Administrator
发布于 2025-12-04 / 18 阅读
0
0

03MCP与A2A

在大模型智能体(AI Agent)快速演进的今天,工具调用(Tool Use) 和 多智能体协作(Multi-Agent Collaboration) 已成为两大核心能力。然而,早期的实现方式高度碎片化——每个框架、每个平台、每个工具都采用私有接口,导致开发者重复造轮子、系统难以互操作、生态彼此割裂。

为解决这一问题,行业正在形成两大标准化协议:

  • MCP(Model Context Protocol) —— 让 Agent 与外部工具 的交互标准化

    • MCP 解决的问题可以概括成一句话:让“外部工具、资源、提示词模板”等能力,能够按统一协议被不同 AI 应用发现和使用。

  • A2A(Agent-to-Agent Protocol) —— 让 Agent 与 Agent 的协作标准化

这两大协议并非竞争关系,而是互补共生,共同构成未来 AI Agent 生态的“基础设施层”。本文将从起源、架构、工作原理、应用场景、对比分析等多个维度,对 MCP 与 A2A 进行全面、深入、系统的解析,助你把握 AI 智能体发展的技术脉络。


一、MCP(Model Context Protocol):Agent 的“万能工具接口”

(一)什么是 MCP?

MCP(Model Context Protocol,模型上下文协议) 是由 Anthropic 于 2024 年提出的开放标准协议其目标是:为 AI 应用提供一种统一、安全、可扩展的方式,动态注入和管理外部工具、数据源与上下文信息。

✅ 简单理解:MCP 就像 USB-C 接口——任何工具只要实现 MCP Server,就能被任意支持 MCP 的 Agent 调用,无需定制适配。

(二)核心设计思想

MCP 的设计围绕三个关键原则

  1. 上下文结构化:将工具、数据、提示词等资源以标准化 JSON 格式描述。

  2. 职责分离:

    • Prompts:由用户控制(如系统提示词)

    • Resources:由应用控制(如知识库文件)

    • Tools:由模型控制(如 API 调用函数)

      Agent Tool 与 MCP Tool 的关系

      可以用一个简单的公式来理解:

      Agent 的 Tool 模块 = MCP 的 Tools(作为主要实现方式)

      Agent系统的Tool模块原则上可以使用MCP的Resources和Prompts,但在绝大部分工程实践中,Agent的Tool模块通常只消费Tools,而不直接消费Resources和Prompts。

      具体来说,两者是这样的关系:

      概念

      角色

      说明

      Agent 的 Tool 模块

      "能力容器"

      Agent 系统里用来管理和调用外部能力的那个组件。它是一个抽象的概念,定义了"Agent 可以调用工具"这个能力。

      MCP 的 Tools

      "具体实现"

      Agent 的 Tool 模块可以通过多种方式来实现,而 MCP 的 Tools 是目前最主流、最标准化的实现方式。

  3. 传输无关性:支持 stdio(本地进程通信)、HTTP/SSE(远程服务)等多种传输方式。

(三)架构组成

MCP 采用经典的 Client-Server 架构:

组件

角色

功能

MCP Host

主机应用

如 TRAE IDE、Cursor、Windsurf 等,集成 MCP Client

MCP Client

客户端

内置于 Agent 中,负责发现、连接、调用 MCP Server

MCP Server

服务端

托管具体工具或数据源,响应 Agent 请求

MCP Registry(可选)

注册中心

提供 Server 发现服务(如 mcp.so 市场)

本地数据源

提供本地数据

提供本地数据

远程服务

第三方工具

提供三方工具,提供额外信息数据

ServerVCP

MCP Server 是整个架构的核心,负责向大模型提供结构化上下文和可调用的操作能力。它定义了三大类基础能:

1)Resources:类似静态或动态的数据文档,比如 AP! 返回的 JSON、配置文件、项目结构,供模型查询参考

2)Tools:模型可调用的函数接口,比如发请求、创建文档、执行命令,执行前通常需要用户授权来保证安全

3)Prompts:预定义的提示模板,用来引导模型完成特定任务,比如代码审查、生成 commit message、总结会议内容,能提高交互效率。通过这三类能力,MCP Server 让模型不仅能"看懂"信息,还能"动手"完成任务社区维护的 MCP Servers

Repository 和 Awesome MCP Servers 里有大量开源的 MCP Server 实现。TypeScript 写的MCP Server 通常用 npx 命令运行,Python 写的用 uvx 命令启动,部署起来很方便。

MCP 协议层面大致怎么工作

MCP 不只是“发 HTTP 请求”这么简单,它在协议层有自己的一套约定。学习本章时,先理解下面这条主线即可:

  1. Host / Client 发起连接

  2. Client 和 Server 做初始化

  3. 双方声明各自支持的 capabilities

  4. 客户端发现服务器提供的 tools / resources / prompts

  5. 按需调用或读取

  6. 结果返回给 Host,再由模型 / UI 使用

MCP 的底层消息格式基于 JSON-RPC 2.0(请求 / 响应 / 通知)。这也是为什么你会在很多资料里看到:

  • request / response / notification

  • capabilities negotiation

  • initialize

MCP 更像是:**“AI 应用与外部能力之间的协议层 + 能力发现层 + 调用层”**而不只是某个单纯的 SDK。

3.2.1 用 5 个动作理解一次完整 MCP 调用

如果把 MCP 放回一轮真实问答里,可以把它拆成下面 5 个动作:

  1. 握手与能力发现(Handshake & Discovery)
    Host 启动后,会根据配置连接 MCP Server,并完成初始化。此时客户端会知道:这台服务器提供了哪些 Tools、Resources、Prompts,以及它支持哪些 capabilities。

  2. 用户提问与上下文注入(Context Injection)
    用户提出问题后,Host 会把“用户问题 + 已发现的工具说明 / 资源信息 / 提示词信息”一并提供给模型或应用逻辑。

  3. 模型或应用做决策(Reasoning / Decision)
    模型决定是否需要调用某个 Tool,或者应用决定是否读取某个 Resource、选用某个 Prompt。

  4. 路由与执行(Routing & Execution)
    Host / Client 按协议把请求发给 MCP Server。Server 在自己的进程或远端服务中执行真正的逻辑,例如查天气、读文件、查数据库。

  5. 结果回传与继续生成(Result Feedback)
    Server 把结果返回给 Client,Client 再把结果交回 Host,由 Host 继续让模型生成最终回答,或者直接展示给用户。

可以把这个过程和Tool 调用对比着理解:

  • Tool 调用 更像“模型知道怎么调一个函数”

  • MCP 更像“这个函数来自哪里、怎么发现、怎么连接、怎么按协议调”

这也是为什么在 Agent 场景里,MCP 常常出现在 Tool 之前一层。

(四)通信方式

两种通信机制:这一节先把新旧叫法分清楚。

根据 MCP 官方传输规范(文档以 Transports 等页面为准,版本会迭代),当前主线标准传输是:

  1. stdio

  2. Streamable HTTP

官方还明确说明:

  • Streamable HTTP 取代了 2024-11-05 版本中的 HTTP+SSE transport

  • 新的 HTTP 传输里,服务器仍然可以使用 SSE 作为流式返回机制

也就是说,今天更准确的理解应该是:

  • STDIO:本地子进程通信

  • Streamable HTTP:独立服务进程,通过 HTTP 通信,必要时可配合 SSE 流式返回

而你在很多旧资料、旧案例、适配器配置里看到的 sse,通常属于:

  • 旧的 HTTP+SSE transport 叫法

  • 或兼容写法

  • 或具体库层面对历史接口的保留

结合仓库现有案例,可以这样看:

传输方式

更适合什么场景

对应案例

STDIO

本地、轻量、由客户端拉起服务端进程

McpServerByFastMCP.py

SSE / HTTP 兼容教学写法

理解历史资料、理解远程服务形态

McpServerWeatherByFastMCP.py、mcp.json

当前规范重点

优先理解为 Streamable HTTP

新项目应以官方规范为准

MCP 支持两种底层传输方式,适用场景完全不同:

Stdio 模式:基于标准输入输出流,Client 和 Server 跑在同一台机器上,通过进程间管道通信。启动快、延迟低、调试方便,本地开发首选。Claude Desktop 默认就用这种方式启动本地 Server。

SSE 模式:基于 HTTP 长连接,Server 可以部署在远端。Client 通过 HTTP POST发请求,Server 通过 Server-SentEvents 推送响应。适合分布式部署、跨网络调用的生产场景。

与传统 Function Calling 的区别

很多人会问:MCP 和 OpenAI 的 Function Calling 有什么区别?

核心差异在于标准化和解耦。

传统 Function Calling 是模型厂商各搞各的,OpenAI 有一套格式,Claude 有另一套,换个模型就得改代码。工具定义也是硬编码在应用里,每接一个新工具就得改应用代码重新部署。MCP 把这套流程标准化了:工具以 Server 的形式独立部署,Client 通过协议发现和调用工具。换模型不用改 Server,加工具不用改 Client。就像 USB 接口一样,只要符合协议,插上就能用。

(五)工作流程

MCP 的核心工作流程是一个客户端-服务器协作的闭环,整体分为7个阶段:

1)初始化连接:主机应用启动后,MCP Client 与 MCP Server 建立连接。一个主机可以同时连多个 Server,每个 Server负责不同的工具和资源。

2)获取工具列表:Client 从 Server 拉取可用的工具清单,包括每个工具的名称、参数、用途描述。这一步相当于"能力注册",让模型知道手里有哪些牌可以打。

3)构造 Function Caling 请求:用户输入问题后,Client 把工具描述和用户问题一起打包发给 LLM。传输格式是结构化的Function Calling,告诉模型"你现在能调用这些函数"。

4)模型智能决策:LLM 根据上下文和工具信息,判断是否需要调用外部工具、调用哪个、传什么参数。比如用户问天气

模型就会选择 getWeather 工具并填入城市参数。

5)工具调用执行:如果模型决定调用工具,Client 把调用请求转发给 Server;Server 负责实际执行--跑脚本、查数据库、调 API,然后把结果返回。

6)结果整合:工具执行结果传回 LLM,模型把这个结果和原始问题、对话上下文糅在一起,生成最终的自然语言回答,

7)用户响应输出:Client 把模型生成的回答展示给用户,完成一次完整的人机协作。

(四)全流程示例图(续)

和Tool、RAG、Agent 有什么区别?

概念

解决什么问题

典型关注点

Tool / Function Calling

模型如何调用一个具体工具

工具 schema、参数、调用结果

RAG

模型如何拿到外部知识上下文

文档加载、切块、检索、上下文拼接

MCP

外部能力如何被标准化暴露与接入

Host / Client / Server、协议、传输、发现

Agent

谁来规划、决策、调用这些能力

推理、编排、记忆、执行闭环

  • Tool 解决“能不能调用”

  • RAG 解决“能不能拿到知识”

  • MCP 解决“怎么统一接入”

  • Agent 解决“谁来决定何时调用”

(六)面试官追问

提问:MCP Client 和 Server 之间的连接断了怎么办?有没有重连机制?

回答:MCP 协议本身定义了连接生命周期管理。Stdio 模式下,Server 进程挂了 Client 会收到 EOF 信号,可以选择重启Server 进程。SSE 模式下,HTTP 长连接断开后 Client 可以重新发起连接。具体的重连策略、重试次数、退避算法这些是Client 实现层面的事,协议没有强制规定,得看各家 SDK 怎么实现。

提问:如果模型一次需要调用多个工具,MCP 怎么处理?

回答:MCP 支持串行和并行两种模式。串行就是一个工具执行完拿到结果,再决定下一步调哪个。并行就是模型一次返回多个工具调用请求,Client 同时发给 Server 执行。具体用哪种取决于模型的推理结果和工具之间的依赖关系。比如先查用户ID再查订单,这种有依赖的只能串行;查天气和查股票这种独立的就可以并行。

提问:MCP 和 LangChain 的 Agent 有什么关系?能一起用吗?

回答:两者解决的问题不在一个层面。LangChain Agent 是个编排框架,负责把多个步骤串起来、管理对话状态、处理工具调用结果。MCP 是个通信协议,定义 Client 和 Server 怎么交互。完全可以在 LangChain Agent 里接入 MCP Client,让Agent 通过 MCP 调用外部工具。LangChain 社区已经有 MCP 的集成方案了。

提问:MCP Client 和 MCP Server 之间是怎么通信的?用的什么协议?

回答:MCP 底层用的是 JSON-RPC 2.0 协议,传输层支持两种方式:一种是 stdio,适合本地进程间通信;另一种是 HTTF+SSE,适合远程服务调用。stdio 方式下 Client 直接 fork 一个 Server 进程,通过标准输入输出交换 JSON 消息,延迟低、实现简单。HTTP+SSE 方式下 Client 用 HTTP POST发请求,Server 用 Server-Sent Events 推送响应,适合跨网络场景。

提问:一个 MCP Client 能同时连多个 MCP Server 吗?这种多连接场景下怎么管理?

回答:可以,MCP 设计上就支持一个 Client 同时连多个 Server。每个 Server 提供不同能力,Client 会维护一个 Server 列表,每次请求前先聚合所有 Server 的工具列表给模型。模型选择调用哪个工具时,Cient 根据工具归属把请求路由到对应的Server。Cursor 里配置多个 MCP Server 就是这个原理。

提问:MCP Server 的 Tools 和 Resources 有什么本质区别?

回答:Resources 是只读的数据,模型拿来参考用,不会产生副作用;Tools 是可执行的动作,会真正改变外部状态。

提问链接:https://www.mianshiya.com/question/1914241826789912577

(七)典型应用场景

开发工具集成:Git、Docker、Playwright 等通过 MCP Server 暴露为 Agent 可调用工具

  • 企业系统对接:将内部 CRM、ERP、数据库封装为 MCP 服务,供智能客服调用。

  • 多模态能力扩展:图像生成(Stable Diffusion)、语音识别(Whisper)等作为 MCP 工具接入。

🌐 生态现状:截至 2025 年 12 月,MCP 市场 已收录超 2000 个社区贡献的 MCP Server,涵盖开发、设计、办公、云服务等领域

(八)如何用MCP

8.1直接使用现成的 MCP 服务

如果你的目标不是“学习怎么实现协议”,而是“先把能力接进来”,最直接的方式通常是:

  • 找到现成的 MCP Server

  • 在宿主应用里配置连接方式

  • 让客户端自动发现其 Tools / Resources / Prompts

当前官方已经有 Registry 方向的能力和生态,公共 MCP 服务器的发现也越来越规范化。这意味着:

很多能力无需一开始就自己写服务端,先学会怎么接、怎么配、怎么调试也很有必要。


8.2 本地自建 MCP 服务端

如果你要接的是:本地文件系统、内部数据库、企业私有 API、自己的业务系统。

那通常就要自己写 MCP Server。这也是本章案例的重点:我们会通过本地天气服务、FastMCP 示例和 mcp.json 客户端配置,理解一个 MCP 服务是如何被暴露、被发现、再被 Agent 使用的。

8.2.1 什么是 FastMCP

这里很适合顺手把 FastMCP 这个词讲清楚,因为后面的案例文件名里会频繁出现它。

FastMCP 是 MCP 官方 Python 生态里用来快速编写 MCP Server 的高层封装。它帮你把很多底层样板工作收起来,让你可以更接近“写 Python 函数”的方式去暴露 MCP 能力。

先把它和 MCP 的关系看成下面这组对应:

  • MCP 是协议标准,解决“AI 应用怎么统一接入外部能力”

  • FastMCP 是 Python 里的服务端开发工具,解决“我怎么更方便地把能力按 MCP 标准暴露出去”

也就是说:MCP 是规则,FastMCP 是实现这些规则的一种工具。这就像:HTTP 是协议,FastAPI / Flask 是帮助你实现 HTTP 服务的框架。

放到这一章里也是一样:MCP 决定 Host、Client、Server 之间怎么协作,FastMCP 帮你更轻松地写出一个 MCP Server。

8.2.2 本章为什么讲 FastMCP

在真实项目里,如果你准备自己写一个 MCP 服务端,通常有两条常见路线:

  1. 自己直接按 SDK / 协议细节去实现

  2. 借助 FastMCP 这种更高层的封装来实现

第二条路线通常更友好,因为它能把注意力放回到“我要暴露什么能力”上,而不是一开始就陷进大量底层细节。

这也是为什么本章案例会分成两类:

  • McpServer.py
    这是教学版极简实现,帮助你理解“服务端注册工具”这个最小概念。

  • McpServerByFastMCP.py、McpServerWeatherByFastMCP.py
    这是更贴近真实 Python MCP 开发体验的写法,帮助你理解 Tool / Resource / Prompt 怎么按官方 SDK 风格暴露出去。

因此这一章里,FastMCP 不是主角,MCP 协议本身才是主角;但 FastMCP 很适合作为 Python 侧的入门实现工具。

8.3 在 LangChain / Agent 里使用 MCP

这一点也和当前项目主线非常贴近。

LangChain 官方已经提供了对 MCP 的适配支持。常见路线是:

  1. 用 MultiServerMCPClient 连接一台或多台 MCP 服务器

  2. 通过 get_tools() 取回 MCP 工具

  3. 把这些工具交给 create_tool_calling_agent 或 create_agent

  4. 让 Agent 在对话中实际调用它们(Agent 的创建与执行细节见 第 21 章 Agent 智能体)

思考:

  1. MCP 解决的问题,和“写一个本地工具函数”有什么不同?

    参考思路: 本地工具函数只服务当前代码;MCP 让工具、资源、提示词以统一协议暴露给不同 AI 应用复用。它的重点是标准化接入和跨应用复用,而不是多写一个函数。

  2. Host、Client、Server 三个角色如果搞混,会造成什么理解偏差?

    参考思路: 会分不清谁运行应用、谁负责协议通信、谁暴露能力。Host 是应用宿主,Client 负责连接 MCP Server,Server 提供 Tools / Resources / Prompts。角色清楚后,配置和排障才有方向。

  3. Tool、Resource、Prompt 三类能力应该怎么划分?

    参考思路: Tool 适合可执行动作,Resource 适合被读取的上下文资料,Prompt 适合可复用提示模板。不要把所有东西都做成 Tool,否则权限和语义都会变乱。

  4. 什么时候用 stdio,什么时候更关注 Streamable HTTP?

    参考思路: 本地进程、桌面工具、开发调试常见 stdio;跨进程、服务化、远程访问更需要 HTTP 形态。传输方式服务于部署场景,不是单纯背协议名。

小结:

  • MCP 负责“标准化接入”

  • LangChain / Agent 负责“把接进来的能力真正用起来”

  • MCP 的本质:不是模型、不是工具本身,而是 AI 应用与外部能力之间的标准化连接协议。

  • MCP 的核心价值:统一发现、统一描述、统一接入,让工具、资源、提示词模板更容易跨应用复用。

  • 和其他概念的区别:Tool 解决“调用能力”,RAG 解决“检索知识”,Agent 解决“规划和决策”,MCP 解决“标准化接入”。

  • 当前规范重点:标准传输优先理解为 stdio 与 Streamable HTTP;仓库中的 sse 写法保留为案例兼容与教学理解用途。

  • 本章案例主线:从极简版教学服务端,到 FastMCP 服务端,再到 mcp.json + LangChain Agent 的 MCP 客户端,已经构成了完整的入门路线。

  • 安全边界不能省略:MCP 让接入更统一,不代表接入就天然安全。真实项目里仍要考虑服务器来源可信、认证授权、最小权限、敏感能力隔离,以及不要把本不该暴露的内部资源直接开放给模型侧。

  • 学完本章后,你至少应该能分清四件事:MCP 是协议层;Host / Client / Server 是通信角色;Tools / Resources / Prompts 是服务端暴露的能力;统一接入不等于自动解决安全问题。


二、A2A(Agent-to-Agent Protocol):Agent 的“通用协作语言”

(一)什么是 A2A?

A2A(Agent-to-Agent Protocol,智能体到智能体协议) 是由 Google 于 2025 年 4 月联合 Linux 基金会推出的开放标准其目标是:实现不同厂商、不同框架、不同平台的 AI 智能体之间的安全、高效、互操作协作。

✅ 简单理解:A2A 就像 TCP/IP 协议——让来自 CrewAI、AutoGen、LangGraph 的 Agent 能像人类团队一样自然协作。

(二)核心设计哲学

A2A 基于四大原则

  1. 不透明性(Opacity):Agent 无需暴露内部逻辑,仅通过接口交互,保护知识产权与隐私。

  2. 基于现有标准:构建于 HTTP、JSON-RPC 2.0、SSE(Server-Sent Events)之上,易于集成。

  3. 任务驱动:以“任务”(Task)为核心单元,支持长周期、多轮、异步协作。

  4. 默认安全:支持 OAuth 2.0、API Key、OpenID Connect 等企业级认证机制。

(三)核心组件

组件

描述

A2A Client(客户端智能体)

发起任务请求的 Agent(如“行程规划 Agent”)

A2A Server(远程智能体)

接收并执行任务的 Agent(如“航班查询 Agent”)

Agent Card

公开的 JSON 元数据文件(通常位于 /.well-known/agent.json),描述能力、端点、认证方式

Task

工作单元,有唯一 ID 和状态生命周期(submitted → working → completed/failed)

Message & Artifact

通信基本单元(文本/文件/结构化数据)和任务产出物(如 PDF 报告、图像)

(四)工作流程(三阶段)

(五)高级特性

  • 流式传输:通过 SSE 实时推送任务进度、中间结果(如代码生成过程)。

  • 异步通知:对长时间任务(数小时/天),支持 Webhook 推送最终状态。

  • 多模态支持:消息和工件可包含文本、图像、音频、结构化 JSON 等。

  • 状态管理:任务状态持久化,支持断点续做。

(六)典型应用场景

  • 跨企业协作:零售库存 Agent 检测缺货 → 通过 A2A 调用供应商订单 Agent。

  • 专业分工:招聘经理 Agent → 委托简历筛选 Agent → 再委托背景调查 Agent。

  • 复杂任务编排:旅行规划 Agent 协调航班、酒店、景点、支付等多个专业 Agent。

🌍 生态进展:Google Cloud、IBM、阿里云等已宣布支持 A2A;CrewAI、LangGraph 等框架正逐步集成 A2A 客户端


三、MCP 与 A2A 的关系:互补而非替代

维度

MCP

A2A

作用对象

Agent ↔ 外部工具/API/数据源

Agent ↔ Agent

抽象层级

工具层(“手和脚”)

协作层(“社交网络”)

通信模式

请求-响应(Request-Response)

任务委派-状态同步(Task Delegation)

典型传输

stdio, HTTP

HTTP + SSE

核心价值

赋能单个 Agent

连接多个 Agent

协同工作示例:汽车维修店智能系统

  1. 客户通过 A2A 与“店长 Agent”沟通问题。

  2. 店长通过 A2A 委派任务给“机械师 Agent”。

  3. 机械师通过 MCP 调用诊断工具和维修手册。

  4. 若需零件,机械师通过 A2A 联系“供应商 Agent”。

  5. 供应商通过 MCP 查询自身库存数据库。

🔑 关键结论:MCP 负责“做事”,A2A 负责“找人”。两者结合,才能构建真正强大的多智能体系统。


四、如何选择?实践建议

场景

推荐策略

为 Agent 添加新工具(如 Git、数据库)

实现 MCP Server,发布到 MCP 市场

构建单 Agent 应用(如智能客服)

优先使用 MCP 集成所需工具

需要多 Agent 协作(如供应链、招聘)

设计 A2A 兼容的 Agent,并提供 Agent Card

已有 CrewAI/AutoGen 系统

逐步将内部工具迁移到 MCP,对外暴露 A2A 接口

企业级部署

MCP 用于内部系统集成,A2A 用于跨部门/跨企业协作


五、未来展望

MCP + A2A + ANP:随着 ANP(Agent Network Protocol) 的发展,未来将形成“工具接入(MCP)→ 智能体协作(A2A)→ 网络发现(ANP)”的完整协议栈

  • 标准化加速:Linux 基金会、W3C 等组织正推动 A2A 成为正式 Web 标准。

  • 生态爆发:开发者可像开发 npm 包一样,发布 MCP 工具或 A2A 智能体,形成繁荣的“Agent App Store”。


结语

MCP 与 A2A 的出现,标志着 AI Agent 技术从“各自为战”走向“互联互通”的新时代。MCP 解决了“能力接入”的标准化问题,A2A 解决了“智能协作”的标准化问题。二者如同“USB 接口”与“互联网协议”,共同为下一代 AI 应用奠定基础设施。

对于开发者而言,拥抱 MCP 与 A2A,不仅是技术升级,更是参与构建开放、互操作、可持续的 AI 生态的关键一步。

📚 延伸阅读:


评论