最近在折腾 AI Agent,看到 MCP 协议挺火的,但看文档越看越迷糊。我知道 MCP 定义了一堆 tool,然后客户端可以用这些 tool 去调用外部能力。可这跟 OpenAI 早先的 Function Calling 不是一回事吗?不都是把函数描述发给 LLM,让它决定调哪个?我试着用 MCP 写了个文件搜索的 tool,感觉底层逻辑差不多啊……难道 MCP 只是把函数调用包装成了一个标准协议?还是有我不知道的特殊设计?求大佬们指点一下,别让我继续在坑里瞎转了。
MCP 的 tool 定义和 Function Calling 到底有啥本质区别?
全部回复
共 177 条其实本质区别就在MCP是标准协议,Function Calling只是单家API的接口规范,就像USB-C和苹果线的关系。
最大的区别是MCP把工具调用变成了标准协议,换模型换框架不用重写,Function Calling还得绑死一家。
你试试让MCP同时接多个不同家的模型跑一遍,就明白协议层和API层的差距了。
其实你感觉没错,底层逻辑确实都是“把函数描述给模型选”,但MCP更像是在Function Calling外面套了一层“设备驱动”的壳。它管的不光是单个函数的入参出参,还定义了怎么发现服务、怎么鉴权、怎么处理流式结果。你写单个tool感觉差不多,但当你同时接多个外部系统,或者要换不同的LLM供应商时,MCP的标准化优势才明显。
我自己试过把几个内部API用MCP封装,再配个支持它的客户端,确实省去了很多写胶水代码的功夫。不过说实话,要是项目就一两个简单工具,直接Function Calling反而更轻快,MCP的协议开销和调试成本也不低。
本质区别就是MCP把工具调用从“跟OpenAI绑定”变成了“跟任何LLM都能用”,你换模型不用重写一遍接口。
说白了Function Calling是单个模型的能力,MCP是让所有模型共享同一套工具生态的协议。
说实话我当初也纠结过这个问题,后来觉得核心区别在于MCP把tool的定义、传输和认证都标准化了,而Function Calling更像是OpenAI自家生态里的一个接口约定。你换个模型或者换个框架,Function Calling的格式可能就得重写,但MCP至少给了个通用层。另外MCP还支持资源访问和提示词模板这些,不只是tool调用,算是个更完整的协议栈吧。
本质区别在于MCP是协议,function calling是接口,前者管生态互通,后者管单次调用。
说白了Function Calling是单个模型的接口,MCP是跨模型跨应用的通用插座,前者是零件后者是标准。
本质上一个是功能,一个是生态,你拿文件系统举例,FC得写死在代码里,MCP换个客户端照样跑。
说实话我一开始也有这个困惑,后来折腾了一阵子才稍微理清楚点。你感觉底层逻辑像,是因为两者确实都在做“把工具描述给模型选”这件事,但MCP更像是在这个逻辑外面套了一层传输和发现的规范。Function Calling本质上是模型API的一个参数,跟具体的服务商绑定,你换家模型就得重新适配;而MCP把工具定义、调用、结果返回都标准化了,相当于给工具建了个通用USB接口,谁都能插。我试过把同一个MCP server接到Claude和本地跑的开源模型上,几乎不用改代码,这点Function Calling就做不到。另外MCP还带资源访问和提示词模板这些额外能力,不只是工具调用,不过说实话现在生态还在早期,很多实现确实有点为了协议而协议的感觉。我自己的体验是,如果只是单应用里调几个函数,直接用Function Calling反而更省事,MCP的优势要等你有多个Agent或者需要跨平台共享工具时才明显。不知道你用的什么客户端,有些框架对MCP的支持还不完善,容易踩坑。
其实你感觉没错,底层本质都是把工具描述给模型然后让它选,但MCP更像是给这些工具加了个“统一插头”。Function Calling只是调用格式,MCP还管了工具怎么发现、权限怎么控制、甚至跨进程连接,相当于把单机调用变成了可互操作的服务。我之前也以为只是包装,后来发现主要区别在于MCP的tool是动态发现的,服务端能实时增删,而Function Calling基本是写死的。不过说实话,如果只是自己写个简单Agent,直接用Function Calling反而更轻便。你那个文件搜索tool,如果只在本机跑,确实感觉不出MCP的优势。
本质上就是多了个标准化的“插座”,你不用再给每家模型单独定制插头了。
本质区别就是FC是单机调用,MCP是标准化了服务器和鉴权,生态互通才是重点。
你拿文件搜索举例当然觉得差不多,换到跨系统数据源试试就明白了。
说实话我一开始也有这个困惑,后来自己撸了个小项目才慢慢品出点味道。Function Calling 本质上是 LLM 输出 JSON 的约定,它只解决“模型怎么决定调哪个函数”这一步,剩下的路由、执行、结果回传全得你自己写。MCP 更像是把“工具提供方”和“工具消费方”拆开了,客户端不用知道工具是本地 Python 还是远程 API,只要按 MCP 协议去发现和调用就行,相当于给工具套了个统一接口层。还有个关键点是 MCP 支持动态发现工具,你可以在运行时让客户端去问服务端“你现在有哪些能力”,而 Function Calling 的工具列表是写死在请求里的,每次改都得改代码重新部署。不过我觉得也别把 MCP 想得太玄乎,它确实不是新概念,更像是一种标准化尝试,就像 HTTP 之于 TCP,底层还是那套函数调用逻辑。但如果你要接多个 Agent 或多个工具源,MCP 的收益就很明显了,不然维护一堆自定义的 JSON schema 能烦死你。我目前就把它当个中间层用,感觉比裸写 Function Calling 省心不少,但要说本质区别,可能更多是工程组织方式的区别,而不是推理机制的区别。
简单说,FC是单个模型的临时调用,MCP是标准化的生态连接,长期看后者更像基础设施。
本质区别在于MCP把工具调用标准化成协议,而Function Calling只是单次接口交互,生态和复用性完全不是一个量级。
说实话一开始我也有这个困惑,后来琢磨了下,Function Calling更像是个接口规范,而MCP是把这个规范升级成了完整的协议,还顺带定义了传输、认证和资源发现这些周边。你那个文件搜索的tool,单看调用逻辑确实跟函数调用没差,但MCP的价值在于让整套工具能跨平台、跨客户端复用,而Function Calling基本绑死在OpenAI那套生态里。不过我也觉得MCP现在有点过度设计,小项目直接上反而更麻烦。
MCP更像是把工具调用变成了跨应用的“USB接口”,而Function Calling只是本地的一次握手。
说实话我一开始也这么觉得,但后来发现MCP更像是把“工具发现、调用、认证、结果返回”这些全链路标准化了,而Function Calling只是LLM侧选函数的那个瞬间。你写单个tool可能感觉差不多,但当你需要对接几十个不同的外部系统时,MCP那种统一接口和动态发现机制的优势才真正体现出来。而且MCP还能做资源访问和提示词模板,不止是tool,这点是Function Calling完全没覆盖的。不知道你试过跨服务复用同一个MCP server没,那才是它设计上更重的地方。
MCP本质是标准化工具发现和调用的协议,而Function Calling只是单次请求的接口约定,前者解决生态互通问题。
刚上手时确实容易混淆,但MCP的定位是让不同Agent能复用同一套工具,而FC更像框架内的私有约定。
本质上确实都是“让模型选函数”,但MCP把这件事从“一家公司的API”变成了“一个通用插座”。你写单个tool时感觉一样,可一旦要接10个服务、换3个模型,Function Calling得每个重写适配,MCP则是写一次到处插。另外MCP还管了认证、发现、上下文这些边角料,算是把周边坑都填了。我最近在搞多Agent协作,这块感受特别深,光省下的胶水代码就不止一半。
说实话我一开始也有这困惑,后来琢磨着MCP更像是个“万能插座”,Function Calling只是其中一种插头规格。你换个模型或者换个框架,Function Calling的格式可能就变了,但MCP的tool定义能复用。另外MCP还带了资源、提示词这些周边能力,不是单纯管函数调用的。
不过我也觉得现阶段MCP有点过度包装,小项目直接写Function Calling反而更利索,等真需要跨平台跨模型协作时再上MCP不迟。