MCP 进阶指南
提出两个问题:MCP从哪里来,MCP要到哪里去?
MCP从哪里来?
在讨论这个问题前,是否有人会对 MCP 有这样的理解: MCP 就是给 AI 添加了调用外部工具的能力。
这个理解是错误的,原因非常明显,**在 MCP 之前,AI 就有调用外部工具的能力,**比如说:
- 联网搜索
- Agent
- 知识库 他们都并非 AI大模型 纯粹本身拥有的能力,都是调用了外部。那么他们都是依靠什么来调用外部的呢?
直接上结论
模块 | 主要技术 | 补充说明 |
---|---|---|
联网搜索 | Function Calling | 通过API调用搜索引擎(如Google/Bing) |
知识库 | RAG | 从向量数据库或文档库检索信息并增强生成 |
Agent | Function Calling + Prompt | Agent既可能调用工具(Function Calling),也可能依赖Prompt规划任务 |
Function calling, RAG, Prompt 是什么?
先看解释:
- Function Calling 是指 LLM 与外部工具交互的协议规范,定义了如何将输入数据发送给外部工具,以及如何从外部工具接收输出数据。
- RAG 是一种向量数据库或文档库的检索方法,可以从中检索信息并增强生成。
- Prompt 是一种基于规则的对话系统,可以规划任务。
从文字解释中我们就能飞快地确定这三个技术中只有 Function Calling
才是真正调用外部工具的技术。 RAG
着重于读取和检索,是处理数据的一种能力,虽然我们能提供外部文件,但本质是读
然后转换
成 AI 能快速理解的格式。 Prompt
则本质就是提示词,一种帮助 AI 做决策的规则比如:请先搜索2024年GDP数据,再计算中美增长率差异。
( 这边可能存在疑惑,因为这确实像极了让 AI 拥有了调用外部工具的能力,不过这在下面讲解 )
Function Calling 是什么?
看解释,就可以知道他本质是一种协议规范,换句话说:只要工具根据指定的数据格式传递过来,就能调用(其实还需要符合对应AI大模型的 白名单 + 权限, 想具体了解可以查看OpenAI 文档 )。
于是,什么样的数据格式:JSON Schema
比如必须明确符合的格式: - 字段类型(字符串、数字、布尔值等) - 必填字段(哪些字段必须存在) - 取值范围(如数字的最小/最大值) - 嵌套结构(对象中嵌套数组或其他对象) - 默认值(字段未提供时的默认值)
用户提问:"2024年奥运会在哪里举办?" 模型生成的 Function Calling 请求:
json
{
"tool": "web_search",
"query": "2024年奥运会举办地"
}
系统执行搜索后返回:
json
{
"results": [
{
"title": "2024年奥运会 - 维基百科",
"snippet": "2024年奥运会将于法国巴黎举行。"
}
]
那为什么需要MCP?
既然 Function Calling 已经能调用外部工具,那么 MCP 又为什么出现?似乎 MCP 几乎等同于 Function Calling
然而:
-
首先
Function Calling
并非所有AI模型都拥有,调用函数的能力是极其难以训练的,其中deepseek-reasoner
都为了保障推理能力而放弃了Function Calling
功能。 -
其次
Function Calling
的固有局限性
需求 | Function Calling | MCP协议 |
---|---|---|
多工具并行调用 | ❌ 单次调用单工具 | ✅ 批量请求支持 |
长时异步操作 | ❌ 同步阻塞式 | ✅ 轮询/回调机制 |
跨会话状态管理 | ❌ 无原生支持 | ✅ 显式context_id传递 |
工具版本控制 | ❌ 需人工管理 | ✅ URI内置版本号 |
- Function Calling:各厂商实现互不兼容
python
# OpenAI格式
tools = [{"type": "function", "function": {"name": "get_weather"...}}]
# Claude格式
tools = {"tool_uses": [{"name": "get_weather"...}]}
于是我们又会疑问:MCP 要取代 Function Calling 吗?
答案还是是否定的,并且直接抛出流程图
从这个图看出来 MCP 并非取代 Function Calling
, MCP 作为 Function Calling 的上层协议,他们之间没有替代的关系,只是 Function Calling
在功能上扩展了 MCP 的功能。
并且 MCP 也并非是强依赖于 Function Calling
,还可以利用 Prompt
实现。
MCP 根本不应该作为 Function Calling
的比较事物。
Prompt------伪装大师
在大模型、客户端极度缺乏 Function Calling
能力的情况下,理论上 AI 是无法调用外部文件的。但我们在使用各种 AI 产品时都能看到,有些 AI 产品可以调用外部文件,为什么呢?
因为每个客户端背后都会有巨长无比的提示词,就拿roocode
的举例
足足有600多行,换算成token
随便上万,当你添加了外部工具时,客户端就会去解析,并将其转化成指令(inputSchema
)并存储在提示词中比如:
text
# 已连接的MCP服务器
当服务器连接时,你可以通过`use_mcp_tool`工具使用服务器的工具,并通过`access_mcp_resource`工具访问服务器的资源。
## my-mcp-server (`node /Users/zhiyi/Documents/Code/MY/mcp/mcp-server/main.js`)
### 可用工具
- add: 张三计算法
输入模式:
{
"type": "object",
"properties": {
"a": {
"type": "number"
},
"b": {
"type": "number"
}
},
"required": [
"a",
"b"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
Function Calling
调用方式:
json
// 模型生成的 Function Calling 请求
{
"tool": "add",
"a": 3,
"b": 5
}
// 系统调用工具后返回的结果
{
"content": [{"type": "text", "text": "9"}] // 3 + 5 + 1 = 9
}
Prompt
调用方式:
text
// 发起指令
请模拟调用"张三计算法"工具,输入 a=3 和 b=5,返回工具的计算结果。
按以下格式响应:
工具名称: add
输入: {"a": 3, "b": 5}
输出: {"content": [{"type": "text", "text": "计算结果"}]}
// 模型返回
工具名称: add
输入: {"a": 3, "b": 5}
输出: {"content": [{"type": "text", "text": "9"}]} # 模型根据inputSchema"猜"出 3+5+1=9
- 模型可能计算错误(如返回 8,忽略 +1 规则)。
- 完全依赖模型对"张三计算法"的理解(若训练数据中未提过类似工具,可能无法模拟)。
Prompt
更像是读取工具,让模型自己去理解,并根据规则生成指令,这在简单的任务中问题并不是特别大,但在复杂的任务中,模型可能无法理解提示词,导致模型无法正确执行。 比如:
text
模拟调用"人脸识别工具",输入照片链接:https://example.com/photo.jpg。
MCP要到哪里去?
MCP
的出现直接引燃了 AI 模型调用外部工具的热潮,他打破了 AI 模型的限制性
,让 AI 模型可以更灵活更容易配置
。
并且 MCP 还处于高速普及的道路上,他本身提供的功能远远没被开发完毕
可以看出主要的 Tools
、 Resources
、 Prompt
功能,也就 Tools
被广泛应用, 更别说像是 Sampling
这么强大的能力还没有被开发出来。未来发展的空间巨大,每集成一个功能都是对使用体验极大的提升。 这就像极了 GPT
刚出来的时候,大家都在吐槽,但现在 GPT
DeepSeek
等 AI 模型能力 开始触及到生活的方方面面。 也许过不了多久,我们可以一键制定出行计划,一键生成销售方案,一键完成数据分析,真正进入模块化领域化。
如今 MCP 市场也非常多,这边推荐几个:
- MCP.so(最大的市场)
- modelscope(偏国内)
- Awesome MCP Servers(偏国外)