模型上下文协议(MCP)
模型上下文协议(MCP)
补充说明:MCP 由 Anthropic 公司于 2023 年提出,旨在解决 LLM 与外部系统集成的标准化问题。它类似于计算机领域的 USB 或 HTTP 协议,为 AI 系统提供统一的"插件"接口,让不同厂商的工具能够即插即用。
为了让 LLM 成为真正的智能体,必须具备与外部环境交互的能力——访问实时数据、调用外部软件。没有标准化通信协议,每次集成都需定制开发,难以复用,阻碍了复杂 AI 系统的扩展和互联。
模型上下文协议(MCP)通过开放标准,成为 LLM 与外部系统的通用接口。它定义了能力发现和调用的标准流程,采用客户端-服务器架构,服务器可向任意合规客户端暴露工具、数据资源和 Prompt。
核心思想:标准化连接 —— MCP 像通用电源插座系统,不直接提供工具,但允许任何合规工具接入,打造动态、可扩展的智能体工作坊。
与函数调用的区别
函数调用适合简单场景(固定少量函数),MCP 则是复杂、互联 AI 系统不可或缺的标准化通信框架。
| 对比 | 函数调用 | MCP |
|---|---|---|
| 定义方式 | 代码中硬编码函数 | 服务器动态暴露工具 |
| 发现机制 | 无,开发者预先定义 | 客户端可动态查询服务器能力 |
| 可扩展性 | 每次新增需改代码 | 新服务器上线即可被发现使用 |
| 适用场景 | 简单、固定的工具集 | 复杂、多工具、多数据源的企业系统 |
补充说明:在实际项目中,函数调用和 MCP 可以结合使用。例如,核心业务逻辑使用函数调用保证性能,而需要动态扩展的部分(如第三方服务集成)使用 MCP。这种混合架构既能保持核心系统的稳定性,又能享受 MCP 带来的扩展性优势。
MCP 架构
MCP 采用客户端-服务器模型,标准化信息流:
用户 → [LLM] → [MCP 客户端] ←→ [MCP 服务器] ←→ [第三方服务]
(数据库/API/SaaS)
四个核心组件
- LLM:核心 Agent,处理用户请求、制定计划、决定何时访问外部信息或执行操作
- MCP 客户端:LLM 的应用或包装层,将 LLM 意图转化为 MCP 标准请求,负责发现、连接和通信
- MCP 服务器:外部世界的入口,向授权客户端暴露工具、资源和 Prompt,通常负责某一领域(如数据库、邮件服务、API)
- 第三方服务:实际的外部工具、应用或数据源,由 MCP 服务器管理和暴露(如数据库查询、SaaS 平台、天气 API)
补充说明:这四个组件构成了 MCP 的完整生态链。LLM 作为"大脑"负责决策,MCP 客户端作为"翻译官"负责协议转换,MCP 服务器作为"网关"负责权限控制,第三方服务则是具体的"执行者"。这种分层设计实现了关注点分离,让每个组件专注于自己的职责。
交互流程
- 发现:MCP 客户端代表 LLM 查询服务器能力,服务器返回工具、资源和 Prompt 清单
- 请求构造:LLM 决定使用某工具(如发邮件),构造请求并指定参数(收件人、主题、正文)
- 客户端通信:MCP 客户端将请求按标准格式发送至 MCP 服务器
- 服务器执行:MCP 服务器认证客户端、校验请求,调用底层软件执行操作(如邮件 API 的 send 函数)
- 响应与上下文更新:服务器返回标准化响应(如邮件发送确认 ID),客户端将结果反馈给 LLM,更新上下文,智能体继续后续任务
补充说明:MCP 的交互流程体现了"声明式"编程思想。LLM 只需要声明"要做什么",而不需要关心"如何做"。这种抽象让 LLM 能够专注于高级推理和规划,而将具体的执行细节交给专门的 MCP 服务器处理。
图2:MCP 交互流程图 - 展示从发现到执行的完整5步流程
图1:MCP 整体架构图 - 展示用户、LLM、MCP客户端、MCP服务器和第三方服务之间的数据流
工具、资源与 Prompt 的区别
| 概念 | 说明 | 示例 |
|---|---|---|
| 资源(Resource) | 静态数据,供 LLM 读取 | PDF 文件、数据库记录、配置文件 |
| 工具(Tool) | 可执行功能,供 LLM 调用 | 发邮件、API 查询、文件写入 |
| Prompt | 引导 LLM 与资源或工具交互的模板 | 结构化查询模板、操作指引 |
补充说明:理解这三者的区别对设计 MCP 服务器至关重要。资源适合提供静态参考数据,工具适合执行具体操作,而 Prompt 则用于引导 LLM 的思考过程。一个设计良好的 MCP 服务器通常会同时提供这三种能力,形成完整的能力矩阵。
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 服务器
图3:ADK连接文件系统MCP服务器架构 - 展示从用户到文件系统的完整调用链
演示如何通过 MCPToolset + StdioServerParameters 连接本地文件系统 MCP 服务器:
用户 → [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,即可通过自然语言管理文件。
import os
from google.adk.agents import LlmAgent
from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset, StdioServerParameters
GEMINI_MODEL = "gemini-2.0-flash"
# 获取 agent.py 同级目录下 'mcp_managed_files' 文件夹的绝对路径
TARGET_FOLDER_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "mcp_managed_files")
os.makedirs(TARGET_FOLDER_PATH, exist_ok=True)
root_agent = LlmAgent(
model=GEMINI_MODEL,
name='filesystem_assistant_agent',
instruction=(
'帮助用户管理文件。你可以列出、读取和写入文件。'
f'你的操作目录为:{TARGET_FOLDER_PATH}'
),
tools=[
MCPToolset(
connection_params=StdioServerParameters(
command='npx',
args=[
"-y",
"@modelcontextprotocol/server-filesystem",
TARGET_FOLDER_PATH,
],
),
# 可选:限制暴露的工具,如只允许读取
# tool_filter=['list_directory', 'read_file']
)
],
)
示例 2:FastMCP 服务器
图4:FastMCP服务器架构 - 展示FastMCP服务器与多个客户端的连接关系
用 FastMCP 框架快速创建一个 greet 工具的 MCP 服务器:
@mcp_server.tool:装饰器注册工具函数,文档字符串和类型提示自动生成接口规范- 运行后监听
127.0.0.1:8000,任何 MCP 客户端均可调用
# pip install fastmcp
from fastmcp import FastMCP, Client
mcp_server = FastMCP()
@mcp_server.tool
def greet(name: str) -> str:
"""
生成个性化问候语。
Args:
name: 要问候的人名。
Returns:
问候语字符串。
"""
return f"你好,{name}!很高兴认识你。"
if __name__ == "__main__":
mcp_server.run(
transport="http",
host="127.0.0.1",
port=8000
)
示例 3:ADK 消费 FastMCP 服务器
图5:ADK消费FastMCP服务器流程 - 展示HTTP连接和工具调用的完整过程
ADK Agent 作为 MCP 客户端连接 FastMCP 服务器:
"向 John Doe 问好" → [fastmcp_greeter_agent] → HttpServerParameters → FastMCP 服务器 → greet("John Doe")
HttpServerParameters:通过 HTTP 连接远程 MCP 服务器tool_filter=['greet']:只允许使用 greet 工具
运行步骤:
- 先启动 FastMCP 服务器:
python 7.2MCP示例_FastMCP服务器.py - 再启动 ADK Web:
adk web - 选择
fastmcp_greeter_agent,输入 Prompt
import os
from google.adk.agents import LlmAgent
from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset, HttpServerParameters
GEMINI_MODEL = "gemini-2.0-flash"
# 定义 FastMCP 服务器地址
# 请确保 7.2MCP示例_FastMCP服务器.py 已在该端口运行
FASTMCP_SERVER_URL = "http://localhost:8000"
root_agent = LlmAgent(
model=GEMINI_MODEL,
name='fastmcp_greeter_agent',
instruction='你是一个友好的助手,可以通过 "greet" 工具向人问好。',
tools=[
MCPToolset(
connection_params=HttpServerParameters(
url=FASTMCP_SERVER_URL,
),
# 可选:限制 MCP 服务器暴露的工具
# 本例只允许使用 'greet'
tool_filter=['greet']
)
],
)
示例 4:其他连接方式
展示 python3 和 uvx 两种 STDIO 连接参数配置:
- python3:连接自己编写的 Python MCP 服务器脚本,可通过
env传递环境变量 - uvx:Python 命令行工具,利用 uv 临时隔离环境运行 Python 包,无需全局安装,适合运行社区 MCP 服务器
"""
MCP 服务器的其他连接方式示例。
展示 python3 和 uvx 两种 STDIO 连接参数配置。
"""
from google.adk.tools.mcp_tool.mcp_toolset import StdioServerParameters
# ============================================================
# 示例 1:通过 python3 连接自定义 MCP 服务器
# ============================================================
# 适用于自己编写的 Python MCP 服务器脚本
SERVICE_ACCOUNT_PATH = "/path/to/service_account.json"
DRIVE_FOLDER_ID = "your-drive-folder-id"
python_connection_params = StdioServerParameters(
command="python3",
args=["./agent/mcp_server.py"],
env={
"SERVICE_ACCOUNT_PATH": SERVICE_ACCOUNT_PATH,
"DRIVE_FOLDER_ID": DRIVE_FOLDER_ID
}
)
# ============================================================
# 示例 2:通过 uvx 连接社区 MCP 服务器
# ============================================================
# uvx 是 Python 命令行工具,利用 uv 临时隔离环境运行 Python 包,无需全局安装
uvx_connection_params = StdioServerParameters(
command="uvx",
args=["mcp-google-sheets@latest"],
env={
"SERVICE_ACCOUNT_PATH": SERVICE_ACCOUNT_PATH,
"DRIVE_FOLDER_ID": DRIVE_FOLDER_ID
}
)
关键要点
- MCP 是开放标准,规范 LLM 与外部应用、数据源和工具的通信
- 采用客户端-服务器架构,定义资源、Prompt 和工具的暴露与消费方式
- ADK 支持消费现有 MCP 服务器,也可将自身工具暴露为 MCP 服务
- FastMCP 简化 MCP 服务器开发,尤其适合 Python 工具的快速集成
- MCP Genmedia 工具支持智能体集成 Google Cloud 生成式媒体服务
- MCP 让 LLM 和智能体能访问真实世界系统、动态信息,并执行超越文本生成的操作
总结
模型上下文协议(MCP)是连接大语言模型与外部系统的开放标准。它采用客户端-服务器架构,让 LLM 能通过标准化工具访问资源、利用 Prompt、执行操作。MCP 支持数据库访问、生成式媒体编排、物联网控制和金融自动化等场景。文中通过文件系统服务器和 FastMCP 服务器的智能体集成示例,展示了 MCP 与 ADK 的实际应用。MCP 是打造具备交互能力的智能体系统不可或缺的核心组件。
更多推荐

所有评论(0)