对比
MCP 与函数调用的区别
两者都让模型调用工具。一个内建在模型运行时里,另一个是跨系统的协议。
先记住一句话
函数调用是模型自身的能力。你在请求里声明一组函数,模型可能返回一个结构化的调用,然后由你自己的代码去执行。 全过程都发生在你能控制的一个进程里。
MCP 是客户端和服务端之间的协议。工具不必在你的进程里,可以是别人写的;客户端是在运行时发现它们, 而不是提前把清单声明好。
关键区别
函数调用回答的是"模型怎么表达一次调用";MCP 回答的是"这些可调用的能力从哪来、别人怎么找到它们"。
并排看
| 维度 | 函数调用 | MCP |
|---|---|---|
| 它是什么 | 模型 API 的一个特性 | 一套客户端–服务端协议 |
| 工具在哪 | 在你进程里,随请求声明 | 在服务端后面,可能是别人写的 |
| 发现方式 | 每次调用都传完整清单 | 客户端从服务端发现能力 |
| 清单变大的代价 | 工具越多,每次请求越大 | 能力留在服务端一侧 |
| 执行方 | 你的代码执行函数 | 服务端执行该能力 |
| 跨应用复用 | 复制声明和处理器 | 让另一个客户端连同一个服务端 |
| 凭据 | 在调用方应用里 | 在服务端边界上,管一次 |
它们重叠在哪
尽管有上面这张表,两者并不是竞争关系。支持 MCP 的客户端,通常会把发现到的能力转换成模型本来就认识的形式。 从模型的角度看,一次调用来自声明的函数还是来自发现的 MCP 工具,往往长得一模一样。
区别在模型之外:实现归谁所有、怎么被发现、凭据和权限放在哪里。
什么时候用哪个
函数调用就够了工具数量少、都在同一个服务里实现、不需要跨产品复用,而且工具清单很稳定。
该上 MCP工具要在多个客户端之间共享、放在另一个系统里,或者需要让根本不碰你代码的用户也能安装。
有意识地两个都用本地辅助函数直接调,共享的或第三方的能力走 MCP,避免为私有代码额外付协议开销。
注意成本把每个工具都内联声明,会让每一轮的请求都变大。超过一定规模,光是 token 预算就足以让"发现式"胜出。
它们怎么组合
实际项目里很少二选一。典型的客户端会声明几个本地函数,同时连上一个或多个 MCP 服务端。 模型看到的是一份合并后的可调用清单,由客户端把每次调用路由到正确的地方。
本地函数 → 在本进程内执行 MCP 服务端 → 发现能力,调用通过协议转发 模型看到: 一份合并后的工具清单 客户端决定: 路由到本地处理器,还是路由到服务端
所以真正要回答的不是"函数调用还是 MCP",而是"哪些能力值得留在本地,哪些能力值得共享出去"。