首页›文章›从工具调用到协议互联:MCP与A2A如何定义AI Agent的工程边界

从工具调用到协议互联:MCP与A2A如何定义AI Agent的工程边界

人工智能 · 生成式AI与大模型2026-10-020次浏览0 个评论

摘要

2025年,AI Agent从聊天玩具进化为能自主执行任务的智能体。工具生态的爆发式增长与集成方式的手工化之间,存在一条结构性裂隙——每接入一个新工具就要写一套定制适配,Agent之间也难以有效协作。Anthropic的MCP(Model Context Protocol)试图用一套"USB-C"标准打通Agent与外部工具及数据的连接通道;Google的A2A(Agent-to-Agent Protocol)则试图让Agent之间像互联网节点一样自主发现、协商与配合。OpenAI、Salesforce、SAP等巨头纷纷入局——协议之争已经从学术讨论升格为产业基础设施的角力。本文围绕MCP与A2A两个核心协议展开工程级深度分析:回顾从Function Calling到MCP的演进脉络,解构两个协议的架构设计、交互模型与生态现状,对比二者在"垂直连接"与"水平连接"上的互补定位,剖析安全边界、状态一致性、服务发现、错误恢复四大落地难题,并给出面向开发者的架构决策框架。文末对"Agent Web"的未来图景、自动化能力协商与任务调度市场机制做出预判,强调协议标准化将是Agent从演示走向生产的决定性杠杆。

1. 引言:当Agent不再是聊天玩具

2025年7月,OpenAI将此前分散的Operator(网页交互)、Deep Research(信息整合)与ChatGPT对话能力合并为一套统一的ChatGPT Agent。与此同时,早于2025年4月由Google推出的A2A(Agent-to-Agent)协议(后于6月捐赠给Linux基金会)已在产业界逐步铺开,旨在让不同平台、不同厂商开发的Agent能够互相对话。Anthropic的MCP协议服务器数量也已突破23000个,生态增速肉眼可见。三方面信号共同指向同一个事实:AI Agent已经过了"说几句漂亮话"的阶段,正走进需要规模、需要集成、需要协议的工程深水区。

在这场变革里,最隐性的矛盾却最容易被忽视:工具越来越丰富,集成方式却越来越手工化。一个典型的内部场景中,团队内部有十几个微服务,外面接了十几个SaaS API,再叠加大模型厂商的搜索、代码执行、文件分析能力——每接入一个新工具,就要写一套自定义的HTTP封装、一个prompt模板、一个错误处理钩子。这正是n×m的困局:n个工具,每种都需要m种定制适配。它让Agent的能力天花板被"胶水代码"锁死,也让开发者把80%的时间花在了重复造轮子上。

更大的麻烦在后面。当企业中不止一个Agent在运行时——客服Agent、数据分析Agent、合规审查Agent、代码生成Agent——它们之间又该如何协作?如果Agent A需要Agent B的分析结果,B又需要调用Agent C的工具集,今天的答案多半是:再写一坨编排脚本。这种点对点堆叠在原型阶段勉强能用,一旦团队、厂商、接口数量放缩到生产规模,便会暴露出可维护性、安全边界、状态同步等一系列工程塌方。

协议的价值就在于此。它不是某个Agent的"超能力",而是整个生态的"通用语法"。MCP和A2A就是两个在2024-2025年涌现的关键语法体系。理解它们的工程内涵,是判断Agent架构选型、避免技术债务的第一块基石。

2. 工具调用的黎明:从Function Calling到插件宇宙

2.1 Function Calling的诞生:LLM第一次"触达"外部世界

2023年6月,OpenAI在GPT-4的更新中首次推出Function Calling能力。核心思想很简单:在对话API的functions字段里定义一组JSON Schema,模型在推理过程中判断是否"需要"调用其中某个函数,并生成结构化参数。API把模型输出解析为可执行的函数调用对象,再由外部代码执行并返回结果,模型拿到返回值继续对话。

从工程角度看,这是一次从"文本到文本"到"文本到动作"的关键跃迁。LLM不再只是模仿人类语言,它开始基于结构化契约(JSON Schema)编排程序行为。Function Calling的野心很大,但它的设计也相当克制:OpenAI只负责"决定调用什么函数、参数是什么",至于这些函数背后是什么服务、怎么连接、怎么鉴权,完全是开发者的责任。

这种半开放设计在初期是合理的。它给了社区极大的自由度,也催生了两个繁荣方向:Plugin生态和编排框架。

2.2 Plugin与胶水层的繁荣与局限

OpenAI的Plugins体系(2023年3月发布)试图提供一个标准化的接入方式:服务方写一个openapi.yaml描述自己的接口,平台自动将其包装为Plugin。但Plugin在实际操作中要求对接OpenAI的Plugin Store审批、托管、认证流程,灵活性受到很大限制。开发者很快发现,真正"好用"的集成方式是扔掉Plugin,直接用Function Calling + 业务代码自己搭,这让Plugin体系始终没能形成大规模生态。

框架层的故事恰好相反。LangChain(2022年10月发布)和LlamaIndex(同期)迅速成为Agent集成的"胶水层"巨头。它们提供了工具发现、工具调用链、ReAct推理循环、RAG数据管道等抽象,让开发者可以用几行代码把LLM和各种工具串在一起。

但繁荣的另一面是问题。

集成碎片化首当其冲。每个工具在LangChain里都是一个BaseTool子类,需要单独实现name、description、args_schema和_run方法。这意味着每接入一个新工具,就要写一块Python胶水。LlamaIndex虽然提供了ToolSpec接口,本质上也摆脱不了"每个工具定制实现"的模式。当初始工具数量为3-5个时,这种模式无伤大雅;当工具规模膨胀到几十个、上百个、跨团队跨组织共享时,维护成本呈指数级增长。

安全边界模糊紧随其后。谁来决定模型能调用哪个工具?模型本身不是可信执行体——prompt injection可以让模型相信一个恶意工具是"必要的",然后泄露数据。Function Calling时代的答案是:开发者在编排层手动写白名单。但这种做法缺乏标准化,不同项目各自为政,审计与合规无从谈起。一个真实的案例是:某SaaS产品允许LLM通过工具查询用户薪资数据,攻击者通过构造特殊prompt让模型越过权限检查,最终导致数据泄露。如果工具权限模型从一开始就不标准化,安全就永远是事后补丁。

再次是上下文管理混乱。当工具链变长后,工具的描述语占用了越来越多的上下文窗口。每个工具都需要一段JSON Schema + 功能说明塞进prompt里,模型逐渐迷失在冗长的工具目录中,调用精度下降。开发者被迫自行开发工具筛选、工具分组、工具摘要机制——这些恰恰应该是协议层该解决的问题。

2.3 n×m困局:碎片化的本质是缺乏协议

回顾这一阶段,n个工具与m个Agent/应用的集成关系,是一个典型的组合爆炸问题。每个新工具都要为每个Agent重写一次适配层,每个Agent的能力也无法被其他Agent复用。

解决这类困局的历史经验很清晰:引入协议。HTTP统一了网络传输,REST统一了API交互,USB-C统一了外设接口。工具集成需要一个"通信与描述的共同约定"。这就是2024年11月Anthropic推出MCP后引发广泛关注的原因。

3. MCP协议解构:Anthropic的"USB-C"蓝图

3.1 发布背景与核心定位

2024年11月,Anthropic正式开源Model Context Protocol(MCP)。官方定位极为直白:为Agent提供一种标准化的方式,连接到任何外部数据或工具。其命名"Context"已经隐含了核心意图:不仅是让Agent"调用"工具,更是让Agent能够"发现、理解、获取"与工具相关的上下文信息——这其实比一次性的函数调用更进一步。

MCP不是第一个尝试解决这个问题的方案。如果把它放在历史位置上,它相当于从Fragmented Integration走向Standardized Integration的转折点。之所以说它是"USB-C"蓝图,是因为它的设计目标不是定义某个特定工具的行为,而是定义所有工具如何被描述、如何被连接、如何被发现的元协议。

3.2 核心抽象:Tool、Resource、Prompt

MCP的协议模型由三个核心概念构成:

  • Tool(工具):可执行的外部能力,从简单的计算器到复杂的数据分析函数。每个工具通过JSON Schema描述其输入参数和输出结构,LLM在调用前可以基于Schema理解语义。
  • Resource(资源):静态或近静态的数据上下文,比如文件内容、数据库状态、API响应的快照。资源可以被Agent按需读取或订阅更新,为推理提供必要的上下文。
  • Prompt(提示):预定义的系统级指令模板,帮助Agent在特定场景下正确调用工具或访问资源。

这种三元划分非常实用。工具解决"做什么"的问题,资源解决"基于什么做"的问题,提示解决"怎么做"的问题。三者共同构成一个完整的Agent-世界交互语义空间。

3.3 架构四元组:Host、Client、Server、Tool

MCP的架构由四种角色组成:

flowchart LR
    subgraph Host["Host主机环境"]
        A["LLM应用\n(Claude Desktop / Cursor / 定制Agent)"]
        B["MCP Client"]
    end
    subgraph Server["MCP Server"]
        C["工具集合\n工具A / 工具B / ..."]
        D["Resource目录\n文件/数据库/API"]
    end
    A -->|"1. 初始化连接"| B
    B -->|"2. 能力发现\ntools/list, resources/list"| Server
    Server -->|"3. 返回Schema\n工具元数据 + 参数定义"| B
    B -->|"4. 工具调用\ntools/call"| Server
    Server -->|"5. 执行结果\n结构化响应"| B
    B -->|"6. 注入上下文\n上传给LLM继续对话"| A

上图展示了MCP一条完整交互的六个步骤。Host是Agent运行的总控环境——比如Claude桌面应用、IDE插件、或者一个自研的Agent服务。Host内部嵌有一个MCP Client,负责按照协议格式与外部MCP Server建立连接、发现能力、发起调用。MCP Server则是工具提供方的适配器:它持有一组具体的Tool和Resource实现,对上暴露标准化的JSON-RPC 2.0接口。

这张架构图与2023年的Plugin/Function Calling模式有本质区别。在旧模式下,Agent和工具之间是"直接集成"——Agent代码里直接import函数、发HTTP请求。在MCP模式下,Agent和工具之间是"协议集成"——双方通过标准消息格式握手、协商、调用。这种间接层带来了可复用性:一个MCP Server可以被多个Host同时连接,一个Host也可以同时管理多个Server。协议本身替代了胶水代码。

3.4 传输层:stdio与SSE的权衡

MCP支持两种传输层模式:

  • stdio(标准输入输出):Host通过启动子进程的方式与本地的MCP Server通信。消息通过进程的标准输入输出管道以JSON-RPC 2.0格式传输。这种模式适合本地工具,系统开销低、延迟可控、安全性较高(受操作系统进程隔离保护)。Claude Desktop早期版本采用的就是stdio模式,用来连接本地文件系统和Cmd工具。
  • SSE(Server-Sent Events,或HTTP长连接):Host通过HTTP协议与远程MCP Server通信,利用SSE实现服务器向客户端的推送能力。这种模式适合远程服务、SaaS集成和分布式部署,一个远程MCP Server可以被全球任何Host访问。

两种模式在协议语义上完全等价,区别仅在于传输介质和部署拓扑。这种设计让MCP既能覆盖本地开发场景(低延迟、高安全),又能无缝延伸到云端部署(可扩展、可共享)。

3.5 能力发现:Schema即契约

MCP最具工程价值的设计之一,是其自动发现机制。Host连接到Server后,会发送tools/list和resources/list请求,Server返回一组JSON Schema描述。每一个工具都有:

  • 名称(name)
  • 人类可读描述(description)
  • 参数Schema(JSON Schema,约束类型、约束范围、必填字段)
  • 输入示例(可选,用于模型Few-Shot)

模型拿到这些Schema后,可以直接在推理过程中"理解"工具的语义和用法——不再需要开发者手写长篇说明塞进prompt。当工具数量增多时,Host可以按需过滤、分组、摘要,上下文管理问题被协议层吸收。这种"发现即契约"的机制,正是解决n×m困局的关键:工具开发者只需要写好Schema,接入成本从"写一套适配代码"降到"启动一个MCP Server"。

不过MCP不是银弹。它解决了Agent-工具的连接问题,却没有解决Agent与Agent之间的协作问题。当两个Agent需要互相委托任务、共享结果时,MCP的"Host调Server"模型就不再适用了。这正是A2A要填补的空白。

4. MCP的工程化实践:服务端开发的攻防

MCP协议的工程落地,不只是"启动一个JSON-RPC服务器"那么简单。真正把MCP Server推到生产环境,需要处理消息生命周期管理、有状态会话、权限边界和错误降级四个核心维度。Anthropic在MCP的SDK中提供了基础辅助,但高可用、可审计、可扩展的服务端设计,仍然依赖开发者的工程决断。

4.1 一条JSON-RPC 2.0消息的生命周期

MCP的所有交互都承载在JSON-RPC 2.0之上。理解消息在全栈中的流动,是定位问题和设计扩展性的前提:

  1. 初始化握手:Host的Client向Server发送initialize请求,携带协议版本、交换能力声明。Server确认后返回自身支持的能力列表(如是否支持streaming、是否支持progress notification)。这一步的时延通常<10ms(stdio模式)或受网络限制(SSE模式)。
  2. 能力发现:Client发送tools/list、resources/list、prompts/list,Server返回结构化元数据。这个阶段性调用通常被Host缓存,避免每次对话都重新拉取。
  3. 工具调用:LLM决定调用某个工具时,Client生成tools/call RPC请求。注意这里的调用不是同步阻塞等待——MCP允许Server返回progress通知来报告长任务进度,Host可以在等待期间保持与用户的交互。
  4. 响应与错误:工具执行完毕后,Server返回JSON-RPC的result或error载荷。错误码体系复用了JSON-RPC 2.0的标准(如-32700到-32603的预定义错误和-32000到-32099的服务端保留错误),但MCP在其上添加了特有的语义错误(如InvalidParams、ToolNotFound、ToolExecutionError)。

对开发者来说,最容易踩的坑是误把MCP Server当作无状态的HTTP API。实际上,每个连接都持有Session上下文,Server的响应可以依赖Session中用户交互的历史状态。这意味着"Server必须是有状态服务"、"Client必须保持连接存活"、"重连必须设计恢复机制"。任何一个地方被当作单纯REST API处理,就会踩进状态不一致的深坑。

4.2 有状态连接与会话隔离

MCP的会话模型建立在长连接之上。无论stdio还是SSE,一条连接代表一个用户会话,Server需要在这个会话周期内保持上下文的一致性。这带来了两个设计挑战:

  • 连接管理:stdio模式下,Host是Server的"父进程",Host退出后进程被操作系统回收;SSE模式下,Host需要管理HTTP连接的生命周期,包括心跳探测、重连退避和会话令牌恢复。Google Cloud上运行的一个MCP Server在生产中观察到,SSE连接在不稳定的客户端网络下平均3-5小时会断一次,必须设计指数退避的重试和会话粘滞机制。
  • 会话隔离:在多租户或多用户场景中,一个MCP Server会同时服务多个Client。每个Client的Session必须严格隔离——A用户的文件资源不能被B用户的工具请求访问。最安全的实现方式是在初始化握手阶段交换用户身份令牌,Server内部的资源访问层基于该令牌做权限校验。MCP主规范目前尚未定义标准认证协议,但社区已经涌现出mcp-discord-auth、mcp-oidc-auth等实践方案,主要围绕OAuth 2.0和JWT展开。

一个反模式的教训来自某开源项目:其MCP Server将所有Client视为无状态共享池,全局缓存工具执行结果以"提升性能"。结果在多用户接入时发生数据混杂,导致A用户请求查到了B用户的私有文档,触发安全事件。正确的做法是对任何有业务意义的信息按Session隔离,共享只读配置可以放宽,但共享状态永远是危险的。

4.3 工具定义与资源暴露的最佳实践

工具设计的粒度,直接影响模型的调用精度和上下文消耗。

  • 紧致但不过细:每个工具只做一件事且只做完整的事。例如,写一个query_database工具好过把查询拆成connect_db、run_sql、format_result三个工具。模型在单次工具调用窗口中只需做一次决策,避免多步推理失误。
  • Schema即Prompt:工具描述(description)直接塞进模型上下文,其质量直接决定调用准确率。描述应包含"这个工具做什么"、"什么时候用"、"什么情况下不要用"。正面示例与反面示例也可以放在description里。
  • 资源的最小暴露:Resource给Agent提供上下文,但暴露过多敏感数据是重大漏斗。最小权限原则要求Server只暴露完成当前任务所必需的数据切片,而非整库整表。比如一个HR数据分析工具,应该暴露聚合后的匿名统计Resource,而不是员工明细Resource。
  • 工具描述长度控制:当前主流模型的上下文限制仍在8k-128k之间,如果MCP Server注册了十几二十个工具,每个描述200字,工具元数据会吃掉数千token。开发者应该考虑分组加载:不同业务模块的工具通过命名空间隔离,按需注册,而不是一次性全灌进prompt。

4.4 错误处理与超时策略

Agent工作流是异步且多步的,中间任一步骤的失败都需要优雅的降级策略,否则让一个耗时5分钟的Agent任务因为某个无关工具的失败而全盘崩溃,是不可接受的。

MCP支持多种错误信号:JSON-RPC层面的语法错误和通信错误,工具执行层面的语义错误,以及连接层面的超时。服务端开发需要建立三级防护:

  • 工具级回退(Fallback):某个工具不可用时,模型可以基于retry逻辑或替代工具提示,重新规划。Server端可以返回ToolExecutionError并附带isRetryable标志,告知Agent是否需要重试。
  • 会话级timeout:MCP Server在长时间计算时需要定期发送progress通知,否则Client的超时机制会断开连接并判定任务失败。开发长任务工具时必须设计成增量报告进度,否则网络层和传播层的超时将带来假阴性失败。
  • 工作流级补偿:Agent编排工具(如n8n、Temporal)通常提供断点续传或Saga补偿事务。MCP Server本身不处理工作流逻辑,但应返回足够详细的错误信息,以便上层编排器做出正确的补偿动作。

MCP把Agent与工具连接的问题从"每个项目定制"推向了"协议标准化"。但要让这种连接从"能用"走向"好用"、"安全可靠地用于生产",工程细节上的打磨远比协议本身更花时间。下一节转向另一个协议:解决Agent与Agent协作问题的A2A。

5. A2A协议:Google描绘的Agent联邦图景

2025年4月,Google联合Salesforce、SAP、LangChain等一众厂商推出了Agent-to-Agent Protocol(A2A)(后于2025年6月捐赠给Linux基金会)。如果说MCP的目标是让Agent"能用上工具",A2A的目标则是让Agent"能与其他Agent说话"。它不是MCP的替代品,而是填补了一个完全不同的工程空白:跨平台、跨厂商的多Agent协同。

5.1 A2A的架构愿景:一个Agent互联网

A2A的设计背后有一个宏大的图景:未来的AI系统不是由一个大模型包揽一切,而是由无数专门化Agent组成的联邦网络。每个Agent都有自己的专业能力、数据权限和身份标识,它们之间可以像互联网节点一样请求服务、传递任务、交换结果。

这个愿景的灵感来源不是AI行业,而是互联网早期。在1990年代,TCP/IP和DNS让不同硬件、不同操作系统的计算机能够找到彼此并通信。今天,A2A试图为Agent做同样的事:让不同框架、不同云、不同公司训练的Agent能够互相发现、协商和协作。

5.2 核心概念拆解

A2A的核心由四个概念组成:

  • Agent Card:Agent的"数字名片",通过公开URL暴露一份JSON-LD格式的元数据。它包括Agent的技能列表(skills)、端点地址(url)、认证要求(authentication)、版本信息和厂商标识。技能描述使用自然语言+结构化约束的组合,使其他Agent能够基于语义理解其能力范围,而无需人类介入。
  • Task:跨Agent任务的原子单元。一个Task有完整的状态机:submitted(待处理)→ working(执行中)→ input-required(需要对方补充信息)→ completed(成功交付)/ failed(执行失败),另有 cancelled(请求方撤销)与 rejected(被call方拒绝)两个终态。每个Task有唯一ID,可以跨多个Agent传递并保持状态完整。
  • Artifact:Agent向另一个Agent交付的结构化成果。与MCP的工具响应不同,Artifact通常承载更复杂的业务成果——如一份数据分析报告、一个代码模块或一组多媒体内容。Artifact支持多版本和多MIME类型。
  • Push Notification:异步任务完成时的回调机制。由于Agent之间的任务可能耗时数分钟甚至更久,A2A允许请求方注册回调URL,被调用Agent在状态发生变化时主动推送更新。这消除了长轮询的开销,也让Agent不需要维持长期阻塞连接等待回复。

A2A与MCP在概念上的差异,可以用"纵向"与"横向"的关系来理解。MCP是垂直的:Agent(Host)向下连接本地或远程的工具与数据源。A2A是水平的:Agent对等地向另一个Agent发起任务请求。二者共同构成一个"T字形"的全栈Agent互联。

5.3 一条跨Agent任务的状态流转

A2A最精髓的设计,是Task状态机在跨系统场景下的状态同步。以下流程图展示了Agent A委托任务给Agent B的完整交互过程:

flowchart LR
    A["Agent A\n(client)"] -->|"1. 发现:获取Agent B的Agent Card"| B["Agent B\n(server)"]
    B -->|"2. 返回Card\n技能/端点/认证"| A
    A -->|"3. 创建Task\nPOST /tasks"| B
    B -->|"4. 返回Task ID\n状态:submitted"| A
    A -->|"4b. 可选:注册Push Notification\n回调URL"| B
    B -->|"5. 状态更新\n推送至A: working"| A
    B -->|"6. 状态转换\n推送至A: input-required"| A
    A -->|"7. 补充信息\nPOST /tasks/{id}"| B
    B -->|"8. 最终交付\n推送Artifact+completed"| A
    A -->|"9. 获取成果\nGET /tasks/{id}"| B

上图刻画了一条典型的A2A交互链路。Agent A需要先 探索 对方的能力——通过解析Agent B公开的Agent Card,确认对方是否具备处理本任务所需的技能。确认后,A向B的/tasks端点提交一个创建请求,收到返回的Task ID后,A可以选择注册Push Notification等待被通知,或者轮询任务状态。Agent B内部处理任务时可能状态多次变化(working → input-required → working),每次状态跃迁都通过push通知同步给A。最终B生成一个或多个Artifact,与completed状态一并推送,A再按需拉取完整的交付成果。

这个状态机设计在处理复杂业务时有两个明显优势。第一,它天然支持异步解耦。Agent B可以是一个运行在Salesforce平台的企业级Agent,内部有10人审批流程,需要几分钟甚至几天才能完成——A2A的状态推送机制让Agent A不需要阻塞等待,可以在等待期间继续处理自己的其他任务。第二,它显式定义了"需要补充信息"的中途协商状态(input-required)。这在现实业务中极其常见:B不可能永远一次性拿到足够的上下文,当它发现缺失信息时,通过状态转换请求A补充,回退后再继续。这比单次发一个prompt请求一次到位的同步调用更符合实际业务逻辑。

不过A2A文本规范中也留有若干未解决的技术灰色地带。例如,Agent Card的更新同步机制(当一个Agent新增技能后,其他Agent如何知道)、跨域OAuth 2.0的完整授权流程细节、以及Artifact格式在跨平台场景下的互操作性,目前社区实践均处于早期。

6. 协议双雄的碰撞与融合

MCP与A2A并非竞争关系,而是互补关系。但在开发者的实际选型中,它们经常被放在同一张表格里做比较。本节解析二者的架构位正交性,以及业界探索的融合方向。

6.1 垂直与水平的坐标系

如果把AI Agent的连接模型看作一个坐标系,X轴是"连接对象是谁"——从"内部数据"到"外部Agent",Y轴是"交互方式"——从"同步调用"到"异步协商"。MCP和A2A分别占据两个不同的象限。

MCP位于"Agent←→工具/数据"的垂直连接象限。它的调用范式相对同步:模型需要某个工具,协议层立即转发调用,等待返回后继续对话。虽然有progress通知机制,但本质仍是一个请求-响应周期。MCP的焦点是"让Agent拥有统一的工具箱"。

A2A位于"Agent←→Agent"的水平连接象限。它的调用范式天然异步:任务投递后,双方可以各自忙碌,状态变化通过callback传播。A2A的焦点是"让Agent拥有可协作的伙伴网络"。

这种正交性决定了它们不是选项A和选项B,而是同一个问题空间的不同投影。一个生产级Agent系统很可能同时需要MCP Server连接公司内部数据集,同时通过A2A与外部合作伙伴的Agent共享任务。

6.2 生态现状

MCP的生态扩张速度惊人。截至2025年中,社区登记的MCP Server已突破23000个,覆盖文件系统、数据库(PostgreSQL、MongoDB、SQLite)、GitHub、Slack、Notion、Google Drive等几乎所有主流工具。MCP.so等聚合平台已经出现,提供Server的发现和一键安装能力。Claude Desktop、Cursor IDE、Cline等AI原生IDE已经内建MCP支持。开源社区的主要贡献集中在工具封装的广度,但高质量的Server在错误处理、权限隔离、Schema设计深度方面参差不齐。

A2A的起步晚近半年,但企业级背书更强。Google推出A2A时,Salesforce、SAP、ServiceNow、MoveWorks等B2B巨头同步宣布支持。这意味着A2A在企业ERP、CRM、工作流自动化领域的渗透率远高于通用开发者社区。Deel的HR自动化系统、ADP的薪资Agent已经接入A2A进行跨平台任务流转,这些案例虽然数量少于MCP的23,000个Server,但单笔交易的价值和集成深度更大。

生态差异背后有两条清晰的路线。MCP走的是"自下而上":先让开发者觉得好用,再倒逼平台方接入。A2A走的是"自上而下":先让大企业标准化跨系统协作,再向下渗透到开发者工具链。两条路线都有道理,最终胜者将取决于谁能先建立网络效应——即"接入该协议的Agent越多,每个Agent的价值越高"的飞轮。

6.3 协议融合的可能性

从长期架构视角看,两个协议是否可能合并?答案是:合并不合适,但桥接是必需的。

合并的障碍是设计目标差异太大。MCP需要低延迟、轻量级的JSON-RPC调用,适合一次对话中几十上百次的工具调用。A2A需要承载多步状态机、多方异步协商、长任务生命周期跟踪,协议头部和信息量远大于MCP。如果把两者强行统一成一个大而全的协议,会让MCP场景负担过重,A2A场景又受限于简化设计。

更务实的架构是分层桥接。一个在多个MCP Server之上运行的"编排Agent",本身可以用A2A对外提供能力。例如,一个"数据分析Agent"内部管理三个MCP Server(连接内部数据库、连接公司文件系统、连接BI工具),对外用A2A的Agent Card,将自己包装为一个企业级Agent服务。任何外部Agent需要数据分析时,通过A2A向它发送一个Task,而这个Agent内部再通过MCP调度本地工具完成。这种"洋葱结构"(A2A外层 + MCP内层)已经被多个企业实践验证。

6.4 对架构范式的深远影响

协议双雄的成熟,正在改变AI应用的架构范式。2024年的主流Agent架构是"单体Agent":一个LLM核心配若干个定制工具函数,所有逻辑和状态都集中在单一进程中。2025年的趋势是"分布式多Agent系统":多个专精Agent各自处理子问题,通过MCP获取数据,通过A2A协调合作。

这种转变要求开发者的系统设计能力从"写好prompt和function call"升级到了"分布式系统设计与协议选型"。需要考虑的问题清单至少是:

  • Agent之间的任务拆分粒度如何确定?
  • 状态应该在哪个层集中还是分布?
  • 同步阻塞调用与异步事件驱动的边界在哪里?
  • 消息格式的序列化开销是否在可接受范围?
  • 失败场景是回退(fallback)还是补偿(compensate)?

这些恰恰是过去微服务架构面临的问题——Agent协议的标准化,正把AI系统从"脚本式AI"搬进了"生产级分布式系统"的战场。

7. OpenAI的第三极:ChatGPT Agent与Responses API

当MCP和A2A正在争夺"开放协议"的话语权时,OpenAI选择了一条完全不同的路线:在自有API之上构建原生的Agent能力。2025年7月,OpenAI将此前分散的Operator(网页交互)、Deep Research(信息整合)与ChatGPT对话能力融合为统一的ChatGPT Agent。开发者不再需要在多个产品之间切换,而是可以在一个统一的接口中编排搜索、代码执行、文件分析和网页浏览。与这一产品动作同步推出的,是Responses API——一个更底层的Agent编排基础设施。

7.1 从模型能力到编排能力的升维

Responses API在OpenAI的产品矩阵中位于一个独特的位置。它不像Chat Completions API那样只提供一次性的文本生成,而是支持多轮"推理+工具调用+人类确认"的完整工作流循环。核心差异在于:Chat Completions API由应用层负责编排循环(发prompt、接收函数调用、执行工具、塞回结果再发prompt),而Responses API把这个循环下沉到OpenAI服务端,由OpenAI自己管理"tool call → execute → feed result → reasoning → next action"的全生命周期。

对开发者来说,这种内聚化带来两个明显好处。第一,减少了大量的样板代码——开发者不用自己写ReAct循环和工具调用编排器。第二,由于OpenAI对工具调用的内部优化(比如缓存、并行化、重试策略),整体延迟往往优于自研实现。目前OpenAI内部已支持的"工具"包括网页搜索、Python代码解释器(sandboxed)、文件读取,以及通过API注册的自定义函数。

但问题是:OpenAI的"自有工具"思路和MCP的"开放工具"形成了直接张力。Responses API里的工具接入需要OpenAI审核,而MCP的Server任何人都能写。这意味着开发者在用OpenAI原生服务时面临一个约束:只能在OpenAI生态内使用已批准的工具集,或者注册自己的function。如果想接入社区里23000+个MCP Server,就必须跳出OpenAI的封闭体系。

7.2 对开放协议的态度:兼容适配层 vs 自有封闭生态

OpenAI在协议策略上采用了务实的中间路线。它并没有直接支持MCP或A2A协议本身(也就是说,不能直接在Responses API里声明"连接这个MCP Server"),但保留了通过function call接入任何外部系统的能力。开发者可以在function schema里写一个指向内部封装MCP Client的bridge函数——模型以为自己在调用一个普通function,实际上这个function在后台用MCP协议连接到某个外部Server。

这种做法让开发者获得了MCP的广度 + OpenAI原生的编排深度,但它是有代价的:每次MCP工具调用都要经过OpenAI的API往返,而且function call机制只支持单次返回,无法利用MCP的progress通知和streaming特性。对于高频率、低延迟的工具调用场景,这种桥接的性能损失不可忽略。

更深层的博弈在于平台锁定。如果Agent的核心编排逻辑(任务分片、工具选择、重试策略、人类在环确认)全部在OpenAI云端执行,应用层的代码就被压缩到极薄的一层——这在初创公司原型阶段是巨大优势,但在企业级部署时面临数据主权和合规审计的问题。很多金融机构和制造业企业明确禁止将核心业务逻辑和中间执行数据发送到第三方云端。这正是开放协议的不可替代性所在:MCP和A2A允许企业在自有基础设施上运行编排逻辑,数据只在受控的网络边界内流动。

7.3 三足鼎立还是一统江湖?

当前Agent协议领域形成了三方势力。MCP把控开发者生态的广度,A2A把控企业级集成的深度,OpenAI把控制造原生化体验的丝滑度。短中期内,三者不太可能互相取代。

更可能出现的情况是"三明治结构":OpenAI Responses API负责面向C端和初创的"快速启动"层,MCP完成开发者自定义工具的"垂直扩展"层,A2A完成跨企业系统的"水平联邦"层。开发者根据场景的隐私需求、集成复杂度、延迟要求和厂商锁定容忍度,在三者之间做切片式选择。

8. 工程深坑:协议落地的四大硬核难题

协议标准从纸面走入生产环境,必然会遇到纸面规范未覆盖的工程难题。MCP和A2A在2025年已经面临四个最现实的深水区:安全边界、状态一致性、服务发现、错误恢复。这四个问题没有一个是协议本身可以完全解决的,它们需要开发者在架构层做出系统性判断。

8.1 安全边界:工具权限的最小化与人类在环

信任模型是Agent架构中最容易被低估的维度。LLM本身不是可信执行体——一段精心构造的prompt可以让模型调用一个本该被禁止的工具,或者向工具参数注入恶意数据。因此,"工具权限模型不能依赖模型自律",而必须在协议层之下建立独立的强制机制。

MCP社区目前有三种安全实践在演进:

  • 白名单隔离:Host在发起连接前,明确声明这个Server允许使用哪些工具。Server内部的Tool和Resource是静态注册的,Host侧决定激活哪些。这种模式简单但粗粒——一旦连接建立,Server持有的所有被激活工具都是"可用"的,无法针对单次调用做动态限制。
  • 沙箱隔离:工具的实际执行环境与模型推理环境物理隔离。MCP的stdio模式天然利用操作系统进程隔离;SSE模式下则通常依赖容器或WASM沙箱。云厂商如Google Cloud提供的MCP execution sandbox已经内置了网络访问限制、文件系统隔离和环境变量白名单。
  • 人类在环确认(Human-in-the-Loop):对于数据敏感性高的操作(如发邮件、删文件、转账、访问私有数据库),Server返回一个requires_user_approval标志,Host在界面上弹出确认对话框,用户确认后才真正执行。MCP规范中已经包含这种能力,但具体UI层和审批策略由Host实现。

更深层的问题在于:当Agent开始大量调用外部工具时,攻击面从"模型本身"扩展到了"模型所连接的一切"。一个接入23000个MCP Server的Agent,其攻击面等同于这23000个Server各自的漏洞总和。这意味着MCP Server的审计和漏洞管理将成为未来Agent安全的新前沿。

8.2 状态一致性:上下文漂移与分布式状态同步

Agent的工作流通常是长会话(几分钟到几十分钟)甚至超长会话(数小时级别)。在如此长的时间跨度里,模型对上下文的理解会发生漂移——早期步骤中加载的Resource在后续推理中被遗漏或曲解。MCP的Resource机制允许按需重新拉取数据,但何时拉取、拉取什么,仍由模型自行决定,这带来了不确定性。

更棘手的是多Agent协作场景。如果Agent A通过A2A把任务的一部分委托给Agent B,同时自己也在执行另一组MCP工具调用,两个Agent之间的共享状态如何保持一致?

当前有三种工程策略在探索中:

  • 集中式State Store:所有Agent通过共享数据库或缓存(如Redis、TiDB)读写状态。优点是简单直接,缺点是引入了一个高风险的单点——如果State Store故障,整个协作网络陷入瘫痪。集中式方案适合企业内网部署,跨云场景不适用。
  • CRDT(无冲突复制数据类型):将状态表示为可以合并的CRDT结构,各Agent在本地维护副本,彼此异步传播更新。这种方案天然支持离线-在线切换、网络分区恢复,但对状态结构有较强约束——并非所有业务模型都适合CRDT。
  • Event Sourcing + CQRS:所有状态变更都以事件日志的形式记录,各Agent从日志中重建自己的状态视图。这种模式在已采用事件驱动架构的企业中较容易落地,但需要额外的基础设施投入,且状态重建的延迟可能影响实时协作体验。

A2A的Task模型在设计时已经考虑了状态一致性。Task有唯一ID和显式状态机,它充当了"共享锚点"——所有相关方都以Task对象作为状态同步的基准。但A2A没有强制规定Task数据的具体存储方式,这仍然是各Agent实现者的工程选择。

8.3 发现机制:Agent/工具的自描述与自动发现

MCP的tools/list和A2A的Agent Card解决了"如何描述自己的能力"的问题,但没有解决"如何被发现"的问题。当一个企业内部运行着上百个MCP Server和几十个Agent时,"知道谁有什么能力"变成了一个分布式搜索问题。

互联网解决这个问题的方式是域名系统(DNS)。Agent生态也需要一个类似"能力目录"或"技能注册中心"的设施。目前已有两个雏形在出现:

  • MCP Registry:MCP.so等平台已经提供Server的目录服务,开发者可以按标签、提供商、热度搜索Server。但这本质上是中心化列表,没有自动发现机制。企业内部更可能部署私有Registry,每个MCP Server启动时向Registry注册自身的tools/list和端点信息,Host通过Registry查询而非直连每个Server。
  • Agent Web的Service Mesh类比:如果将Agent看作微服务,Service Mesh(如Istio)中的服务发现、流量管理、可观测性恰好是Agent联邦所缺失的。已有研究者提出"Agent Mesh"概念:在Agent之间插入一个侧车代理(sidecar proxy),负责能力发布、路由、负载均衡和安全策略的执行。

发现的自动化程度,将决定Agent生态的规模化上限。如果每次接入新工具或新Agent都需要人工配置,网络效应就无法释放。自动发现需要依赖语义化描述——不仅仅是技能名称的字符串匹配,而是基于功能的语义相似度匹配。这是当前技术前沿,大型语言模型的嵌入能力有望在这里发挥关键作用。

8.4 错误恢复:半自动化工作流的断点续传

生产级Agent工作流不可能一帆风顺。模型可能误解意图、工具可能超时、外部API可能503、用户可能在中间改变了需求。当一条10步的Agent工作流在第7步失败时,从头重来的代价往往不可接受。

分布式系统工程师对这类问题的成熟答案是Saga模式——将长事务拆分为若干短事务,每个短事务有对应的补偿操作。如果第7步失败,系统执行前6步的补偿操作并回滚到已知一致状态,然后重新开始或返回错误。

Agent工作流也可以引入类似思想。n8n和Temporal等编排引擎已经为MCP/A2A提供Saga编排的适配层:开发者定义正常流和补偿流,引擎自动执行。补偿操作的具体内容通常由开发者手写,但常见的几种模式可以被标准化:

flowchart TD
    S["开始工作流"] --> T1["步骤1: 查询数据库"]
    T1 --> T2["步骤2: 发送邮件通知"]
    T2 --> T3["步骤3: 调用外部API"]
    T3 --> T4["步骤4: 生成报告"]
    T4 --> T5["步骤5: 提交审批"]
    T5 --> T6["结束"]
    T3 -- "失败" --> C3["补偿:撤销外部API影响\n调用回退接口"]
    C3 --> C2["补偿:发送澄清邮件\n关于操作已取消"]
    C2 --> C1["补偿:无——查询可保留"]
    C1 --> ERR["错误报告\n返回用户/管理员"]

上图描绘了Saga模式在Agent工作流中的应用。工作流从查询数据库开始,顺次执行邮件通知、外部API调用、报告生成和审批提交。当"调用外部API"失败时,系统触发补偿链:先撤销外部API的影响(调用对方提供的回退接口),再发送澄清邮件通知各相关方操作已取消,然后最终返回结构化错误报告。注意并不是每一步都需要补偿——查询操作是只读的,没有补偿成本。补偿粒度的设计直接决定了错误恢复的速度和副作用范围。

但将Saga模式引入Agent系统面临特殊挑战。传统微服务的Saga有确定性的业务逻辑,但Agent的部分步骤是由模型动态决策的——模型在推理中"发现"需要调用某个工具,这一步在编排引擎预定义的正常流里可能根本不存在。这意味着Agent的Saga需要支持"半动态补偿":已知步骤可以预定义补偿,模型自发调用的步骤需要自动生成补偿(比如记录调用日志并依赖外部系统的幂等性来自然撤销)。

这四大难题揭示了一个共同的主题:协议只是解决了"怎么连通",但没有解决"如何可靠地运行在生产环境中"。安全、状态、发现、恢复——这些正是过去20年互联网基础设施一步步啃下的硬骨头。Agent协议正在走同一条路。

9. 开发者视角:如何设计Agent协议架构

理解了MCP和A2A的分工、碰撞、工程陷阱后,实际面对一个项目时,开发者需要一套可操作的决策框架。本节围绕三个核心问题给出分析:内部API该封装为MCP Server还是保留为内部服务?两个Agent之间该用A2A通信还是内部编排?性能瓶颈会在哪里?

9.1 决策树:何时暴露为MCP,何时走A2A

一条简单的判断路径如下:

  • 如果能力属于"数据/工具"型——比如查询数据库、读取文件、调用计算器、访问某个SaaS API,封装为MCP Server。MCP的JSON-RPC开销低,Schema驱动的调用让模型直接理解接口,不需要额外prompt工程。
  • 如果能力属于"业务Agent"型——比如"一个完整的客服Agent"、"一个专门做财务报表的Agent"、"一个审批Agent"——包装为A2A Agent Card。这个Agent内部可能自己管理多个MCP Server,但对外以A2A的Task+Artifact形式提供完整服务。
  • 如果两个模块在同一进程内——比如主Agent内部拆出来的子模块——使用内部RPC或函数调用。不要为同一进程内的通信引入协议开销。
  • 如果一方无法修改源码——比如对方是遗留系统、第三方服务——在这种"单方适配"场景下,MCP是更好的选择。你只需要写一套MCP Server作为适配层,不需要对方做任何改动。

9.2 混合架构实战示例

一个典型的复杂数据分析场景可以说明三种协议的协同。假设一家企业需要构建"智能财务分析Agent",需求包括:

  1. 从多个内部系统拉取原始财务数据(ERP、HR系统、采购系统)。
  2. 由一个分析Agent做数据清洗、异常检测和趋势预测。
  3. 由一个可视化Agent生成图表和报告。
  4. 报告需要提交给财务总监审批,审批环节可能涉及多轮人工确认。

架构设计建议:

  • 底层数据层:为每个内部系统(ERP、HR、采购)分别编写MCP Server。每个Server暴露一组Resource(如get_monthly_expense)和Tool(如run_forecast_model),并遵循最小暴露原则——不与当前分析无关的敏感字段通过read-only Resource返回受限视图。
  • 分析Agent:这个Agent内部持有3个MCP Client,分别连接三个内部系统的Server。它本身不对外暴露A2A——作为内部服务直接嵌入主工作流。
  • 可视化Agent:独立部署为一个Agent服务,对外暴露A2A接口。它需要接收分析结果、生成图表,并支持不同格式的Artifact输出(PDF、HTML、PPT)。由于可视化任务可能耗时较长(图表渲染),A2A的异步Task+Push Notification机制天然适合。
  • 审批工作流:审批环节涉及人类总监的多次确认,属于典型的"input-required"状态转换。A2A Task状态机中的input-required → working → completed流程可以精确映射这个业务过程。

这个例子展示了MCP和A2A的"垂直-水平"分层。MCP负责企业内部工具的标准化接入,A2A负责跨Agent/跨服务的异步业务协作。两者不重叠,各自解决不同层的问题。

9.3 性能考量

协议选型不能只看功能语义,性能指标同样关键。以下是三个需要量化的维度:

  • 序列化开销:MCP使用JSON-RPC 2.0,消息体为纯JSON,序列化/反序列化开销较低。A2A基于HTTP+JSON-LD,协议头部更大,且Artifact可能包含Base64编码的多媒体数据,单个消息体积可能是MCP的数倍到数十倍。在高频交互场景(模型一次对话调用几十个工具)中,MCP的轻量级优势显著。A2A适用于低频、大颗粒、异步交互的场景。
  • 连接池管理:MCP的SSE长连接需要维护连接池,Host侧需要合理设置最大连接数、空闲超时和重连策略。经验规则是:连接数不要超过后端Server的并发处理能力,也不要因为频繁新建连接带来TCP握手开销。stdio模式没有连接池问题,但受限于本地进程数量。
  • 并发策略:当Agent需要同时调用多个独立工具时,能否并行发起MCP调用直接影响整体延迟。MCP规范支持并行的tools/call,但Host和Server两端都必须正确实现请求ID的关联。实际测试中,一个Query需要并行调用"天气API"和"数据库查询"的场景,串行调用延迟约为并行调用的1.8-2.2倍。

从性能角度总结:MCP适合高频、低延迟、小颗粒的工具调用;A2A适合低频、大颗粒、长耗时的业务任务。在混合架构中,不要让A2A承载细粒度的工具级调用,也不要让MCP承载跨组织的状态协商。

10. 未来图景:从协议层到Agent Web

如果MCP是今天的USB-C,A2A是今天的TCP/IP,那么Agent生态的终极目标是什么?本节探讨几个可能演进方向。

10.1 Agent注册与发现网络

互联网之所以成为互联网,不是靠每家公司的网站各自为政,而是靠DNS把人类可读的域名解析为机器可读的IP地址。Agent生态面临类似的"发现"问题:如何让我知道你的Agent存在,以及它能帮我做什么?

MCP和A2A目前的答案分别是"Registry平台"和"Agent Card公开URL"。两者都还没有达到DNS级别的自动化和去中心化。未来可能出现一个"Agent DNS"层:每个Agent拥有一个可验证的DID(去中心化标识符),在链上或分布式注册表中记录自己的技能、信誉评分和端点信息。当你需要一个"能处理中文法律合规的Agent"时,系统自动查询这个注册表并返回匹配的候选列表,类似于DNS的解析过程。

这个愿景面临治理难题:谁来维护注册表?如何防止恶意Agent注入虚假技能声明?如何防止DGA(域名生成算法)式的Agent刷量攻击?这些都是互联网20年前解决过的问题,Agent Web需要重新走一遍。

10.2 自动化能力协商

今天的A2A要求Agent A在调用Agent B之前,人工确认B的Agent Card中确实有匹配的技能。未来可能实现"自动化能力协商":Agent A通过自然语言描述需求(比如"帮我生成一份符合SOC2 Type II标准的审计报告"),系统基于语义匹配自动筛选到一组具备相关技能的Agent,由它们自动建立A2A连接、协商任务拆分、分配子任务。人类干预只在最终审批环节。

自动化协商的前提是:技能描述必须足够标准化和语义化。JSON-LD的现有结构提供了很好的基础,但需要引入嵌入向量和语义匹配引擎,才能从"关键词匹配"进化到"意图匹配"。

10.3 经济层与编排层的市场机制

当Agent开始像今天的人类自由职业者一样互相委托任务时,任务调度和资源分配问题就出现了。谁来决定哪个Agent处理哪个任务?多个Agent都声称能做同一件事,选择谁?

可能的答案是:引入市场机制。每个Agent为自己的服务设定"报价"(基于计算成本、数据成本和响应速度),请求Agent在预算和质量约束下做优化选择。信誉系统记录每个Agent的历史成功率和响应延迟,帮助请求方做出信任判断。争议解决机制处理交付物不符合预期的情况——这简直就是Agent世界的"仲裁系统"。

这种经济层的构想目前仍处于学术讨论阶段,但如果Agent数量真的达到"互联网规模",纯粹的手动配置和资源分配将无法扩展。市场机制可能是唯一的出路。

10.4 标准之争的结局预测

开放协议 vs 封闭平台的历史已经上演过无数次。PC时代的Wintel、移动互联网时代的iOS/Android之争,每次都指向同一个规律:开放协议最终胜出,但短期内是封闭平台主导体验。

MCP和A2A正处于开放协议阵营。它们面临的最大挑战不是OpenAI,而是彼此之间的碎片化。如果MCP和A2A各自为政,开发者被迫学习和维护两套协议,开放阵营就会被各个击破。前文讨论的"分层桥接"(A2A外层 + MCP内层)是对此最务实的回应。

短期(2025-2026年)的格局预测是:MCP+A2A+各厂商私有适配层并存。开发者需要在自己的Agent架构中预留协议抽象层,确保当某个协议胜出时可以低摩擦切换。中长期(2027年以后),一个统一的Agent Web协议栈——底层传输、中间件发现、上层协商——将逐渐浮现。

11. 结语:协议是Agent从演示走向生产的最后一公里

AI Agent在2023年是聊天的花招,2024年是原型的狂欢,2025年正在进入生产的修罗场。在这场进化中,协议层是最容易被旁观者低估、却最被从业者焦虑的基础设施。

MCP解决了Agent与工具世界的连接问题。它把碎片化的function call和自定义集成,统一成一套可发现、可复用、可组合的标准接口。它的历史意义不只是"少写了多少胶水代码",而是把工具生态从垂直的"每个工具各自为政",变成了水平的"任何工具一旦接入,所有Agent都能用"。

A2A解决了Agent与Agent之间的协作问题。它让不同厂商、不同框架、不同云环境中的Agent能够建立信任、委托任务、异步协商。它的历史意义在于首次把Agent从"单体智能体"推向了"分布式智能体网络"。

二者不是竞争关系,而是互补关系。一个Agent系统的成熟标志,是同时用好MCP(获取数据和工具)和A2A(与其他Agent协作),并在自己的架构中清晰划分二者的边界。

对于正在设计Agent架构的开发者,建议至少做三件事:

  1. 为内部工具输出MCP Server。每写好一个内部API,顺手写一个MCP Server封装——成本很低,但未来的你和其他团队成员会获得极大的复用价值。
  2. 思考哪些模块应成为独立的A2A Agent。哪些子系统的逻辑足够内聚、边界足够清晰、具备独立对外服务的能力?把它们从主Agent里拆出来,用A2A接口包装。
  3. 在编排层预留协议抽象。不要让你的Agent核心逻辑硬编码为"调用这个function",而是写成"从能力目录获取工具 → 根据Schema动态调用"的模式。这样当协议标准演进时,你的代码不需要重写。

Agent的能力高低取决于它连接的世界有多广。协议,正是打开这个世界之门的钥匙。

评论

0

评论加载中…

发表评论

0/2000