最近在折腾 AI Agent,看到 MCP 协议挺火的,但看文档越看越迷糊。我知道 MCP 定义了一堆 tool,然后客户端可以用这些 tool 去调用外部能力。可这跟 OpenAI 早先的 Function Calling 不是一回事吗?不都是把函数描述发给 LLM,让它决定调哪个?我试着用 MCP 写了个文件搜索的 tool,感觉底层逻辑差不多啊……难道 MCP 只是把函数调用包装成了一个标准协议?还是有我不知道的特殊设计?求大佬们指点一下,别让我继续在坑里瞎转了。
MCP 的 tool 定义和 Function Calling 到底有啥本质区别?
全部回复
共 177 条本质上确实是标准化和生态的问题,function calling各家各写各的,MCP是想让工具接入一次到处能用。
本质区别在于MCP把工具调用从“一次性请求”变成了“可复用协议”,能跨平台共享,而Function Calling只是单次对话的临时方案。
说实话,你现在觉得差不多是因为场景还没复杂到需要MCP那套标准化管理的地步,小项目用Function Calling反而更直接。
说实话我当初也纠结过这个问题,后来觉得关键不在“让LLM选函数”这一步,而是MCP把工具发现、权限控制、多客户端复用这些周边事儿都给标准化了。Function Calling更像是个接口约定,MCP则是把整个工具生态的接入方式统一了,比如远程服务器、鉴权、动态工具列表这些。你要是只在本地单机玩,那确实感觉差别不大,但一旦涉及多应用共享工具或者安全审计,MCP的价值就出来了。不过我也在等更多实战案例,看看它跟直接撸SDK比到底能省多少事。
我一开始也这么觉得,后来发现MCP更像是个“通用插座”,Function Calling只是其中一种插头。MCP把认证、传输、发现都定死了,换个模型不用重写工具层,这点确实省心。
不过说实话,真跑到生产环境,MCP的调试比直接调Function Calling麻烦多了,报错链长一截,小项目我觉得没必要上。你要是只接OpenAI,直接用function calling反而更顺,MCP的优势在多模型切换或者跨平台复用的时候才明显。
说实话我一开始也有这个困惑,后来自己撸了个小项目才慢慢品出点味道。Function Calling说白了就是OpenAI给你的一套API约定,你按它的schema写函数描述,它帮你解析调用意图,本质上是模型能力和接口格式的绑定。但MCP是独立于任何模型和厂商的协议层,它把工具发现、鉴权、调用、结果返回这些全标准化了,比如你写了个文件搜索tool,部署成MCP server,那任何支持MCP的客户端(Claude、Cursor、甚至自己写的Agent)都能直接连上来用,不用针对每家API重写适配。这一点Function Calling做不到,你换了模型供应商就得重新适配一套。另外MCP还支持多工具动态发现,客户端可以随时查询server上有哪些能力,而Function Calling的工具列表是在每次请求前硬编码塞给模型的,灵活性差很多。不过话说回来,如果你只是单机跑个demo,不涉及多端协作,那MCP的优势确实不明显,甚至因为多了层网络开销反而更麻烦。我现在是这么理解:Function Calling是“模型怎么调用函数”,MCP是“函数怎么被生态共享”,两者定位不同,但确实有重叠地带。你后面如果要做跨应用的工具共享,MCP的价值就出来了。
其实我一开始也有同样的困惑,后来觉得关键不在“调函数”这个动作,而是MCP把整个工具发现、权限控制和多客户端复用都标准化了。Function Calling更像是单机版的约定,MCP则是让服务端能动态暴露能力,还能统一鉴权和配置。你写文件搜索工具感觉差不多,是因为底层调用确实没变,但换个场景比如企业里多个Agent共享同一套工具,MCP的优势就出来了。不过说实话,如果只是个人项目,直接Function Calling反而更轻量。
说实话我一开始也有这个困惑,后来自己动手把OpenAI的function calling和MCP都走了一遍才稍微明白点。你感觉底层逻辑差不多是对的,因为核心都是“把工具描述喂给模型让它选”,但MCP真正多出来的东西是那层标准化的传输和资源管理。比如你的文件搜索tool,如果只用function calling,那每个客户端都得自己写一套怎么连、怎么鉴权、怎么处理错误,而MCP把这块统一成了协议,你写一次就能被不同Agent复用。另外MCP不止有tool,还有resource和prompt,这等于把“能调什么”和“能看什么”都规范了,而function calling本质上还是偏单次请求-响应的模式。不过说实话,对于简单的单Agent场景,MCP带来的额外抽象层反而有点重,我自己的感觉是,如果你只是做个小demo,直接function calling更顺手,但要是想搞多Agent或者跨平台复用,MCP那套标准化确实能省不少事。还有个坑是MCP的tool定义里带inputSchema,但实际跑起来不同客户端的处理方式还是有差异,这点文档讲得不够清楚,你得自己踩一遍。
其实我刚从Function Calling切到MCP时也是这感觉,但用久了发现关键不在“调函数”这步,而在MCP把工具发现、鉴权、参数schema这些周边都标准化了,多agent之间能直接共享同一套工具集。不过说实话,小项目里直接Function Calling反而更轻快,MCP那套协议栈有点重,除非你要跨系统复用工具。
本质区别在于MCP是协议,FC是API,前者让工具跨平台复用,后者绑死单一厂商。
本质区别在于MCP把工具调用做成了标准化协议,能跨平台复用,而Function Calling只是单机版的临时约定。
说实话我刚开始也有这个困惑,后来琢磨明白一个点:Function Calling是单机版的“你告诉我怎么调”,MCP是给你一套统一接口去连各种服务,相当于把工具调用做成了标准化协议。文件搜索这种简单场景确实感觉差不多,但真到要接一堆外部API、多个客户端复用的时候,MCP的规范就值钱了。不过我也在纠结,如果只做单Agent项目,硬上MCP是不是反而多此一举?
本质区别在于MCP把工具调用从“模型特性”变成了“协议标准”,但实际用起来确实感觉像换了个壳子。
说实话我一开始也有这个困惑,后来琢磨了一下,Function Calling更像是个“临时工”,你每次都得现定义函数结构,而MCP是给这些工具建了个“标准插座”,把鉴权、参数校验、错误处理全打包好了。你写文件搜索tool觉得差不多,是因为还没碰到跨应用、多服务复用的场景,那时候MCP的标准化优势就出来了。另外MCP的tool描述里还能带资源上下文,这点Function Calling好像没强调过,不知道我理解得对不对。
本质区别在于MCP是协议,FC是接口规范,前者管生态互联,后者管单次推理。
说实话我一开始也有这个困惑,后来觉得关键不在“函数描述”本身,而在于MCP把传输、鉴权、发现这些外围全标准化了。Function Calling更像是个接口约定,MCP则是完整生态,比如远程服务器、多客户端共享,这些是单纯function call给不了的。你试的本地工具感觉差不多正常,真上生产接数据库或跨服务时差异就出来了。
你这感觉没错,MCP在tool定义层面跟Function Calling确实很像,本质都是给LLM一个函数清单。但MCP真正多出来的是那层“传输和发现”的协议,相当于把函数调用从单机版做成了可以跨服务、跨语言的分布式版,能直接复用别人写好的server。我自己试下来,最直观的差异是MCP能动态拉取工具列表,不用每次改代码重新定义,而且还能挂资源、走权限,这确实是Function Calling没覆盖的。不过说实话,如果只是自己单进程里调几个函数,直接Function Calling反而更轻量,MCP那套配置成本有点重了。
说实话我之前也有过一模一样的困惑,后来自己跑了个小项目才琢磨明白点。Function Calling更像是个单次请求的接口约定,而MCP把工具发现、鉴权、调用、错误处理这些周边逻辑全标准化了,等于把零散的函数调用升级成了一套可复用的协议层。你要只是自己写个demo,那确实感觉差别不大,但一旦要接多个外部系统或者多人协作,MCP的优势就出来了。不过我觉得MCP目前生态还不够成熟,文档也写得有点绕,上手门槛比直接写Function Calling高不少。
本质区别在于MCP是协议,把工具发现、认证、调用都标准化了,Function Calling只是单次调用的格式约定。
本质区别在于MCP把工具调用变成了标准化协议,能跨平台复用,而Function Calling是各家闭门造车。
说白了Function Calling是单机接口,MCP是通用插座,换模型不用重写工具。
我刚入坑的时候也这么想,后来发现最大的区别在于MCP把工具发现、鉴权、调用和传输层都标准化了,而Function Calling只是协议里的一小环。你写单个tool感觉差不多,但一旦要对接多个外部系统或者换不同模型,MCP的收益就比较明显了。另外MCP还支持资源访问和提示词模板,不止是调用函数这么简单。当然如果只是简单场景,直接Function Calling确实更轻量。