使用 AgentScope 接入 Nacos 注册的 A2A Agent 与 MCP 服务:TaoToken 统一 Key 配置实战
1. 多服务注册之后鉴权为什么最先崩AgentScope 里跑通一个 A2A Agent 不难难的是当 Nacos 上同时挂着 A2A Agent、MCP Server、还有几个内部工具服务时每个服务一套 Key、一套 base_url、一套鉴权头配置散落在各个脚本里。我试过最典型的翻车场景A2A Agent 能调通MCP 工具也能列出来但一旦让 Agent 在一次对话里同时用两者就会出现 401 和 404 交替报错——因为 A2A 走的是 Nacos 服务发现拿到的 AgentCardMCP 走的是本地 streamable_http 客户端两条链路的凭证来源根本不是同一个地方。这篇要解决的就是这件事用 TaoToken 的统一 Key 作为模型侧的唯一凭证出口让 AgentScope 通过 Nacos 发现 A2A Agent 和 MCP 服务时模型调用这一层不再分散配置。适合已经在用 AgentScope、Nacos 3.x并且被多服务鉴权搞烦的开发者。核心检索词就三个AgentScope 接入 Nacos、A2A Agent 调用、MCP 服务统一 Key。整条链路是这样的Nacos 作为注册中心A2A Agent 和 MCP Server 都注册进去AgentScope 侧通过 NacosAgentCardResolver 拿 AgentCard通过 MCP Router 拿工具列表而所有需要调模型的地方统一指向 TaoToken 的 API 地址和一把 Key。这样你换模型、换额度、看消耗都只在一个地方动。2. TaoToken 前置一把 Key 管住模型出口TaoToken 在这里的角色不是替代 Nacos也不是替代 AgentScope而是把「模型调用」这一层的凭证收敛掉。Nacos 负责服务发现AgentScope 负责编排TaoToken 负责模型访问的统一入口。三者职责不重叠这点先理清楚后面配置才不会乱。你需要先拿到一把 Key。进入控制台创建 API Key地址是 https://taotoken.net/api-keys 创建后复制保存后面 config.toml 和代码里都用它。模型对话调试可以在 https://taotoken.net/models 里先验证 Key 是否可用避免配到一半发现是 Key 的问题。API 的基础地址是 https://taotoken.net/api 注意这个地址不带任何查询参数直接作为 base_url 使用。如果你用的是 OpenAI 兼容风格的客户端通常需要在后面拼 /v1具体看你用的 SDK。AgentScope 和 Strands 这类框架一般走 LiteLLM 兼容层base_url 填 https://taotoken.net/api 即可模型名按 TaoToken 文档里支持的写。注意不要把 Key 硬编码进提交到仓库的脚本里。本地测试可以用环境变量生产环境建议走密钥管理。下面示例里为了直观会写在配置中你实际用时替换成自己的读取方式。3. 可复制配置config.toml 骨架与 Nacos 参数先给 AgentScope 侧的 config.toml 骨架。这个文件的作用是把模型出口、Nacos 地址、MCP Router 地址集中管理避免散落在多个 py 文件里。[model] provider openai model_name qwen3-vl base_url https://taotoken.net/api api_key sk-你的TaoTokenKey timeout 60 [nacos] server_addresses http://localhost:8848 namespace public username nacos password nacos [a2a] remote_agent_name weather-agent [mcp] router_url http://localhost:8000/mcp transport streamable_httpNacos 侧的关键参数说明一下。server_addresses 是 Nacos 主服务端口默认 8848namespace 用 public 表示默认命名空间A2A Agent 和 MCP 服务必须注册在同一个命名空间下才能被同一套 resolver 发现。username/password 是 Nacos 开启鉴权后的凭证如果本地 standalone 没开鉴权可以留空但生产环境一定要开。A2A Agent 注册到 Nacos 时AgentCard 里的 url 字段要填成其他客户端能访问到的地址。本地测试常见坑是填了 127.0.0.1结果容器内解析不到。如果你在 Docker 里跑用宿主机可达的域名或 IP比如 default.test.com:9000 这种。MCP 服务这边用 Nacos MCP Wrapper 注册时SERVER_ADDR 指向 Nacos 地址NAMESPACE 和上面 config.toml 保持一致。启动时如果报找不到注册接口通常是 Nacos 版本或 wrapper 版本不匹配确认 Nacos 是 3.1.x 且 wrapper 是最新版重试一次一般就能注册成功。MCP Router 用 router 模式启动环境变量这样设export NACOS_ADDR127.0.0.1:8848 export NACOS_USERNAMEnacos export NACOS_PASSWORDnacos export TRANSPORT_TYPEstreamable_http uvx nacos-mcp-routerlatest启动后它监听 8000 端口的 /mcp这就是 config.toml 里 router_url 的来源。4. 验证请求A2A 与 MCP 端到端跑一次先验证 A2A 链路。用 AgentScope 的 NacosAgentCardResolver 从 Nacos 拿 AgentCard再创建 A2AAgent 发消息。模型出口走 TaoToken。import asyncio from v2.nacos import ClientConfig from agentscope.a2a import NacosAgentCardResolver from agentscope.agent import A2AAgent from agentscope.message import Msg async def main(): agent_card await NacosAgentCardResolver( remote_agent_nameweather-agent, nacos_client_configClientConfig( server_addresseshttp://localhost:8848, ), ).get_agent_card() print(fAgentCard: {agent_card.name}) agent A2AAgent(agent_cardagent_card) msg Msg(nameuser, contentwhat is the weather in beijing?, roleuser) res await agent(msg) print(res.content) if __name__ __main__: asyncio.run(main())跑通的话会先打印 AgentCard 名字再打印天气结果。如果卡在 get_agent_card 报 404说明 Nacos 里没找到这个 agent用下面的 curl 确认注册状态curl -X GET 127.0.0.1:8848/nacos/v3/admin/ai/a2a?namespaceIdpublicagentNameweather-agent返回 code 为 0 且 data 里有 skills 和 url说明注册正常。url 字段要和你实际能访问的地址一致。再验证 MCP 链路。把 MCP Router 注册为 Agent 的工具模型同样走 TaoToken。from mcp.client.streamable_http import streamable_http_client from strands import Agent from strands.tools.mcp import MCPClient from strands.models.litellm import LiteLLMModel mcp_client MCPClient( lambda: streamable_http_client(http://localhost:8000/mcp) ) model LiteLLMModel( model_idqwen3-vl, client_args{ api_key: sk-你的TaoTokenKey, base_url: https://taotoken.net/api, use_litellm_proxy: True, }, ) agent Agent( modelmodel, namePersonal Assistant, descriptionA personal assistant for the user., tools[mcp_client], callback_handlerNone, ) resp agent(Please tell me the time using time-server.) print(resp)这里有个实测经验提示词要明确指向 Nacos 里注册的 MCP 服务名比如 time-server。如果只说「现在几点」Agent 可能不去调 MCP 工具而是直接编一个时间。带上服务名后工具调用才会被触发。两条链路都跑通后你可以在 TaoToken 控制台看这次验证消耗了多少 token确认 Key 和额度都正常。5. 本篇常见错排查AgentCard 拿不到报 404 或空对象。先确认 Nacos 命名空间和 config.toml 里一致再确认 agentName 拼写。Nacos 3.1 的 A2A 查询接口路径是 /nacos/v3/admin/ai/a2a版本低于 3.1 没有这个接口。A2A 调用返回连接超时。AgentCard 里的 url 填的是 127.0.0.1但调用方在容器或另一台机器上。改成双方都能解析的地址或者用 host 网络模式跑。MCP 工具列表为空。MCP Router 没起来或者 router_url 端口不对。默认是 8000/mcp确认 uvx 启动后没有报端口占用。另外 Nacos 里 MCP 服务的命名空间要和 Router 的 NACOS_ADDR 指向的实例一致。模型调用报 401。Key 错了或者 base_url 拼错。TaoToken 的 base_url 是 https://taotoken.net/api不要多加 /v1 除非你的 SDK 明确要求。Key 去 https://taotoken.net/api-keys 重新复制一次注意前后空格。MCP 注册时启动报错找不到接口。这是 Nacos MCP Wrapper 和 Nacos 版本不匹配的典型表现属于正常现象重试一次通常能注册成功。如果持续失败检查 Nacos 是否开启了鉴权而 wrapper 没传用户名密码。A2A 和 MCP 同时用时报错交替。大概率是两套客户端各自读了不同的 base_url 或 Key。把模型出口统一到 config.toml 的 [model] 段代码里不要再单独写 client_args。6. 统一 Key 之后配置该往哪收走到这一步你的 AgentScope 应该已经能通过 Nacos 发现 A2A Agent、通过 MCP Router 调 MCP 工具而模型调用全部指向 TaoToken 的一把 Key。接下来要做的不是继续加服务而是把配置收口。如果你还在本地调试阶段建议把 Key 和 base_url 抽成环境变量config.toml 里只留引用。接入文档在 https://taotoken.net/doc 里面有不同 SDK 的 base_url 拼接方式遇到 404 先查这里。模型对话验证用 https://taotoken.net/models 能快速确认 Key 和模型名是否匹配。长期跑编码类 Agent 或者多 Agent 编排的话Coding Plan 比按量更划算地址是 https://taotoken.net/coding-plan 适合这种持续调模型的场景。控制台在 https://taotoken.net/console 可以看每个 Key 的消耗明细方便你判断是 A2A 链路费 token 还是 MCP 工具调用费 token。最后留一个实用技巧Nacos 里注册的 A2A Agent 和 MCP 服务建议用命名空间做环境隔离dev 和 prod 各一个 namespaceconfig.toml 里只改 namespace 一个字段就能切换环境不用动其他配置。这样统一 Key 加统一命名空间多服务鉴权分散的问题基本就收住了。