Google 在 2025 年 4 月 9 日发布了的一个重磅项目——Agent2Agent (A2A) 协议。这个协议旨在解决当前 AI Agent 生态中的一个核心痛点:不同厂商、不同框架下的智能体如何有效沟通与协作?
让我们深入 A2A 的 GitHub 仓库,从代码和文档中一探究竟,并看看它与另一个备受关注的协议 MCP 有何异同。
GitHub 地址: https://github.com/google/A2A
首先,我们看看项目的代码结构(如下图所示):
项目中有一个值得关注的文件:llms.txt
。这是一种新兴的规范,我们先从它说起。
llms.txt
- 让大模型读懂你的项目根据 llmstxt.org 的定义,llms.txt
文件是一种标准化的文本文件,旨在帮助大型语言模型(LLM)在推理时更好地理解和使用网站或项目的信息。它提供了一种机器可读且易于维护的方式,来声明服务的能力、接口规范、元数据等关键信息,有点像专为 LLM 设计的 sitemap.xml
,但内容更丰富、更聚焦。
在 Google A2A 项目中,llms.txt
文件扮演了以下角色:
主要讲了:
那么,A2A 协议本身究竟是为了解决什么问题而诞生的呢?核心目标非常明确:让不同厂商、不同框架、不同技术实现的 AI 智能体(Agent)能够互相发现、通信与协作。
具体来说,A2A 旨在解决:
总结一下:A2A 协议的本质,是为日益复杂的多智能体系统提供一个开放、标准、可扩展的通信和协作基础,打破技术壁垒,实现真正的「智能体互联互通」。
为了实现上述目标,A2A 协议依赖以下核心技术组件和机制:
/.well-known/agent.json
),描述 Agent 能力、技能、端点、认证等,供客户端发现。TextPart
, FilePart
, DataPart
支持文本、文件、结构化 JSON 等多种内容。tasks/sendSubscribe
和 tasks/resubscribe
实现 Server-Sent Events,实时推送任务状态和产物。tasks/pushNotification/set
配置,Agent 可主动将更新推送到客户端指定的 URL。这些机制共同保证了协议的互操作性、灵活性和实际落地能力。
common
目录的通用能力 (Python 版)在 A2A 的 Python 示例代码中,samples/python/common
目录实现了 A2A 协议的通用基础功能,为构建 A2A 客户端和服务端提供了可复用的核心组件:
types.py
:定义了所有 A2A 核心数据结构。server/
:包含 A2AServer
(基于 Starlette 的服务端入口) 和 TaskManager
(任务管理抽象)。client/
:包含 A2AClient
(客户端调用逻辑封装) 和 A2ACardResolver
(AgentCard 发现)。utils/
:提供缓存、推送通知认证等工具。设计意义:common
目录将通用实现抽象出来,减少重复开发,提升效率和一致性,是构建 A2A 兼容应用的基石。
一个典型的 A2A 交互流程如下:
/.well-known/agent.json
),了解其能力。tasks/send
(同步) 或 tasks/sendSubscribe
(异步流式) 发起任务。submitted
-> working
。input-required
,等待客户端再次调用 tasks/send
。sendSubscribe
) 推送状态 (TaskStatusUpdateEvent
) 和产物 (TaskArtifactUpdateEvent
)。completed
, failed
, canceled
)。tasks/get
查询状态,tasks/cancel
取消任务,tasks/resubscribe
重新订阅流。流程图如下:
这个标准化的流程确保了不同 Agent 间交互的可预测性和可靠性。
根据 A2A 官方文档的说明 (A2A and MCP),两者是互补的,而非竞争关系。
可以这样理解:
它们如何互补?
官方文档的汽车维修店例子:
集成点:Google 建议可以将 A2A Agent 本身建模为 MCP 资源(通过 AgentCard 描述)。这样,一个智能体框架既可以通过 MCP 调用外部工具和数据,也可以通过 A2A 与用户或其他智能体进行无缝通信。
官方示例图:
A2A 和 MCP 解决了智能体生态中不同层面的互操作性问题。MCP 侧重于模型与工具/数据的连接,而 A2A 侧重于智能体之间的协作与通信。两者结合,将共同推动一个更强大、更灵活、更互联的智能体生态系统的发展。
虽然官方这么说,但是随着 A2A 协议的推行,其可能会「吃掉」MCP (个人猜想 ^_^)
以上。