跳到主要内容
SUN / 笔记
← 全部文章

模型上下文协议(MCP)

为了让 LLM 成为真正的智能体,必须具备与外部环境交互的能力——访问实时数据、调用外部软件。没有标准化通信协议,每次集成都需定制开发,难以复用,阻碍了复杂 AI 系统的扩展和互联。

模型上下文协议(MCP)通过开放标准,成为 LLM 与外部系统的通用接口。它定义了能力发现和调用的标准流程,采用客户端-服务器架构,服务器可向任意合规客户端暴露工具、数据资源和 Prompt。

核心思想:标准化连接 —— MCP 像通用电源插座系统,不直接提供工具,但允许任何合规工具接入,打造动态、可扩展的智能体工作坊。

与函数调用的区别

函数调用适合简单场景(固定少量函数),MCP 则是复杂、互联 AI 系统不可或缺的标准化通信框架。

对比 函数调用 MCP
定义方式 代码中硬编码函数 服务器动态暴露工具
发现机制 无,开发者预先定义 客户端可动态查询服务器能力
可扩展性 每次新增需改代码 新服务器上线即可被发现使用
适用场景 简单、固定的工具集 复杂、多工具、多数据源的企业系统

MCP 架构

MCP 采用客户端-服务器模型,标准化信息流:

text
用户 → [LLM] → [MCP 客户端] ←→ [MCP 服务器] ←→ [第三方服务]
                                                    (数据库/API/SaaS)

四个核心组件

  1. LLM:核心 Agent,处理用户请求、制定计划、决定何时访问外部信息或执行操作
  2. MCP 客户端:LLM 的应用或包装层,将 LLM 意图转化为 MCP 标准请求,负责发现、连接和通信
  3. MCP 服务器:外部世界的入口,向授权客户端暴露工具、资源和 Prompt,通常负责某一领域(如数据库、邮件服务、API)
  4. 第三方服务:实际的外部工具、应用或数据源,由 MCP 服务器管理和暴露(如数据库查询、SaaS 平台、天气 API)

交互流程

  1. 发现:MCP 客户端代表 LLM 查询服务器能力,服务器返回工具、资源和 Prompt 清单
  2. 请求构造:LLM 决定使用某工具(如发邮件),构造请求并指定参数(收件人、主题、正文)
  3. 客户端通信:MCP 客户端将请求按标准格式发送至 MCP 服务器
  4. 服务器执行:MCP 服务器认证客户端、校验请求,调用底层软件执行操作(如邮件 API 的 send 函数)
  5. 响应与上下文更新:服务器返回标准化响应(如邮件发送确认 ID),客户端将结果反馈给 LLM,更新上下文,智能体继续后续任务

工具、资源与 Prompt 的区别

概念 说明 示例
资源(Resource) 静态数据,供 LLM 读取 PDF 文件、数据库记录、配置文件
工具(Tool) 可执行功能,供 LLM 调用 发邮件、API 查询、文件写入
Prompt 引导 LLM 与资源或工具交互的模板 结构化查询模板、操作指引

MCP 的更多考量

考量 说明
可发现性 客户端可动态查询服务器能力,实现"即时发现",智能体无需重启即可适应新功能
安全性 必须支持认证和授权,控制客户端访问权限和操作范围
实现复杂度 部分厂商(Anthropic、FastMCP)已推出 SDK,简化开发流程
错误处理 协议需定义错误如何反馈给 LLM,便于智能体尝试替代方案
本地 vs 远程 本地适合敏感数据和高性能,远程便于共享和扩展
按需 vs 批量 支持实时交互(对话型)和批量处理(数据分析流水线)
传输机制 本地:JSON-RPC over STDIO;远程:Streamable HTTP + SSE

适用场景

MCP 极大拓展了 AI/LLM 能力,常见九大应用场景:

场景 说明
数据库集成 通过 MCP 无缝访问结构化数据库,如查询 BigQuery,自然语言驱动
生成式媒体编排 集成 Imagen(图片)、Veo(视频)、Chirp 3 HD(语音)、Lyria(音乐)等生成服务
外部 API 交互 获取实时天气、股票价格,发送邮件,对接 CRM 系统
推理型信息抽取 利用 LLM 推理能力按需抽取信息,超越传统检索
自定义工具开发 用 FastMCP 等框架快速开发工具,通过 MCP 服务器暴露
标准化通信 降低集成成本,促进不同厂商间互操作
复杂流程编排 组合多种工具实现多步骤流程(获取数据→生成图片→撰写邮件→发送)
物联网设备控制 通过 MCP 控制智能家居、工业传感器、机器人
金融服务自动化 对接数据源、交易平台、合规系统,实现分析、交易、报告

经验法则

构建复杂、可扩展或企业级智能体系统,需与多样化外部工具、数据源和 API 交互时,优先采用 MCP。尤其当需要不同 LLM 与工具互操作、智能体可动态发现新能力时,MCP 是最佳选择。若仅需固定少量函数,直接工具调用即可。

代码示例

示例 1:ADK 连接文件系统 MCP 服务器(7.1MCP示例_ADK文件系统.py)

演示如何通过 MCPToolset + StdioServerParameters 连接本地文件系统 MCP 服务器:

text
用户 → [filesystem_assistant_agent] → MCPToolset → npx @modelcontextprotocol/server-filesystem → 本地文件系统
  • MCPToolset:ADK 中连接 MCP 服务器的工具集
  • StdioServerParameters:通过 STDIO 启动本地 MCP 服务器进程
  • npx:npm 自带的包执行工具,无需全局安装即可运行 Node.js 包
  • tool_filter(可选):限制暴露的工具,如只允许读取

运行方式:进入脚本所在父目录,执行 adk web,在浏览器中选择 filesystem_assistant_agent,即可通过自然语言管理文件。

示例 2:FastMCP 服务器(7.2MCP示例_FastMCP服务器.py)

用 FastMCP 框架快速创建一个 greet 工具的 MCP 服务器:

  • @mcp_server.tool:装饰器注册工具函数,文档字符串和类型提示自动生成接口规范
  • 运行后监听 127.0.0.1:8000,任何 MCP 客户端均可调用

示例 3:ADK 消费 FastMCP 服务器(7.3MCP示例_ADK消费FastMCP.py)

ADK Agent 作为 MCP 客户端连接 FastMCP 服务器:

text
"向 John Doe 问好" → [fastmcp_greeter_agent] → HttpServerParameters → FastMCP 服务器 → greet("John Doe")
  • HttpServerParameters:通过 HTTP 连接远程 MCP 服务器
  • tool_filter=['greet']:只允许使用 greet 工具

运行步骤:

  1. 先启动 FastMCP 服务器:python 7.2MCP示例_FastMCP服务器.py
  2. 再启动 ADK Web:adk web
  3. 选择 fastmcp_greeter_agent,输入 Prompt

示例 4:其他连接方式(7.4MCP示例_其他连接方式.py)

展示 python3 和 uvx 两种 STDIO 连接参数配置:

  • python3:连接自己编写的 Python MCP 服务器脚本,可通过 env 传递环境变量
  • uvx:Python 命令行工具,利用 uv 临时隔离环境运行 Python 包,无需全局安装,适合运行社区 MCP 服务器

关键要点

  • MCP 是开放标准,规范 LLM 与外部应用、数据源和工具的通信
  • 采用客户端-服务器架构,定义资源、Prompt 和工具的暴露与消费方式
  • ADK 支持消费现有 MCP 服务器,也可将自身工具暴露为 MCP 服务
  • FastMCP 简化 MCP 服务器开发,尤其适合 Python 工具的快速集成
  • MCP Genmedia 工具支持智能体集成 Google Cloud 生成式媒体服务
  • MCP 让 LLM 和智能体能访问真实世界系统、动态信息,并执行超越文本生成的操作

总结

模型上下文协议(MCP)是连接大语言模型与外部系统的开放标准。它采用客户端-服务器架构,让 LLM 能通过标准化工具访问资源、利用 Prompt、执行操作。MCP 支持数据库访问、生成式媒体编排、物联网控制和金融自动化等场景。文中通过文件系统服务器和 FastMCP 服务器的智能体集成示例,展示了 MCP 与 ADK 的实际应用。MCP 是打造具备交互能力的智能体系统不可或缺的核心组件。

相关笔记

相关文章

强化学习笔记 →上下文工程 →Mission: 掌握多模态 LoRA 与 QLoRA →