作者|子葵 & 于懷
MCP 的發(fā)展速度之快,似乎超出了大部分人的想象。今年 2 月,Cursur、Winsurf、Cline 均開(kāi)始引入 MCP,近日 OpenAI 宣布支持 MCP,國(guó)內(nèi)百度地圖、高德地圖陸續(xù)發(fā)布 MCP Server,還有一眾非?;钴S的提供 MCP 托管和中間件服務(wù)的供應(yīng)商,MCP 生態(tài)正呈現(xiàn)越加豐富和成熟的發(fā)展態(tài)勢(shì)。雖然 AI 在短期內(nèi)依舊面臨 ROI 的考驗(yàn),但幾乎所有人都不會(huì)懷疑他的未來(lái),都不希望錯(cuò)過(guò)這一場(chǎng)“軍備競(jìng)賽”。問(wèn)題隨之而來(lái),存量業(yè)務(wù)架構(gòu)中的 API 改造成 MCP Server,既面臨時(shí)間成本,還有人力上的挑戰(zhàn)。企業(yè)對(duì)能提升 MCP 構(gòu)建效率的開(kāi)源和商業(yè)方案愈加渴望。
“0 改動(dòng)”適配 MCP Server
Nacos 作為 MCP Registry,扮演控制面的角色,不僅管理 Tool 的元信息,還可以把存量 API 轉(zhuǎn)化成 MCP 協(xié)議。Nacos 可以幫助應(yīng)用快速把業(yè)務(wù)已有的 API 接口,轉(zhuǎn)換成 MCP 協(xié)議接口,結(jié)合 Higress AI 網(wǎng)關(guān),實(shí)現(xiàn) MCP 協(xié)議和存量協(xié)議的轉(zhuǎn)換。其中,Nacos 提供存量的服務(wù)管理和動(dòng)態(tài)的服務(wù)信息定義,幫助業(yè)務(wù)在存量接口不改動(dòng)的情況下,通過(guò) Nacos 的服務(wù)管理動(dòng)態(tài)生效 Higress 網(wǎng)關(guān)所生成的 MCP Server 協(xié)議。
借助 MCP 的發(fā)展契機(jī),Nacos (Naming and Configuration Service)正從構(gòu)建云原生應(yīng)用向云原生 AI 應(yīng)用的動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺(tái)開(kāi)源項(xiàng)目進(jìn)行演進(jìn) ,近期 Nacos 即將發(fā)布 3.0 正式版本,會(huì)體系化面向 AI 架構(gòu)進(jìn)行升級(jí)。

為什么能實(shí)現(xiàn)“0 代碼”
適配 MCP Server
我們先看一下普通的調(diào)用是如何發(fā)生。首先,調(diào)用者需要知道服務(wù)提供者的地址 (一個(gè)域名或者是一個(gè) IP),之后調(diào)用者根據(jù)提前約定好的參數(shù),對(duì)接口進(jìn)行調(diào)用。調(diào)用流程圖如下:

在日常開(kāi)發(fā)中,我們已經(jīng)知悉當(dāng)前的提供者的接口集合、接口和接口參數(shù)的具體作用,所以可以基于這些上下文,在業(yè)務(wù)代碼中寫(xiě)入調(diào)用邏輯,實(shí)現(xiàn)服務(wù)間的調(diào)用。對(duì)模型而言,這些調(diào)用上下文也是必須的,模型也需要知道服務(wù)提供者的接口集合以及接口的詳細(xì)描述,才能根據(jù)上下文進(jìn)行接口調(diào)用。
因此,對(duì)于已經(jīng)使用 Nacos 作為注冊(cè)配置中心的存量服務(wù)而言,Nacos 中已經(jīng)存儲(chǔ)了服務(wù)的調(diào)用地址,只需要增加服務(wù)的接口信息就能實(shí)現(xiàn)模型來(lái)調(diào)用上下文。
為此,我們引入了“應(yīng)用全局描述”來(lái)描述當(dāng)前應(yīng)用以及接口的詳細(xì)信息,通過(guò)統(tǒng)一的接口描述協(xié)議對(duì) Nacos 中的服務(wù)進(jìn)行 MCP 化改造。對(duì)于之前未注冊(cè)在 Nacos 中的服務(wù),只需要通過(guò) Nacos 持久化服務(wù)發(fā)現(xiàn)手動(dòng)注冊(cè)即可。在配置完服務(wù)相關(guān)信息之后,MCP 協(xié)議需要的相關(guān)數(shù)據(jù)都已經(jīng)齊全了,接下來(lái)就需要考慮如何將這些數(shù)據(jù)通過(guò) MCP 協(xié)議暴露出去,這里我們通過(guò) Higress 的插件機(jī)制完成 MCP 協(xié)議的暴露能力。調(diào)用流程圖如下:

Nacos 轉(zhuǎn)化 MCP 的具體實(shí)現(xiàn)原理
MCP 協(xié)議目前支持多種資源(Tool、Prompt、Resource 等),我們對(duì)使用量較高的 Tool 進(jìn)行了優(yōu)先實(shí)現(xiàn),再借助 Higress 提供的統(tǒng)一的 SSE 協(xié)議支持,便加速了 MCP Server 的構(gòu)建。
實(shí)現(xiàn)原理上,我們通過(guò)在 Higress 中的 MCP Server 插件實(shí)現(xiàn)了 Nacos 中管理的 Tools 的暴露,對(duì)外通過(guò) MCP 協(xié)議暴露普通 HTTP 服務(wù),需要先完成兩件事,實(shí)現(xiàn)原理圖如下:

暴露 tool/list 接口,由 Higress 代理返回所有的 Tool 列表
tool/list 方法主要負(fù)責(zé)將當(dāng)前 MCP Server 支持的 Tool 的詳細(xì)信息列表返回給客戶(hù)端,返回信息包含 Tool 的作用描述和 Tool 的參數(shù)描述(包含類(lèi)型,作用等),然后通過(guò)將 Nacos 存儲(chǔ)的描述信息轉(zhuǎn)化為標(biāo)準(zhǔn)的 MCP 協(xié)議里的 tool/list 結(jié)果,返回給客戶(hù)端。
Nacos 中會(huì)注冊(cè)多個(gè)服務(wù),每個(gè)服務(wù)會(huì)有多個(gè)接口,每一個(gè)接口映射為一個(gè) Tool,Tool 的描述信息就是接口的描述信息,之后根據(jù)接口名,將所有服務(wù)中的所有 Tool 的服務(wù)名等生成全局唯一的 Tool 名稱(chēng),然后將這些 Tool 聚合為當(dāng)前的 Tool 列表,返回給 MCP Client。
協(xié)議轉(zhuǎn)化,對(duì) MCP 協(xié)議的 Json RPC 轉(zhuǎn)化為普通 HTTP 請(qǐng)求,并轉(zhuǎn)發(fā)到后端服務(wù)
當(dāng) MCP Client 要調(diào)用 Tool 的時(shí)候,Higress 將 tool/call 的 Json RPC 請(qǐng)求解析出來(lái),通過(guò)用戶(hù)配置的參數(shù)映射信、Path、后端地址等信息,Higress 生成后端的 HTTP 調(diào)用請(qǐng)求,并進(jìn)行調(diào)用。調(diào)用完成后,再將后端的調(diào)用結(jié)果包裝供標(biāo)準(zhǔn)的 tool/call 接口調(diào)用的返回結(jié)果。
在整體實(shí)現(xiàn)中,Nacos 作為 MCP Registry,扮演控制面的角色來(lái)管理 Tool 的元信息,Higress 在數(shù)據(jù)面做協(xié)議轉(zhuǎn)換和 RPC 調(diào)用。存量服務(wù)只需要添加接口描述即可,無(wú)需做任何改動(dòng)。
使用 Nacos 管理 Tool 的元信息的優(yōu)勢(shì)
存量 API 可以快速構(gòu)建 MCP Server:Nacos 集成 Higress 的方案可以讓用戶(hù)快速,0 代碼的構(gòu)建成 MCP Server,快速跟進(jìn) MCP 協(xié)議;
MCP 信息動(dòng)態(tài)下發(fā)實(shí)時(shí)生效:MCP 描述信息、Tools 以及 Prompt 都需要進(jìn)行調(diào)試,才能達(dá)到更好效果,Nacos 可以幫助管理和下發(fā)信息,更高效的調(diào)試描述;
MCP 信息歷史版本管理:Nacos 會(huì)管理和存儲(chǔ) MCP 信息歷史版本,方便進(jìn)行 Diff 對(duì)比差異,方便進(jìn)行快速回滾;
MCP 信息灰度管理:Nacos 在 MCP 信息生效的時(shí)候,可以進(jìn)行灰度分批生效,方便對(duì)比 MCP 信息效果;
密碼配置加密:MCP 信息里以及調(diào)用 API 過(guò)程中,需要密碼等敏感信息,Nacos 提供了敏感信息加密的能力,幫助更安全的使用 MCP;?MCP 返回格式 JSON 轉(zhuǎn)換 XML:和大模型交互都有體感,對(duì)模型來(lái)說(shuō),JSON 沒(méi)有 XML 格式好用,所以在 MCP 返回信息格式上,Nacos 可以幫助 MCP 把返回格式從 JSON 變成 XML,方便大模型理解;
MCP 服務(wù)管理及健康檢查:MCP 服務(wù)會(huì)越來(lái)越多,Nacos 有大規(guī)模服務(wù)管理能力,并且持續(xù)在迭代過(guò)程中,為 MCP 做健康檢查、實(shí)時(shí)更新、負(fù)載均衡,起到 MCP 服務(wù)發(fā)現(xiàn)中心的托管作用。
手把手演示“0 代碼”
復(fù)刻高德 MCP Server
最近高德推出了 MCP Server 獲得了業(yè)內(nèi)廣泛關(guān)注,這部分 Server 是高德基于 MCP 社區(qū)的開(kāi)發(fā)指引實(shí)現(xiàn)的,構(gòu)建成本較高。接下來(lái),我們基于高德官方的 Open API 接口,通過(guò) Nacos+Higress 的方案,來(lái)演示如何 0 代碼適配 MCP Server。
環(huán)境準(zhǔn)備
Nacos 部署
通過(guò) docker 部署 nacos:
export NACOS_AUTH_TOKEN=自定義的token,token為原始內(nèi)容的base64編碼結(jié)果
export NACOS_AUTH_IDENTITY_VALUE=自定義的IDENTITY_VALUE,任意英文和數(shù)字組合
docker run -td -e PREFER_HOST_MODE=hostname -e MODE=standalone -e
NACOS_AUTH_IDENTITY_KEY=serverIdentity -e
NACOS_AUTH_IDENTITY_VALUE=${NACOS_AUTH_IDENTITY_VALUE} -e
NACOS_AUTH_TOKEN=${NACOS_AUTH_TOKEN} -p 8848:8848 -p 9848:9848 nacos/nacos-server
Higress 部署
安裝 docker
配置 Kind通過(guò) Kind 在本地安裝 higress,在 Linux x86 的環(huán)境下使用如下命令安裝
# For AMD64 / x86_64
[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.27.0/kind-linux-amd64
# For ARM64
[ $(uname -m) = aarch64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.27.0/kind-linux-arm64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
通過(guò) Kind 創(chuàng)建一個(gè) local 的 k8s 集群
kind create cluster
獲取 hgctl,準(zhǔn)備安裝 higress
curl -Ls https://raw.githubusercontent.com/alibaba/higress/main/tools/hack/get-hgctl.sh | bash
在本地部署 higress
hgctl install --set profile=local-k8s
安裝 Kubectl 并 連接到剛剛創(chuàng)建的集群
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x ./kubectl
mv ./kubectl /usr/bin/kubectl
部署 redis
docker run --name higress-redis -d redis
修改 ConfigMap 讓 Higress 連接到 Nacos
kubectl -n higress-system edit cm higress-config

將紅框部分替換為一下內(nèi)容, 即在原本配置中,data.higress 中增加 mcpServer 段的配置
apiVersion: v1
data:
higress: |-
mcpServer:
sse_path_suffix: /sse
enable: true
redis:
address: {local_ip}:6379
match_list:
- match_rule_domain: "*"
match_rule_path: /registry
match_rule_type: "prefix"
servers:
- name: nacos-registry
type: nacos-mcp-registry
path: /registry
config:
serverAddr: {local_ip}
namespace: ""
serviceMatcher:
amap: ".*"
ip: ".*"
downstream:
connectionBufferLimits: 32768
http2:
initialConnectionWindowSize: 1048576
initialStreamWindowSize: 65535
maxConcurrentStreams: 100
idleTimeout: 180
maxRequestHeadersKb: 60
routeTimeout: 0
upstream:
connectionBufferLimits: 10485760
idleTimeout: 10
請(qǐng)將 {local_ip} 替換為本機(jī)地址,可以在本地執(zhí)行以下命令獲取
ifconfig eth0 | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}'
編輯完成之后保存配置,至此基本環(huán)境以及配置完成。
使用高德官方的 Open API,構(gòu)建 MCP Server
環(huán)境部署完成之后,我們通過(guò)一個(gè)小的 Demo 對(duì)整個(gè)流程進(jìn)行演示,我們以查詢(xún)天氣為場(chǎng)景,將高德的 HTTP 接口在無(wú)改造的情況下暴露為 MCP 協(xié)議,讓 Agent 進(jìn)行調(diào)用。
高德開(kāi)發(fā)者 API KEY 申請(qǐng)
調(diào)用高德 API,我們首先需要申請(qǐng)到高德 API 的 key。進(jìn)入高德開(kāi)發(fā)者平臺(tái) ,登陸之后,創(chuàng)建新應(yīng)用。

創(chuàng)建新應(yīng)用:

應(yīng)用創(chuàng)建完成之后,我們創(chuàng)建 key:

在控制臺(tái)看到 key,將 key 保存下來(lái)

接下來(lái)我們完成 higress 中關(guān)聯(lián) Nacos 做 MCP registry 的配置接下來(lái)我們?cè)?Nacos 中配置完成高德 HttpApi 的描述文件的配置以及高德域名信息配置
在 Nacos 中進(jìn)行高德 API 服務(wù)配置
首先我們通過(guò)持久化服務(wù)發(fā)現(xiàn)的能力將高德的域名注冊(cè)到 nacos 中,服務(wù)名為 amap,分組為 amap。

創(chuàng)建完服務(wù)之后,我們將高德的域名注冊(cè)到 Nacos 中。

通過(guò)以下命令注冊(cè)高德的域名。
curl -X POST
'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=amap&groupName=amap&ip=restapi.amap.com&port=80&ephemeral=false'
檢查 amap 服務(wù)的實(shí)例數(shù)變?yōu)?1。

在配置中心新建一個(gè)配置文件對(duì)高德的 API 進(jìn)行描述。

進(jìn)入配置中心,點(diǎn)擊新建配置。

創(chuàng)建 DataId 為 amap-mcp-tools.json 分組為 amap 的配置項(xiàng),配置內(nèi)容為
{
"protocol": "http",
"tools": [
{
"name": "get_weather",
"description": "get weather",
"inputSchema": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "city adcode"
}
}
}
},
{
"name": "get_adcode",
"description": "get adcode via address",
"inputSchema": {
"type": "object",
"properties": {
"address": {
"type": "string",
"description": "address"
}
}
}
},
{
"name": "get_address_via_ip",
"description": "get address via ip",
"inputSchema": {
"type": "object",
"properties": {
"ip": {
"type": "string",
"description": "ip address"
}
}
}
}
],
"toolsMeta": {
"get_weather": {
"credentialRef": "amap-key.json",
"InvokeContext": {
"path": "/v3/weather/weatherInfo",
"method": "GET"
}
},
"get_adcode": {
"credentialRef": "amap-key.json",
"InvokeContext": {
"path": "/v3/geocode/geo",
"method": "GET"
}
},
"get_address_via_ip": {
"credentialRef": "amap-key.json",
"InvokeContext": {
"path": "/v3/ip",
"method": "GET"
}
}
}
}
這個(gè)配置描述了高德的 HTTP API 的相關(guān)參數(shù)信息,以及 Higress 進(jìn)行協(xié)議轉(zhuǎn)換時(shí)需要的上下文信息。再創(chuàng)建 DataId 為 amap-key.json, 分組為 amap 的配置項(xiàng)配置內(nèi)容為:
{
"type": "fixed-query-token",
"credentialsMap": {
"key": "key",
"value": "高德的api key"
}
}
在 Nacos 中進(jìn)行獲取出口 IP 服務(wù)配置
注冊(cè)一個(gè)獲取當(dāng)前出口 IP 的服務(wù)獲取當(dāng)前的 IP。以 ipinfo.io 為例,在服務(wù)管理中創(chuàng)建服務(wù) ip, 分組為 ip:

服務(wù)創(chuàng)建完成之后,向 Nacos 中注冊(cè) ipinfo.io 的域名信息,執(zhí)行一下命令。
curl -X POST
'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=ip&groupName=ip&ip=ipinfo.io&port=80&ephemeral=false'
注冊(cè)完成之后,就能在 Nacos 控制臺(tái)看到 IP 服務(wù)的下有一個(gè)實(shí)例了。

服務(wù)創(chuàng)建完成之后,我們?cè)谂渲弥行呐渲毛@取 IP 服務(wù)的接口描述。創(chuàng)建 DataId ip-mcp-tools.json 為 ,分組為 ip 的配置,配置內(nèi)容為:
{
"protocol": "http",
"tools": [
{
"name": "get_current_ip_address",
"description": "get current caller's ip address",
"inputSchema": {
"type": "object",
"properties": {
"empty_args": {
"type": "string",
"description": "should be empty"
}
}
}
}
],
"toolsMeta": {
"get_current_ip_address": {
"InvokeContext": {
"path": "/",
"method": "GET"
}
}
}
}
配置創(chuàng)建完之后,就可以在 Cursor 中配置 Higress 作為 MCP Server 調(diào)用 Tool 了。
Cursor MCP 配置
Cursor 的具體配置方法如下:首先安裝最新版本的 Cursor,安裝完成之后在 Cursor 的設(shè)置中,配置 MCP Server 的具體信息。
{
"mcpServers": {
"nacos-registry": {
"url": "http://localhost/registry/sse"
}
}
}
配置完成后可以看到 通過(guò) Higress + Nacos 暴露的 MCP Server 提供的 Tool。

查詢(xún)天氣
接下來(lái),我們通過(guò) Agent 模式向智能體,詢(xún)問(wèn)今天天氣怎么樣。

可以看到,智能體先獲取了當(dāng)前主機(jī)的出口 IP,再通過(guò) IP 獲取到具體的省市信息,再通過(guò)省市信息獲取到 adcode,最終通過(guò) adcode 獲取到當(dāng)前的天氣信息。整個(gè)過(guò)程中,用戶(hù)只需要將服務(wù)注冊(cè)在 Nacos 中,并且在 Nacos 中配置服務(wù)接口相關(guān)的描述信息即可,服務(wù)本身的代碼無(wú)需任何改造;
總 結(jié)
通過(guò) Nacos+Higress 的方案實(shí)現(xiàn) 0 代碼改造將 Agent 連接到存量應(yīng)用,能夠顯著降低存量應(yīng)用的改造成本。當(dāng)前需要用戶(hù)手動(dòng)配置接口描述信息,后續(xù)可以通過(guò)工具化的能力將接口進(jìn)一步簡(jiǎn)化,用戶(hù)只需要微調(diào)即可?,F(xiàn)實(shí)中,我們有大量的存量服務(wù)和接口,按照接口到 Tool 的映射,我們將會(huì)有非常多的 Tool,當(dāng) Agent 拉取 Tool 列表并傳遞給模型的時(shí)候,將會(huì)有非常多的 token 消耗,并且模型的性能也可能會(huì)下降。那么如何在上下文中圈定有效的 Tool 列表,并返回給 Agent,將會(huì)是我們后續(xù)重要的演進(jìn)方向之一。除了 Tool,MCP 協(xié)議還有 Prompt、Resource 等,MCP 社區(qū)也在持續(xù)更新協(xié)議,我們將在后續(xù)逐個(gè)支持,助力 MCP 生態(tài)的發(fā)展。
Nacos 3.0 AI 應(yīng)用服務(wù)管理平臺(tái)
Nacos 3.0 架構(gòu)已將發(fā)布正式版本,定位 AI 應(yīng)用服務(wù)管理平臺(tái),包含了 MCP 動(dòng)態(tài)管理,也覆蓋通用 AI 生態(tài)場(chǎng)景,包含模型參數(shù)、Prompt 動(dòng)態(tài)模版等場(chǎng)景幫助業(yè)務(wù)動(dòng)態(tài)管理實(shí)時(shí)生效,Nacos 社區(qū)有完備的多語(yǔ)言客戶(hù)端生態(tài),成熟的 Python、GO、Rust、Java、NodeJS 等主流語(yǔ)言的適配,幫你用最低的成本快速構(gòu)建 AI 應(yīng)用;隨著 Nacos 演進(jìn),會(huì)推出越來(lái)越多 AI 相關(guān)的能力。

熱門(mén)跟貼