1. 存量接口接入 MCP 的真实痛点与 Nacos Registry 的定位
很多团队手里已经跑着一堆稳定的 HTTP 接口,比如天气查询、地址解析、订单状态、库存查询。这些接口在业务系统里活得好好的,但一旦想让 AI Agent 去调用,问题就来了:Agent 不认识你的 REST 接口,它只认 MCP 协议。于是摆在面前的路只有两条,要么把每个接口重写成 MCP Server,要么找一个中间层做协议转换。
重写这件事听起来简单,做起来很磨人。一个中等规模的业务系统,对外暴露的接口动辄几十上百个,每个接口都要写 Tool 描述、参数 Schema、调用逻辑、错误处理,还要考虑鉴权怎么透传。人力成本先不说,改完之后原来的业务代码还得回归测试,风险不小。更麻烦的是,MCP 协议本身还在快速演进,今天写完的 Server 明天可能就要跟着协议版本调整。
Nacos 这次发布的 MCP Registry 就是冲着这个场景来的。它把自己定位成控制面,负责管理 Tool 的元信息,把存量 API 的描述信息存起来,然后配合 Higress AI 网关在数据面做协议转换。存量服务本身不需要改一行代码,只需要在 Nacos 里补上接口描述,Higress 就能把这些 HTTP 接口以 MCP 协议暴露出去。
这个思路的核心在于:Nacos 本来就已经存了服务的调用地址,对于已经用 Nacos 做注册配置中心的团队来说,服务发现这一层是现成的。缺的只是接口的语义描述——这个接口叫什么、干什么用、需要什么参数。把这些信息补进 Nacos,MCP 协议需要的上下文就齐了。
我试过在本地把一条高德天气接口通过这套方案暴露成 MCP Tool,整个过程没有动高德那边的任何代码,也没有写新的服务,只是在 Nacos 里加了两条配置,Higress 就把它转成了 MCP 协议。Agent 调用的时候,先拿出口 IP,再查 adcode,最后查天气,三步串起来跑通了。
适合谁看这篇:手里有存量 HTTP 接口、想让 AI Agent 调起来、又不想大改代码的后端和平台同学。下面我会把 Nacos 注册服务、写 Tool 描述、配 Higress、接 TaoToken 统一 Key 这条链路完整走一遍,每一步都给可复制的配置。
2. TaoToken 统一 Key 通道的前置准备与 MCP 鉴权思路
存量接口转成 MCP 之后,紧接着要解决的是鉴权问题。原来的 HTTP 接口可能有自己的 API Key、Token 或者签名机制,Agent 调用 MCP Tool 的时候,这些凭证怎么传、怎么管,是个绕不开的环节。
一种做法是把每个上游服务的 Key 都硬编码在 Higress 的配置里,但这样 Key 散落在各处,轮换和审计都麻烦。另一种做法是引入一个统一的 Key 通道,让 MCP 调用链路上的鉴权收敛到一个地方。TaoToken 在这里扮演的就是统一 Key/API 通道的角色,它提供兼容 OpenAI 风格的接口入口,MCP 工具调用时可以通过它来统一管理凭证和请求转发。
先明确几个地址,后面配置会用到:
- 官网入口:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
- API 基地址:https://taotoken.net/api
- 模型对话页:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite
- Coding Plan 页:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite
- 控制台:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite
- API Keys 管理:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite
- 接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite
- Claude Code 接入:https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claude_code&utm_campaign=rewrite
前置准备分三步。第一步,在 TaoToken 控制台创建一个 API Key,这个 Key 后面会作为 MCP 调用链路上的统一凭证。第二步,确认本地已经能跑 Nacos 和 Higress,如果还没装,下面会给 Docker 和 Kind 的命令。第三步,想清楚你要暴露哪几个存量接口,把它们的路径、方法、参数整理出来,后面写 Tool 描述的时候直接填。
鉴权思路是这样的:Higress 在把 MCP 的 tool/call 转成后端 HTTP 请求时,会从 Nacos 的配置里读取凭证引用(credentialRef),把对应的 Key 注入到请求里。对于走 TaoToken 通道的调用,凭证就是 TaoToken 的 API Key,Base URL 指向 https://taotoken.net/api。这样上游服务的真实 Key 不需要暴露给 Agent,Agent 侧只需要拿到 MCP Server 的地址就能调用。
有一点要注意:TaoToken 在这里是作为统一的 API 通道和 Key 管理入口,不是替代 Nacos 或 Higress 的角色。Nacos 管 Tool 元信息,Higress 做协议转换,TaoToken 管凭证和请求转发,三者各司其职。
3. 可复制的 Nacos Registry 配置与 MCP 服务注册片段
这一节是整篇的核心,所有配置都可以直接复制。我按顺序来:先起 Nacos,再起 Higress,然后注册服务、写 Tool 描述、配鉴权。
3.1 启动 Nacos 并设置鉴权变量
用 Docker 起一个单机版 Nacos,注意鉴权相关的环境变量要设好:
export NACOS_AUTH_TOKEN=你的token的base64编码 export NACOS_AUTH_IDENTITY_VALUE=你的IDENTITY_VALUE 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-serverNACOS_AUTH_TOKEN 需要是原始内容的 base64 编码结果,IDENTITY_VALUE 用任意英文数字组合即可。启动后访问 8848 端口能看到控制台就说明 OK。
3.2 用 Kind 部署 Higress 并连接 Nacos
本地用 Kind 起一个 K8s 集群,然后装 Higress:
# 安装 kind [ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.27.0/kind-linux-amd64 [ $(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 # 创建集群 kind create cluster # 获取 hgctl 并安装 Higress curl -Ls https://raw.githubusercontent.com/alibaba/higress/main/tools/hack/get-hgctl.sh | bash hgctl install --set profile=local-k8s # 安装 kubectl curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" chmod +x ./kubectl sudo mv ./kubectl /usr/bin/kubectl # 起一个 redis 给 Higress 用 docker run --name higress-redis -d redis然后改 Higress 的 ConfigMap,让它连上 Nacos:
kubectl -n higress-system edit cm higress-config在 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把 {local_ip} 替换成本机地址,用ifconfig eth0 | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}'可以拿到。保存后 Higress 会重新加载配置。
3.3 注册存量服务到 Nacos
以高德开放接口为例,先把域名注册进 Nacos:
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'再注册一个获取出口 IP 的服务:
curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=ip&groupName=ip&ip=ipinfo.io&port=80&ephemeral=false'注册完在 Nacos 控制台的服务列表里能看到实例数为 1。
3.4 写 Tool 描述配置
在 Nacos 配置中心新建 DataId 为 amap-mcp-tools.json、分组为 amap 的配置:
{ "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" } } } }再建一个 DataId 为 amap-key.json、分组为 amap 的配置,放高德的 Key:
{ "type": "fixed-query-token", "credentialsMap": { "key": "key", "value": "你的高德API Key" } }IP 服务的 Tool 描述类似,DataId 为 ip-mcp-tools.json、分组为 ip:
{ "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" } } } }3.5 接入 TaoToken 统一 Key 通道
如果希望 MCP 调用链路上的凭证统一走 TaoToken,可以在 Higress 的凭证配置里把 Base URL 指向 TaoToken 的 API 地址,Key 用 TaoToken 控制台创建的 API Key。以 OpenAI 兼容的调用方式为例,配置片段如下:
{ "type": "fixed-header-token", "credentialsMap": { "Authorization": "Bearer 你的TaoToken API Key" }, "baseUrl": "https://taotoken.net/api" }这样 Agent 侧调用 MCP Tool 时,请求会经过 TaoToken 通道转发,上游服务的真实 Key 不需要暴露。TaoToken 的 API Key 在控制台的 API Keys 页面创建,接入细节可以参考接入文档。
4. 端到端验证:从 MCP Client 调用到成功返回
配置写完,接下来验证整条链路能不能跑通。我用 Cursor 作为 MCP Client 来演示,其他支持 MCP 的客户端配置方式类似。
4.1 配置 MCP Client
在 Cursor 的设置里找到 MCP Server 配置,填入 Higress 暴露的 SSE 地址:
{ "mcpServers": { "nacos-registry": { "url": "http://localhost/registry/sse" } } }保存后,Cursor 会去拉取 Tool 列表。如果配置正确,你能在 MCP 面板里看到 get_weather、get_adcode、get_address_via_ip、get_current_ip_address 这几个 Tool。
4.2 发起一次完整调用
在 Agent 模式里问一句「今天天气怎么样」。Agent 的调用链是这样的:
第一步,调用 get_current_ip_address,拿到当前主机的出口 IP。这个请求经过 Higress 转成对 ipinfo.io 的 HTTP 调用,返回 IP 地址。
第二步,用这个 IP 调用 get_address_via_ip,拿到省市信息。
第三步,用省市信息调用 get_adcode,拿到城市的 adcode。
第四步,用 adcode 调用 get_weather,拿到天气数据。
整个过程 Agent 不需要知道高德的接口长什么样,它只看到 MCP Tool 的描述和参数。Higress 在背后把每次 tool/call 的 JSON-RPC 请求解析出来,根据 Nacos 里配的 InvokeContext 生成对应的 HTTP 请求,转发到 restapi.amap.com,再把结果包装成 MCP 的返回格式。
4.3 验证成功的结果
如果一切正常,Agent 会返回类似「当前城市天气晴,温度 25 度」这样的结果。你可以在 Higress 的日志里看到每次协议转换的记录,确认请求确实经过了 Nacos 的 Tool 描述和 Higress 的转发。
如果走的是 TaoToken 统一 Key 通道,可以在 TaoToken 控制台的调用记录里看到对应的请求,确认鉴权链路是通的。
这一步跑通,说明存量 HTTP 接口到 MCP 协议的完整链路已经打通,而且没有改任何存量代码。
5. 本篇常见报错排查:401、local proxy failed、reading choices、OAuth
配置过程中容易踩的坑集中在几个报错上,我按实际遇到的顺序列一下。
401 Unauthorized:最常见的是 Nacos 的鉴权变量没设对。NACOS_AUTH_TOKEN 必须是 base64 编码后的结果,直接填原始字符串会报错。另外 Higress 连 Nacos 时如果 serverAddr 填错,也会出现鉴权失败。检查 ConfigMap 里的 serverAddr 是不是本机 IP,namespace 是不是空字符串。
local proxy failed:这个报错通常出现在 MCP Client 连 Higress 的时候。先确认 Higress 的 mcpServer.enable 是不是 true,sse_path_suffix 是不是 /sse。然后检查 match_list 里的 match_rule_path 和 servers 里的 path 是否一致,我这里都配的是 /registry。如果 Redis 没起,Higress 的 MCP Server 也会起不来,确认 higress-redis 容器在跑。
reading choices 相关报错:如果 MCP Client 在拉取 Tool 列表时报这个,多半是 Tool 描述配置的 JSON 格式有问题。检查 amap-mcp-tools.json 里的 tools 数组和 toolsMeta 对象是否对应,每个 Tool 的 name 在 toolsMeta 里都要有对应的 InvokeContext。JSON 里多一个逗号或者少一个括号都会导致解析失败。
OAuth 相关报错:如果 MCP Client 要求 OAuth 认证而你的 Higress 没配,会出现认证失败。本地验证阶段可以先在 Client 侧关掉 OAuth 要求,或者确认 Higress 的 MCP Server 配置里没有强制认证。如果走 TaoToken 通道,确认 API Key 是有效的,Authorization 头的格式是 Bearer 加空格加 Key。
还有一个容易忽略的点:Nacos 里注册的服务实例如果是临时实例(ephemeral=true),Nacos 重启后实例会丢。我这里用的是 ephemeral=false,持久化实例,重启后还在。
排查的时候建议按链路顺序来:先确认 Nacos 里服务实例在不在,再确认 Tool 描述配置有没有生效,然后看 Higress 的日志有没有协议转换记录,最后看 MCP Client 侧能不能拉到 Tool 列表。哪一步断了就查哪一步。
6. 长期编码与 Agent 场景下的通道选择
把存量接口通过 Nacos MCP Registry 暴露出去之后,日常使用会分成两类场景。一类是临时验证,比如想快速试一下某个接口能不能被 Agent 调起来,这种用模型对话页就够了,配好 MCP Server 地址直接问。另一类是长期跑编码和 Agent 任务,比如让 Agent 持续调用一批内部接口做自动化,这种对通道的稳定性和 Key 管理要求更高。
如果只是验证模型和 Tool 的配合效果,可以直接在模型对话页里试,地址是 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite。想快速拿到 Key 开始接,去 API Keys 页面创建,地址是 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite。接入过程中遇到配置问题,接入文档里有各语言的示例,地址是 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite。
如果是长期跑编码和 Agent 任务,Coding Plan 更适合,地址是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite。Claude Code 的接入方式单独有一页,地址是 https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claude_code&utm_campaign=rewrite。控制台里可以统一管理 Key 和查看调用记录,地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite。
最后说一个实际用下来的经验:Nacos 里 Tool 描述写得好不好,直接决定 Agent 能不能正确调用。description 字段别写太泛,参数说明要具体到格式和取值范围。我一开始把 get_weather 的 city 参数描述写成「城市」,Agent 经常传城市名而不是 adcode,后来改成「city adcode,例如 110000」就稳定了。Tool 描述是给模型看的,写得越清楚,调用成功率越高。