A2A + MCP:2026 年多 Agent 系统的通信层架构,我帮你拆清楚了

MCP 和 A2A 不是二选一的关系,一个是连接工具,一个是连接 Agent,两者组合才是多 Agent 系统的完整通信方案。

你在搭多 Agent 系统。Agent 之间怎么说话,每个 Agent 怎么用工具——这两个问题你迟早得面对。

2025 年的时候,答案还不明朗:MCP 刚出没多久,A2A 才刚发布,大家都在观望。到了 2026 年 5 月的今天,事情清楚多了。MCP 的 GitHub Stars 冲到 8 万 +,A2A 被 Linux Foundation 托管,生态已经成熟到可以做架构决策了。

但问题变成了另一个:这两玩意到底怎么搭?

网上大部分文章要么只讲 MCP、要么只讲 A2A,很少有人把它们放在一个系统里讲清楚。我今天换个角度——不是给你读规范,是给你讲一个正在搭多 Agent 系统的人,到底该怎么看 MCP 和 A2A


先说清楚:它俩解决的不是同一个问题

这是 2026 年最常见的误解——有人以为 MCP 和 A2A 是竞品,要二选一。

不可能。因为它们的职责压根不在一个层面上。

MCP 是做事的。A2A 是说话的。

MCP(Model Context Protocol)解决的是 Agent 跟工具之间的连接问题。你的 Agent 要读文件、查数据库、调 API,这些都需要 MCP。每个 Agent 内部挂一个 MCP Client,通过标准协议跟各种 MCP Server 通信。2026 年,社区已经有 8000+ 个 MCP Server,从文件系统到 GitHub 到 Slack 到数据库,摆在那里直接用。

A2A(Agent-to-Agent)解决的是 Agent 跟 Agent 之间的通信问题。你的研究 Agent 写完了报告,怎么告诉写作 Agent?写作 Agent 写完了,怎么通知审核 Agent?这些 Agent 可能是不同团队写的、跑在不同服务器上的、用不同框架搭的。没有标准协议,你就要给每个 Agent 写一套自定义 API。

给你一个最直观的类比:

  • MCP 像 USB-C:设备(Agent)通过标准接口连接配件(工具)
  • A2A 像 HTTP:不同设备(Agent)之间通过标准协议互相通信

USB-C 和 HTTP 是竞品吗?不是。一个管连接,一个管通信,层次不同。


那 A2A 和 MCP 在架构里到底怎么共存?

我直接给你画一个 2026 年比较标准的多 Agent 架构图(文字版,但足够清楚):

                    ┌─────────────────────────┐
                    │     编排 Agent (A2A)     │
                    │   负责任务拆分和调度       │
                    └──────┬──────────┬───────┘
                           │  A2A      │ A2A
                    ┌──────▼──┐   ┌───▼──────┐
                    │ 搜索     │   │ 写作     │
                    │ Agent    │   │ Agent    │
                    │ (A2A)   │   │ (A2A)   │
                    └──┬─┬────┘   └──┬──┬────┘
                       │ │          │  │
                    MCP│ │MCP    MCP│  │MCP
                    ┌──▼─▼──┐   ┌──▼──▼──┐
                    │ Web   │   │ 文档   │
                    │搜索   │   │ 生成   │
                    │Server  │   │ Server │
                    └───────┘   └───────┘

每个 Agent 都有两层:对外用 A2A(跟其他 Agent 说话),对内用 MCP(调用自己的工具)。

编排 Agent 用 A2A 把任务发给搜索 Agent,搜索 Agent 内部用 MCP 调搜索引擎,拿到结果后用 A2A 返回给编排 Agent。编排 Agent 再通过 A2A 把信息发给写作 Agent,写作 Agent 内部用 MCP 调文档生成工具。

分工明确,边界清晰。你不需要在 A2A 的消息里塞工具调用的逻辑,也不需要让 MCP 去管 Agent 之间的任务调度。


Agent Card:A2A 最巧妙的设计

A2A 里我最喜欢的一个概念是 Agent Card

你可以把它理解成 Agent 的名片。每个 A2A 兼容的 Agent 都必须暴露一个 JSON 格式的 Agent Card,告诉别人自己是谁、能干什么、怎么调用。

长这样:

{
  "name": "Research Agent",
  "description": "专业的研究分析 Agent,擅长信息搜集",
  "url": "https://agent.example.com/a2a",
  "skills": [
    {
      "id": "web_search",
      "name": "网页搜索",
      "description": "搜索互联网获取最新信息"
    },
    {
      "id": "data_analysis",
      "name": "数据分析",
      "description": "分析结构化数据并生成报告"
    }
  ],
  "authentication": { "schemes": ["Bearer"] }
}

为什么这玩意重要?因为多 Agent 系统的核心难点从来不是"一个 Agent 有多强",而是"Agent 之间怎么发现彼此"

传统做法是你写死配置:A Agent 知道 B Agent 的地址,B 知道 C 的地址。一旦新增或者替换 Agent,你要改配置、重启、测试。拿微服务的话说——这是硬编码的服务发现。

Agent Card 让服务发现变成了动态的。编排 Agent 可以查询目录服务:"给我找一个能做数据分析的 Agent",目录返回匹配的 Agent Card,编排 Agent 直接发任务。新增一个数据分析 Agent?不需要改任何代码,只要它在目录里注册一下就行。

A2A 定义了三种发现方式:

  1. 已知 URL:直接请求 /.well-known/agent.json
  2. 目录服务:企业部署 Agent 注册中心,按需查询
  3. 广播发现:局域网内的 Agent 自动发现

对于这类多 Agent 系统,目录服务是最合理的方案。你可以在系统启动时让所有 Agent 注册到中心目录,编排 Agent 按技能查询,不需要硬编码任何地址。


任务生命周期:别小看这个状态机

多 Agent 系统里一个最容易被低估的问题是任务状态管理

你的编排 Agent 把任务发给搜索 Agent 之后,怎么知道它做完了?如果搜索 Agent 做一半挂了怎么办?如果需要用户确认才能继续怎么办?

没有标准协议的时候,你要自己设计这套状态机。每个团队的设计还不一样,跨系统协作的时候直接崩。

A2A 定义了一套通用的任务生命周期:

submitted → working → input-required → completed
                    ↓
                  failed
                    ↓
                  canceled

每个状态都有明确的语义:

  • submitted:任务已投递,对方确认收到
  • working:正在处理,支持流式输出进度
  • input-required:需要额外输入
  • completed:干完了,附结果
  • failed:挂了,附错误信息
  • canceled:被取消了

这套状态机的价值在于——你不需要跟每个 Agent 的开发者对齐"什么叫完成"。A2A 的标准里写死了,所有人都按同一套来。


实际搭一个:写代码看看

假设你要搭一个研究报告自动生成系统,三个 Agent:研究 Agent(查资料)、搜索 Agent(具体搜索)、写作 Agent(生成报告)。

搜索 Agent 的 A2A Server 实现(Python):

from a2a.server import A2AServer
from a2a.types import AgentCard, TaskStatus

agent_card = AgentCard(
    name="Search Agent",
    description="专业的互联网信息搜索 Agent",
    url="http://localhost:8000",
    skills=[{"id": "web_search", "name": "网页搜索"}]
)

server = A2AServer(agent_card=agent_card)

@server.task_handler()
async def handle_task(task):
    query = task.message.content
    results = await mcp_client.call_tool("search", {"query": query})
    return TaskStatus(state="completed", artifacts=[results])

编排 Agent 的 A2A Client:

from a2a.client import A2AClient

search_agent = await A2AClient.discover(
    "https://search-agent.example.com/.well-known/agent.json"
)

task = await search_agent.send_task({
    "message": {"role": "user", "content": "搜索 2026 AI Agent 趋势"}
})

async for update in task.stream():
    if update.state == "completed":
        print(update.artifacts[0])

看到没?编排 Agent 不需要知道搜索 Agent 内部怎么实现的、用的是什么搜索引擎、代码是什么语言写的。它只需要知道 Agent Card 里写的"这个 Agent 能做网页搜索",然后发任务、收结果。这就是标准协议的价值。


什么时候该用什么?我的判断

MCP 是必选项,不是可选项。 如果你的 Agent 需要跟外部工具交互——读文件、查数据库、调 API——那么 MCP 就是你最好的选择。8000+ 现成服务器摆在那,而且所有主流 Agent 框架都支持 MCP(Claude Code、Cursor、Cline、LangChain 全支持)。

A2A 是可选项,但在以下场景里价值极大:

  • 你有 3 个以上 不同类型的 Agent 需要协作
  • Agent 由 不同团队 开发,或者用 不同框架 搭建
  • Agent 部署在不同服务器 上,需要远程通信
  • 你希望系统能 动态增减 Agent,而不是硬编码连接

如果只是单 Agent 系统——比如一个 Agent 接几个 MCP Server——那 A2A 对你没意义。


2026 年的多 Agent 开发,已经不需要从零造轮子了。MCP 把工具调用标准化了,A2A 把 Agent 通信标准化了。你要做的就是搭好架构、选对协议、把精力花在真正有差异的地方——Agent 的业务逻辑本身。别花时间写自定义通信协议。人家已经帮你写好了。

评论

此博客中的热门博文

我写了半年 prompt,最后发现最好的技巧就三个