MCP 与 A2A:AI Agent 互操作的协议边界、可信边界与工程落地

约 2998 字 约 10 分钟阅读

2026-07-22 MCP 与 A2A:AI Agent 互操作的协议边界、可信边界与工程落地

过去一年,Agent 系统的讨论很容易被简化成一个问题:要不要接入 MCP,或者要不要采用 A2A。这个问法本身就容易把架构带偏,因为两者解决的并不是同一层的问题。

截至本文写作时,Model Context Protocol(MCP)已经形成了较完整的客户端、服务端和授权规范;Agent2Agent(A2A)则在 2026 年发布了 1.0 版本,试图为跨框架、跨组织的 Agent 协作提供统一通信层。前者回答“Agent 如何安全地使用工具和数据”,后者回答“一个 Agent 如何把任务交给另一个 Agent”。

真正需要解决的问题不是在二者之间二选一,而是划清协议边界、可信边界和职责边界。


一、先区分两个完全不同的问题

一个实际的 Agent 系统通常至少有三类参与者:用户、负责决策的 Agent、提供能力的外部系统。外部系统可能是 GitHub、数据库、浏览器、企业内部 API,也可能是一个由另一个团队维护的专业 Agent。

MCP 的核心模型是 Host、Client、Server:

  • Host 是承载 LLM 的应用,例如 IDE、桌面客户端或自建 Agent Runtime。
  • Client 是 Host 内部连接某个 MCP Server 的协议端。
  • Server 暴露资源、提示词模板和工具。

它的重点是把“模型需要的信息”和“模型可以调用的函数”标准化。协议以 JSON-RPC 2.0 为基础,要求能力协商,并把 Resources、Prompts、Tools 作为主要服务端能力。

A2A 则将通信对象提升为独立 Agent。一个远端 Agent 可以公开自己的能力描述,通过 Agent Card 被发现,接收任务、流式返回进度、异步完成长任务,并且不必暴露其内部模型、记忆、工具链或私有实现。

因此可以用一句简单的话概括:

MCP 解决 Agent 到能力的连接;A2A 解决 Agent 到 Agent 的协作。

把数据库查询封装成 A2A Agent 并非绝对错误,但通常会平白引入任务管理、状态同步和远端调度复杂度;反过来,把一个拥有独立目标、独立权限和长时间任务生命周期的专业 Agent 伪装成 MCP Tool,也会丢失协作语义。


二、协议层不等于信任层

MCP 和 A2A 都能让系统“连通”,但连通不等于可信。协议描述消息如何传输、能力如何发现、任务如何流转;授权策略、数据最小化和审计责任仍然属于应用架构。

以 MCP 为例,官方规范明确提醒:Tool 代表任意代码执行路径;工具描述和注解在不可信服务器的场景下也应视为不可信输入。Host 应当在调用工具前取得用户明确授权,并使用户理解该操作会造成什么影响。

这带来三个工程结论。

1. 不要把 Tool 名称当成安全证明

一个名为 read_file 的工具未必只读文件;一个名为 deploy_preview 的工具也可能提交代码、上传环境变量或触发外部工作流。模型看到的名字、描述和 JSON Schema 都是决策线索,不是安全边界。

真正的安全边界应位于工具执行端:

  • 依据身份和租户做服务端鉴权。
  • 使用最小权限令牌,而不是共享高权限密钥。
  • 对路径、SQL、URL、命令参数做服务端验证。
  • 对高风险动作设置显式审批和可撤销的授权。
  • 记录调用主体、参数摘要、资源范围、结果与失败原因。

2. 不要让远端 Agent 继承本地 Agent 的全部权限

在 A2A 场景中,调用方 Agent 不应将自己的长期凭据、完整上下文或无范围访问权直接转交给被调用方。远端 Agent 是一个独立的信任主体,即使它由合作团队维护,也可能发生提示词注入、依赖投毒、配置漂移或权限扩张。

更稳妥的做法是为每次任务签发范围明确、有效期短、可审计的委托凭据。委托内容至少需要限定:允许访问的资源、允许执行的动作、任务截止时间、最大调用次数与预算。

3. “用户已确认”不是一次性的布尔值

读取公开文档、读取私有仓库、创建 issue、执行迁移、生产发布属于不同风险等级。将它们压缩成一个“允许 Agent 操作”的开关,会让确认流程失去意义。

更合理的模型是基于动作和资源的分级策略。例如,read:repository 可以在任务范围内持续有效;write:repository 需要变更摘要确认;deploy:production 需要展示目标环境、版本、回滚方式与影响范围后再次确认。


三、为什么 A2A 不能简单替代 MCP

A2A 的价值在于处理“黑盒 Agent 协作”。它允许两个 Agent 在不共享内部记忆、提示词、模型提供商和工具实现的前提下协作。这对于跨组织系统尤其重要。

但它并不规定一个 Agent 内部如何调用子 Agent,也不定义工具调用细节。A2A 官方文档也明确将其定位为 Agent 间通信协议,而不是 Agent 开发框架、子 Agent 协议或 MCP 的替代品。

可以把一个典型系统分为三层:

用户 / 产品界面
        |
编排 Agent:规划、授权、预算、审计
        |
  +-----+------------------+
  |                        |
MCP                     A2A
  |                        |
工具、资源、企业 API       独立的专业 Agent

其中,编排 Agent 负责对用户意图进行拆解,并对每个动作作出授权与预算判断。

  • 需要读取仓库、查询数据库、创建工单时,调用 MCP Server 提供的具体工具。
  • 需要委托法律审查 Agent、财务分析 Agent、代码迁移 Agent 或另一个组织的工作流 Agent 时,使用 A2A 发送任务。
  • 被委托的远端 Agent 内部仍可以使用 MCP 连接它自己的工具和资源。

这种分层避免了两个常见问题:把低层工具包装成“假 Agent”,以及让中心编排器直接持有所有系统的高权限凭据。


四、把任务生命周期设计为可恢复的状态机

传统 RPC 往往假设请求会在短时间内完成,但 Agent 任务并不符合这个假设。一个任务可能需要等待人工补充信息、轮询第三方系统、执行多步验证,甚至因预算耗尽而暂停。

因此,跨 Agent 协作至少应具有以下状态:

submitted -> working -> input-required -> completed
                     \-> failed
                     \-> canceled

工程上最重要的是:状态必须由服务端持久化,而不是只存在某次模型上下文中。调用方应保存稳定的任务标识,支持查询、取消、重试和恢复;被调用方应将中间产物、最终产物、错误码和可重试性清晰区分。

例如,一个“升级依赖并提交 Pull Request”的远端代码 Agent,不应只返回自然语言结论。至少应返回结构化产物:

{
  "taskId": "task_7d91",
  "status": "completed",
  "artifacts": [
    { "type": "pull_request", "url": "https://example.com/pull/42" },
    { "type": "report", "content": "已升级 12 个依赖,测试通过 86/88。" }
  ],
  "warnings": ["两个快照测试需要人工确认"]
}

自然语言仍然适合解释,但它不应是自动化链路唯一的契约。调用方需要能够基于状态和产物编排后续动作,而不是依赖模型再去猜一段文本的含义。


五、能力发现应当是“可验证的声明”

无论是 MCP 的能力协商,还是 A2A 的 Agent Card,能力发现都不应被误解为可信注册。一个 Agent 声称自己“可以处理支付审批”,不代表它真的拥有该权限,也不代表它的输出满足组织合规要求。

生产环境建议为能力描述增加以下控制:

  1. 来源验证:只接受经过签名、受信任注册表或明确 allowlist 中的服务。
  2. 版本固定:记录协议版本、Agent 版本、工具版本和 Schema 版本,避免能力在运行中静默变化。
  3. 策略映射:把声明的能力映射到组织策略,例如只有经过审批的 code-review Agent 可以接触特定仓库。
  4. 运行时校验:服务端再次验证调用者身份、任务范围和参数,而不是只依赖发现阶段信息。
  5. 可观测性:对发现、协商、授权、调用、重试和取消建立同一条 trace。

这里的关键原则是:能力描述用于路由,策略系统用于授权,执行端用于强制。


六、MCP Server 的安全设计比“接入数量”更重要

随着 MCP Server 增多,风险往往不是某个工具过于危险,而是多个低风险能力组合后形成了高风险路径。

例如:一个工具可以读取 issue,另一个工具可以读取环境变量,第三个工具可以向外部 URL 发送请求。它们单独看都可能通过审查,组合起来却可能造成数据外泄。

因此,MCP Server 的评审不应只看单个 Tool,还应评估调用图:

  • 哪些资源能够进入模型上下文?
  • 哪些内容可能被模型转发给其他工具?
  • 哪些工具可访问网络或持久化存储?
  • 是否存在从“读取敏感信息”到“外发信息”的可达路径?
  • 用户确认发生在链路的哪个节点?

在实现上,建议把工具按副作用分为 readwriteexecuteexternal-egress 四类,并默认禁止跨类自动串联。尤其是 external-egress,即向外部网络、第三方服务或不可逆系统发送数据的操作,应获得单独策略控制。


七、一个可落地的最小架构

对于刚开始建设 Agent 平台的团队,不必一开始就实现复杂的去中心化协作网络。可以从以下最小架构开始:

  1. 建立一个编排层,负责身份、会话、预算、审批和审计。
  2. 将内部数据源和确定性操作封装为 MCP Server。
  3. 为每个 Tool 定义输入 Schema、输出 Schema、副作用级别与资源范围。
  4. 对耗时或跨团队任务引入 A2A Agent,并要求其返回结构化任务状态和产物。
  5. 使用统一 traceId 贯穿用户请求、模型调用、MCP 调用和 A2A 任务。
  6. 将策略判断放在模型之外,使模型只能提出调用意图,不能绕过执行端授权。

一个健康的系统应当允许替换模型、替换工具实现、替换远端 Agent,而不改变授权和审计的基本机制。协议的价值就在于降低这种替换成本;但只有将安全、状态和可观测性设计在协议之外,替换才不会演变成失控。


结语

MCP 和 A2A 的出现说明 Agent 工程正在从“单模型调用”进入“协议化系统集成”阶段。前者让工具和数据连接更标准,后者让独立 Agent 的协作开始有共同语言。

但协议不是自治系统的安全证明。一个可靠的 Agent 平台,必须同时回答四个问题:谁可以调用、可以访问什么、何时需要确认、出了问题如何追溯。把这些问题交给模型自行判断,或者寄希望于某个协议名称,本质上都是把架构责任推迟到事故发生之后。

真正值得投入的,不是接入更多协议,而是在清晰边界内让协议发挥作用。


参考资料

  1. Model Context Protocol Specification, 2025-11-25
  2. MCP Architecture
  3. MCP Authorization
  4. Introducing the Model Context Protocol, Anthropic, 2024-11-25
  5. A2A Protocol Documentation
  6. Agent2Agent Protocol Repository
aiagentmcpa2a协议互操作性安全架构设计

评论讨论