第13章 给工具世界定个规矩
第6章我们讲了Function Calling,第12章讲了安全。但还有一个痛点没解决:你写的Agent接入的是OpenAI,工具定义是OpenAI的格式;另一个Agent用的是Anthropic,工具定义又是另一种格式。换个模型就得重写工具?MCP协议就是来解决这个问题的——让所有工具说同一种语言。
13.1 为什么需要MCP?
13.1.1 "万国插座"问题
假设你写了三个Agent,用了三个不同的LLM:
| Agent | LLM | 工具定义方式 |
|---|---|---|
| Agent A | OpenAI | OpenAI Function Calling 格式 |
| Agent B | Anthropic | Anthropic Tool Use 格式 |
| Agent C | Ollama(本地) | 自定义JSON Schema |
同一个工具 get_weather,你得写三遍定义。三套代码,三种格式,维护噩梦。
这就是MCP要解决的问题——一套工具定义,所有LLM都能用。
13.1.2 MCP是什么
MCP(Model Context Protocol) 是一个开放协议,由Anthropic在2024年底提出。它定义了LLM和外部工具之间的标准通信方式。
简单类比:
- USB-C出现之前:每个手机有自己充电口,出门得带三根线
- MCP出现之前:每个LLM有自己的工具调用格式,写工具得适配三套
- 有了MCP之后:一套接口,所有LLM都能用
13.2 MCP架构:Server、Client与协议规范
13.2.1 三个角色
| 角色 | 做什么 | 类比 |
|---|---|---|
| MCP Server | 暴露工具,等待调用 | 微服务里的一个API服务 |
| MCP Client | 发起工具调用请求 | 微服务里发起HTTP请求的服务 |
| LLM | 决定什么时候调哪个工具 | 大脑 |
13.2.2 MCP协议的四个核心概念
Tools(工具):Server暴露的可调用函数。每个工具有名称、描述、参数schema。
Resources(资源):Server暴露的数据。比如"用户手册"、"产品目录"——LLM可以读取这些数据作为上下文。
Prompts(提示模板):Server提供的预制Prompt模板。比如"客服对话模板"。
Sampling(采样):Server可以反过来请求LLM生成内容——这是个高级功能。
13.3 自己写一个MCP Server
13.3.1 最小MCP Server
用Python的 mcp 库,几行代码就能搭一个MCP Server:
python
from mcp.server import Server, NotificationOptions
from mcp.server.models import InitializationCapabilities
from mcp.server.stdio import stdio_server
from mcp.types import Tool, TextContent
import json
# 创建Server
server = Server("weather-server")
# 注册一个工具
@server.list_tools()
async def handle_list_tools():
return [
Tool(
name="get_weather",
description="查询指定城市的天气",
inputSchema={
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称"
}
},
"required": ["city"]
}
)
]
# 实现工具逻辑
@server.call_tool()
async def handle_call_tool(name: str, arguments: dict):
if name == "get_weather":
city = arguments["city"]
weather_data = {
"北京": {"temp": 25, "condition": "晴"},
"上海": {"temp": 28, "condition": "多云"},
}
result = weather_data.get(city, {"error": "未找到该城市"})
return [TextContent(type="text", text=json.dumps(result, ensure_ascii=False))]
# 启动Server
async def main():
async with stdio_server() as (read_stream, write_stream):
await server.run(read_stream, write_stream)
if __name__ == "__main__":
import asyncio
asyncio.run(main())13.3.2 测试你的MCP Server
python
from mcp.client.stdio import stdio_client
from mcp import ClientSession, StdioServerParameters
async def test_weather_server():
# 连接到Server
server_params = StdioServerParameters(command="python3", args=["weather_server.py"])
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
# 初始化
await session.initialize()
# 列出可用工具
tools = await session.list_tools()
print(f"可用工具: {[t.name for t in tools.tools]}")
# 调用工具
result = await session.call_tool("get_weather", {"city": "北京"})
print(f"结果: {result.content[0].text}")13.4 MCP与Function Calling的关系
13.4.1 不是替代,是互补
很多人问:有了MCP,是不是不需要Function Calling了?
不是。它们解决不同层面的问题:
| Function Calling | MCP | |
|---|---|---|
| 做什么 | LLM决定调哪个工具 | 工具如何被定义和暴露 |
| 谁定义的 | 各LLM厂商自己 | 开放的行业标准 |
| 问题域 | "Agent内部怎么做决策" | "工具怎么被外部系统调用" |
你可以同时用两者:LLM通过Function Calling决定调用 get_weather,然后通过MCP协议去调用部署在MCP Server上的 get_weather 工具。
13.4.2 MCP的生态现状
- Claude Desktop 原生支持MCP,可以直接连接MCP Server
- LangChain 有
langchain-mcp适配器,让LangChain Agent调用MCP工具 - Cursor、Zed 等编辑器开始支持MCP,让AI编程助手访问本地工具
- 社区贡献了大量MCP Server:文件系统、数据库、浏览器、GitHub……
13.5 MCP生态与未来展望
13.5.1 为什么MCP值得关注
MCP如果成功,意味着:
对工具开发者:写一次工具,所有支持MCP的LLM都能用。不用再适配各个厂商的格式。
对LLM厂商:不用自己造工具调用标准了。接入MCP,自动获得整个生态的工具。
对Agent开发者:你的Agent可以"插"上任何MCP Server,就像给电脑插USB设备。
13.5.2 你可能遇到的挑战
MCP还很新(2024年底才提出),目前有一些局限:
- 标准还在演进:API可能还会有变化
- 生态还不够大:虽然增长快,但和REST API的生态比还差得远
- 调试工具不成熟:出了错排查起来比较费劲
但这些是时间问题。本书第17章做项目时,你会在实战中用MCP——到时候这些问题大部分应该已经解决了。
13.6 本章小结
- MCP是工具的"USB-C标准":一套接口,所有LLM通用。告别三套格式适配的噩梦。
- 三个角色:MCP Server暴露工具、MCP Client发起调用、LLM做决策。
- MCP不是替代Function Calling:MCP管执行层(工具怎么暴露),Function Calling管决策层(该调哪个工具)。
- 生态在快速增长:Claude Desktop原生支持,LangChain适配器可用,社区Server越来越多。
✅ 知识点检查
学完这一章,试试回答这几个问题:
- [ ] MCP解决了什么核心问题?为什么把它比作USB-C?
- [ ] MCP架构中有哪三个角色?各负责什么?
- [ ] MCP和Function Calling的关系是什么?
- [ ] 写一个MCP Server需要几个步骤?
📚 延伸阅读
- MCP官方文档:https://modelcontextprotocol.io
- MCP GitHub仓库(含工具列表):https://github.com/modelcontextprotocol/servers
- LangChain MCP适配器:https://python.langchain.com/docs/integrations/tools/
- 本书配套源码:关注公众号「图解AI系列」免费领取
🎯 下一章预告
第14章,认清边界,比知道怎么做更重要——
"Agent不是万能的。知道它不能做什么,你才能用好它。"

