导语
工具函数调用是定制工具包,每个厂商格式各异,难以复用。模型上下文协议(MCP)是通用电源接口,任何兼容工具都能被任何兼容LLM访问和使用。MCP通过标准化通信接口,让智能体与外部应用、数据源、工具无缝集成,打造可互操作的生态系统。本文介绍MCP的核心概念、架构组件、FastMCP实战与ADK集成,适合需要构建企业级智能体系统的开发者。
TL;DR
- 核心:MCP是开放标准,为LLM与外部系统提供标准化通信接口,包含Tools(工具)、Resources(资源)、Prompts(提示模板)三大元素。
- 价值:互操作性(任何LLM访问任何工具)、可复用性(工具独立部署)、动态发现(无需重新部署)、生态系统(推动标准化组件)。
- 架构:LLM → MCP Client → MCP Server → 3P Service,通过发现、请求构建、客户端通信、服务器执行、响应返回五步流程。
- 实现:FastMCP简化MCP Server开发,ADK通过MCPToolset连接MCP服务器,支持本地STDIO和远程HTTP/SSE通信。
- 边界:底层API质量决定效果,需要针对智能体优化;数据格式需智能体友好(Markdown而非PDF)。
是什么:MCP的核心定义
模型上下文协议(MCP):一个开放标准,为大语言模型(LLM)与外部应用、数据源、工具之间提供标准化的通信接口。就像是通用电源插座,让任何兼容工具都能被任何兼容LLM访问和使用。
核心类比:
工具函数调用 → 定制工具包(专用扳手+螺丝刀)
MCP协议 → 通用电源接口(任何设备都能接入)
三大核心元素:
- Tools(工具):可执行的功能(如发送邮件、查询数据库)
- Resources(资源):静态数据(如文件、数据库记录)
- Prompts(提示模板):指导LLM如何交互的模板
常见误解澄清:
- ❌ MCP就是函数调用:MCP是完整的发现与通信框架,函数调用只是直接调用预定义函数。
- ❌ MCP会增加很多延迟:会增加发现和标准化通信层,但换来互操作性和可扩展性。
- ❌ 所有工具都需要MCP:简单应用用函数调用即可,复杂系统需要动态扩展时用MCP。
为什么:产生背景与适用场景
产生背景
工具函数调用的局限:
- 厂商专有,格式各异:不同厂商的工具调用格式不同,难以复用。
- 与特定应用深度绑定:工具与特定LLM或应用紧密耦合。
- 静态配置可用工具:无法动态发现和适应新能力。
MCP协议的优势:
- ✅ 开放标准,统一规范
- ✅ 完整的发现与通信框架
- ✅ 客户端-服务器架构
- ✅ 动态发现和查询能力
- ✅ 独立部署,跨平台复用
核心区别:
- 函数调用:直接给AI一套专用工具
- MCP:建立标准接口,任何工具都能即插即用
MCP vs 工具函数调用
| 维度 | 工具函数调用 | MCP协议 |
|---|---|---|
| 标准化 | 厂商专有,格式各异 | 开放标准,统一规范 |
| 范围 | 直接调用特定预定义函数 | 完整的发现与通信框架 |
| 架构 | LLM与工具一对一直接交互 | 客户端-服务器架构 |
| 发现机制 | 静态配置可用工具 | 动态发现和查询能力 |
| 可复用性 | 与特定应用深度绑定 | 独立部署,跨平台复用 |
| 适用场景 | 简单应用,固定功能 | 复杂系统,动态扩展 |
怎么做: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: 返回执行结果
实战: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优势:
- 简单装饰器定义工具
- 自动生成接口规范
- 支持服务器组合和代理
部署模式
| 模式 | 适用场景 | 优势 |
|---|---|---|
| 本地Server | 敏感数据、追求速度 | 安全、低延迟 |
| 远程Server | 跨组织共享 | 可扩展、统一管理 |
| 按需调用 | 实时交互 | 即时响应 |
| 批处理 | 大规模数据分析 | 高吞吐 |
传输机制
- 本地通信:JSON-RPC over STDIO(进程间通信)
- 远程通信:Streamable HTTP + Server-Sent Events(SSE)
对比与取舍:MCP的关键价值与局限
✅ 核心价值
- 互操作性:任何LLM访问任何工具
- 可复用性:工具独立部署,跨项目使用
- 动态发现:无需重新部署即可适应新能力
- 生态系统:推动标准化组件生态
- 简化集成:减少定制开发工作量
⚠️ 关键局限
-
底层API质量决定效果
- 问题:简单封装遗留API效果差
- 解决:需要针对智能体优化API(如添加过滤、排序)
-
数据格式兼容性
- 问题:返回PDF等非文本格式,智能体难处理
- 解决:API应返回智能体友好格式(如Markdown)
-
非确定性需要确定性支撑
- 智能体不能替代传统工作流
- 需要更强的确定性基础设施
常见错误与排错
典型坑位
| 问题 | 症状 | 识别方法 | 修复建议 |
|---|---|---|---|
| API质量差 | 智能体难以使用工具 | 检查API返回格式 | 优化API设计,返回智能体友好格式 |
| 数据格式不兼容 | PDF等格式无法处理 | 检查返回数据类型 | 转换为Markdown或JSON格式 |
| 连接失败 | 无法连接到MCP服务器 | 检查网络和认证 | 验证URL、认证信息、网络连接 |
| 工具发现失败 | 无法发现可用工具 | 检查Agent Card配置 | 确保Agent Card正确配置 |
调试技巧
- 测试MCP服务器独立运行:先单独测试服务器,再集成到智能体。
- 检查Agent Card:确保工具描述清晰,LLM能理解。
- 验证通信协议:检查STDIO或HTTP/SSE通信是否正常。
- 查看日志:记录MCP通信过程,便于调试。
FAQ
Q1:何时用MCP,何时用函数调用?
A:
- 简单应用,固定功能 → 函数调用
- 复杂系统,需要动态扩展 → MCP
Q2:MCP会增加延迟吗?
A:会,因为增加了发现和标准化通信层。但换来的是互操作性和可扩展性。
Q3:如何确保MCP安全?
A:1) 身份验证和授权;2) 限制工具访问范围;3) 输入验证;4) 审计日志。
Q4:现有工具如何接入MCP?
A:用FastMCP等框架封装现有API,暴露为MCP Server。注意要优化数据格式和API设计。
Q5:本地 vs 远程MCP Server如何选择?
A:
- 本地:敏感数据、低延迟
- 远程:跨组织共享、可扩展
Q6:MCP与LangChain的关系?
A:MCP是通信协议标准,LangChain可以作为MCP Client使用MCP服务器暴露的工具。
延伸阅读与引用
官方文档
总结
模型上下文协议(MCP)是标准化LLM与外部系统连接的核心协议。通过Tools、Resources、Prompts三大元素和客户端-服务器架构,MCP实现了任何LLM访问任何工具的互操作性,推动了标准化组件生态的发展。FastMCP等框架简化了MCP Server的开发,Google ADK等平台提供了原生支持。虽然MCP增加了通信层,但换来了可复用性、动态发现和生态系统优势。