MCP 与 A2A:调用外部能力,还是委托远端任务

所属:第二部分 · 让它做对事的四块地基(第 5–8 章) 前置:第 7 章(记忆、检索与迭代搜索)、第 6 章(工具粒度、工具合同与运行边界)、第 4 章(工具请求、执行与结果回填) 本章新概念:直接 API、MCP Host/Client/Server、A2A、Agent Card、Message、Task、Artifact、核心协议无隐式会话、M×N 适配问题


一、跨过程序边界的,是一个能力还是一项目标

第 7 章的运行系统会把候选材料装入本轮工作集,再由模型决定下一次搜索、读取或停止。如果搜索能力位于另一个程序里,运行系统可以把一次明确动作交出去,例如「用这些关键词找候选来源」。对方返回结果后,搜索什么、读哪篇和何时结束仍由本地运行系统决定。这是调用外部能力

运行系统也可以把整个目标交出去,例如「调查本周稳定币监管动态,核对冲突,最后交付一页报告」。远端 Agent 在自己的运行边界内完成搜索、读取、比较和停止;调用方不参与这些内部步骤,只补充信息、跟踪进度并接收成果。这是委托远端任务

两种动作的差别在责任范围:

能力调用只把一个边界清楚的能力请求交给对方;任务委托把目标以及目标内部的执行责任一起交给远端 Agent。

动作确定后,还要约定双方怎样交换请求和结果。本章把由某个提供方自行规定、双方单独对接的接口简称为直接 API;多方也可以采用一套共同协议。直接 API 可以承载能力调用,也可以承载任务委托。「直接」只说明接口格式由提供方自定,不说明责任边界。

跨过边界的是什么 提供方自定接口 采用共同协议
一个被点名的能力 直接 API 主要由 MCP 统一表达
一项目标及其内部执行责任 直接 API 主要由 A2A 统一表达

因此,直接 API、MCP 和 A2A 不是同一层的三个选项。先判断跨过边界的是能力还是任务,再判断是否需要共同协议。

二、MCP:把外部能力接到运行系统

如果第 7 章的 search_sourcesread_source 位于外部服务,运行系统需要知道服务提供哪些能力、调用时交什么、返回后怎样接回工作集。MCP 是 Model Context Protocol,它为这类能力交互提供共同协议。

第 7 章的运行系统位于 MCP Host 一侧。三个角色沿一次调用分工:

角色 位于哪里 在能力调用中做什么
Host 使用能力的应用一侧 承载运行系统、模型与上下文;管理连接权限、用户同意和安全边界;决定开放哪些能力及怎样使用结果
Client Host 内部 与一个指定 Server 通信,把 Host 的请求送出,再把结果带回
Server 提供能力的一侧 暴露一组聚焦的工具、资源或提示模板,并完成收到的能力请求。比如:气象局服务可以返回天气信息

一次搜索可以这样发生:Host 通过 Client 发现 Server 提供搜索与读取;Host 只开放当前允许使用的能力;Client 把调用送给 Server;Server 返回候选来源或正文;运行系统把需要的结果装入工作集,模型再决定下一次搜索、读取或停止。

于是,MCP 把第 7 章已有的关系延伸到了程序边界之外:

Server 完成被点名的能力,Host 把结果接回自己的运行过程;MCP Server 不因内部使用了模型或 Agent,就自动成为整个任务的受托方。

Server 暴露的三类对象也各有职责:工具用于执行动作,资源用于读取内容,提示模板用于取得一组可填参数的消息。它们都属于 Host 可以消费的外部能力。

角色边界与交互关系见 MCP 2026-07-28 架构说明

三、协议核心没有隐式会话,不等于应用没有状态

2026-07-28 版 MCP 中,核心协议移除了初始化握手和隐式会话标识。每个请求都要带齐处理它所需的协议信息,不应靠「这条连接之前发生过什么」才能解释。

这只是在约束协议请求,不是在禁止应用保存状态。

例如,浏览能力第一次创建浏览器实例后,可以返回一个 browser_id。后续调用显式带回这个标识,Server 再据此找到对应实例。类似地,购物车可以靠 cart_id 延续,长任务可以靠 task_id 跟踪。连续性没有消失,只是从隐式会话变成了请求里看得见的标识。

Host 仍可以保存对话、工具结果、用户同意和当前任务;Server 仍可以使用数据库或缓存。于是:

核心协议没有隐式会话,表示请求应当自包含;它不表示 Host、Server 或业务过程必须无状态。

这是带版本范围的事实,不能倒推给所有历史实现。版本变化与设计原因见 MCP 2026-07-28 发布说明

四、A2A:把整个目标交给远端 Agent

如果调用方不再逐次调用搜索和读取,而是把「完成本周调研」交给另一个系统,远端就会在自己的运行边界内组织工作。它可以建立自己的工作集,使用固定检索或迭代搜索,也可以调用别的工具;调用方不需要看见这些内部步骤,只需要交流目标、补充信息、任务状态和成果。

A2A 是 Agent2Agent Protocol。第 7 章的运行系统把整个目标交给远端 Agent 时,位于 A2A Client 一侧。发起交互的一侧叫 A2A Client,接受交互的 A2A Server 也叫 Remote Agent。本章先用四个主干对象理解这段协作:

对象 在协作中的位置 它承载什么
Agent Card 交互开始前 远端声明的身份、可完成的任务、访问方式与安全要求
Message 发起或继续交流时 目标、问题、补充信息或过程说明
Task 工作需要被持续跟踪时 任务标识、当前状态与生命周期
Artifact 任务产生正式结果时 报告、文件或结构化成果

典型过程是:调用方先读取 Agent Card,判断远端声明的能力是否匹配;再用 Message 给出目标。简单交流可以直接得到一条 Message。需要持续跟踪的工作会形成 Task,远端可以更新状态或请求补充信息,最终把任务输出放进 Artifact。

这些对象共同表达的是独立 Agent 的协作边界。Remote Agent 内部可以自主规划,也可以运行固定工作流;A2A 规定双方怎样协作,不要求远端公开内部计划、记忆或工具实现。

对象定义与交互规则见 A2A v1.0 规范

五、MCP Tasks 与 A2A Task 有重叠,但协议契约仍不同

把 MCP 说成「短暂、无状态的工具调用」,把 A2A 说成「长时间、有状态的任务」,已经不够准确。MCP 2026-07-28Tasks 扩展也能让工具调用异步持续,并跟踪它的生命周期。

两者确实出现了功能重叠,但没有因此变成同一种协议契约:

MCP 的中途输入要分两个阶段:在异步 Task 创建前,工具调用可以先返回「仍缺哪些输入」,Client 补齐后带着这些显式输入重新发起调用;Task 创建后,这项 Task 也可以进入「等待输入」状态,Client 再通过任务更新补回信息。前一种补充属于重新发起的工具调用,后一种补充属于已经存在的 Task。因此,「能否中途补充输入」也不能用来区分 MCP 与 A2A。

因此,不能只问「有没有 Task」「是不是异步」「要运行多久」或「能不能补充输入」。要问的是:

对端是以 MCP 的工具、资源或提示模板提供能力,还是以 A2A 的 Agent Card、Message、Task 和 Artifact 参与 Agent 协作?

端点内部有没有 Agent 也不能替你判断。MCP Server 可以在内部使用 Agent,A2A Remote Agent 也可以只运行固定流程。最终看的是对外协议契约,不是运行时间、状态数量或内部实现技术。MCP Tasks 的版本位置见 MCP 2026-07-28 发布说明

六、采用共同协议时,再比较 MCP 与 A2A

MCP 与 A2A 都是共同协议。此时可以用同一组问题比较:对端以什么身份出现,调用方交出什么,对端承担什么责任,以及双方用什么对象续接工作。

判断问题 MCP A2A
对端以什么身份出现 提供工具、资源或提示模板的 Server 接受 Agent 间交互的 Remote Agent
调用方交出什么 一个工具调用、资源请求或提示模板参数 表达目标、问题或补充信息的 Message
对端承担什么责任 完成被点名的能力请求 在自己的运行边界内处理收到的目标或交流
怎样发现对端能做什么 Host 发现 Server 暴露的工具、资源和提示模板 Client 读取 Agent Card 中的身份、任务能力、访问方式与安全要求
持续工作怎样表达 Tasks 扩展可以跟踪异步持续的工具调用 Task 表达远端工作的状态与生命周期;简单交流也可直接返回 Message
正式结果怎样交回 工具结果、资源内容或提示模板消息 简单交流返回 Message;Task 的输出放入 Artifact
何时更匹配 多个 Host 希望用共同方式消费外部能力 独立 Agent 系统需要用共同对象交流、委托或协作

表中的生成差异是对端身份与责任范围,不是运行时间或内部是否使用模型。MCP Server 可以在内部运行一个 Agent,但对外仍只承诺完成能力请求;A2A Remote Agent 也可以运行固定流程,但对外仍以 Agent 协作对象接收和续接工作。

直接 API 属于另一条轴:它只表示接口由单个提供方自定。一个直接 API 可以表达表中任一侧的关系。一对一集成、需要大量提供方专有特性,或没有复用需求时,直接 API 可能更合适;它不是比共同协议更低一级的方案。

七、MCP 与 A2A 可以出现在同一条链上

一个调研系统可能是:

调用方 Agent —A2A 委托→ 远端调研 Agent —MCP 调用→ 搜索能力 —专有 API→ 搜索服务。

A2A 管的是调用方与远端 Agent 之间的任务协作;MCP 管的是远端 Agent 怎样消费外部能力;MCP Server 内部仍可以使用专有 API。

反过来也可能成立:一个 MCP 工具在内部把请求转交给 A2A Agent。外层调用方此时看到的仍是 MCP 能力;只有当调用方需要直接参与 Agent 间的 Message、Task 和 Artifact 协作时,才需要把 A2A 边界直接暴露出来。实现可以嵌套,对外协议仍由调用方实际参与的关系决定。

MCP 统一外部能力怎样被消费,A2A 统一独立 Agent 怎样协作;两者可以嵌套,因为它们规范的交互对象不同。

八、共同协议可能减少重复适配

共同协议的一项直接收益,是减少重复的接口适配。假设一类边界里有 M 个接入方,每个都要连接 N 个提供方。如果每一对都使用专有接口,并且所有接入方都连接所有提供方,最多需要 M×N 组定制适配。在 MCP 场景里,可以把它理解为 M 个 Host 对接 N 个 Server;在 A2A 场景里,则是 M 个调用方对接 N 个 Remote Agent。

如果双方都实现同一种协议,并且业务语义也兼容,理想情况下,M 个接入方各实现一次协议客户端,N 个提供方各实现一次协议服务端,协议适配的实现面可以接近 M+N。

这只是满连接情况下,对适配实现种类的理想化比较,不是总成本公式,也不是选择 MCP 或 A2A 的判据。现实中仍要分别处理:

如果现实只连接其中几对,原本的定制适配也不会达到 M×N。共同协议减少的是「每一对都重新约定接口形状」的重复工作,不能自动统一业务语义,更不能把总成本直接从乘法变成加法。

九、协议不是信任、授权或正确性的证明

协议让双方用共同格式沟通,不会自动让对方可信。要把四个问题分开:

问题 它要确认什么 协议能否单独解决
互操作 双方能否按共同规则交换信息 这是协议主要改善的部分
认证 对方是谁 协议可以承载方法,仍要实际验证
授权与同意 对方现在允许做什么,用户是否同意 仍由 Host 与服务端执行策略
结果正确性 返回内容是否真实、可靠并满足任务 仍要核验,协议不能担保

对 MCP 来说,Host 要决定允许连接哪些 Server、开放哪些能力以及哪些数据可以送出;Server 仍要检查调用方是否有权执行动作。工具说明和返回结果来自外部,也不能因为使用共同协议就默认可信。

对 A2A 来说,Agent Card 只是远端对身份、能力与安全要求的声明。它不表示当前请求已经获得授权,也不证明 Artifact 内容正确。

协议解决“怎样交谈”,认证与授权解决“能不能做”,结果核验解决“做得对不对”。

十、三条结论

一,先分能力调用与任务委托,再看接口是否需要共同协议。 能力调用只把一个边界清楚的能力请求交出去;任务委托把目标及其内部执行责任交给远端 Agent。直接 API 可以承载两者;采用共同协议时,前者主要由 MCP 表达,后者主要由 A2A 表达。

二,MCP Tasks 与 A2A Task 有功能重叠,但属于不同关系网。 两者都能表示持续工作,不能用「短或长」「无状态或有状态」机械区分。MCP Tasks 跟踪异步持续的工具调用;A2A Task 则与 Agent Card、Message 和 Artifact 一起表达独立 Agent 之间的协作。

三,共同协议减少的是重复适配,不是全部系统风险。 M×N 到 M+N 只是满连接条件下对适配实现面的理想化说明。协议不会自动统一业务语义,也不会替代认证、授权、用户同意和结果核验。

十一、这一章引出的问题

现在,我们已经能区分「调用外部能力」与「委托远端任务」。但能委托,不等于值得把系统拆成多个 Agent。每项独立职责能否在结束时被验收或接续,是拆分边界能否成立的基础;并行、上下文隔离或独立核验只是可能的收益,还要看这些收益能否盖过交接、等待和合并成本。

下一章会用这些条件判断什么时候该拆,什么时候不该拆。

十二、自检题

  1. 主程序希望通过共同协议发现并调用一个搜索工具,拿回结果后继续自己的流程。这更匹配 MCP,还是 A2A?为什么?
  2. 直接 API 为什么不能简单归入「能力调用」一类?
  3. MCP 的 Host、Client 和 Server 各负责什么?谁决定开放哪些能力,以及结果怎样进入应用侧过程?
  4. MCP 2026-07-28 核心没有隐式会话,为什么浏览器实例或购物车仍能跨多次调用存在?
  5. A2A 的 Agent Card、Message、Task 和 Artifact 各起什么作用?
  6. MCP 有了 Tasks 扩展,是否就与 A2A 没有区别?判断时应该检查哪些协议对象?
  7. 一个 A2A Remote Agent 内部能否使用 MCP,再由 MCP Server 调用专有 API?
  8. M×N 接近 M+N 为什么不能被解释成总成本一定按同样比例下降?
  9. Agent Card 声明了能力与安全要求,是否已经证明当前调用获得授权、最终结果正确?

十三、参考答案

先自己答完再往下看。

  1. 更匹配 MCP。 调用方交出去的是一个被点名的搜索能力,不是整项调研目标;结果返回后,运行系统仍决定下一步。
  2. 因为「直接」只说明接口由提供方自行定义。 这个接口既可以暴露一个动作,也可以接受目标并负责一项完整任务。
  3. Host 管应用侧协调,Client 管连接,Server 管能力。 Host 包含运行系统,承载模型、上下文、同意与安全策略,并决定开放哪些能力、怎样使用结果;Client 在 Host 内连接一个 Server;Server 暴露并执行工具、资源或提示模板。
  4. 用显式业务标识续接。 后续请求带回 browser_idcart_id,Server 据此读取状态。请求自包含,不等于应用不能保存状态。
  5. Agent Card 说明远端声称是谁、会什么、怎样访问;Message 承载一次交流;Task 表示工作的状态与生命周期;Artifact 承载正式成果。
  6. 不是。 MCP Tasks 跟踪异步持续的工具调用;A2A Task 位于 Agent Card、Message、Task 和 Artifact 组成的 Agent 协作关系中。MCP 在 Task 创建前可以返回缺少的输入,让 Client 补齐后重新发起工具调用;Task 创建后也可以进入等待输入状态,再由 Client 更新任务。因此不能用「能否补充信息」区分 MCP 与 A2A。要检查对外协议对象,而不是只数有没有 Task。
  7. 可以。 A2A 负责外层的任务委托,远端 Agent 可以在内部通过 MCP 使用能力,MCP Server 又可以封装专有 API。
  8. 因为 M×N 与 M+N 只比较满连接情况下的适配实现种类。 业务语义映射、授权、部署、运行和结果核验仍各有成本。
  9. 没有。 Card 是声明,不是授权结果或质量证明;身份、权限和成果仍要分别验证。

上一章:第 7 章 记忆与检索:让旧信息在需要时重新进入上下文 下一章:第 9 章 多 Agent:什么时候值得,什么时候是自找麻烦