1. 为什么要把 Nacos 和 Higress 拼在一起承载 MCP Server
MCP Server 是模型上下文协议的服务端实现,它把工具、资源、提示词以标准端点暴露给 AI 客户端调用。Nacos 是配置中心加服务发现,Higress 是基于 Envoy 的云原生网关。把这三者组合起来,解决的是一个很具体的问题:当 MCP Server 从单机脚本变成多实例集群后,客户端该连谁、工具列表怎么热更新、鉴权在哪里做、流量怎么灰度。
我试过最原始的形态,把 MCP Server 写成一个本地 stdio 进程,客户端配置里写死命令和参数。单机跑没问题,一旦要多人共用、要按租户隔离、要动态上下线工具,这套就崩了。你需要一个注册中心告诉客户端有哪些 MCP Server 实例活着,需要一个网关统一收口鉴权和路由,还需要一个配置中心让工具清单和模型参数能热更新而不重启进程。Nacos 负责前两件事里的注册与配置,Higress 负责网关层的路由、鉴权和协议转换。
这套架构适合谁?适合已经在用 Spring Cloud Alibaba 或 Kubernetes 的团队,手里有 Nacos 集群,想在不引入新中间件的前提下把 MCP Server 管起来。也适合做 AI Agent 平台的团队,工具数量会持续增长,需要动态注册和灰度发布能力。如果你只是本地跑一个 MCP Server 给自己用,这套偏重,直接 stdio 或单机 SSE 就够了。
核心检索词先明确:Nacos 服务发现、Higress 网关、MCP Server 架构设计、统一 Key 接入。这四个词贯穿全文。Nacos 解决服务注册与配置下发,Higress 解决南北向流量入口与鉴权,MCP Server 是被承载的业务端点,统一 Key 解决的是多个 MCP Server 共用一套凭证体系的问题。
先说清楚一个容易混淆的点。MCP 协议本身有 stdio 和 SSE/HTTP 两种传输方式。stdio 是本地进程通信,网关管不到。要让 Nacos 和 Higress 发挥作用,MCP Server 必须以 HTTP/SSE 方式暴露端点,这样网关才能做七层路由。所以本文的前提是:你的 MCP Server 已经支持 HTTP 传输,或者你愿意用 Higress 的协议转换能力把后端 HTTP 服务包装成 MCP 端点。
架构分层是这样的。最底层是 MCP Server 实例,每个实例启动时向 Nacos 注册自己的 IP、端口和元数据,元数据里带上工具分类、租户标识、版本号。中间层是 Higress,它订阅 Nacos 的服务列表,动态生成路由规则,同时挂载鉴权插件校验统一 Key。最上层是 MCP Client,它只认 Higress 的域名,不直接接触后端实例。配置数据比如工具清单、模型参数放在 Nacos 配置中心,Higress 或 MCP Server 监听变更后热更新。
这个分层带来的直接好处是客户端配置极简。你不需要在客户端里维护一长串 MCP Server 地址,只需要一个网关地址加一个 Key。后端实例扩缩容、迁移、换版本,客户端无感知。这也是统一 Key 接入的价值所在:所有 MCP Server 共享一套鉴权体系,Key 在网关层校验,后端服务不用各自实现鉴权逻辑。
下面进入具体配置。我会按 Nacos 注册、Higress 路由与鉴权、MCP Server 端点暴露、连通性验证、报错排查的顺序展开,每一步都给可复制的配置片段。
2. TaoToken 前置准备:统一 Key 与 API 通道
在把 MCP Server 挂到 Higress 之前,需要先解决模型侧的统一接入。MCP Server 本身是工具服务,但它调用的模型能力需要一个稳定的 API 通道。TaoToken 在这里扮演的角色是统一 Key 管理和 API 通道,让多个 MCP Server 不用各自维护模型凭证。
先拿 Key。访问 https://taotoken.net/api-keys 创建 API Key。这个 Key 是后续所有 MCP Server 调用模型能力的统一凭证。创建时建议按用途命名,比如 mcp-tools-prod,方便后续在网关层做租户隔离时区分。
拿到 Key 后,模型侧的 Base URL 是 https://taotoken.net/api。这个地址在 MCP Server 的模型调用配置里会用到。注意 API 地址不带 UTM 参数,保持干净。
如果你需要确认模型 ID 和可用模型列表,打开 https://taotoken.net/models 查看。MCP Server 里配置的 Model ID 必须和这里列出的保持一致,否则调用会返回模型不存在的错误。
对于长期跑编码类 Agent 的场景,可以了解 Coding Plan:https://taotoken.net/coding-plan 。它适合需要持续调用模型能力的 MCP Server 集群,按套餐走比按量计费更可控。
接入文档在 https://taotoken.net/doc ,里面有各语言 SDK 的接入示例。MCP Server 如果用 Python 写,参考文档里的 OpenAI 兼容调用方式即可,因为 TaoToken 的 API 是 OpenAI 兼容格式。
这里要强调一个设计原则:统一 Key 不要硬编码在 MCP Server 代码里。正确做法是把 Key 放在 Nacos 配置中心,MCP Server 启动时拉取,或者由 Higress 在网关层注入。这样 Key 轮换时只需要改一处。下面 Nacos 配置部分会给出具体做法。
模型对话调试入口在 https://taotoken.net/chat ,当你怀疑是模型侧问题时,可以先用这个入口发一条请求,确认 Key 和模型 ID 没问题,再排查 MCP Server 和网关。
控制台在 https://taotoken.net/console ,可以查看调用量、余额和 Key 状态。MCP Server 上线后,通过控制台观察调用是否正常。
前置准备的核心是三样东西:API Key、Base URL、Model ID。这三样在后面的 MCP Server 配置和 Higress 鉴权配置里都会出现。先把它们准备好,再往下走。
3. 可复制配置:Nacos 注册、Higress 路由与 MCP Server 端点
这一节是全文的技术核心,给出可直接复制的配置。分三块:Nacos 侧的服务注册与配置、Higress 侧的路由与鉴权、MCP Server 侧的端点暴露。
3.1 Nacos 服务注册配置
MCP Server 启动时向 Nacos 注册。以 Spring Boot 应用为例,application.yml 配置如下:
spring: application: name: mcp-server-tools cloud: nacos: discovery: server-addr: 192.168.1.10:8848 namespace: mcp-prod group: MCP_SERVER_GROUP metadata: mcp-protocol: http-sse mcp-version: v1 tenant: default tools: weather,search,code-interpreter config: server-addr: 192.168.1.10:8848 namespace: mcp-prod group: MCP_CONFIG_GROUP file-extension: yaml关键在 metadata。mcp-protocol 告诉 Higress 这个实例用 HTTP SSE 传输,mcp-version 用于灰度路由,tenant 用于多租户隔离,tools 列出该实例提供的工具分类。Higress 订阅 Nacos 服务列表时,会读取这些 metadata 生成路由标签。
如果你不用 Spring Boot,用 Nacos 的 OpenAPI 手动注册也可以:
curl -X POST 'http://192.168.1.10:8848/nacos/v1/ns/instance' \ -d 'serviceName=mcp-server-tools' \ -d 'ip=192.168.1.21' \ -d 'port=8080' \ -d 'namespaceId=mcp-prod' \ -d 'groupName=MCP_SERVER_GROUP' \ -d 'metadata={"mcp-protocol":"http-sse","mcp-version":"v1","tenant":"default"}'注册成功后,在 Nacos 控制台的服务列表里能看到 mcp-server-tools,实例数随你启动的副本数变化。
3.2 Nacos 配置中心:统一 Key 与工具清单
把 TaoToken 的 Key 和模型配置放在 Nacos 配置中心,Data ID 为 mcp-server-config.yaml,Group 为 MCP_CONFIG_GROUP:
taotoken: base-url: https://taotoken.net/api api-key: sk-你的实际Key model-id: gpt-4o-mini timeout: 30s mcp: tools: - name: weather enabled: true endpoint: /mcp/tools/weather - name: search enabled: true endpoint: /mcp/tools/search - name: code-interpreter enabled: false endpoint: /mcp/tools/code rate-limit: default: 100 tenant-a: 200MCP Server 通过 Nacos SDK 监听这个配置,变更时热更新工具开关和模型参数。注意 api-key 放在配置中心而不是代码里,轮换时只改这一处。
3.3 Higress 路由配置
Higress 通过 McpBridge 或直接订阅 Nacos 服务列表来发现后端。以下是 Higress 的 McpBridge 配置,把 Nacos 注册的 mcp-server-tools 服务接入:
apiVersion: networking.higress.io/v1 kind: McpBridge metadata: name: nacos-mcp-bridge namespace: higress-system spec: registries: - name: nacos-mcp type: nacos2 domain: 192.168.1.10 port: 8848 nacosGroups: - MCP_SERVER_GROUP nacosNamespace: mcp-prod然后配置路由,把外部请求转发到 MCP Server:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: mcp-server-ingress namespace: higress-system annotations: higress.io/destination: mcp-server-tools.MCP_SERVER_GROUP.mcp-prod.nacos higress.io/rewrite-target: / spec: ingressClassName: higress rules: - host: mcp.example.com http: paths: - path: /mcp pathType: Prefix backend: resource: apiGroup: networking.higress.io kind: McpBridge name: nacos-mcp-bridge3.4 Higress 鉴权:统一 Key 校验
在 Higress 上挂载 key-auth 插件,校验客户端带来的统一 Key:
apiVersion: extensions.higress.io/v1alpha1 kind: WasmPlugin metadata: name: mcp-key-auth namespace: higress-system spec: selector: matchLabels: higress.io/resource: mcp-server-ingress pluginConfig: _rules_: - _match_route_: - mcp-server-ingress allow: - "sk-mcp-client-key-001" - "sk-mcp-client-key-002" global_auth: false consumers: - name: tenant-a credential: "sk-mcp-client-key-001" - name: tenant-b credential: "sk-mcp-client-key-002"客户端请求时在 Header 里带Authorization: Bearer sk-mcp-client-key-001,Higress 校验通过后转发到后端 MCP Server。后端服务不需要再实现鉴权。
3.5 MCP Server 端点暴露
MCP Server 用 Python 的 FastAPI 暴露 SSE 端点,核心代码如下:
from fastapi import FastAPI, Request from fastapi.responses import StreamingResponse import json, asyncio app = FastAPI() @app.get("/mcp/sse") async def mcp_sse(request: Request): async def event_stream(): yield f"event: endpoint\ndata: /mcp/message\n\n" while True: await asyncio.sleep(15) yield f"event: ping\ndata: keepalive\n\n" return StreamingResponse(event_stream(), media_type="text/event-stream") @app.post("/mcp/message") async def mcp_message(request: Request): body = await request.json() method = body.get("method") if method == "tools/list": return {"jsonrpc": "2.0", "id": body.get("id"), "result": {"tools": [...]}} if method == "tools/call": return {"jsonrpc": "2.0", "id": body.get("id"), "result": {"content": [...]}} return {"jsonrpc": "2.0", "id": body.get("id"), "error": {"code": -32601, "message": "Method not found"}}这个 MCP Server 注册到 Nacos 后,Higress 自动发现并路由。客户端只需要连https://mcp.example.com/mcp/sse,带统一 Key 即可。
4. 验证请求与调用链:从客户端到 MCP Server 的完整链路
配置写完,必须验证。验证分四层:Nacos 注册是否成功、Higress 路由是否生效、鉴权是否拦截、MCP 调用是否返回正确结果。
第一层,查 Nacos 实例列表:
curl 'http://192.168.1.10:8848/nacos/v1/ns/instance/list?serviceName=mcp-server-tools&namespaceId=mcp-prod&groupName=MCP_SERVER_GROUP'返回 JSON 里 hosts 数组应该有你的 MCP Server 实例,healthy 为 true。如果为空,检查 MCP Server 启动日志里 Nacos 注册是否报错。
第二层,查 Higress 路由是否生成。在 Higress 控制台的路由列表里找 mcp-server-ingress,或者用命令行:
kubectl get ingress -n higress-system mcp-server-ingress -o yaml确认 status 里有实际的后端地址。如果后端为空,说明 McpBridge 没订阅到 Nacos 服务,检查 McpBridge 的 domain 和 namespace 是否写对。
第三层,测鉴权。不带 Key 请求:
curl -i https://mcp.example.com/mcp/sse预期返回 401。带正确 Key:
curl -i -H 'Authorization: Bearer sk-mcp-client-key-001' https://mcp.example.com/mcp/sse预期返回 200,Content-Type 为 text/event-stream,并且能看到 event: endpoint 的数据。
第四层,测 MCP 工具调用。用 curl 模拟 MCP Client 发 tools/list:
curl -X POST https://mcp.example.com/mcp/message \ -H 'Authorization: Bearer sk-mcp-client-key-001' \ -H 'Content-Type: application/json' \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'预期返回工具列表 JSON。如果返回的是模型调用结果,说明 MCP Server 内部调用了 TaoToken 的模型能力,检查 Nacos 配置里的 api-key 和 model-id 是否正确。
完整调用链是:MCP Client 带统一 Key 请求 Higress,Higress 校验 Key 后根据 Nacos 服务列表路由到某个 MCP Server 实例,MCP Server 处理 tools/call 时如果需要模型能力,用 Nacos 配置里的 TaoToken Key 调用 https://taotoken.net/api,返回结果沿原路回传。
验证模型侧是否正常,可以单独用模型对话入口发一条请求:https://taotoken.net/chat 。如果这里正常但 MCP 调用失败,问题在 MCP Server 或网关,不在模型侧。
调用链验证通过后,建议在 Nacos 里改一次配置,比如把 code-interpreter 的 enabled 从 false 改成 true,观察 MCP Server 是否热更新工具列表,不重启进程。这是验证配置中心与 MCP Server 联动是否正常的关键动作。
5. 常见报错排查:401、local proxy failed、reading choices、OAuth
这一节列真实会遇到的报错和排查路径。
401 Unauthorized。两种可能。一是客户端没带 Key 或 Key 写错,检查 Header 里 Authorization 的值是否和 Higress 插件配置的 credential 一致。二是 Higress 插件没生效,检查 WasmPlugin 的 selector 是否匹配到了正确的 Ingress。如果 401 来自 MCP Server 而不是 Higress,说明鉴权没在网关层拦住,请求透传到了后端,检查 Higress 路由是否绑定了鉴权插件。
local proxy failed。这个报错通常出现在 MCP Client 侧,客户端尝试直连后端实例失败。原因是客户端配置里写的是后端地址而不是网关地址。MCP Client 应该只配 Higress 的域名,不要配 Nacos 里的实例 IP。检查客户端配置的 URL 是否为 https://mcp.example.com/mcp/sse。
reading choices 相关报错。这个报错来自模型 API 响应解析,通常是 TaoToken 返回的响应格式和 MCP Server 期望的不一致。检查 MCP Server 里模型调用的 Base URL 是否为 https://taotoken.net/api,Model ID 是否在 https://taotoken.net/models 列表里。如果用的是 OpenAI SDK,确认没有多拼一层路径。
OAuth 相关报错。如果 MCP Server 或 Higress 配置了 OAuth 鉴权,报错通常是 token 过期或 audience 不匹配。检查 OAuth 配置里的 audience 是否和 MCP Server 的标识一致。如果不需要 OAuth,确认没有误开相关插件。
Nacos 服务列表为空。检查 MCP Server 的 namespace 和 group 是否和 McpBridge 配置一致。Nacos 2.x 默认用 gRPC 端口 9848,如果防火墙只开了 8848,服务注册会失败。确认 9848 端口可达。
Higress 路由 404。检查 Ingress 的 path 和 MCP Server 实际暴露的 path 是否匹配。如果 MCP Server 暴露的是 /mcp/sse,Ingress 的 path 写 /mcp 并配 rewrite-target 为 /,实际转发路径会变成 /sse,导致 404。正确做法是 path 写 /mcp,rewrite-target 不配或配为 /mcp。
MCP 工具调用超时。检查 MCP Server 到 TaoToken 的网络是否通,以及 Nacos 配置里的 timeout 是否太短。模型调用本身有延迟,timeout 建议不低于 30s。
排查顺序建议:先确认 Nacos 注册,再确认 Higress 路由,再确认鉴权,最后确认 MCP Server 内部逻辑。每一层都有独立的验证命令,不要跳层排查。
6. 长期运行与扩展:监控、灰度与统一 Key 轮换
架构跑起来之后,关注三件事:监控、灰度、Key 轮换。
监控方面,Nacos 控制台看服务实例数和配置版本,Higress 看路由匹配率和 MCP 连接数。关键指标是 MCP 推送延迟和工具调用成功率。如果 MCP Server 调用 TaoToken 的失败率上升,去 https://taotoken.net/console 看调用记录和余额。
灰度方面,利用 Nacos 的 metadata 做版本路由。新版本 MCP Server 注册时 metadata 里 mcp-version 设为 v2,Higress 路由规则里按 Header x-mcp-version 分流。验证没问题后,把旧版本实例下线。
统一 Key 轮换。在 Nacos 配置中心改 api-key,MCP Server 监听变更后热更新。如果 Key 是在 Higress 层注入的,改 Higress 插件配置即可。轮换期间新旧 Key 可以并存,Higress 插件的 allow 列表里同时放两个 Key,等所有 MCP Server 更新完再移除旧 Key。
扩展新 MCP Server 时,只需要启动实例并向 Nacos 注册,Higress 自动发现,客户端无感知。这就是 Nacos 加 Higress 承载 MCP Server 的核心价值:后端动态变化,入口保持稳定。
对于需要长期跑 Agent 任务的场景,Coding Plan 提供了更稳定的调用配额:https://taotoken.net/coding-plan 。接入文档在 https://taotoken.net/doc ,API Key 管理在 https://taotoken.net/api-keys 。模型调试用 https://taotoken.net/chat ,控制台在 https://taotoken.net/console 。
最后给一个实用技巧:在 Nacos 配置里加一个 mcp.health-check 开关,MCP Server 启动时读取,如果为 false 就不注册到 Nacos。这样在调试阶段可以避免半成品实例被网关路由到。上线前改成 true 再注册。这个开关在排查路由问题时特别有用,能快速排除实例本身的问题。