内容纲要
一、核心定义
模型上下文协议(MCP):一个开放标准,为大语言模型(LLM)与外部应用、数据源、工具之间提供标准化的通信接口。就像是通用电源插座,让任何兼容工具都能被任何兼容LLM访问和使用。
核心类比:
工具函数调用 → 定制工具包(专用扳手+螺丝刀)
MCP协议 → 通用电源接口(任何设备都能接入)
三大核心元素:
- Tools(工具):可执行的功能(如发送邮件、查询数据库)
- Resources(资源):静态数据(如文件、数据库记录)
- Prompts(提示模板):指导LLM如何交互的模板
二、MCP vs 工具函数调用
| 维度 | 工具函数调用 | MCP协议 |
|---|---|---|
| 标准化 | 厂商专有,格式各异 | 开放标准,统一规范 |
| 范围 | 直接调用特定预定义函数 | 完整的发现与通信框架 |
| 架构 | LLM与工具一对一直接交互 | 客户端-服务器架构 |
| 发现机制 | 静态配置可用工具 | 动态发现和查询能力 |
| 可复用性 | 与特定应用深度绑定 | 独立部署,跨平台复用 |
| 适用场景 | 简单应用,固定功能 | 复杂系统,动态扩展 |
核心区别:
- 函数调用:直接给AI一套专用工具
- MCP:建立标准接口,任何工具都能即插即用
三、MCP 架构组件
四大核心角色
| 组件 | 角色 | 类比 |
|---|---|---|
| LLM | 智能核心,决策者 | 大脑 |
| MCP Client | LLM的封装应用 | 翻译官 |
| MCP Server | 外部能力的网关 | 桥梁 |
| 3P Service | 实际执行的外部工具/API | 手脚 |
交互流程
1. 发现(Discovery)
Client → Server: 查询可用能力
Server → Client: 返回工具/资源清单
2. 请求构建(Request Formulation)
LLM: 决定使用哪个工具,构造请求参数
3. 客户端通信(Client Communication)
Client → Server: 发送标准化调用请求
4. 服务器执行(Server Execution)
Server: 验证→执行→调用底层API
5. 响应返回(Response)
Server → Client → LLM: 返回执行结果
四、典型应用场景
1. 数据库集成
智能体用自然语言 → MCP工具箱 → 查询BigQuery → 生成报表
价值:自然语言驱动的数据库操作
2. 生成式媒体编排
MCP连接 → Imagen(图片) + Veo(视频) + Chirp(语音) + Lyria(音乐)
价值:统一接口调度多种媒体生成服务
3. 外部API交互
MCP标准化接口 → 天气API + 股票API + 邮件API + CRM系统
价值:扩展LLM能力边界
4. 基于推理的信息提取
传统搜索: 返回整篇文档
MCP+LLM: 精准提取具体条款/数据/关键陈述
价值:深度理解+精准提取
5. 自定义工具开发
开发者 → 构建专属工具 → MCP Server(FastMCP) → 标准化暴露
价值:企业私有能力快速接入
6. 复杂工作流编排
查客户数据 → 生成营销图片 → 撰写邮件 → 自动发送
价值:多服务协同完成复杂任务
7. 物联网设备控制
自然语言 → MCP → 智能家居/工业传感器/机器人
价值:自然语言控制物理世界
8. 金融服务自动化
MCP对接 → 金融数据源 + 交易平台 + 合规系统
价值:智能化金融操作
五、关键设计考虑
核心要素对比
| 要素 | 说明 | 重要性 |
|---|---|---|
| Tool vs Resource vs Prompt | 工具(可执行)、资源(静态数据)、提示(交互模板) | 明确角色定位 |
| 可发现性 | 动态查询可用能力 | 适应新功能 |
| 安全性 | 身份验证+权限控制 | 保护数据和功能 |
| 实现复杂度 | 框架(Anthropic/FastMCP)简化开发 | 降低门槛 |
| 错误处理 | 清晰反馈错误,支持重试 | 提升鲁棒性 |
部署模式
| 模式 | 适用场景 | 优势 |
|---|---|---|
| 本地Server | 敏感数据、追求速度 | 安全、低延迟 |
| 远程Server | 跨组织共享 | 可扩展、统一管理 |
| 按需调用 | 实时交互 | 即时响应 |
| 批处理 | 大规模数据分析 | 高吞吐 |
传输机制
- 本地通信:JSON-RPC over STDIO (进程间通信)
- 远程通信:Streamable HTTP + Server-Sent Events(SSE)
六、实战:ADK + MCP
1. 连接本地MCP服务器(文件系统)
核心代码:
from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset, StdioServerParameters
TARGET_FOLDER_PATH = "/path/to/your/folder"
root_agent = LlmAgent(
model='gemini-2.0-flash',
name='filesystem_assistant_agent',
instruction='帮助用户管理文件',
tools=[
MCPToolset(
connection_params=StdioServerParameters(
command='npx', # Node Package Execute
args=["-y", "@modelcontextprotocol/server-filesystem",
TARGET_FOLDER_PATH]
)
)
]
)
关键点:
- <code>npx</code>:直接运行npm包,无需全局安装
- <code>StdioServerParameters</code>:本地服务器通信参数
- <code>TARGET_FOLDER_PATH</code>:文件操作根目录
2. 使用FastMCP创建自定义服务器
定义服务器:
from fastmcp import FastMCP
mcp_server = FastMCP()
@mcp_server.tool
def greet(name: str) -> str:
"""生成个性化问候"""
return f"Hello, {name}! Nice to meet you."
# 启动HTTP服务器
if __name__ == "__main__":
mcp_server.run(transport="http", host="127.0.0.1", port=8000)
连接服务器(客户端):
from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset, HttpServerParameters
root_agent = LlmAgent(
model='gemini-2.0-flash',
name='fastmcp_greeter_agent',
instruction='友好的问候助手',
tools=[
MCPToolset(
connection_params=HttpServerParameters(url="http://localhost:8000"),
tool_filter=['greet'] # 可选:限制可用工具
)
]
)
FastMCP优势:
- 简单装饰器定义工具
- 自动生成接口规范
- 支持服务器组合和代理
七、MCP的关键价值与局限
✅ 核心价值
- 互操作性:任何LLM访问任何工具
- 可复用性:工具独立部署,跨项目使用
- 动态发现:无需重新部署即可适应新能力
- 生态系统:推动标准化组件生态
- 简化集成:减少定制开发工作量
⚠️ 关键局限
-
底层API质量决定效果
- 问题:简单封装遗留API效果差
- 解决:需要针对智能体优化API(如添加过滤、排序)
-
数据格式兼容性
- 问题:返回PDF等非文本格式,智能体难处理
- 解决:API应返回智能体友好格式(如Markdown)
-
非确定性需要确定性支撑
- 智能体不能替代传统工作流
- 需要更强的确定性基础设施
八、关键概念速查
| 概念 | 定义 |
|---|---|
| MCP | LLM与外部系统的标准化通信协议 |
| MCP Client | 封装LLM的应用,发起MCP请求 |
| MCP Server | 暴露工具/资源/提示的服务端 |
| Tool | 可执行功能 |
| Resource | 静态数据 |
| Prompt | 交互模板 |
| Discovery | 动态查询可用能力 |
| FastMCP | 简化MCP Server开发的Python框架 |
| STDIO | 本地进程间通信方式 |
| HTTP/SSE | 远程通信方式 |
九、常见问题
Q1:何时用MCP,何时用函数调用?
- 简单应用,固定功能 → 函数调用
- 复杂系统,需要动态扩展 → MCP
Q2:MCP会增加延迟吗?
会,因为增加了发现和标准化通信层。但换来的是互操作性和可扩展性。
Q3:如何确保MCP安全?
1) 身份验证和授权;2) 限制工具访问范围;3) 输入验证;4) 审计日志。
Q4:现有工具如何接入MCP?
用FastMCP等框架封装现有API,暴露为MCP Server。注意要优化数据格式和API设计。
Q5:本地 vs 远程MCP Server如何选择?
- 本地:敏感数据、低延迟
- 远程:跨组织共享、可扩展
Q6:MCP与LangChain的关系?
MCP是通信协议标准,LangChain可以作为MCP Client使用MCP服务器暴露的工具。
十、参考资源
官方文档
代码示例
- ADK + 本地MCP服务器(章节内嵌)
- FastMCP自定义服务器(章节内嵌)
扩展阅读
- 原文章节:<code>16-Chapter-10-Model-Context-Protocol.md</code>
- 第5章:工具使用(MCP的基础概念)