【A2A Protocol】AI Agent 互联互通协议深度解析:架构、设计与 MCP 的分工
一句话核心结论:A2A(Agent2Agent)协议是 AI Agent 世界的”HTTP”——它让不同框架、不同公司构建的 Agent 能够互相通信,而 MCP 负责的是 Agent 内部的工具调用。A2A 解决的是 Agent 协作的”最后一公里”问题。
前言
想象一个场景:你在公司用 Salesforce 管理客户,用 Slack 沟通协作,用 GitHub 管理代码——它们之间通过 API 和 Webhook 互联互通。但如果你有三个 AI Agent,分别由 LangChain、AutoGen 和自制框架构建,它们之间能直接对话吗?
答案是:以前不能,现在可以了。
Google 主导的 A2A(Agent2Agent)协议正在为 AI Agent 世界建立一套标准的”普通话”。截至 2026 年 5 月,该项目已获得 23,527 颗 GitHub Stars,被 8 家顶级科技公司的技术委员会共同指导,并已进入 1.0 生产稳定版阶段。
本文将深入解析 A2A 协议的核心设计理念、协议架构、关键数据模型,以及它与 MCP 的分工边界。
一、为什么需要 A2A?
当前 AI Agent 领域面临一个根本性问题:框架割裂。
企业级 AI 系统通常由多个专业化 Agent 组成——有的负责研究,有的负责执行,有的负责审核。这些 Agent 可能由不同团队、使用不同框架、在不同服务器上运行。当一个 Agent 需要调用另一个 Agent 时,开发者只能针对每个组合单独编写适配代码,这导致了:
- 厂商锁定:深度绑定某一框架的 Agent 生态
- 重复造轮子:每对 Agent 协作都需要定制开发
- 无法跨组织协作:组织 A 的 Agent 无法安全地调用组织 B 的 Agent
- 黑盒协作:Agent 之间无法发现彼此能力,只能硬编码调用
A2A 的核心目标是打破这些孤岛,让 Agent 可以像 Web 服务一样,通过标准协议互相发现、协商和协作。
二、A2A 协议核心概念
2.1 协议定位:A2A 是”Agent 间的 HTTP”
在深入技术细节之前,先理解 A2A 在整个 AI Agent 技术栈中的位置至关重要:
graph TB
subgraph "Agent 内部 (MCP 的作用域)"
LLM["🤖 LLM"]
TOOL["🔧 工具调用\n文件读写/搜索/代码执行"]
CTX["📚 Context / Memory\nRAG / 知识库检索"]
LLM --> TOOL
LLM --> CTX
end
subgraph "Agent 之间 (A2A 的作用域)"
AGENT_A["📦 Agent A\n(LangChain / AutoGen / 自研)"]
AGENT_B["📦 Agent B\n(不同框架)"]
AGENT_C["📦 Agent C\n(不同组织)"]
end
AGENT_A <-->|"A2A 协议"| AGENT_B
AGENT_A <-->|"A2A 协议"| AGENT_C
AGENT_B <-->|"A2A 协议"| AGENT_C
style LLM fill:#E8D5F5,stroke:#CE93D8,stroke-width:2px,color:#333
style TOOL fill:#FFDAB9,stroke:#FFAB76,stroke-width:2px,color:#333
style CTX fill:#FFDAB9,stroke:#FFAB76,stroke-width:2px,color:#333
style AGENT_A fill:#C7CEEA,stroke:#9FA8DA,stroke-width:2px,color:#333
style AGENT_B fill:#C7CEEA,stroke:#9FA8DA,stroke-width:2px,color:#333
style AGENT_C fill:#C7CEEA,stroke:#9FA8DA,stroke-width:2px,color:#333MCP(Model Context Protocol)定义的是”Agent 如何调用工具和获取上下文”,解决的是单个 Agent 内部的问题。
A2A 定义的是”Agent 如何与其他 Agent 通信协作”,解决的是多个 Agent 之间的协作问题。
两者是正交关系,一个 Agent 内部可以同时使用 MCP(调用工具)和 A2A(调用其他 Agent)。
三、协议架构深度解析
3.1 传输层:多种协议绑定
A2A 协议采用传输无关的设计,支持三种主流传输方式:
graph LR
subgraph "A2A 协议层"
CORE["📋 核心语义\nTask / Message / Artifact"]
end
subgraph "传输绑定"
HTTP["🌐 HTTP + JSON-RPC\n最简单的接入方式"]
GRPC["⚡ gRPC\n高性能场景"]
REST["🔁 HTTP + REST\nWeb 友好"]
end
CORE --> HTTP
CORE --> GRPC
CORE --> REST
style CORE fill:#E8D5F5,stroke:#CE93D8,stroke-width:2px,color:#333
style HTTP fill:#B5EAD7,stroke:#80CBC4,stroke-width:2px,color:#333
style GRPC fill:#B5EAD7,stroke:#80CBC4,stroke-width:2px,color:#333
style REST fill:#B5EAD7,stroke:#80CBC4,stroke-width:2px,color:#333| 传输方式 | 适用场景 | 特点 |
|---|---|---|
| HTTP + JSON-RPC | 通用场景,最易接入 | 纯 JSON,可穿透防火墙 |
| gRPC | 高性能、低延迟 | Protocol Buffers 序列化,适合内部网络 |
| HTTP + REST | Web 原生应用 | 与现有 Web 基础设施兼容 |
协议还支持同步请求/响应和**流式响应(SSE)**两种交互模式,客户端可以根据场景选择轮询、流式或 Webhook 推送来获取结果。
3.2 核心数据模型
A2A 定义了四个核心实体:
classDiagram
class Task {
+string id
+string context_id
+TaskStatus status
+repeated Artifact artifacts
+repeated Message history
+get_state() TaskState
}
class Message {
+string message_id
+string context_id
+string task_id
+Role role
+repeated Part parts
+send() Task
}
class Artifact {
+string artifact_id
+string name
+repeated Part parts
+append(last_chunk)
}
class Part {
+text / raw / url / data
+metadata
+filename
+media_type
}
class AgentCard {
+string name
+string description
+repeated AgentInterface supported_interfaces
+AgentCapabilities capabilities
+repeated AgentSkill skills
}
Task "1" --> "*" Message : history
Task "1" --> "*" Artifact : artifacts
Message --> "*" Part : parts
Artifact --> "*" Part : partsTask(任务):A2A 的核心工作单元
Task 是 A2A 协议中最核心的概念,代表一次完整的 Agent 协作工作单元。它包含:
- 唯一标识:
id(UUID)用于追踪整个任务 - 上下文标识:
context_id将多个相关的 Task 归到同一个会话或项目下 - 状态机:
status跟踪任务生命周期 - 产物:
artifacts存储任务产生的结果(如生成的报告、代码文件) - 历史:
history记录完整的交互过程
TaskState 状态机
stateDiagram-v2
[*] --> SUBMITTED: 任务创建
SUBMITTED --> WORKING: Agent 开始处理
WORKING --> COMPLETED: 成功完成
WORKING --> FAILED: 执行出错
WORKING --> CANCELED: 被取消
WORKING --> INPUT_REQUIRED: 需要用户输入
WORKING --> AUTH_REQUIRED: 需要认证
WORKING --> REJECTED: Agent 拒绝执行
INPUT_REQUIRED --> WORKING: 用户提供输入
AUTH_REQUIRED --> WORKING: 认证完成
COMPLETED --> [*]
FAILED --> [*]
CANCELED --> [*]
REJECTED --> [*]
note right of WORKING: 核心处理状态\nAgent 在此状态下产出 Artifact3.3 AgentCard:Agent 的”身份证”
AgentCard 是 A2A 协议中最巧妙的设计之一——它解决了 Agent 发现(Discovery) 的问题。每个 A2A Agent 都会暴露一个标准化的 AgentCard,让其他 Agent 或客户端能够:
- 了解该 Agent 能做什么(
skills) - 支持哪些通信方式(
supported_interfaces) - 需要什么样的认证(
security_schemes) - 签名验证(
signatures)防止身份伪造
1 | message AgentCard { |
关键理解:AgentCard 包含的是 Agent 的能力描述,而非内部实现细节。这正是 A2A”保持 Opacity(不透明性)”原则的体现——Agent 之间可以在不了解彼此内部架构的情况下协作。
3.4 任务生命周期:完整交互流程
sequenceDiagram
participant Client as 👤 客户端/Orchestrator
participant AgentA as 📦 Agent A (研究 Agent)
participant AgentB as 📦 Agent B (执行 Agent)
Note over Client: 1. 发现 Agent
Client->>AgentB: GET /agentCard
AgentB-->>Client: AgentCard {name: "执行 Agent", skills: [...]}
Note over Client: 2. 创建任务
Client->>AgentB: POST /message:send {message: "执行 SQL 查询"}
AgentB-->>Client: Task {id: "task-123", status: WORKING}
Note over Client: 3. 订阅任务更新 (SSE)
Client->>AgentB: GET /tasks/task-123:subscribe
AgentB-->>Client: Stream: TaskStatusUpdateEvent(WORKING)
AgentB-->>Client: Stream: TaskArtifactUpdateEvent(数据片段1)
AgentB-->>Client: Stream: TaskArtifactUpdateEvent(数据片段2, last_chunk=true)
AgentB-->>Client: Stream: TaskStatusUpdateEvent(COMPLETED)
Note over Client: 4. 获取最终结果
Client->>AgentB: GET /tasks/task-123
AgentB-->>Client: Task {artifacts: [{parts: [...]}]}
Note over AgentA: 进阶:Agent 之间的 A2A 调用
AgentA->>AgentB: POST /message:send {message: "需要执行复杂分析"}
AgentB-->>AgentA: Task {status: COMPLETED, artifacts: [...]}四、实战代码:构建一个 A2A Agent
下面通过 Python SDK 演示如何快速构建一个符合 A2A 协议的 Agent。
4.1 安装
1 | pip install a2a-sdk uv |
4.2 定义 AgentCard(Agent 的能力声明)
1 | from a2a import AgentSkill, AgentCard, AgentCapabilities, AgentProvider |
4.3 实现 A2A Server(使用 Starlette + FastAPI)
1 | from a2a.server.starlette import A2AStarletteAdapter |
4.4 实现 A2A Client(调用其他 Agent)
1 | import asyncio |
4.5 使用 Streaming 实时获取任务进度
1 | async def stream_task_updates(): |
五、A2A vs MCP:一张图说清楚分工
这是目前社区最容易混淆的概念。让我用一张图彻底讲清楚:
graph TB
subgraph "单个 Agent 内部"
LLM["🤖 LLM\n(大语言模型)"]
subgraph "MCP 管辖范围"
TOOL["🔧 工具\n搜索/文件IO/代码执行"]
KB["📚 知识库\n向量数据库/RAG"]
MEM["🧠 记忆\n对话历史/长期记忆"]
end
LLM --> TOOL
LLM --> KB
LLM --> MEM
TOOL --> LLM
KB --> LLM
MEM --> LLM
end
subgraph "多个 Agent 之间"
AGENT1["📦 Agent 1\n(研究 Agent)"]
AGENT2["📦 Agent 2\n(执行 Agent)"]
AGENT3["📦 Agent 3\n(审核 Agent)"]
AGENT1 <-->|"A2A"| AGENT2
AGENT2 <-->|"A2A"| AGENT3
AGENT1 <-->|"A2A"| AGENT3
end
style LLM fill:#E8D5F5,stroke:#CE93D8,stroke-width:2px,color:#333
style TOOL fill:#FFDAB9,stroke:#FFAB76,stroke-width:2px,color:#333
style KB fill:#FFDAB9,stroke:#FFAB76,stroke-width:2px,color:#333
style MEM fill:#FFDAB9,stroke:#FFAB76,stroke-width:2px,color:#333
style AGENT1 fill:#C7CEEA,stroke:#9FA8DA,stroke-width:2px,color:#333
style AGENT2 fill:#C7CEEA,stroke:#9FA8DA,stroke-width:2px,color:#333
style AGENT3 fill:#C7CEEA,stroke:#9FA8DA,stroke-width:2px,color:#333| 维度 | MCP(Model Context Protocol) | A2A(Agent2Agent) |
|---|---|---|
| 解决的问题 | Agent 如何调用工具和获取上下文 | Agent 如何与其他 Agent 通信协作 |
| 类比 | 浏览器的 Web API(fetch/XMLHttpRequest) | 互联网的 HTTP 协议 |
| 典型场景 | Agent 调用搜索 API、读写文件、操作数据库 | 研究 Agent 将任务委托给执行 Agent |
| 通信方向 | Agent → 工具/资源(单向) | Agent ↔ Agent(双向) |
| 状态管理 | 无状态,每次独立调用 | 有状态,完整的 Task 生命周期 |
| 标准化组织 | Model Context Protocol (Anthropic 主导) | Linux Foundation (Google 主导) |
两者结合的典型架构:
flowchart LR
subgraph "Orchestrator Agent"
LLM_O["🤖 LLM"]
end
subgraph "Specialist Agents"
LLM_S1["🤖 研究 Agent"]
LLM_S2["🤖 执行 Agent"]
end
subgraph "Tools (MCP)"
SEARCH["🔍 搜索 MCP"]
CODE["💻 代码执行 MCP"]
end
LLM_O -->|"MCP"| SEARCH
LLM_O -->|"MCP"| CODE
LLM_O -->|"A2A"| LLM_S1
LLM_O -->|"A2A"| LLM_S2
LLM_S1 -->|"MCP"| SEARCH
LLM_S2 -->|"MCP"| CODE
style LLM_O fill:#E8D5F5,stroke:#CE93D8,color:#333
style LLM_S1 fill:#C7CEEA,stroke:#9FA8DA,color:#333
style LLM_S2 fill:#C7CEEA,stroke:#9FA8DA,color:#333
style SEARCH fill:#B5EAD7,stroke:#80CBC4,color:#333
style CODE fill:#B5EAD7,stroke:#80CBC4,color:#333六、A2A v1.0 企业级特性
A2A 1.0 在 2026 年初发布,带来了一系列面向生产环境的新特性:
6.1 Signed AgentCard(签名验证)
1 | message AgentCardSignature { |
每个 AgentCard 都可以附带的 JWS 签名,允许接收方通过公钥验证 AgentCard 的真实性和完整性。这在跨组织协作中至关重要——你可以在与未知 Agent 通信前,先验证它的身份是否可信。
6.2 Multi-Tenancy(多租户)
A2A 协议支持在单一端点上托管多个 Agent,通过 tenant 路径参数区分:
1 | POST /{tenant}/message:send |
这使得企业可以在同一组服务器上运行多个 Agent,服务不同的业务线或客户,同时保持隔离。
6.3 Push Notifications(推送通知)
传统的轮询方式在长时间运行的任务中效率很低。A2A 支持 Webhook 推送,当任务状态变更时主动通知客户端:
1 | config = SendMessageConfiguration( |
七、优缺点分析
优点
| 维度 | 说明 |
|---|---|
| 架构简洁性 | 核心概念少(Task/Message/Artifact/AgentCard),上手容易 |
| 协议灵活性 | 支持 HTTP/gRPC/REST多种传输方式,适应不同场景 |
| 安全设计 | 内置 OAuth2、API Key、mTLS 等多种认证方案 |
| 可发现性 | AgentCard 机制让 Agent 可以动态发现彼此能力 |
| 多框架兼容 | SDK 已支持 Python/Go/JS/Java/.NET,主流框架可接入 |
| 标准成熟度 | v1.0 已发布,Linux Foundation 背书,企业可用 |
缺点与局限
| 维度 | 说明 |
|---|---|
| 协议复杂度 | 相比简单 HTTP 调用,协议开销较高 |
| 生态年轻 | 2025 年才出现,生态工具链(如监控、调试)尚不完善 |
| 版本迁移 | v0.3 到 v1.0 有 breaking changes,老项目迁移有成本 |
| 落地门槛 | 需要多个 Agent 协作场景才有价值,单独 Agent 无需 A2A |
| 性能开销 | 相比直接函数调用,A2A 的序列化/网络开销不可忽视 |
八、对比:同类 Agent 通信协议
除了 A2A,业界还有哪些 Agent 通信协议?
| 协议 | 主导方 | 定位 | 成熟度 |
|---|---|---|---|
| A2A | Google + Linux Foundation | Agent ↔ Agent 协作 | ⭐⭐⭐⭐ v1.0 生产级 |
| MCP | Anthropic | Agent → 工具/资源 | ⭐⭐⭐⭐ 广泛采用 |
| Agent Protocol | AI Foundation | Agent 标准接口 | ⭐⭐⭐ 早期 |
| OpenAI Agent SDK | OpenAI | Agent 开发框架 | ⭐⭐⭐ 封闭生态 |
| LangChain Agent | LangChain | Agent 开发框架 | ⭐⭐⭐ 绑定框架 |
设计差异对比:
| 维度 | A2A | MCP |
|---|---|---|
| 抽象层次 | 任务级(Task/Artifact) | 资源级(Tool/Resource) |
| 状态管理 | 有状态完整生命周期 | 无状态每次独立调用 |
| 发现机制 | AgentCard 主动发现 | 客户端配置型 |
| 通信模式 | 双向协商 | 客户端驱动 |
| 扩展方向 | 协作工作流 | 工具生态 |
九、应用场景
A2A 特别适合以下场景:
场景 1:企业级 Multi-Agent 编排
大型企业通常有多个专业 Agent——客服 Agent、风控 Agent、数据分析 Agent。A2A 让它们可以在不了解彼此实现细节的情况下协作:
flowchart TD
USER["👤 用户: 帮我分析这笔交易风险"]
ORCH["🎭 Orchestrator Agent"]
RES["📊 研究 Agent"]
RISK["⚠️ 风控 Agent"]
REPORT["📝 报告 Agent"]
USER --> ORCH
ORCH --> RES
ORCH --> RISK
RES --> REPORT
RISK --> REPORT
REPORT --> USER
ORCH -->|"A2A: 委托分析"| RES
ORCH -->|"A2A: 风险评估"| RISK
RES -->|"A2A: 汇总数据"| REPORT
RISK -->|"A2A: 提供评估"| REPORT
style USER fill:#C7CEEA,stroke:#9FA8DA,color:#333
style ORCH fill:#E8D5F5,stroke:#CE93D8,color:#333
style RES fill:#FFDAB9,stroke:#FFAB76,color:#333
style RISK fill:#FFB3C6,stroke:#F48FB1,color:#333
style REPORT fill:#B5EAD7,stroke:#80CBC4,color:#333场景 2:跨组织 Agent 协作
组织 A 的合规 Agent 可以安全地验证组织 B 的交易 Agent 的身份后,调用其服务。
场景 3:Agent Marketplace
想象一个 Agent 应用商店——开发者发布 Agent 时附带标准 AgentCard,买家通过 AgentCard 了解能力后直接通过 A2A 调用,无需任何定制集成。
十、总结与展望
核心结论
- A2A 是 Agent 互联互通的桥梁:它解决的是”不同 Agent 如何对话”的问题,与 MCP 的”Agent 如何调用工具”是正交关系
- Task 是核心抽象:相比简单的消息传递,A2A 通过完整的任务生命周期管理,支持长时间运行的复杂协作
- 安全与可发现性并重:Signed AgentCard 机制让跨组织 Agent 协作成为可能,同时保护各方隐私
- 生态正在快速成熟:已有 Python/Go/JS/Java/.NET 多语言 SDK,主流框架(LangGraph、ADK)已开始集成
给不同读者的建议
| 读者 | 建议 |
|---|---|
| Agent 框架开发者 | 尽快支持 A2A,这是大势所趋 |
| 企业 AI 架构师 | 在设计 Multi-Agent 系统时,优先考虑 A2A 作为协作层 |
| 独立开发者 | 从简单场景入手,用 A2A SDK 5 分钟即可让 Agent 支持 A2A |
| AI 研究者 | A2A 的 AgentCard 发现机制是 Agent 自动化协作的关键基础设施 |
未来趋势
- 2026 年底:主流 Agent 框架(LangChain、AutoGen)全面支持 A2A
- 2027 年:企业级 Agent Marketplace 出现,A2A 是其底层协议
- 长期:A2A 有潜力成为 AI Agent 互联网的基础协议,类似 HTTP 在 Web 中的地位
参考资源
- 官方文档:https://a2a-protocol.org
- 协议规范:https://a2a-protocol.org/latest/specification/
- GitHub:https://github.com/a2aproject/A2A
- Python SDK:
pip install a2a-sdk - DeepLearning.AI 课程:https://goo.gle/dlai-a2a
结尾金句:A2A 的出现,标志着 AI Agent 从”各自为战”走向”协同网络”的关键转折。理解 A2A,就是理解 AI Agent 大规模协作的未来。