Agent 互操作协议之争:MCP、A2A 与工具调用标准的三条路线
Agent 生态在 2026 年出现了一个有点尴尬的局面:每家厂商都说自己”支持开放协议”,但把 A 家的 Agent 接到 B 家的运行时上,仍然要写一层适配代码。所谓”协议之争”,争的不是某个 JSON 字段,而是谁来定义 Agent 边界的切法。
本文不预测谁赢,而是把当前几条主要路线拆开:它们各自解决什么问题、在什么层次上重叠、以及一个正在做 Agent 产品的团队应该在哪一层投入、在哪一层保持可替换。以下涉及的时间与采纳情况均为公开信息整理与个人判断,具体数字仅作参考。
一、先分清三个不同的”互操作”
讨论协议时最大的混乱,是把三件事混成一件。它们的耦合点完全不同:
| 层次 | 解决的问题 | 代表方案 | 谁是”客户端” |
|---|---|---|---|
| 工具接入层 | Agent 如何发现并调用外部能力 | MCP、各家 plugin/tool 规范 | 模型运行时 |
| Agent 间协作层 | Agent 如何把任务委托给另一个 Agent | A2A 类协议、任务/消息信封 | 另一个 Agent |
| 模型 API 层 | 请求/响应报文长什么样 | OpenAI 兼容格式、Anthropic Messages | 应用代码 |
三层可以任意组合。你完全可以用 Anthropic 的 Messages API 跑一个挂了十个 MCP server 的 Agent,再用某种 Agent 间协议把子任务派给同事团队的服务。反过来,“我们支持 MCP” 这句话对模型 API 层的可移植性毫无贡献——这是最常见的误读。
可复用的判断:当有人说”我们兼容开放协议”,先问是哪一层。三层里只兼容一层的产品,迁移成本仍然接近从零重写。
二、工具接入层:MCP 事实上赢了半场
MCP 的设计优势不在技术新颖,而在它把”工具”从应用代码里拆了出来,变成一个可独立部署、独立鉴权、独立版本管理的进程。这一刀切得很准,因为它对应了真实的组织边界:写数据库查询工具的人,和写 Agent 编排逻辑的人,往往不是同一批。
它赢的是”半场”,因为剩下半场的问题没解决:
- 权限粒度。协议层面定义了工具的调用契约,但”这个 Agent 能不能调这个工具、能调几次、在什么上下文下能调”,仍然是各家运行时自己实现。参见我们对 Agent 权限体系设计 的展开。
- 工具描述质量不可移植。同一个 MCP server 挂到不同模型上,效果差异可能比换模型还大,因为工具描述的写法高度依赖目标模型的偏好。
- 多 server 的上下文膨胀。挂十个 server 意味着几十个工具定义常驻上下文,token 成本和选择准确率同时恶化。
所以实际情况是:MCP 解决了分发问题(工具能被装上),没解决治理问题(工具被正确地用)。这也是为什么各家运行时仍在 MCP 之上加自己的一层。
三、Agent 间协作层:问题定义还没收敛
工具接入层之所以能收敛,是因为”调用一个函数拿到结果”这个语义足够窄。Agent 间协作没有这种运气——它至少要回答四个彼此独立的问题:
- 任务信封:一个任务的描述、输入、约束、截止条件怎么表达?
- 状态与长任务:Agent B 执行两小时,A 怎么轮询、怎么收中间进度、怎么取消?
- 身份与信任:A 凭什么相信 B 的输出?B 凭什么接受 A 的指令?跨组织时这是个真问题。
- 结果结构:返回自然语言、结构化对象,还是一份可审计的轨迹?
现有各种方案在 1 和 2 上有不少相似之处(本质是异步任务队列的 RPC 化),但在 3 和 4 上分歧很大。而 3、4 恰恰是决定协议能否跨组织用的关键——同一家公司内部,用 HTTP + 约定好的 JSON 就够了,根本不需要协议。
可操作的结论:如果你的 Agent 协作全部发生在自己的基础设施内,现在采用任何 Agent 间协议都是过度投资。把任务信封定义成自己的内部 schema,用 Agent 状态机设计 里那套显式状态管理,比追协议更有价值。等到确实要跟外部 Agent 打交道时再加适配层,成本不会更高。
四、模型 API 层:兼容格式是妥协不是标准
OpenAI 兼容格式变成了事实网关语言,原因很实际——工具链存量太大。但它作为”标准”有明显问题:它是某一家产品在某个时间点的实现细节被固化下来的结果,而不是设计出来的协议。
具体表现:
- 推理类参数(thinking budget、reasoning effort)在兼容格式里没有位置,各家网关只能塞进
extra_body之类的口袋字段 - 缓存控制、引用(citations)、多模态的表达各家差异很大
- 流式事件的粒度不同,SSE 解析逻辑无法直接复用
这意味着”改 base_url 就能换模型”只在最简单的对话场景成立。一旦你用到工具调用、缓存、结构化输出,跨家迁移仍然要改代码。这层的现实做法不是等标准,而是自己做抽象:
# 在应用和各家 SDK 之间放一层薄适配,只抽象你真正用到的能力
class ChatRequest:
messages: list
tools: list | None = None
max_output_tokens: int = 4096
reasoning: str | None = None # "low" | "medium" | "high",各家自行映射
cache_hint: bool = False # 由适配层决定翻译成 cache_control 还是 ttl 参数
class Provider(Protocol):
def chat(self, req: ChatRequest) -> ChatResponse: ...
def stream(self, req: ChatRequest) -> Iterator[ChatDelta]: ...
# 关键纪律:适配层只暴露"所有目标厂商都能表达"的能力交集,
# 厂商独有能力走显式的 escape hatch,调用处能一眼看出自己被锁定了。
这层薄适配通常两三百行就够,比等一个统一标准落地现实得多。相关取舍我们在 OpenAI 兼容格式与 Anthropic 协议的差异 里做过更细的对比。
五、协议竞争的真正变量:谁控制分发
技术上三条路线并不互斥,但商业上它们抢的是同一件东西——开发者默认写代码时想到的那个接口。历史上这类竞争的结果,通常不取决于协议本身的优劣,而取决于三件事:
- 谁的实现最容易跑起来。一个 15 分钟能接通的 SDK,胜过一份写得更严谨的规范。
- 谁能带来现成的对端。协议的价值等于对端数量的平方级函数,早期生态补贴比技术设计更有决定性。
- 谁在模型侧有议价权。能让自家模型对某种工具描述格式”训练得更好”的一方,天然占优——这不是开放协议能抹平的。
第三点值得特别注意:即使协议是开放的,模型对协议的执行质量不是开放的。同样的工具 schema,不同模型的调用准确率差异可以到两位数百分点。这让”协议中立”在实践中打了折扣。
六、给正在做决策的团队的三条线
综合下来,我的建议按投入优先级排:
- 工具接入层:跟进,但别裸奔。用 MCP 把工具拆出来是对的,收益是清晰的边界和复用。但在 MCP 之上必须自己加权限与预算控制——协议不会替你做这件事,参见 Agent 沙箱设计。
- Agent 协作层:观望,先做内部 schema。没有跨组织需求就别引入。把任务定义、状态流转、重试语义写成自己能演进的结构,将来适配任何协议都只是加一层翻译。
- 模型 API 层:自己抽象,不押注任何一家的”兼容”。两三百行的 Provider 接口,是这三层里性价比最高的一笔投入,也是多模型路由和故障切换的前提。
还有一条元判断:协议标准化程度越低的层次,越应该保留自己的抽象;标准化程度越高的层次,越应该直接用现成的。当下的分布恰好是工具接入层最收敛、Agent 协作层最发散,投入比例也应该按这个来。
七、未来一年可能的观察点
以下都是基于公开信息的个人判断,不构成预测:
- 工具接入层的竞争大概率从”协议”转到”注册表与信任”——工具从哪来、谁签名、怎么审计,会比调用格式更重要
- Agent 协作层可能不会出现单一赢家,而是在特定垂直场景(比如企业内部审批流、跨公司采购)先形成局部约定
- 模型 API 层的碎片化短期不会缓解,因为新能力的发布速度快于标准化速度,这是结构性的
对开发者来说,好消息是:这三层的变化都发生在你自己抽象层的外侧。只要那层抽象存在,协议之争的结果对你的代码影响有限。