☰
一文讲懂2026年Agent三件套:A2A、MCP、Skills 配 TaoToken 的 settings.json 骨架
2026/9/27 19:40:29 网站建设 项目流程

1. 多 Agent 协作链路里,三件套为什么总在 Key 上卡住

如果你正在搭多 Agent 协作链路,大概率已经踩过这个坑:A2A 负责 Agent 之间通信,MCP 负责接工具和数据,Skills 负责把领域流程封装成可复用模块,三套东西各自跑得通,但一旦要统一走一个模型通道,配置就开始打架。A2A 的 AgentExecutor 里要调模型,MCP Server 里的分析工具要调模型,Skills 触发的执行步骤里还要调模型,结果就是三份 Key、三套 base_url、三种超时策略,改一处漏两处。

这篇面向正在搭建多 Agent 协作链路的开发者,把 A2A 通信、MCP 工具接入、Skills 复用这三件套如何统一走 TaoToken 的 Key/API 通道讲清楚,并给出一份可复制的settings.json配置骨架,最后用一次端到端调用验证三件套的最小闭环。核心检索词就三个:A2A、MCP、Skills,加上 TaoToken 的 settings.json 骨架。

先说清楚三者定位,避免概念混淆。A2A 是横向的 Agent 与 Agent 之间的协作标准,解决的是“谁来找谁干活”;MCP 是纵向的 Agent 与外部工具/数据之间的标准接口,解决的是“怎么调工具”;Skills 是内部的知识包,把领域流程知识封装成可复用模块,解决的是“这件事该怎么做”。三者工作在不同层次,是互补而非替代关系。目前最理想的落地结构是:多个 Agent 通过 A2A 协作,每个 Agent 内部用 Skills 指导自己怎么做,通过 MCP 连接需要用到的工具和数据。

问题在于,这三层里每一层都可能触发模型调用。A2A 的远程 Agent 收到任务后要理解意图,MCP 的分析工具要对文本做处理,Skills 的生成器要按模板产出内容。如果每层都单独配 Key,维护成本会指数级上升。统一走 TaoToken 的 Key/API 通道,就是把这三种调用收敛到一份配置里。

2. TaoToken 前置:一份 Key 打通三件套的调用通道

TaoToken 在这里扮演的角色是统一的模型调用入口。你不需要在 A2A 服务端、MCP Server、Skills 执行脚本里分别写三套凭证,而是让它们都读同一份settings.json,从里面取base_url和api_key。

先拿到 Key。访问控制台创建 API Key,地址是 https://taotoken.net/console ,创建后复制保存,后面配置里要用。如果你还没注册,官网入口在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,注册后在控制台里生成 Key 即可。

拿到 Key 之后,接入文档在 https://taotoken.net/doc ,里面写了 base_url 的写法和兼容的调用方式。API 根地址是 https://taotoken.net/api ,注意这个地址不带任何查询参数,配置时直接用它作为 base_url。

这里有个关键点:三件套统一走 TaoToken,不是让 TaoToken 去替代 A2A 或 MCP 协议本身,而是让这三层里所有需要调模型的地方,都指向同一个 OpenAI 兼容端点。A2A 的 AgentExecutor 里用 OpenAI SDK 调模型时,base_url填 TaoToken 的地址;MCP Server 里的分析工具同理;Skills 的脚本里如果调模型,也读同一份配置。这样你只需要维护一份 Key,轮换、限流、计费都在一个地方看。

如果你打算长期跑编码类 Agent 或常驻的 Agent 服务,可以看下 Coding Plan,地址是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_campaign=rewrite&utm_content= ,适合需要稳定调用额度的场景。只是临时验证模型连通性的话,用模型对话页面就够了,地址是 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_campaign=rewrite&utm_content= 。

3. 可复制配置:settings.json 骨架与三件套接入

下面这份settings.json是骨架,放在项目根目录,三件套的各个组件都从这里读配置。字段命名保持通用,你可以按自己项目的加载逻辑调整。

{ "taotoken": { "base_url": "https://taotoken.net/api", "api_key": "sk-你的Key", "default_model": "claude-sonnet-4-20250514", "timeout": 60, "max_retries": 2 }, "a2a": { "host": "127.0.0.1", "port": 10001, "agent_card_path": "/.well-known/agent.json", "model_ref": "taotoken" }, "mcp": { "transport": "stdio", "server_script": "./mcp/server.py", "model_ref": "taotoken" }, "skills": { "root": "./skills", "auto_load": true, "model_ref": "taotoken" } }

这份骨架的设计思路是:taotoken节点是唯一的凭证来源,a2a、mcp、skills三个节点都通过model_ref指向它。这样任何一层要调模型,都从taotoken节点取base_url和api_key,不需要各自硬编码。

A2A 服务端接入时,AgentExecutor 里初始化模型客户端这样写:

import json from openai import OpenAI with open("settings.json", "r", encoding="utf-8") as f: settings = json.load(f) cfg = settings["taotoken"] client = OpenAI( api_key=cfg["api_key"], base_url=cfg["base_url"], timeout=cfg["timeout"], max_retries=cfg["max_retries"], )

MCP Server 里的分析工具接入方式一致,读同一份配置:

import json import os from openai import OpenAI BASE_DIR = os.path.dirname(os.path.abspath(__file__)) with open(os.path.join(BASE_DIR, "..", "settings.json"), "r", encoding="utf-8") as f: settings = json.load(f) cfg = settings["taotoken"] client = OpenAI(api_key=cfg["api_key"], base_url=cfg["base_url"])

Skills 的脚本里如果调模型,同样读这份配置。Skills 本身是一个文件夹,核心是SKILL.md,里面用 YAML frontmatter 声明name和description,正文写执行步骤。当步骤里需要调模型时,脚本从settings.json取配置,而不是在脚本里写死 Key。

--- name: sentiment-report description: 对新闻文本做情感分析并生成 Markdown 报告。当用户要求分析舆情、生成情感报告时使用。 --- 你是情感分析报告生成器。请严格遵循以下步骤: 步骤 1: 读取输入文本。 步骤 2: 调用模型做情感分析,输出总体倾向、正面因素、负面因素、影响、结论。 步骤 3: 按 assets/report-template.md 的结构填充内容。 步骤 4: 将完成的报告作为单个 Markdown 文档返回。

这样三件套的模型调用都收敛到一份配置,改 Key 只改一处。

4. 验证请求:一次端到端调用跑通最小闭环

配置写好后,用一次端到端调用验证三件套是否都走通了 TaoToken 通道。验证动作分三步:先确认模型通道连通,再确认 MCP 工具能调模型,最后确认 A2A 任务能触发 Skills 并返回结果。

第一步,直接验证 TaoToken 通道。用 curl 发一个最小请求:

curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的Key" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": "回复 ok"}], "max_tokens": 16 }'

返回里能看到choices[0].message.content就说明通道通了。如果返回 401,检查 Key 是否复制完整;返回 404,检查 base_url 是否写成了带/v1的完整路径,OpenAI SDK 会自动补/v1,所以 base_url 填https://taotoken.net/api即可。

第二步,验证 MCP 工具调模型。启动 MCP Server,用客户端连上去,调用一个会触发模型的分析工具:

import asyncio from mcp import ClientSession, StdioServerParameters from mcp.client.stdio import stdio_client async def main(): params = StdioServerParameters( command="python", args=["./mcp/server.py"], env=None, ) async with stdio_client(params) as (read, write): async with ClientSession(read, write) as session: await session.initialize() tools = await session.list_tools() print("可用工具:", [t.name for t in tools.tools]) result = await session.call_tool( "analyze_sentiment", {"text": "这款产品体验很好,物流也快。"} ) print("工具返回:", result.content[0].text) asyncio.run(main())

如果工具返回了报告文件路径,说明 MCP Server 里的模型调用走通了 TaoToken 通道。

第三步,验证 A2A 任务触发 Skills。启动 A2A 服务端,用客户端发一条消息,观察 Task 状态流转:

import asyncio import httpx from a2a.client import A2ACardResolver, ClientConfig, create_client from a2a.helpers import new_text_message from a2a.types.a2a_pb2 import Role, SendMessageRequest, Task async def main(): async with httpx.AsyncClient() as http: resolver = A2ACardResolver( httpx_client=http, base_url="http://127.0.0.1:10001", ) card = await resolver.get_agent_card() print("读到 Agent Card:", card.name) client = await create_client( agent=card, client_config=ClientConfig(streaming=False), ) msg = new_text_message( text="分析这条新闻的情感:新产品发布后用户反馈积极。", role=Role.ROLE_USER, ) request = SendMessageRequest(message=msg) async for chunk in client.send_message(request): if isinstance(chunk, Task): print("Task 状态:", chunk.status.state) for artifact in chunk.artifacts: for part in artifact.parts: if part.text: print("Artifact:", part.text) await client.close() asyncio.run(main())

成功的结果是:Agent Card 能读到,Task 状态从WORKING走到COMPLETED,Artifact 里返回了分析结果。这条链路里,A2A 负责通信,MCP 负责工具调用,Skills 负责流程指导,三者都通过settings.json里的taotoken节点调模型。

5. 本篇常见错排查

配置三件套统一走 TaoToken 时,报错集中在几个地方,逐个说。

第一个常见错是401 Unauthorized。原因通常是 Key 没读到,或者读到了但带了多余空格。检查settings.json里api_key字段,确认没有换行和空格。如果 Key 是从环境变量注入的,确认环境变量名和代码里读的一致。另外注意,A2A、MCP、Skills 三层如果各自读配置,要确认它们读的是同一份文件,而不是各自目录下的副本。

第二个常见错是404 Not Found。这个多半是base_url写错了。OpenAI SDK 会自动在 base_url 后面补/v1/chat/completions,所以 base_url 应该填https://taotoken.net/api,不要填成https://taotoken.net/api/v1,否则会变成/api/v1/v1/chat/completions。如果你用的是非 OpenAI SDK 的 HTTP 客户端,那就需要手动拼完整路径https://taotoken.net/api/v1/chat/completions。

第三个常见错是 MCP Server 启动后工具列表为空。检查server.py里mcp.run(transport="stdio")是否在__main__里执行,以及客户端StdioServerParameters的command和args是否指向正确的 Python 解释器和脚本路径。Windows 下路径用反斜杠时注意转义,或者直接用正斜杠。

第四个常见错是 A2A 任务卡在INPUT_REQUIRED不继续。这是设计如此,不是报错。A2A 的 Task 在需要用户确认时会返回INPUT_REQUIRED状态,客户端要带着同一个task_id和context_id再发一条确认消息,任务才会继续。如果你在验证时看到这个状态,按提示发确认消息即可。

第五个常见错是 Skills 不触发。Skills 的触发依赖SKILL.md里 frontmatter 的description字段,模型根据 description 判断是否加载该 Skill。如果 description 写得太泛,比如只写“处理文档”,模型可能匹配不上。把触发条件写具体,比如“当用户要求分析舆情、生成情感报告时使用”,命中率会高很多。

排障时如果涉及 Key 和接入方式,优先看接入文档 https://taotoken.net/doc ,里面有 base_url 和鉴权的完整说明。需要重新生成 Key 就去 API Keys 页面 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_campaign=rewrite&utm_content= 。

6. 三件套统一通道后的下一步

把 A2A、MCP、Skills 的模型调用收敛到一份settings.json之后,维护成本会明显下降。接下来可以做的几件事:一是把settings.json里的default_model抽成环境变量,方便在不同环境切换模型;二是给 A2A 的 TaskStore 换成持久化实现,避免服务重启后任务状态丢失;三是把 Skills 的related_skills字段用起来,让 Agent 在解决复杂问题时能沿着技能图谱跳转。

如果你还在选模型阶段,可以先用模型对话页面 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_campaign=rewrite&utm_content= 试几个模型,确认哪个在 A2A 任务理解和 MCP 工具调用上表现更稳,再写进settings.json的default_model。长期跑编码类 Agent 的话,Coding Plan https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_campaign=rewrite&utm_content= 的额度更适合常驻服务。

最后提醒一个实操细节:三件套里如果有多层嵌套调用,比如 A2A 任务触发 MCP 工具、MCP 工具又触发 Skills 脚本,注意给每层设置合理的超时。settings.json里的timeout是单次模型调用的超时,嵌套调用时总耗时是各层之和,别让最外层先超时了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询