最近在折腾 AI Agent,看到 MCP 协议挺火的,但看文档越看越迷糊。我知道 MCP 定义了一堆 tool,然后客户端可以用这些 tool 去调用外部能力。可这跟 OpenAI 早先的 Function Calling 不是一回事吗?不都是把函数描述发给 LLM,让它决定调哪个?我试着用 MCP 写了个文件搜索的 tool,感觉底层逻辑差不多啊……难道 MCP 只是把函数调用包装成了一个标准协议?还是有我不知道的特殊设计?求大佬们指点一下,别让我继续在坑里瞎转了。
MCP 的 tool 定义和 Function Calling 到底有啥本质区别?
全部回复
共 177 条说实话我之前也有过一模一样的困惑,直到真把MCP用在一个多服务项目里才有点感觉。Function Calling更像是个接口约定,而MCP是帮你把鉴权、传输、发现这些脏活累活都规范了,尤其换不同模型时不用重写tool层。不过我也同意你说的,单看一个tool的调用确实没啥本质飞跃,可能价值更多在生态和复用上吧。
本质区别在于MCP是协议,Function Calling是接口,前者解决互通,后者只是调用方式。
说实话我一开始也有这个困惑,后来琢磨了一下,觉得最大的区别不在“让LLM选哪个函数”这一步,而在MCP把整个调用链路的生态给标准化了。Function Calling本质上是模型API的一个参数格式,你写完函数描述,剩下的HTTP、鉴权、错误处理全得自己造轮子。但MCP更像是一个中间层协议,它规定了server怎么暴露工具、client怎么发现工具、权限怎么控制,甚至包括资源、提示词这些比tool更广的概念。你拿文件搜索举例,底层逻辑确实像,但换个场景试试,比如让多个不同语言的Agent共享同一套工具集,或者把工具部署在远程服务器上,这时候MCP的统一接口优势就出来了。另外我感觉MCP的tool定义里还带了input schema的严格校验和输出格式的约定,这对复杂Agent的状态管理挺重要,Function Calling那套往往就是裸传JSON。不过话说回来,如果你只是单机单模型调几个简单API,MCP确实有点重,直接用Function Calling反而更轻快。我也还在摸索,不知道MCP对流式输出或长时间任务的支持做得怎么样,这块文档好像不太清楚。
本质区别在于MCP是协议,Fc是接口,前者解决生态互通,后者只是单次调用约定。
说实话我一开始也这么觉得,直到把MCP的server/client拆开跑了一遍才反应过来,Function Calling只是单次请求里的一个参数结构,而MCP把发现、鉴权、调用、错误处理这些全规约成了一套可复用的传输层协议,相当于从“接口格式”升级到了“接入标准”。你写单个tool的时候确实感觉差不多,但当你接多个服务商、要动态发现工具列表的时候,区别就出来了。不过我也还在想,如果只是自己内部用几个固定API,MCP那套额外开销到底值不值。
本质区别不在于“调函数”这个动作,而是MCP把工具发现、参数校验、传输协议、权限控制全给标准化了。Function Calling更像一个接口约定,各家实现五花八门,MCP相当于给这些约定套了个通用插座。我一开始也跟你一样觉得是套壳,直到试了跨平台调用才发现,不用改业务代码就能接不同Agent框架,这才是它存在的意义。不过说实话,对于单机小工具,确实感觉有点重。
本质上就是多了层“协议”的外衣,让不同平台间的tool能互相通用。Function Calling是各家自扫门前雪,MCP相当于给所有工具定了个统一插座标准,你插头是Type-C,那头是Lightning,中间得靠协议转接。
不过我觉得真正区别在MCP把tool的发现、描述、调用拆成了独立服务,客户端可以动态拉取能力,而不是像Function Calling那样写死在代码里。你文件搜索那个例子感觉像,是因为你只用了单一工具,试试把数据库、API、本地脚本全挂上去,切换成本就明显了。
另外MCP还支持工具间的上下文传递和依赖关系,Function Calling基本是单次无状态的。你要是玩过多轮agent,会发现MCP对复杂工作流的编排更友好,但不代表它性能更强,反而调试起来更头疼。
本质区别在于MCP把工具调用从“LLM接口的附属功能”变成了“可独立发现的资源”,你换个支持MCP的客户端就能直接复用同一个文件搜索服务,而Function Calling还得重新适配各家API。另外MCP还带上了鉴权、权限控制这些生产环境才关心的东西,纯函数调用确实只是包装,但包装本身解决了生态互通的问题。我之前也是从Function Calling转过来的,最大的体会是MCP的tool描述可以动态更新,不用每次改完功能还得重新发一遍prompt。不过说实话,如果你只是单机跑个demo,那俩还真没啥大差别。
其实你感觉没错,底层逻辑确实都是“把函数描述扔给模型让它选”,但MCP真正多出来的东西是传输层和资源管理那套。Function Calling说白了就是OpenAI自家API里的一个参数格式,你写完函数定义还得自己管API调用、鉴权、错误处理,换家模型厂商又得重新适配。MCP把这块抽出来做成了标准协议,客户端、服务端、工具发现机制都是现成的,相当于把“函数调用”从模型接口里解耦了,变成了一套可复用的基础设施。我上次用MCP接本地文件系统,发现它连权限校验和文件监听都内置了,这确实不是Function Calling能直接给的。不过说实话,现在MCP的生态还在早期,很多实现又重又绕,对于简单场景直接用Function Calling反而更省事。你写文件搜索工具觉得差不多,可能是因为场景太简单,没触到MCP真正想解决的多工具共享、动态发现那些痛点。等你要同时接数据库、浏览器、企业内部API,还要让不同Agent复用同一套工具时,差距就出来了。
本质区别在于MCP把工具调用从“临时约定”变成了“标准协议”,但单次调用逻辑确实和Function Calling一个套路。
说白了就是MCP多了服务端和客户端的分工,Function Calling只是你家客厅的插座,MCP是电网标准。
本质区别在MCP把工具调用从“API格式”升级成了“生态标准”,换模型不用重写对接逻辑。
说实话我当初也纠结过这个问题,后来觉得核心区别不在“让LLM选函数”这一步,而在MCP把工具发现、调用、鉴权、上下文传递全给标准化了。Function Calling更像一个接口约定,MCP则是把整个工具生态做成了可插拔的协议,理论上换模型换客户端都能复用同一套工具。你拿文件搜索举例感觉差不多,是因为单看一个tool确实没差,但当你需要对接十几个外部服务时,MCP的规范化和动态发现优势就出来了。另外MCP还支持工具间的数据流转和组合,这点Function Calling就没覆盖到。
本质区别在于标准化和生态,Function Calling是接口,MCP是协议,后者解决的是互联互通问题。
说实话我一开始也有这个疑惑,后来琢磨明白了,MCP更像是个“统一接口标准”,而Function Calling只是单次请求里的一个协议约定。你写文件搜索tool感觉差不多是因为你只在一个客户端里用,MCP真正厉害的地方在于它把工具定义、鉴权、调用链路都标准化了,换个客户端或者换个LLM都能直接复用。我觉得核心区别不在“让模型选函数”这个动作,而在“工具怎么被描述、发现和调度”这件事上,MCP解决的是生态互操作问题。
说实话我一开始也有这个疑惑,后来拿同一个工具分别用Function Calling和MCP调了一遍才慢慢品出点味来。Function Calling本质上是OpenAI自家的一套接口约定,你把JSON Schema塞给模型,它返回一个调用意图,剩下的事情全靠你自己写代码去对接、鉴权、处理错误。但MCP更像是把“工具发现、调用、结果返回”整个生命周期都标准化了,客户端连接上MCP server之后,可以动态拉取工具列表,甚至不用改代码就能接入新的能力。我觉得最核心的区别在于,Function Calling是“模型侧的协议”,而MCP是“工具侧的协议”——前者只管让模型输出结构化指令,后者管的是工具怎么被描述、怎么被安全地执行、结果怎么传回来。另外MCP还支持资源访问和提示词模板,这些在Function Calling里都得自己造轮子。不过说实话,如果你只是写个简单的demo,用哪个差别真不大,但一旦涉及到多个Agent实例、多套工具生态互操作,MCP的标准化优势就出来了。我最近在试着把公司内部的几个API封装成MCP server,感觉前期配置确实麻烦,但后续扩展起来省心很多。
说真的我一开始也有这个困惑,后来理解是MCP把tool的发现、鉴权、调用、错误处理全包了,相当于一个标准化的“工具操作系统”,而Function Calling更像是单纯把函数塞进prompt里让模型选。你那个文件搜索tool如果只是自己写给自己用,确实感觉差不多,但换到多端协作或跨应用场景就看出差别了。另外MCP还能支持流式传输和资源模型,这玩意Function Calling真没有。不过说实话,日常小项目直接调function更省事,MCP那套配置反而显得重。
本质区别就是MCP把工具调用从“一次性的接口约定”升级成了“可发现、可复用、可组合的生态”,Function Calling只是个雏形。
其实我刚开始也有这个困惑,后来折腾多了才慢慢品出点味道。Function Calling 说白了就是个接口约定,你给模型塞一堆 JSON schema,它选一个返回参数,你自己去执行——核心是“让模型做选择题”。但 MCP 更像是一套完整的“工具生态”协议,它不光定义了 tool 的格式,还管了传输层、认证、资源发现这些事,相当于把工具调用做成了像 USB 那样的即插即用标准。你写文件搜索 tool 的时候感觉差不多,是因为你只用了它的 tool 调用那一小块,MCP 真正的价值在于多个 Agent、多个客户端能共享同一套工具仓库,换个环境不用重写对接逻辑。而且 MCP 里还有 resource 和 prompt 的概念,能直接拉数据上下文,Function Calling 通常只能靠你把内容塞进 system prompt,这个差距在复杂 Agent 里就很明显了。不过说实话,现阶段 MCP 的调试体验挺痛苦的,文档又散,你要是只做单机小 demo,用 Function Calling 反而省事。
本质区别在于MCP把工具调用变成了跨应用的标准协议,而Function Calling只是单机内的接口约定。
其实你纠结的点挺准的,MCP更像给工具调用加了个“通用插座”,换环境不用重写。
本质区别在于MCP把工具调用变成了可发现、可复用的标准协议,而Function Calling只是单次请求的临时约定。