Function Calling、工具与MCP:一张图彻底讲清三者的关系

本文完全从学习者的第一视角出发,还原我从“一脸懵”到“彻底通透”的思考全过程。
一、最初的困惑:这三个词到底在说什么?
我第一次接触这三个概念时,脑子里全是浆糊:
-
Function Calling 是什么?
-
工具(Tools)又是什么?
-
MCP 怎么好像跟它们都有关系,又不完全一样?
网上资料要么太虚,全是“协议、基础设施”这种大词;要么太散,看完更晕。我花了很长时间才理清楚——这三者根本不在同一个维度上。
下面我用自己的思考路径,一步步把它们拆开。
二、先定角色:我给三个概念各贴了一个标签
为了让自己不混淆,我先给每个词一个最朴素的定性:
| 概念 | 我的第一直觉 | 对不对? |
|---|---|---|
| 工具(Tools) | 就是真实的代码函数,能跑出结果的东西 | ✅ 对 |
| Function Calling | 大模型“听懂”并决定怎么用的能力 | ⚠️ 接近,但不精确 |
| MCP | 把工具翻译给大模型看的东西 | ✅ 对,但还有另一半 |
这个初步定位帮我把它们先“物理隔离”开了——至少我知道它们不是同一个东西。
三、逐一定义:我踩过的坑和修正
1. 工具(Tools)——这是最没争议的
工具就是实实在在的代码。比如:
def get_weather(city: str):
# 真实的API调用或数据库查询
return f"{city}的天气是晴天"
这个函数能真正跑起来,返回数据。它就是“工具”的本体。
但工具不只有“代码”这一面。 它还得有一份“说明书”——告诉调用方:这个函数叫什么名字、需要什么参数、参数是什么类型。
所以一个完整的工具 = 真实执行的代码 + 描述自己的JSON说明书。
import requests
def get_weather(city: str):
"""获取城市天气
:param city: 城市名称
"""
try:
resp = requests.get(f"https://wttr.in/{city}?format=j1", timeout=8)
data = resp.json()
cur = data["current_condition"][0]
return f"{city}的天气是{cur['weatherDesc'][0]['value']},温度{cur['temp_C']}℃"
except Exception:
return f"{city}的天气是晴天"
2. Function Calling——我差点定义歪了
我一开始说它是“大模型的理解能力”,后来发现不准确。
“理解能力”太宽了——大模型本来就懂中文、懂逻辑,那是它的基础能力。而 Function Calling 是一项专项特技:
Function Calling 不是“听懂你在说什么”,而是“在听懂之后,决定调用哪个外部程序,并精准提取参数”。
打个比方:
-
听懂“我饿了”= 基础理解能力
-
决定“我要去后厨叫一份宫保鸡丁,少放辣椒”= Function Calling
它是大模型自带的决策与行动意图能力——这个能力写在模型的“基因”里,是模型厂商(OpenAI、Anthropic等)预置在模型内部的,不需要你安装任何东西,你也拿不走它。
3. MCP——我只说对了一半
我最初说“MCP是把工具翻译成Function Calling的形式给大模型看”——这个理解对了一半。
MCP确实是“翻译官”,但它是双向翻译:
-
正向翻译:把你写的工具(Python函数),翻译成大模型API能看懂的 Function Calling 格式(JSON字典)。
-
反向翻译:当大模型返回“我要调用get_weather,参数是北京”这个指令时,MCP负责把它翻译成真正去执行你电脑上那个
get_weather("北京")代码的调用。
而且MCP还有一个关键职责: 它负责把工具整理成一份标准化的工具清单,让任何大模型客户端都能发现和浏览有哪些工具可用。
所以MCP的完整定义是:
MCP是一套“标准化协议”,负责把工具整理成统一清单,并双向翻译——正向把工具翻译成FC格式供模型决策,反向把模型的决策翻译成真实的工具调用。
四、三者关系的核心洞察:它们是一条链上的不同环节
当我终于搞明白各自定义后,最大的突破是意识到:它们三者是串在一条执行链上的,根本不存在“谁包含谁”。
完整的执行流程是这样的:
用户提问 → 大模型(FC决策) → MCP(反向翻译) → 工具(真实执行) → 返回结果
↑ ↑
MCP(正向翻译) 工具说明书
(整理工具清单)
逐帧拆解:
第0步(准备阶段): 你写好工具代码,用MCP的 @mcp.tool 装饰器把它挂载到MCP服务器上。MCP给这个工具拍了一张“证件照”(JSON说明书),并把所有工具的证件照整理成一份标准化的工具清单。
第1步(正向翻译): 用户提问后,MCP客户端把这份工具清单里的每一项,翻译成当前大模型API认得的Function Calling格式(OpenAI有OpenAI的格式,Claude有Claude的格式,MCP帮你自动转换),塞进API请求里发给模型。
第2步(FC决策): 大模型看到这些工具描述后,用自己天生自带的Function Calling能力做决策——要不要调工具?调哪个?传什么参数?然后返回结构化的 tool_calls 指令。
第3步(反向翻译): MCP收到模型的指令,反向翻译成真实代码调用,去执行你最初写的那个函数。
第4步(执行): 工具真正跑起来,返回结果。
五、用一张比喻彻底定格
为了让自己永远不忘,我编了一个比喻:
| 概念 | 新比喻 | 职责 |
|---|---|---|
| 工具(Tools) | 手和脚 | 真正干活的实体。没有手脚,想法无法落地 |
| Function Calling | 大脑的运动皮层 | 大脑里负责“决策要做什么动作”的区域。它只负责想——“我要举起右手、握拳”,但不会自己去举 |
| MCP | 周围神经系统(脊髓+神经纤维) | 负责传导信号。大脑的运动指令通过神经传导到手脚;手脚的感觉(执行结果)通过神经传回大脑 |
完整协作流程(用这个比喻重新走一遍)
-
大脑(FC) 收到“北京天气怎么样”这个信息后,运动皮层(FC) 做出决策:“我要调用
get_weather这个动作,参数是北京”。 -
这个决策信号通过 神经系统(MCP) 传导出去——MCP 先把“动作指令”翻译成手脚能理解的神经电信号(正向翻译)。
-
手和脚(工具) 收到信号,真正去执行(查 API、读数据库、发请求),拿到结果“晴天28°C”。
-
手脚的感觉神经把“晴天28°C”这个结果,通过 神经系统(MCP) 反向传回大脑。
-
大脑(FC) 收到感觉反馈后,重新加工,最终说出:“北京今天晴天,28°C。”
六、最终结论(一句话说清三者关系)
工具(Tools)是“真实干活的肉体”,Function Calling是“大模型天生的决策大脑”,MCP是“标准化的神经翻译官”。大脑(FC)通过翻译官(MCP)指挥肉体(Tools)去干活。三者各司其职,串联成完整的AI Agent执行链路。
附:如果再有人问你,你可以这样回答
问:Function Calling 和 MCP 是什么关系?
答:不是替代关系,也不是包含关系。Function Calling 是大模型自带的“决策能力”,MCP 是坐在它上游的“标准化翻译官”——MCP 把工具翻译成 FC 能看懂的格式,等 FC 做完决策,MCP 再把决策翻译成真实的工具调用。
问:MCP 里出现的 @tool 是什么?
答:那是 MCP 在“给工具拍证件照”——生成 JSON 说明书,而不是 FC 能力本身。真正的 FC 决策能力永远留在云端模型内部。
问:如果我只用 OpenAI 一家模型,还需要 MCP 吗?
答:不必须。但如果工具数量变多(比如 10 个以上),或者未来可能换模型,MCP 的“标准化”价值就会体现出来——它让你不用为每个模型重写对接代码。
更多推荐


所有评论(0)