从MCP到A2A:AI Agent 互操作性协议的演进与实战

3 阅读6分钟

摘要

随着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的设计原则:

  1. Agent作为一等公民:每个Agent都是独立实体,有身份、有能力、有状态
  2. 能力发现:Agent可以发布自己的能力清单(Agent Card)
  3. 任务协商:支持复杂的任务分解、委托、结果汇总
  4. 安全优先:内置身份验证和授权机制

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:关键差异对比

维度MCPA2A
设计目标模型与工具/数据的连接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技术的开发者:

  1. 关注协议演进:MCP和A2A都在快速迭代,保持关注
  2. 从MCP开始:如果你的Agent主要需要调用工具,MCP生态更成熟
  3. 评估A2A场景:如果需要多Agent协作,A2A是更好的选择
  4. 保持抽象:在业务代码和协议实现之间保持隔离层,便于切换

五、总结

MCP和A2A代表了AI Agent互操作性协议的两种不同视角:

  • MCP 是"内向型"协议,关注Agent如何扩展自身能力
  • A2A 是"外向型"协议,关注Agent如何与外部世界协作

两者共同构成了Agent生态的基础设施层。随着协议标准化的推进,我们有望看到更加繁荣的Agent市场——开发者可以专注于构建特定领域的Agent能力,而不必重复造轮子。

对于技术团队而言,现在正是了解和实验这些协议的最佳时机。协议战争远未结束,但参与其中的价值已经开始显现。


参考资源


本文首发于稀土掘金,转载请注明出处。