摘要
随着AI Agent生态的爆发式增长,协议标准化成为行业焦点。本文深入解析MCP(Model Context Protocol)与Google新推出的A2A(Agent-to-Agent)协议的技术差异、应用场景及演进趋势,帮助开发者理解Agent互操作性的核心挑战与未来方向。
引言:Agent 时代的"巴别塔"困境
2025年被称为"AI Agent元年"。从Claude的Computer Use到OpenAI的Operator,从Perplexity的Deep Research到各类垂直领域Agent,智能体正在从概念走向落地。然而,繁荣背后隐藏着一个关键问题:Agent之间如何高效协作?
想象一下:你的日程管理Agent需要与邮件Agent协作处理会议安排,同时调用代码Agent生成演示文档。如果没有统一协议,每个Agent都需要为其他Agent编写特定的适配器——这正是软件工程中的"M×N问题"。
MCP和A2A的出现,正是为了解决这一困境。
一、MCP:上下文协议的标准化尝试
1.1 MCP 的诞生背景
MCP(Model Context Protocol)由Anthropic于2024年底开源,旨在为大语言模型提供统一的上下文访问接口。其核心设计哲学是:让模型能够以标准化方式连接外部数据源和工具。
1.2 MCP 的核心架构
MCP采用客户端-服务器架构,包含三个核心原语:
- Resources(资源):可被模型读取的数据源,如文件、数据库记录
- Tools(工具):可被模型调用的函数,如API请求、计算操作
- Prompts(提示词):预定义的交互模板
// MCP Server 示例:文件系统服务
const server = new Server({
name: "filesystem-server",
version: "1.0.0"
});
// 定义 Resource
server.setRequestHandler(ListResourcesRequestSchema, async () => {
return {
resources: [
{
uri: "file:///project/README.md",
name: "README",
mimeType: "text/markdown"
}
]
};
});
// 定义 Tool
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [
{
name: "read_file",
description: "读取文件内容",
inputSchema: {
type: "object",
properties: {
path: { type: "string" }
},
required: ["path"]
}
}
]
};
});
1.3 MCP 的局限性
尽管MCP在工具调用标准化方面取得了突破,但它主要解决的是Agent与外部世界的连接问题,而非Agent与Agent之间的协作问题。
具体来说:
- 单向通信:MCP主要是"模型→工具"的单向调用
- 缺乏协商机制:无法支持Agent之间的任务协商、能力发现
- 会话管理薄弱:不支持多Agent间的状态同步和上下文共享
二、A2A:面向 Agent 协作的新协议
2.1 A2A 的设计目标
2025年4月,Google推出A2A(Agent-to-Agent)协议,明确瞄准多Agent协作场景。与MCP不同,A2A的核心问题是:如何让独立的Agent发现彼此、协商任务、协同工作。
A2A的设计原则:
- Agent作为一等公民:每个Agent都是独立实体,有身份、有能力、有状态
- 能力发现:Agent可以发布自己的能力清单(Agent Card)
- 任务协商:支持复杂的任务分解、委托、结果汇总
- 安全优先:内置身份验证和授权机制
2.2 A2A 核心概念
Agent Card(Agent 名片)
每个A2A兼容的Agent都会提供一个JSON格式的能力描述:
{
"name": "code-review-agent",
"description": "代码审查助手,擅长发现潜在bug和优化建议",
"url": "https://agent.example.com/a2a",
"version": "1.0.0",
"capabilities": {
"streaming": true,
"pushNotifications": false,
"stateTransition": true
},
"skills": [
{
"id": "javascript-review",
"name": "JavaScript代码审查",
"description": "审查JS/TS代码,提供改进建议",
"inputModes": ["text", "file"],
"outputModes": ["text", "structured"]
},
{
"id": "security-audit",
"name": "安全审计",
"description": "扫描代码中的安全漏洞",
"inputModes": ["file"],
"outputModes": ["structured"]
}
],
"authentication": {
"type": "oauth2",
"authorizationUrl": "https://auth.example.com/oauth/authorize"
}
}
Task 生命周期
A2A定义了完整的任务状态机:
submitted → working → input-required → working → completed
↓ ↑
failed cancelled
2.3 MCP vs A2A:关键差异对比
| 维度 | MCP | A2A |
|---|---|---|
| 设计目标 | 模型与工具/数据的连接 | Agent与Agent的协作 |
| 通信模式 | 请求-响应 | 双向协商、流式通信 |
| 能力发现 | 静态配置 | 动态Agent Card |
| 任务管理 | 无内置状态机 | 完整任务生命周期 |
| 安全模型 | 依赖宿主 | 内置认证授权 |
| 适用场景 | 工具调用、RAG | 多Agent编排、工作流 |
三、实战:构建一个支持 A2A 的代码审查 Agent
3.1 项目结构
a2a-code-review-agent/
├── src/
│ ├── server.ts # A2A 服务入口
│ ├── agent-card.ts # Agent 能力描述
│ ├── handlers/
│ │ ├── task-handler.ts # 任务处理逻辑
│ │ └── review-engine.ts # 代码审查核心
│ └── utils/
│ └── git-parser.ts # Git diff 解析
├── package.json
└── tsconfig.json
3.2 核心实现
// src/server.ts
import express from 'express';
import { AgentCard } from './agent-card';
import { TaskHandler } from './handlers/task-handler';
const app = express();
app.use(express.json());
// 1. 提供 Agent Card(能力发现)
app.get('/.well-known/agent.json', (req, res) => {
res.json(AgentCard);
});
// 2. 任务提交端点
app.post('/a2a/tasks', async (req, res) => {
const taskRequest = req.body;
const task = await TaskHandler.createTask(taskRequest);
res.status(202).json(task);
});
// 3. 任务状态查询
app.get('/a2a/tasks/:taskId', async (req, res) => {
const task = await TaskHandler.getTask(req.params.taskId);
res.json(task);
});
// 4. 流式响应(SSE)
app.get('/a2a/tasks/:taskId/stream', (req, res) => {
res.setHeader('Content-Type', 'text/event-stream');
TaskHandler.streamTask(req.params.taskId, (update) => {
res.write(`data: ${JSON.stringify(update)}\n\n`);
});
});
app.listen(3000, () => {
console.log('A2A Code Review Agent running on port 3000');
});
3.3 多 Agent 协作示例
假设我们有一个主Agent协调多个专业Agent:
// 主协调 Agent
class CoordinatorAgent {
private agents: AgentCard[] = [];
async discoverAgents() {
// 发现可用的 Agent
const agentUrls = [
'https://code-review.example.com/.well-known/agent.json',
'https://security-audit.example.com/.well-known/agent.json',
'https://test-gen.example.com/.well-known/agent.json'
];
for (const url of agentUrls) {
const response = await fetch(url);
const agentCard = await response.json();
this.agents.push(agentCard);
}
}
async processPullRequest(prData: PRData) {
// 并行调用多个 Agent
const tasks = [
this.delegateToAgent('code-review-agent', prData),
this.delegateToAgent('security-audit', prData),
this.delegateToAgent('test-gen', prData)
];
const results = await Promise.all(tasks);
// 汇总结果
return this.synthesizeReport(results);
}
private async delegateToAgent(agentName: string, data: any): Promise<TaskResult> {
const agent = this.agents.find(a => a.name === agentName);
if (!agent) throw new Error(`Agent ${agentName} not found`);
const taskRequest = {
id: `task-${Date.now()}`,
message: {
role: 'user',
parts: [{ type: 'text', text: JSON.stringify(data) }]
}
};
const response = await fetch(`${agent.url}/a2a/tasks`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(taskRequest)
});
return await response.json();
}
}
四、协议演进趋势与展望
4.1 互补而非替代
MCP和A2A并非竞争关系,而是互补关系:
- MCP 解决"Agent如何获取上下文和调用工具"
- A2A 解决"Agent如何与其他Agent协作"
一个完整的Agent系统可能同时支持两种协议。
4.2 行业标准化进程
目前,协议标准化仍处于早期阶段:
- MCP:已被Claude、Cursor、Zed等工具集成,社区生态活跃
- A2A:Google主导,已获Salesforce、SAP、ServiceNow等企业支持
- ANP(Agent Network Protocol):中国团队提出的开源替代方案
预计2025-2026年将是协议标准化的关键窗口期。
4.3 开发者建议
对于希望拥抱Agent技术的开发者:
- 关注协议演进:MCP和A2A都在快速迭代,保持关注
- 从MCP开始:如果你的Agent主要需要调用工具,MCP生态更成熟
- 评估A2A场景:如果需要多Agent协作,A2A是更好的选择
- 保持抽象:在业务代码和协议实现之间保持隔离层,便于切换
五、总结
MCP和A2A代表了AI Agent互操作性协议的两种不同视角:
- MCP 是"内向型"协议,关注Agent如何扩展自身能力
- A2A 是"外向型"协议,关注Agent如何与外部世界协作
两者共同构成了Agent生态的基础设施层。随着协议标准化的推进,我们有望看到更加繁荣的Agent市场——开发者可以专注于构建特定领域的Agent能力,而不必重复造轮子。
对于技术团队而言,现在正是了解和实验这些协议的最佳时机。协议战争远未结束,但参与其中的价值已经开始显现。
参考资源
本文首发于稀土掘金,转载请注明出处。