MCP与A2A协议对比:AI Agent互联互通的两大标准
🩺 摘要
🔌 2024年底到2026年,AI Agent领域最重要的事件不是某个模型的发布,而是两个协议的出现——MCP和A2A。...
📝 详情
🔌 2024年底到2026年,AI Agent领域最重要的事件不是某个模型的发布,而是两个协议的出现——MCP和A2A。它们正在重新定义Agent之间、Agent与工具之间怎么"说话"。
symptom_zh
Agent之间能互相通信吗?一个Agent能调用另一个Agent的能力吗?MCP(Model Context Protocol)和A2A(Agent-to-Agent Protocol) 是2025-2026年最受关注的两个Agent互操作性标准。但很多人搞不清:它们解决的是同一个问题吗?选哪个?都得学吗?这篇从协议定位、使用场景、技术对比、实际代码四个角度拆解,帮你一次性搞懂这两兄弟。
适合人群: AI Agent开发者、技术选型决策者 读完能做: 清晰判断自己的项目该用MCP还是A2A
diagnosis_zh
一、先搞清楚定位
很多人以为MCP和A2A是竞争对手。不是。它们解决的是两个完全不同的问题。
MCP:让AI访问工具和数据(AI ↔ 工具)
↓
Agent内部:模型需要查数据库、发请求、读文件 → MCP
↓
A2A:让Agent访问其他Agent(Agent ↔ Agent)
↓
跨Agent:一个Agent需要委托另一个Agent → A2A
用人类团队来类比:
- MCP = 给你一把螺丝刀、一台电脑、一堆文件(工具层)
- A2A = 你完成不了的部分,交给团队里的另一个同事来做(协作层)
| 维度 | MCP(Model Context Protocol) | A2A(Agent-to-Agent Protocol) |
|---|---|---|
| 发起方 | Anthropic (2024年11月) | Google (2025年4月) |
| 定位 | 工具调用标准 | Agent间通信标准 |
| 类比 | USB-C(统一连接标准) | HTTP/REST(服务间通信标准) |
| 核心场景 | Agent调用数据库/API/文件 | Agent委托另一个Agent执行任务 |
| 传输层 | JSON-RPC over stdio/sse | JSON-RPC over HTTP |
| 当前版本 | MCP 2025-03-26 | A2A 0.1(草案) |
| 成熟度 | 已有参考实现,多框架支持 | 草案阶段,少部分实现 |
| GitHub | github.com/modelcontextprotocol | github.com/google/A2A |
二、MCP详解:让AI能使用工具
MCP解决的问题: 每次接入一个新工具,都要写适配代码。MCP统一了工具注册和调用的标准。
MCP架构:
┌─────────────┐ JSON-RPC ┌─────────────┐
│ AI模型 │ ◄──────────────────► │ MCP Server │
│ (Host) │ │ (工具提供方) │
│ ┌─────────┐ │ │ ┌─────────┐ │
│ │ Client │─┼─────────────────────┼─►│ Tools │ │
│ └─────────┘ │ │ │ Resources│ │
│ │ │ │ Prompts │ │
└─────────────┘ │ └─────────┘ │
└─────────────┘
核心概念: - Resources(资源) — 数据源(文件、数据库记录、API端点) - Tools(工具) — 可执行的操作(搜索、计算、发送邮件) - Prompts(提示模板) — 预定义的prompt模板
实际代码:一个MCP Server示例
# mcp_server.py
from mcp.server import Server
from mcp.server.stdio import StdioServerTransport
from mcp.types import TextContent, Tool
class WeatherMCPServer:
"""天气查询MCP服务器"""
async def get_weather(self, city: str) -> str:
# 实际业务逻辑
return f"北京 22°C 晴"
async def run(self):
app = Server("weather-server")
@app.list_tools()
async def list_tools() -> list[Tool]:
return [
Tool(
name="get_weather",
description="查询某个城市的天气",
inputSchema={
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名称"}
}
}
)
]
@app.call_tool()
async def call_tool(name: str, arguments: dict) -> list[TextContent]:
if name == "get_weather":
result = await self.get_weather(arguments["city"])
return [TextContent(type="text", text=result)]
transport = StdioServerTransport()
await app.connect(transport)
await app.wait_for_shutdown()
if __name__ == "__main__":
import asyncio
asyncio.run(WeatherMCPServer().run())
在Agent配置中集成MCP(以Hermes Agent为例):
# config.yaml
mcp_servers:
weather:
command: python
args: ["mcp_server.py"]
filesystem:
command: npx
args: ["-y", "@modelcontextprotocol/server-filesystem", "/allowed/path"]
三、A2A详解:让Agent能互相协作
A2A解决的问题: 不同厂商的Agent之间如何互通。Google的Agent vs 你的Agent vs Anthropic的Agent,大家怎么分工。
A2A架构:
┌──────────────┐ A2A协议 ┌──────────────┐
│ 发起Agent │ ◄──────────────────► │ 执行Agent │
│ (Task Giver)│ │ (Task Worker)│
│ │ │ │
│ ┌──────────┐ │ HTTP/JSON-RPC │ ┌──────────┐ │
│ │ A2A Client│─┼─────────────────────┼─►│ A2A Server│ │
│ └──────────┘ │ │ └──────────┘ │
└──────────────┘ └──────────────┘
A2A的核心概念: - Agent Card — Agent的"名片",描述它能做什么 - Task — 一个可追踪的工作单元(支持异步和流式) - Message — Agent之间的通信单元
实际代码:一个A2A Agent示例
# a2a_agent.py
from a2a import A2AServer, AgentCard, Task, TaskState
class TranslationAgent:
"""翻译Agent,通过A2A协议服务"""
async def agent_card(self) -> AgentCard:
return AgentCard(
name="TranslationAgent",
description="支持中英日韩四种语言的翻译Agent",
url="http://localhost:8080",
capabilities={
"streaming": True,
"push_notifications": False,
"state_transition_webhooks": False,
},
skills=[{
"id": "translate",
"name": "翻译文本",
"description": "将文本从源语言翻译到目标语言",
"input": {
"type": "object",
"properties": {
"text": {"type": "string"},
"source_lang": {"type": "string"},
"target_lang": {"type": "string"}
}
}
}]
)
async def handle_task(self, task: Task) -> Task:
"""处理翻译任务"""
params = task.message.parts[0].function_call.parameters
text = params["text"]
target = params["target_lang"]
# 实际的翻译逻辑
translation = await self.translate(text, target)
task.status = TaskState.COMPLETED
task.message.parts[0].text = translation
return task
# 运行A2A服务器
from a2a import run_server
run_server(TranslationAgent(), port=8080)
调用方(A2A Client):
from a2a import A2AClient
async def call_translation_agent():
client = A2AClient("http://localhost:8080")
# 1. 获取Agent Card(自动发现能力)
card = await client.get_agent_card()
print(f"Agent能力: {[s['name'] for s in card.skills]}")
# 2. 发送任务
task = await client.send_task({
"text": "Hello, how are you?",
"source_lang": "en",
"target_lang": "zh"
})
# 3. 获取结果
result = await client.get_task_result(task.id)
print(f"翻译结果: {result}")
四、实际场景对比:什么时候用哪个?
| 场景 | 用MCP | 用A2A | 都用 |
|---|---|---|---|
| Agent查数据库 | ✅ | ❌ | — |
| Agent调用搜索引擎 | ✅ | ❌ | — |
| Agent发邮件 | ✅ | ❌ | — |
| Agent把任务交给另一个Agent | ❌ | ✅ | — |
| 多个Agent分工协作完成复杂任务 | ❌ | ✅ | — |
| Agent使用工具链完成数据处理 | ✅ | — | ✅ |
| 需要同时访问工具和其他Agent | — | — | ✅ |
真实场景举例——智能客服系统:
用户提问:"帮我查一下订单,顺便翻译成日文发给客户"
Agent A(客服Agent)
├─ 用 MCP 调用 → 订单查询工具(查订单状态)
├─ 用 MCP 调用 → 数据库工具(查用户信息)
└─ 用 A2A 委托 → Agent B(翻译Agent)翻译成日文
└─ Agent B 用 MCP 调用 → 翻译API
之后Agent A 收集所有结果,用 MCP 调用 → 邮件发送工具,发给客户
在这个场景里,一个系统同时用到了MCP和A2A,各司其职。
五、2026年生态现状
| MCP | A2A | |
|---|---|---|
| 框架支持 | LangChain, LlamaIndex, Hermes Agent, Cline | Google GenKit, LangChain(部分) |
| MCP Server数量 | 1,000+(官方+社区) | N/A(A2A不需要server/agent概念) |
| 已有工具 | 数据库、文件系统、GitHub、Slack等 | — |
| 适合自建 | ✅ 容易 | ⚠️ 还不太成熟 |
| 中文社区 | 中等热度 | 较低 |
一个重要的判断: 如果你今天要做一个Agent项目,MCP是必须的——没有工具访问能力的Agent几乎等于废物。A2A是"先留着,将来会用"。
六、总结
- MCP是Agent ↔ 工具,A2A是Agent ↔ Agent,彼此互补不冲突
- MCP更成熟,今天就能用,推荐所有Agent项目集成
- A2A是未来趋势,适合多Agent协作场景,现在可以关注
- 建议学习路径: 先掌握MCP(立即能产生价值)→ 再学习A2A(为未来做准备)
- 不用纠结"选哪个"——你的项目很可能两个都需要
💡 建议收藏本文。 这两个协议还在快速进化,版本更新频繁——定期回来看看变化。
📤 转发给团队的技术负责人。 技术选型做对了,后面少走一年弯路。
📚 Agent互操作性系列 → (一) MCP与A2A协议对比:两大标准拆解(本篇) (二) Agent互操作性实战:用MCP和A2A打通不同Agent框架
💬 评论 (0)