MCP与A2A协议对比:AI Agent互联互通的两大标准

📘 AI教程 💬 🔥 Trending

🩺 摘要

🔌 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框架