15. Function Calling、Skill、MCP 这三个有什么区别?
15. Function Calling、Skill、MCP 这三个有什么区别?
👔面试官:Function Calling、Skill、MCP 这三个概念有什么区别?
🙋♂️我:这三个都是让模型调用外部工具的方式吧?Function Calling 是 OpenAI 的方案,MCP 是 Anthropic 的方案,Skill 是 Google A2A 的方案,它们是三家公司各自搞的竞争方案。
👔面试官:竞争方案?那你觉得一个系统里只需要选其中一个用就行了?这三个是可以互相替代的?
🙋♂️我:也不完全是替代关系……它们应该各有侧重?比如 Function Calling 管函数调用,MCP 管工具标准化,Skill 管能力声明?但我不太确定它们之间有没有层级关系。
👔面试官:你前半段说的方向沾边了,但关键问题是你没搞清楚这三者的层级依赖。它们不是并列的三个方案,而是从底到顶的三层架构:Function Calling 是最底层的调用协议,MCP 在它之上做工具管理,Skill 在最上层做任务路由。你把「谁和谁通信」「发生在哪两个角色之间」这些搞清楚,三者的区别就一目了然了。
好,这段对话踩的雷挺典型的,很多人一上来就把这三个当成平行的竞争方案。下面我把三者的层级关系和各自定位拆开讲清楚。
💡 简要回答
我理解这三个概念在不同层次工作,不是竞争关系。Function Calling 是最底层的「调用协议」,管的是模型和单个函数之间怎么通信;MCP 在 Function Calling 之上加了一层工具管理,管的是工具怎么标准化打包、注册和被 AI 客户端发现;Skill 是 A2A 里 Agent 的能力声明,管的是多 Agent 系统里任务怎么路由。简单记就是:Function Calling 解决「模型怎么调函数」,MCP 解决「工具怎么暴露给模型」,Skill 解决「哪个 Agent 接哪类任务」。三层各司其职,在复杂的 AI 系统里这三个往往都要用到。
📝 详细解析
为什么会有三个概念,每个都是为了解决不同粒度的问题
这三个概念放在一起确实很容易让人迷惑,但其实它们各自解决的是完全不同粒度的问题,是三层架构,不是三个竞争方案。怎么理解呢?咱们先建立一个直觉感受:Function Calling 是「模型说:我要调这个函数」,MCP 是「工具主动说:我能提供这些函数」,Skill 是「Agent 说:我擅长做这类任务」。你看,三句话的主语不一样,说话对象不一样,粒度也不一样,这就是三者的本质差异。
再从时间线来看就更清楚了。Function Calling 是最先出现的,当时的核心问题是「模型只会生成文本,怎么让它能触发外部调用」,所以 Function Calling 解决的是最基础的调用协议问题。后来 Function Calling 普及了,大家发现一个新的痛点:每个应用都要自己写代码对接各种工具,数据库一套、文件系统一套、API 又一套,重复劳动太多了。MCP 就是在这个背景下出现的,它把工具的接入标准化了,一次实现到处复用。再后来,多 Agent 系统兴起,又冒出了新问题:好几个 Agent 各有所长,用户的任务该交给谁?Skill 就是为了解决这个协作和路由的问题才诞生的。三者的出现背景不同,自然解决的是不同层次的东西。
从「谁和谁通信」来看三者位置
理解三者最清晰的切入点是:每个机制发生在哪两个角色之间。

Function Calling 发生在模型和函数之间,是单次调用的格式规范。模型生成 tool_calls JSON 告诉宿主程序「调这个函数、参数是这个」,宿主程序执行完把结果以 tool 消息形式喂回去。这一切发生在单个 Agent 内部,是最底层的「调用语言」,整个系统靠这个让模型触发实际动作。
理解了 Function Calling 是最底层的通信语言,往上一层就是 MCP。它发生在 **AI 客户端(MCP Client)和工具服务(MCP Server)**之间,是工具的标准化封装协议。Client 连上 Server 后自动发现工具列表,把工具定义转换成 Function Calling 格式喂给模型。所以 MCP 本质上是对 Function Calling 的封装和管理,它让工具从「应用内的代码片段」变成「独立的标准化服务」,一次实现到处复用。这也发生在单个 Agent 内部,只是比 Function Calling 高一层:Function Calling 是调用的语言,MCP 是工具的管理框架。
再往上一层就到了 Skill,它发生在调度 Agent 和专业 Agent 之间,是多 Agent 系统里任务路由的依据。到了这一层,视角已经从「单个 Agent 内部怎么调工具」变成了「多个 Agent 之间怎么分工协作」。调度 Agent 拿到用户任务,查各专业 Agent 在 Agent Card 里声明的 Skill 列表,找到最匹配的 Agent,通过 A2A 协议把任务委托过去。Skill 的粒度比函数粗得多,「竞品分析」是一个 Skill,而不是「搜索网页」「整理数据」这样的原子函数。
三者的层级依赖关系
搞清楚了三者各自的位置,接下来一个很自然的问题是:它们之间有没有上下级关系?答案是有的,而且层级非常明确。

为什么 Function Calling 在最底层?因为它是模型触发工具调用的「语言」,没有这套语言,模型就没办法告诉外部「我要调哪个函数、传什么参数」,一切上层能力都无从谈起。MCP 为什么在它之上?因为 MCP 做的是工具管理和标准化封装,但归根到底,MCP Server 暴露的工具最终还是要通过 Function Calling 的格式传给模型、让模型来触发,所以 MCP 天然依赖 Function Calling。那 Skill 为什么在最上面?因为 Skill 是多 Agent 协作层面的概念,调度 Agent 根据 Skill 把任务委托给专业 Agent 之后,专业 Agent 内部要真正干活,还是得靠 MCP 发现工具、靠 Function Calling 触发调用。
所以完整的链条是:Skill(任务路由)-> Agent(接受委托)-> MCP(工具发现)-> Function Calling(模型触发调用),从上到下四层,每一层都建立在下一层的基础之上,各司其职。
用一个完整故事串联三者
把三者放在同一个场景里感受一下各层分工。用户对调度 Agent 说「帮我分析最近三个月的销售数据,找出下滑的产品线,给改进建议」。
首先是 Skill 层在起作用:调度 Agent 拆解任务,发现需要「数据分析」和「商业建议」两类能力。它去查已注册 Agent 的 Skill 列表,匹配到数据分析 Agent(声明了「数据分析」Skill)和策略 Agent(声明了「商业建议」Skill),通过 A2A 协议分别发起 Task,把任务委托出去。调度 Agent 不需要知道这两个 Agent 内部怎么工作,只管任务路由。

然后是 MCP 层在起作用:数据分析 Agent 收到任务开始执行,它的 MCP Client 已经连上了数据库 MCP Server 和 Python 执行器 MCP Server,自动知道这两个工具可用,不需要任何手动配置。这是 MCP 的价值所在,工具的接入对 Agent 完全透明,随时插拔。

最底层是 Function Calling 在起作用:数据分析 Agent 里的 LLM 判断需要查数据库,输出 tool_calls: query_database(sql="SELECT ..."),MCP Client 把这个请求路由到数据库 Server 执行,拿到结果继续处理,完成分析后把结果通过 A2A Task 的 artifacts 返回给调度 Agent。

整个流程里 Skill 做路由、MCP 做工具管理、Function Calling 做模型和工具的通信,三层分工明确,缺哪层都不完整。

🎯 面试总结
回到开头对话踩的雷,最大的误区就是把 Function Calling、MCP、Skill 当成三个平行的竞争方案。面试回答这道题,第一个必须说清楚的是三者的层级关系:Function Calling 是最底层的调用协议,解决的是「模型怎么触发函数调用」;MCP 在 Function Calling 之上,解决的是「工具怎么标准化封装和发现」;Skill 在最上层,解决的是「多 Agent 系统里任务怎么路由」。三层从下到上,各司其职。
第二个关键点是「谁和谁通信」。Function Calling 发生在模型和函数之间,MCP 发生在 AI 客户端和工具服务之间,Skill 发生在调度 Agent 和专业 Agent 之间。把通信双方说清楚,三者的边界就一目了然了。
面试时如果能用一个完整场景把三层串起来就更好了:调度 Agent 根据 Skill 把任务路由给专业 Agent,专业 Agent 通过 MCP 发现可用工具,模型通过 Function Calling 触发具体的工具调用。这样面试官能看出你不只是背了概念,而是真正理解了三者在系统里怎么协作的。
对了,AI 工具调用的面试题会在「公众号@小林面试笔记题」持续更新,林友们赶紧关注起来,别错过最新干货哦!

