为什么要有 MCP 和 A2A?它们分别连接什么,为什么不能把所有连接都当成普通工具调用?

MCP 与 A2A 协议

约 16 分钟8 道自测更新于 2026-11-01

一句话记住协议把 M×N 份对接变成 M+N:MCP 让 Agent 连接工具和数据,A2A 让独立 Agent 以有状态任务互相协作。判断关键不是“能不能调用”,而是对方究竟是一个能力明确的工具,还是一个需要异步交接的完整智能系统。

01学完你能做到

知道 MCP 怎么把工具和数据接到 Agent 上,A2A 怎么让不同的 Agent 互相派活,以及两者的分工。

第 29 讲(工具调用 / Function Calling)讲了工具调用:每个应用自己定义工具的 schema。问题是,10 个 AI 应用要接 20 个外部系统,各写一遍对接,就是 10 × 20 = 200 份对接代码。协议的作用是让大家说同一种话,每个应用实现一次、每个外部系统实现一次就行,变成 10 + 20 = 30 份。

这节讲两个协议:

  • MCP(Model Context Protocol,模型上下文协议):Agent 接工具和数据。
  • A2A(Agent2Agent,智能体到智能体协议):Agent 接别的 Agent。

02MCP 的三个角色

MCP 规范(本节以 2025-06-18 版为准)说,MCP 用 JSON-RPC 2.0 消息在三方之间通信:

角色规范定义例子
宿主 Host发起连接的大模型应用Claude Desktop、IDE
客户端 Client宿主里面的连接器宿主为每个服务器建一个
服务器 Server提供上下文和能力的服务文件系统服务器、数据库服务器、GitHub 服务器

两个要点:

  • 一个客户端只对应一个服务器(1:1)。宿主想接 3 个服务器,就建 3 个客户端。
  • 架构文档的设计原则写着:服务器不能读到整段对话,也不能「看进」别的服务器。宿主掌握全局,负责安全边界。这和第 27 讲(压缩与隔离)的「隔离」是一个思路。

MCP 参考了 LSP(语言服务器协议)。LSP 让一个编辑器支持所有编程语言,MCP 想让一个 AI 应用接上所有工具。

传输方式有两种:本地进程用 stdio(标准输入输出),远程用 Streamable HTTP。

MCP 中 Host 掌握上下文与授权边界,为每个 Server 建立独立 Client 会话。
MCP 中 Host 掌握上下文与授权边界,为每个 Server 建立独立 Client 会话。

03服务器的三种原语

服务器可以向客户端提供三类东西。规范用「谁来控制」区分它们:

原语谁控制是什么例子
提示 Prompts用户用户主动挑选的模板斜杠命令、菜单项
资源 Resources应用客户端附加和管理的上下文数据文件内容、git 历史
工具 Tools模型模型决定调用的函数发 API 请求、写文件

可以这样记:

  • Prompts 是用户点菜,例如输入 /总结周报;
  • Resources 是服务员把资料放到桌上,由应用决定附加哪些文件;
  • Tools 是厨师自己决定用哪把刀,由模型决定何时调用。

反方向,客户端也可以向服务器提供三种能力:

  • Sampling(采样):服务器请客户端代它调用一次大模型;
  • Roots(根):服务器询问自己可以操作哪些目录或 URI 范围;
  • Elicitation(征询):服务器请求向用户追问更多信息。

演示:一次工具调用的消息往来

下面是简化后的 JSON-RPC 消息。方法名 tools/list 和 tools/call 来自规范,具体工具是编的示例。

第 1 步:握手。 客户端发 initialize,双方交换版本号和各自支持的能力,比如服务器声明「我有 tools」。

第 2 步:问有哪些工具。

{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}

服务器回复工具清单,每个工具有名字、描述和输入 schema(第 29 讲(工具调用 / Function Calling)讲过的那种):

{"jsonrpc": "2.0", "id": 1, "result": {"tools": [
  {"name": "get_weather", "description": "查询城市天气",
   "inputSchema": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]}}
]}}

第 3 步:模型决定调用。 宿主把工具清单交给模型。模型输出一个工具调用,客户端转成:

{"jsonrpc": "2.0", "id": 2, "method": "tools/call",
 "params": {"name": "get_weather", "arguments": {"city": "上海"}}}

第 4 步:服务器返回结果。

{"jsonrpc": "2.0", "id": 2, "result": {"content": [{"type": "text", "text": "上海:多云,18°C"}], "isError": false}}

第 5 步: 宿主把结果放回模型的上下文,模型继续回答。

和第 29 讲(工具调用 / Function Calling)对比:工具循环本身没变,变的是工具从哪来。以前写死在应用代码里,现在可以运行时从任何 MCP 服务器发现。

安全原则(规范中的要点)

规范专门有一节「安全与信任」,核心是用户知情和同意:

  • 宿主把用户数据交给服务器之前,必须获得用户明确同意;
  • 宿主调用任何工具之前,必须获得用户明确同意;
  • 工具的描述应当视为不可信,除非服务器本身可信;
  • 规范建议,应该始终有人在回路里,能够拒绝工具调用;
  • 采样请求要由用户批准,协议有意限制服务器能看到的提示内容。

「工具描述不可信」很关键:恶意的 MCP 服务器可以在工具描述里藏指令,这正是第 39 讲(提示注入)要讲的提示注入。

04A2A:Agent 和 Agent 之间

MCP 解决「Agent 用工具」。如果要把任务交给另一家公司的 Agent呢?对方是一个完整的智能系统,不是一个函数。A2A 规范称这类 Agent 为「不透明的」:协作只靠声明的能力和交换的信息,不需要共享内部的思考、计划或工具实现。

A2A 复用现成的标准:HTTP、JSON-RPC 2.0、Server-Sent Events(流式传输)。

核心概念

概念是什么
Agent Card(智能体名片)远程 Agent 公开的 JSON 元数据:身份、能力、技能、服务地址、认证要求
Task(任务)工作的基本单位,有唯一 ID,有状态,按生命周期推进
Message(消息)一轮交流,角色是 user 或 agent,由若干 Part 组成
Part(部件)最小内容单元:文本、文件引用或结构化数据
Artifact(产出物)任务产出的结果,例如文档、图片,也由 Part 组成

怎么找到对方? 常见方式是访问约定地址 https://{对方域名}/.well-known/agent-card.json 读取 Agent Card。

A2A 先用 Agent Card 发现能力,再让有状态的 Task 在处理中等待输入,最后交付 Artifact。
A2A 先用 Agent Card 发现能力,再让有状态的 Task 在处理中等待输入,最后交付 Artifact。

演示:一张 Agent Card 和一次任务(示意)

一家差旅公司的 Agent Card(字段经过简化):

{
  "name": "差旅预订助手",
  "description": "预订机票和酒店",
  "version": "1.0.0",
  "skills": [{"id": "book-flight", "name": "订机票", "description": "按日期和城市查询并预订航班"}],
  "defaultInputModes": ["text/plain"],
  "defaultOutputModes": ["text/plain", "application/json"]
}

我方的行政 Agent 读到名片,发消息:「帮我订 11 月 5 日上海到北京的早班机。」

  1. 对方创建任务,状态是已提交(submitted),随后进入处理中(working)。
  2. 对方发现缺信息,状态变为需要输入(input-required),并发消息问:「乘客姓名和身份证号?」
  3. 我方补充信息,任务回到处理中。
  4. 订好后,对方给出 Artifact(行程单),状态变为已完成(completed)。

任务状态(规范定义,简化):

  • 进行中:已提交、处理中;
  • 中断(等外部动作):需要输入、需要认证;
  • 终止:已完成、失败、已取消、已拒绝。

为什么要有状态?A2A 规范把「异步优先」列为设计原则,任务可能跑很久,中间还需要人参与。所以除了同步请求,还支持流式更新和通知(任务有进展时调用客户端提供的 webhook)。

05MCP 和 A2A 怎么配合

A2A 规范附录专门写了两者的关系:互补,不是竞争。

MCPA2A
连什么Agent ↔ 工具、API、数据Agent ↔ Agent(对等协作)
对方是什么能力明确的函数或数据不透明的完整智能系统
交互单位一次工具调用一个有状态、可能很长的任务
比喻员工用公司的软件公司之间签外包合同

规范给的例子:客户端 Agent 通过 A2A 把复杂任务交给服务端 Agent;服务端 Agent 内部再用 MCP 调用多个工具和数据源来完成这个任务。

演示:用这张表做判断

  • 「让我们的客服 Agent 能查订单系统」:订单系统是数据和 API,用 MCP。
  • 「让我们的客服 Agent 把退款争议转给支付公司的风控 Agent」:对方是独立的智能系统,任务可能要几小时、中途还要补材料,用 A2A。

06延伸阅读

07一分钟讲给别人

试着用自己的话讲一遍协议把 M×N 份对接变成 M+N。MCP 让 Agent 接工具和数据:宿主是大模型应用,里面为每个服务器建一个客户端(1:1),用 JSON-RPC 2.0 通信;服务器看不到整段对话,也看不到别的服务器。服务器提供三种原语:Prompts 由用户控制,Resources 由应用控制,Tools 由模型控制。客户端可以反向提供 Sampling、Roots、Elicitation。调用流程是 initialize → tools/list → tools/call → 结果回到模型。安全核心是用户同意,工具描述视为不可信。A2A 让不透明的 Agent 之间协作:靠 Agent Card 发现对方,以有状态的 Task 为单位(已提交、处理中、需要输入、已完成等),用 Message/Part 交流、Artifact 交付。两者互补,A2A 派活,MCP 干活。

想一想

8 道自测

先在心里答一遍,再展开对照。能说清理由,比答对数字更重要。

  1. 01为什么需要协议?用「M 个应用、N 个系统」解释。

  2. 02MCP 的宿主、客户端、服务器分别是什么?客户端和服务器是什么对应关系?

  3. 03MCP 三种原语分别由谁控制?各举一例。

  4. 04MCP 里调用一个工具要经过哪几种消息?

  5. 05为什么规范要求把工具描述视为不可信?

  6. 06A2A 的 Agent Card 是什么?去哪里找?

  7. 07A2A 任务进入「需要输入」状态意味着什么?哪些状态是终止状态?

  8. 08「让 Agent 读公司知识库」和「让 Agent 委托供应商的报价 Agent 出报价」,各该用哪个协议?

已看 0/8 题

练动手练习

写下三个日常工作场景,例如读取公司知识库、让外部服务处理一份材料、调用天气接口。对每个场景标注应使用 MCP 还是 A2A,并用一句话说明对方是工具/数据还是独立 Agent;再画出一次从发现能力到交付结果的最短流程。

完成这一课

完成这一课

读完讲义、看完自测答案,这一课就算学完了。

  • 读完讲义
  • 看完全部自测

本课为投资者教育内容,案例数字均为示意,不构成任何投资建议,也不承诺收益。规则和费率会变,实际操作前请以交易所、监管机构和产品的最新公告为准。