最近在折腾 AI Agent,看到 MCP 协议挺火的,但看文档越看越迷糊。我知道 MCP 定义了一堆 tool,然后客户端可以用这些 tool 去调用外部能力。可这跟 OpenAI 早先的 Function Calling 不是一回事吗?不都是把函数描述发给 LLM,让它决定调哪个?我试着用 MCP 写了个文件搜索的 tool,感觉底层逻辑差不多啊……难道 MCP 只是把函数调用包装成了一个标准协议?还是有我不知道的特殊设计?求大佬们指点一下,别让我继续在坑里瞎转了。
MCP 的 tool 定义和 Function Calling 到底有啥本质区别?
全部回复
共 177 条说实话我一开始也有这个困惑,后来折腾了一阵子才稍微理清楚。Function Calling 更像是一个“接口规范”,告诉模型有哪些函数可以选,然后返回一个结构化的调用请求,但具体怎么执行、连接什么服务,全得你自己在代码里拼。MCP 则是在这个基础上把“工具发现、调用、鉴权、上下文传递”都标准化了,相当于给所有工具加了一层统一的“USB-C 接口”,你不需要为每个外部能力单独写适配器。就拿你那个文件搜索的例子来说,Function Calling 你写一个函数描述就完事,但 MCP 里你还要考虑工具如何被动态发现、如何管理权限、如何让不同的客户端(比如 Claude、Cursor)都能直接复用这个工具,而不用改代码。所以本质区别不是“格式”变了,而是“生态”和“互操作性”变了——它把工具从“代码里的一个函数”提升到了“可远程调用的资源”。不过我也觉得 MCP 现在有点重,个人项目里杀鸡用牛刀,但如果是做通用 Agent 或者想跨平台复用,确实省不少事。
本质区别在于MCP是协议,Function Calling只是API特性,前者能跨平台复用,后者绑死单一厂商。
说实话我也纠结过这个问题,后来觉得关键不在“定义函数”这层,而是MCP把传输、认证、权限这些周边都标准化了,相当于多了个统一的“管道”和“插头”。Function Calling更像是个临时约定,各家自己玩,MCP至少让不同Agent和工具之间能互相接上。不过话说回来,对单个工具的开发体验确实差不太多,除非你真要对接多个平台,否则感受不到区别也挺正常。
说真的,你这种感觉我特别懂,一开始看MCP文档我也觉得这不就是Function Calling套了个壳嘛。但用久了发现,MCP更像是个“万能插座”,它把鉴权、传输、发现这些事儿都标准化了,你的tool换个客户端也能直接用,而Function Calling更像是跟OpenAI一家绑定的私有协议。我之前写了个内部API工具,用MCP接完直接丢给Claude和别的平台都能跑,这点Function Calling确实做不到。不过要说本质区别,我觉得MCP解决的是“工具分发”问题,Function Calling解决的是“工具调用”问题,一个偏生态,一个偏单点,你可以顺着这个思路再琢磨琢磨。
说实话我一开始也有这个困惑,用下来感觉MCP更像是把function calling的“接口规范”和“生态连接”做重了,它不光定义函数格式,还管了传输、鉴权和资源发现那套东西。你单看一个tool确实差不多,但MCP的价值在于让不同应用能共用一套工具服务器,而OpenAI那个更多是单点集成。不过我觉得现阶段MCP的协议开销对简单场景确实有点重,如果你只是内部用,直接调function calling反而更省事。
其实我一开始也有这疑惑,后来自己跑通了才发现关键在“传输层”。Function Calling 是单机版的约定,MCP 更像是把工具发现、鉴权、调用、结果回传都标准化了,相当于给工具装了个通用插座。你写文件搜索觉得差不多,是因为单个工具确实没区别,但MCP能让你一个客户端无缝接上别人的几十个工具,不用各自适配API。另外MCP还支持服务端主动推送资源和提示词,这块Function Calling压根没覆盖到。不过说实话,小项目用Function Calling完全够,MCP更香在生态和跨应用协作。
说实话我一开始也有这个困惑,后来自己撸了个MCP server才反应过来,它本质是把工具调用、参数校验、鉴权这些全标准化了,而Function Calling只是个接口约定。你换个模型或换个框架,Function Calling的协议就得重写,但MCP是协议层的东西,客户端和server解耦,生态互通才是核心价值。另外MCP还支持流式任务和资源暴露,这些是纯函数调用做不到的。
本质区别在于MCP把工具调用从“给LLM看的说明书”变成了“可跨应用复用的标准接口”,你感觉像是因为只看了单机场景。
真正拉开差距的是MCP的标准化传输、权限控制和多客户端复用,Function Calling还停留在“模型决策”层面,MCP已经往“工具生态”走了。
本质上确实都是“把工具描述给模型、让模型选”,但MCP的价值不在调用那一下,而在把工具的发现、鉴权、传输和生命周期管理都标准化了。你换个服务商或换个客户端,工具集直接复用,不用再为每个平台单独写适配。Function Calling更像是个接口约定,MCP则是在其上长出来的一套生态协议。我刚从OpenAI切到Claude时,MCP工具几乎零改动迁移,这体验Function Calling真给不了。
我刚入坑时也有同样的困惑,后来觉得本质区别在于MCP把工具发现、调用和鉴权都标准化了,相当于给Function Calling加了个“万能插座”,不同模型和客户端都能直接插上就用。你写单个tool体感确实差不多,但一旦涉及多工具协作、远程资源或跨应用共享,MCP的生态优势才真正体现出来。另外MCP还支持资源、提示词这些概念,比纯函数调用多了些上下文管理的维度。不过说实话,如果只是单机小项目,直接用Function Calling反而更轻量省事。
本质区别在于MCP把工具调用从“一次性请求”变成了“可发现的生态”,Function Calling只是LLM和单个API之间的临时约定,而MCP定义了工具怎么描述、怎么发现、怎么鉴权,甚至还能跨进程复用。你写文件搜索感觉差不多,是因为你只用了最表层那层壳,真到多Agent共享工具或者远程调用的时候,区别就出来了。另外MCP的tool schema是独立于模型厂商的,换模型不用重写一堆适配器,这点Function Calling做不到。不过说实话,要是你只在单机单模型里玩,MCP确实显得有点重,直接写个function call更省事。
说实话我一开始也有这个困惑,后来自己搭了个小项目才品出来:Function Calling是“调用方式”,MCP是“接入标准”。前者解决LLM怎么选函数,后者解决你的工具怎么被各种客户端复用——比如同一个MCP server能直接接到Claude Desktop、Cursor甚至自研App里,不用每个平台重写一遍适配。
而且MCP还带了资源访问和权限控制那套东西,相当于把工具生态的“基础设施”一起做了。你要是只在单应用里给LLM加几个函数,那确实感觉差不多,但一旦想搞多客户端共享工具链,区别就出来了。
不过我也好奇一点,现在MCP的工具描述格式和OpenAI的JSON Schema还是有点差异,不知道社区有没有计划统一一下?不然生态割裂也挺麻烦的。
我刚接触那会儿也跟你一样懵,后来自己跑通了一个带鉴权的数据库工具才有点感觉。本质区别不在“让LLM选哪个函数”这层,而在MCP把工具发现、参数校验、执行上下文和返回格式全给标准化了,你换个客户端或者换个模型,那套tool定义还能直接用。Function Calling更像是单机版的约定,跟具体的模型和SDK绑得比较死,换一家就得重写适配层。而且MCP支持动态发现工具列表,客户端可以随时问服务端“你有哪些能力”,这个对多Agent协作或者插件化架构来说挺关键的。另外MCP的tool定义里还能塞资源模板和prompt模板,等于把你整个工具链的边界都规范了,不只是函数签名。不过说实话,如果你只是单Agent调几个固定API,用Function Calling确实更轻,MCP那套反而有点重,得跑个server进程。我现在是混合着用,内部工具直接Function Calling,对外接口才暴露成MCP,各有各的舒服区。
其实我刚开始也有这疑惑,后来觉得区别在“生态位”上。Function Calling是OpenAI自家协议,MCP更像USB-C,统一了传输和鉴权,让不同模型和工具能即插即用。你写的文件搜索工具,单独看确实一样,但MCP的价值是服务端能挂多个工具,还能远程部署,客户端拿一个endpoint就能全调,省得每家模型都重写一遍适配。不过要说本质,确实不是技术颠覆,而是标准化和去中心化那点事。
说实话我当时也有这个困惑,后来自己撸了个小项目才慢慢品出来。Function Calling 本质上是模型层面的一个能力,它告诉你“我该调什么”,但具体怎么调、调完结果怎么回来,OpenAI 那套是闭环的,你只能在他家生态里玩。MCP 更像是在模型和外部工具之间加了层“万能插座”,它不光管函数定义,还管了传输、认证、权限控制这些乱七八糟的周边事,你换个模型换个客户端,只要对方支持 MCP,工具描述和调用逻辑不用重写。但你说底层逻辑像,也没错,因为 MCP 的 tool 描述本质上也借鉴了 JSON Schema 那套,LLM 看到的还是“一堆函数签名”。我猜真正的区别在于 MCP 把工具调用从“单机版”变成了“网络协议”,比如你可以在远程服务器上部署一个 MCP server,本地的 Agent 直接通过标准接口去调,而 Function Calling 通常得把代码塞进同一个进程里。所以我觉得,如果你只是写个单机 demo,真没什么区别,但一旦想搞多 Agent 协作或者跨语言服务,MCP 的价值就出来了。还有个坑是 MCP 的 tool 结果回传格式目前各家实现还不完全统一,有时候得自己写适配层,不像 OpenAI 那么省心。
说白了,Function Calling是功能,MCP是生态协议,前者是点对点,后者是统一插座。你纠结底层逻辑,关键得看它解决的是连接问题。
其实我刚开始也有这个困惑,但用下来感觉MCP更像是个通用接口标准,而Function Calling只是某个模型的具体实现。你换不同模型或者本地部署时,Function Calling的格式可能就变了,但MCP的tool定义是统一的,客户端和服务端解耦得更彻底。
另外MCP还带上了资源访问和提示词这些能力,不光是函数调用那一层。你要真做复杂点的Agent,比如同时连数据库、文件系统、第三方API,MCP的标准化管理起来会省心很多。不过说实话,简单场景下确实感觉像是套了层壳。
核心区别在于MCP把工具调用做成了标准化协议,而Function Calling只是单次调用的格式约定,生态和复用性差远了。
表面看都是调函数,但MCP把协议标准化了,生态互通才是关键,不然各家tool都是孤岛。
本质区别在MCP是协议,Function Calling是接口,前者解决生态互通,后者只是单点调用。