老张开了一家餐厅。创业第一天没有菜单,顾客只能口头描述“来点那个有汤的、你拿手的”,全凭伙计的悟性——这就像早期的“提示词工程”:想让 AI 调用工具,得在提示词里反复描述工具怎么用,AI 还不一定配合。生意做大了,老张印了第一版精装菜单,菜名、价格、忌口写得清清楚楚,顾客照着点菜——这就是 Function Calling 的本质:模型从预定义的固定工具列表里挑选一个,填好参数,后端执行。 再后来,老张加盟了连锁集团。集团没有让他继续印菜单,而是给了他一个统一的服务台标准:平板电脑实时显示后厨有什么食材、哪个档口开着、供应商今天送来了什么,所有门店遵循同一套对接规范——这就是 MCP(Model Context Protocol,模型上下文协议)。看到这里你会发现一个关键问题:餐厅既需要菜单(顾客做选择),也需要服务台(统一调度执行),那 AI 工具调用到底该选谁?答案藏在两者的层级关系里:Function Calling 是大模型原生的工具调用能力,MCP 是更上层的标准协议;FC 做决策,MCP 做执行。这篇文章就用“点餐”这个比喻,把它们的差异、优劣和组合姿势讲透。

岗位关联

对 AI 从业者而言,搞清楚 FC 与 MCP 的分工是 Agent 工程落地的分水岭——既能避免“杀鸡用牛刀”的过度设计,也能防止工具一多就失控的架构灾难。本文帮你建立选型直觉,胜任工具调用层的技术决策。

目录
  1. 可视化演示
  2. 工具调用演进
  3. 核心原理对比
  4. 动态发现能力
  5. 生态兼容性
  6. 安全模型
  7. 组合实践
  8. 选型决策矩阵
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

Function Calling是大模型原生的工具调用能力,MCP是更上层的标准协议,两者什么关系?这篇从调用... 切换模式查看不同维度。

本节配有交互动效(进入视口后自动加载,约 3KB)。

Functi:核心原理 动态展示关键流程与数据流动 交互控件调节参数实时渲染 f(x) = transform(x) 核心概念的可视化呈现

工具调用演进

老张的餐厅一开始没有菜单,顾客只能口头描述“来点那个有汤的、你拿手的”,全凭伙计的悟性和运气——这正是早期“提示词时代”的写照:开发者把工具说明、调用格式、示例输出全部写进 prompt,指望模型“发挥悟性”按格式输出。语义稍一复杂,模型就频繁翻车,输出的 JSON 十个有八个缺字段。老张被折磨得不轻,直到印刷厂送来精装菜单,点菜才从自由发挥变成结构化动作。

菜单的本质是“结构化约束”:顾客从固定列表里选菜、填忌口、下单。对应到技术世界,这就是 Function Calling 诞生的逻辑——开发者在请求里传入工具定义(名称、描述、参数 JSON Schema),模型不再自由发挥,而是输出结构化的函数调用意图:工具名 + 参数对象。后端拿到这个结构体,按名执行。可菜单一旦付印就固定了:新菜要等下一版印刷(代码重新发版),食材下架菜单也不能及时改,这就是“静态定义”的先天痛点。

连锁集团给老张的方案是统一服务台标准。这个服务台就是 MCP(Model Context Protocol,模型上下文协议):它不替代菜单,而是定义了一套“门店—供应商—档口”之间的对接规范。工具提供方按标准接口把自己的能力暴露出来,使用方通过标准流程发现和调用,协议层面统一了传输格式、发现方式、错误处理。至此,从提示词到函数调用再到协议标准化,工具调用的“基础设施”完成了三级跳。

从喊单到菜单再到服务台,本质是“门槛越来越低、标准越来越高”的演进史。工具调用早就不再是“模型能不能输出对格式”的问题,而是“整个系统能不能以标准化方式接入和扩展”的问题。

自然语言指令⏟灵活但不可靠→Function Calling静态工具调用⏟精确但固定→MCP动态标准协议⏟生态化可扩展\underbrace{\text{自然语言指令}}_{\text{灵活但不可靠}} \xrightarrow{\text{Function Calling}} \underbrace{\text{静态工具调用}}_{\text{精确但固定}} \xrightarrow{\text{MCP}} \underbrace{\text{动态标准协议}}_{\text{生态化可扩展}}
  1. 起点状态自然语言指令表达自由,但模型行为不可预期,可靠性差。
    自然语言指令=灵活表达+不可靠执行\text{自然语言指令} = \text{灵活表达} + \text{不可靠执行}
  2. 第一次升级Function Calling 将松散表达转换为精确的结构化工具调用,代价是工具集静态固定。
    自然语言→结构化静态工具调用\text{自然语言} \xrightarrow{\text{结构化}} \text{静态工具调用}
  3. 第二次升级MCP 把静态调用提升为动态标准协议,让工具接入获得生态化扩展能力。
    静态工具调用→协议化动态标准协议\text{静态工具调用} \xrightarrow{\text{协议化}} \text{动态标准协议}

核心原理对比

印刷菜单的最大特点是:一旦付印就改不了了。新菜要等版本更新,供应不上的食材菜单上照样印着,顾客点了只能尴尬地说“不好意思今天没有”。而服务台的平板是实时数据:后厨有什么、哪个档口开着、供应商今天送来什么,一目了然。这两者的差别,就是 Function Calling 与 MCP 在“调用方式”上的核心分野。

Function Calling 是模型服务商在 API 层提供的内置能力:开发者把工具 schema 随请求发给模型,模型经推理后输出“该调哪个工具、传什么参数”。工具集在对话开始时就被“印死”在一次请求里,属于静态预定义。如果中间要增加、修改或下架工具,只能改代码重新发版。它解决的问题是“模型如何结构化地表达调用意图”——这是它的主场。

MCP 则把视角拉高了一层:它不关心模型怎么输出意图,只规范“客户端与服务端之间如何发现和调用工具”。一个 MCP Client 可以连接多个 MCP Server,每个 Server 暴露自己的工具集,Client 在运行时查询、按需调用。工具集不再是封闭的固定集合,而是所有 Server 上报内容的动态并集。架构上,FC 是模型厂商的私有 API 行为,MCP 是开放的应用层协议,二者不在同一层,谈不上取代,只有配合。

菜单付印即固定,服务台实时即所见——“静态定义”与“动态发现”最朴素的差别就在于此。理解了这一层,后面所有维度的对比都有了锚点。

TFC={t1,t2,…,tn}vsTMCP=⋃s∈ServerslistTools(s)T_{FC} = \{t_1, t_2, \dots, t_n\} \quad \text{vs} \quad T_{MCP} = \bigcup_{s \in \text{Servers}} \text{listTools}(s)
  1. 左侧静态集合FC 的工具集是开发者预先定义好的固定 n 个工具,随请求固化。
    TFC={t1,t2,…,tn}T_{FC} = \{t_1, t_2, \dots, t_n\}
  2. 对比符号vs 表示两种范式在思想和架构上的根本差异。
    vs\text{vs}
  3. 右侧动态并集MCP 的工具集是所有接入 Server 上报工具的并集,运行时动态变化。
    TMCP=⋃s∈ServerslistTools(s)T_{MCP} = \bigcup_{s \in \text{Servers}} \text{listTools}(s)

动态发现能力

服务台的平板之所以厉害,在于它“长在”后厨的数据上:厨师长早上备了什么菜,平板就显示什么;下午新增甜品档口,平板立刻多一行。这种“能力即插即用”的体验,就是 MCP 动态发现能力的直观体现。新工具上线,不需要重新印菜单,也不需要通知所有顾客换新版——打开平板就在那里。

MCP 实现动态发现的钥匙是 tools/list 方法。客户端随时可以向服务端发起 tools/list 请求,服务端返回当前支持的全部工具清单(含名称、描述、参数结构)。新增工具时,只需在 Server 端注册新函数,客户端下一次 list 就能看到它,上层 Agent 代码、模型 prompt、工具 schema 全部无需改动。这一机制把“工具接入”从开发时行为变成了运行时行为,极大降低了扩展成本。

更精妙的是版本协商机制。MCP Server 在握手阶段声明自己支持的协议版本,Client 按版本自动适配,避免“工具上线了,但两边格式对不上”的尴尬。配合 MCP 的资源(Resources)与提示(Prompts)能力,一个 Server 不仅能动态提供工具,还能动态暴露上下文资源,形成完整的可发现能力面。这也是 MCP 在复杂 Agent 场景中不可或缺的原因。

菜单改版要花印刷费,服务台改版只需要后厨说一声。动态发现的本质是“解耦”——工具提供方和消费方不再被同一个发布周期捆绑,这正是大型 Agent 系统最渴望的灵活性。

ΔT=Tnow∖Tbefore⇒新工具零改造接入\Delta T = T_{\text{now}} \setminus T_{\text{before}} \quad \Rightarrow \quad \text{新工具零改造接入}
  1. 差集运算ΔT 表示两次工具列表查询之间新增的工具集合——这就是“新发现”的部分。
    ΔT=Tnow∖Tbefore\Delta T = T_{\text{now}} \setminus T_{\text{before}}
  2. 推出符号含义是“动态发现带来了以下结果”。
    ⇒\Rightarrow
  3. 结果表达新增工具无需修改上层任何代码即可投入使用。
    新工具零改造接入\text{新工具零改造接入}

生态兼容性

一个城市的餐厅各有各的菜单,外地游客看不懂;但连锁集团的服务台是统一的:不管进哪家门店,报会员号、点标准套餐、开电子发票,流程完全一样。MCP 想做的就是这种“跨店标准”。当你的 Agent 需要对接数据库、GitHub、浏览器、支付系统等十几个外部服务时,统一的协议远胜于为每个服务手写一套私有对接代码。

Function Calling 由各家模型厂商分别实现:OpenAI 的 function calling、Anthropic 的 tool use、国内通义和文心的 tool calling,接口细节各不相同。这意味着如果直接依赖各家 FC,每接入一个新模型,工具层就要重新适配一遍。MCP 则站在厂商中立的位置:Client 和 Server 都遵循同一协议,一套写好的 MCP Server 可以同时服务多种模型的 Agent——模型厂商可以不同,工具接入层却可以完全复用。

生态上,MCP 已然成为事实标准:OpenAI、Anthropic、Google 等主流厂商以不同形式兼容支持,社区涌现出大量开箱即用的 Server,覆盖数据库、文件系统、开发工具、浏览器自动化等领域。集成成本从“逐个适配私有 API”降至“一行配置连接”。对技术决策者来说,生态兼容性直接决定了团队未来在集成上要烧多少资源。

菜单各自为政还是统一服务台?生态兼容性差的方案,团队越用越累;生态好的方案,行业越用越厚。MCP 的开放性让它不仅在当下省事,更让未来的接入变得可预期。

Cport=α⋅N模型⋅1[私有协议]+β⋅1[MCP]C_{\text{port}} = \alpha \cdot N_{\text{模型}} \cdot \mathbb{1}[\text{私有协议}] + \beta \cdot \mathbb{1}[\text{MCP}]
  1. 私有协议成本每接入一个模型都要单独开发适配器,成本随模型数量线性增长。
    α⋅N模型⋅1[私有协议]\alpha \cdot N_{\text{模型}} \cdot \mathbb{1}[\text{私有协议}]
  2. 标准协议成本MCP 场景下只需一次性对接,边际成本几乎为零。
    β⋅1[MCP]\beta \cdot \mathbb{1}[\text{MCP}]
  3. 系数含义α 是单次适配工作量,β 是 MCP 接入的一次性成本,通常 α ≫ β。
    α≫β\alpha \gg \beta

安全模型

在老张的小餐厅,顾客喊一声“上菜”,后厨就动手做——没有登记、没有审批、没有留痕。这在创业期没问题,但连锁集团不能这么干:供应商要验资质、厨师凭工号上岗、特殊菜品要经理授权。安全模型的核心差异,就在于是“信任所有调用”还是“管控每一次调用”。

Function Calling 的安全依赖上层业务代码自行把关:模型输出了工具调用意图,后端收到后自己判断“这个参数合法吗?这个操作该不该执行?”。协议层不提供任何约束——FC 的职责止于“听懂你点了什么菜”,至于后厨要不要真做这道菜,完全是业务方的事。工具少时这很简单,工具一旦涉及支付、删除、对外发送消息,风险就全压在业务代码的自觉性上。

MCP 把安全做进了协议层:Server 声明工具权限与作用域范围,Client 可以对敏感操作要求用户显式审批(human-in-the-loop),调用全过程生成审计日志,谁在什么时候调了什么工具一目了然。这意味着 MCP 天然适合企业级场景——敏感操作必须经过确认,每次调用留痕可追溯。安全不再是散落在业务代码里的 if-else,而是协议保证的标准化能力。

小餐厅靠信任,大集团靠制度。工具调用能力越强,越需要协议的“门禁”来守门——MCP 把安全从“业务代码的质量问题”提升为“协议层面的标准能力”,这对企业落地 Agent 几乎是刚需。

Paccess=Scope∧Approval∧AuditP_{\text{access}} = \text{Scope} \wedge \text{Approval} \wedge \text{Audit}
  1. 作用域约束工具只能访问声明范围内允许的资源,越界默认拒绝。
    Scope\text{Scope}
  2. 审批环节关键操作必须经过用户(或授权人)显式确认才可执行。
    Approval\text{Approval}
  3. 审计日志全部调用过程记录在案,支持事后追溯与责任认定。
    Audit\text{Audit}

组合实践

聪明的食客不会冲进后厨自己炒菜——他们看菜单做决定,剩下的交给服务台调度。AI 工具调用的最佳实践同样是分层:让模型做它最擅长的决策,让协议做它最擅长的事情。现实中不少团队把 FC 和 MCP 当二选一的竞品,其实它们天生是一对搭档。

组合的分工逻辑非常清晰:Function Calling 负责“决策层”。模型根据用户自然语言,输出结构化的调用意图——“我要调用哪个工具、传什么参数”。这一环利用了 LLM 强大的意图理解与参数抽取能力,是 FC 的绝对主场。MCP 则负责“执行层”:拿到模型输出的工具名和参数后,通过 MCP Client 动态发现工具所在 Server、完成认证与路由、执行调用、返回结果。

实践中一个典型 Agent 的调用链路是:用户输入 → 模型通过 FC 输出结构化意图(工具名 + 参数 JSON)→ MCP Client 根据工具名路由到对应 Server → Server 执行真实函数 → 结果回传模型生成最终回复。这样设计的好处是:既能享受 MCP 的动态接入、统一安全和生态复用,又不放弃 FC 让模型精准决策的能力。决策与执行完全解耦,任何一层升级都不影响另一层。

点菜的是顾客,炒菜的是后厨,服务台负责连接——各司其职,才是一家大餐厅的高效运作。记住这个分工,你就能在架构评审会上从容回答“到底该用 FC 还是 MCP”:不是二选一,而是分两层。

Action=FC_Decide(q)⟶MCP_Execute(tool,args)\text{Action} = \text{FC\_Decide}(q) \longrightarrow \text{MCP\_Execute}(\text{tool}, \text{args})
  1. 决策函数给定用户查询 q,FC 让模型输出结构化的工具选择结果。
    FC_Decide(q)\text{FC\_Decide}(q)
  2. 流转箭头决策结果(工具名+参数)作为标准输入传递给执行层。
    ⟶\longrightarrow
  3. 执行函数MCP 路由到具体 Server 完成工具调用,返回真实结果。
    MCP_Execute(tool,args)\text{MCP\_Execute}(\text{tool}, \text{args})

选型决策矩阵

摆摊的小吃车需要豪华服务台吗?不需要,一张菜单足够了。可要开连锁酒店餐厅,没有统一服务台,早晚乱成一锅粥。选型的本质,是对自身业务规模与复杂度的诚实评估。老张的生意经很简单:多大盘子,配多大的系统。

决策矩阵可以用三把尺子来量。第一把尺子是规模:工具数量少于 5 个、模型单一、团队就两三人——直接用 Function Calling,简单直接,别引入额外基础设施;工具数量几十上百、多个模型并发调用——上 MCP,把工具接入标准化,否则团队会淹没在适配代码里。第二把尺子是复杂度:工具需要频繁动态更新、按需暴露给不同 Agent——MCP 的动态发现是刚需;工具长期固定不变——FC 的轻量反而是优势。第三把尺子是生态:目标系统已有现成的 MCP Server(数据库、GitHub、浏览器等常见中间件)——接 MCP 事半功倍;所有工具都得从零自研——FC 上手更快。

一个稳健的落地节奏是:由 FC 入局,按需上 MCP。MVP 阶段用 FC 快速验证产品和业务逻辑;当工具多到维护成本失控、或者需要接入外部生态时,再引入 MCP 作为统一执行层,把 FC 保留为决策层。这样既不错过 MCP 的生态红利,也避免在验证期过度建设。

先想清楚自己是小吃车还是连锁餐厅,再决定用菜单还是服务台。选型本质上是对业务边界的回答:现在复杂吗?未来会多复杂?答案不同,最优解不同。

Score=w1⋅Sscale+w2⋅Ccomplex+w3⋅Eeco,Score>θ⇒MCP\text{Score} = w_1 \cdot S_{\text{scale}} + w_2 \cdot C_{\text{complex}} + w_3 \cdot E_{\text{eco}}, \quad \text{Score} > \theta \Rightarrow \text{MCP}
  1. 三维度加权规模、复杂度、生态三个维度按各自权重打分,反映团队关注点。
    w1⋅Sscale+w2⋅Ccomplex+w3⋅Eecow_1 \cdot S_{\text{scale}} + w_2 \cdot C_{\text{complex}} + w_3 \cdot E_{\text{eco}}
  2. 阈值判定总分超过阈值 θ 时选择 MCP,否则使用 FC。
    Score>θ⇒MCP\text{Score} > \theta \Rightarrow \text{MCP}
  3. 权重调优不同团队按实际瓶颈调整 w 值——比如强约束合规的团队加大 S 的权重。
    w1,w2,w3 可调w_1, w_2, w_3 \text{ 可调}

AI 应用场景

企业内部 Agent 统一工具接入

阶段:工具调用与执行层

解决的问题:大公司内部有 ERP、CRM、工单、支付等十几个系统,传统做法是为每个系统写一套函数定义和鉴权逻辑,每接一个新 Agent 都要重复适配一遍。用 MCP 将各系统封装成标准 Server,统一权限声明与审计日志;上层模型用 FC 做工具决策,新增系统时只需注册一个 Server,工具接入时间从“人天”级降为“分钟”级。

具体案例:某电商公司用 6 个 MCP Server 封装库存、订单、物流、支付、客服、财务系统,接入两个不同厂商的大模型 Agent。改造前接入一个新系统约 3 人天,改造后注册即用,新 Agent 接入免去重复工具适配。

电商智能客服的决策与执行分离

阶段:意图识别与工具调度

解决的问题:售后机器人需要识别用户意图(查物流、退换货、开发票),再调用对应业务系统。若全部依赖 FC,每增加一个业务动作就要改代码重新发版;若全部依赖 MCP,模型在复杂意图下选择工具容易失准。最佳实践是 FC 判断“用户想做什么”,MCP 路由“对应系统怎么调”,敏感操作(如退款)在 MCP 层走人工审批流。

具体案例:某品牌电商客服机器人日均处理 2 万次咨询。FC 负责从 20 个工具意图中选出正确项,MCP 统一接入订单、物流、售后三大系统,退款操作带用户确认弹窗与全链路审计,客诉率下降 40%。

多模型 Agent 工具网关

阶段:模型适配与工具编排

解决的问题:企业中不同团队使用不同厂商的大模型,各家 Function Calling 接口格式不统一。搭建一层“FC 适配器”把各家模型的工具调用输出翻译为标准意图,后端统一接入一组 MCP Server。模型可以随意切换,工具层完全不动,实现“模型可换、工具统一”。

具体案例:某金融科技公司同时使用 OpenAI 和通义千问构建投研 Agent。通过适配层统一了两家模型的工具调用格式,下游接 MCP Server 获取行情、公告、研报数据,模型切换无需改动工具层代码。

Python 演示

python78 行
"""MCP vs Function Calling 简化模拟演示"""import jsonfrom typing import Callable  def get_weather(city: str) -> str:    return f"{city} 今日晴 22°C"  def calc_price(amount: float, discount: float = 1.0) -> str:    return f"实付 {amount * discount:.2f} 元"  class FunctionCalling:    """固定菜单:工具预先静态注册,模型从中选择"""     def __init__(self):        self.tools = {}     def register(self, name: str, fn: Callable, desc: str) -> None:        self.tools[name] = {"fn": fn, "desc": desc}     def decide(self, intent: str) -> str:        for name in self.tools:            if name.replace("_", "") in intent.replace(" ", ""):                return name        return "get_weather"  class MCPServer:    """服务台:动态发现工具,统一路由执行"""     def __init__(self):        self.servers = {}     def add_server(self, name: str, tools: dict) -> None:        self.servers[name] = tools     def list_tools(self) -> list:        result = []        for server, tools in self.servers.items():            for tname in tools:                result.append({"server": server, "name": tname})        return result     def call(self, name: str, args: dict) -> str:        for tools in self.servers.values():            if name in tools:                return tools[name](**args)        raise KeyError(f"工具 {name} 未发现")  class Agent:    """组合模式:FC 做决策,MCP 做执行"""     def __init__(self, fc: FunctionCalling, mcp: MCPServer):        self.fc = fc        self.mcp = mcp     def run(self, query: str) -> str:        tool = self.fc.decide(query)        args = {"city": "北京"} if "天气" in query else {"amount": 99}        return self.mcp.call(tool, args)  if __name__ == "__main__":    fc = FunctionCalling()    fc.register("get_weather", get_weather, "查询天气")    fc.register("calc_price", calc_price, "计算价格")     mcp = MCPServer()    mcp.add_server("weather_svc", {"get_weather": get_weather})    mcp.add_server("billing_svc", {"calc_price": calc_price})    print("MCP 动态发现工具:", mcp.list_tools())     agent = Agent(fc, mcp)    print(agent.run("今天北京天气"))    print(agent.run("买 3 个苹果 99 元打 8 折"))
目的:用标准库模拟 FC 静态注册与 MCP 动态发现、路由执行的核心机制,并演示“FC 决策 + MCP 执行”的组合模式。
  1. fc.register("get_weather", get_weather, "查询天气")静态注册一个工具到函数调用表,相当于把菜品印上菜单。
  2. def decide(self, intent: str) -> strFC 层的决策函数,基于意图匹配选择工具,模拟模型输出结构化选择。
  3. mcp.add_server("weather_svc", {...})向 MCP 服务台添加一个服务端,相当于连锁集团接入一个新供应商档口。
  4. def list_tools(self) -> listMCP 动态发现的关键操作,运行时返回所有 Server 当前暴露的工具清单。
  5. def call(self, name: str, args: dict) -> strMCP 层的路由执行,根据工具名称找到对应 Server 并执行真实函数。
  6. tool = self.fc.decide(query)组合模式的第一步:FC 做决策,选出“调哪个工具”。
  7. return self.mcp.call(tool, args)组合模式的第二步:MCP 做执行,完成真实调用并返回结果。

常见误区

误区我听说 MCP 是更先进的技术,现在用 Function Calling 是不是过时了?赶紧把所有方案换成 MCP 吧。

正解二者根本不在一个层级。FC 是模型 API 层的结构化输出能力,MCP 是工具接入的应用层协议。前者解决“模型怎么表达调用意图”,后者解决“工具怎么被发现和调用”。就像菜单不会取代服务台一样,FC 负责决策、MCP 负责执行,它们是配合关系,不是替代关系。

为何常见:对比类文章常把它们放在一起 PK,读者没有注意层级差异,误以为是“新版本替代旧版本”。

误区MCP 是函数调用的进阶版,函数调用的功能它全都有,直接升级就行。

正解MCP 是协议规范,FC 是模型能力,解决的问题维度不同。MCP 不决定模型如何输出意图,只规定服务器与客户端之间如何发现和调用工具。FC 可以由模型厂商各自实现,MCP 则是跨厂商的统一标准。两者不是“新旧版本”关系。

为何常见:名字都带“调用”,层级被混淆,容易被“升级版”的说法带偏。

误区用了 MCP 以后,AI 就自动拥有所有工具了,我不用再写任何函数。

正解MCP 只负责动态“发现”和标准化“路由”,工具背后的真实代码仍然需要你开发。MCP Server 的本质是在你已有的函数外面包一层标准协议接口,让客户端能查到它、调它。动态发现不等于凭空生成。

为何常见:“动态发现”听起来太智能,被误解为“自动创造工具”,忽略了背后的实现成本。

误区Function Calling 是 OpenAI 独有的功能,其他模型都用不了。

正解OpenAI 是 Function Calling 最早的普及者之一,但现在主流大模型厂商都提供了类似能力:Anthropic 的 tool use、Google 的 function calling、国内通义和文心的 tool calling,只是接口细节和参数格式存在差异。FC 是行业共性的模型能力,不是某家独有。

为何常见:OpenAI 先发优势太强,形成了“提起 Function Calling 就想到 OpenAI”的刻板印象。

误区MCP 多了一层网络通信和协议解析,延迟肯定很高,不如直接函数调用快。

正解性能差距要分部署方式看。MCP Server 可以本地进程运行(stdio 传输),也可以远程部署(HTTP)。即便远程调用,额外延迟通常在毫秒级,而大模型自身的推理响应是秒级,多出的耗时可忽略。真正影响响应速度的往往是工具设计本身和网络环境,而不是 MCP 协议这一层。

为何常见:“多一层 = 慢很多”是直觉判断,忽略了 LLM 场景下毫秒与秒的数量级差异。

面试题

Q1. MCP 协议的"MCP"全称是什么?

单选题 · easy

  • A.Model Context Protocol← 正确答案
  • B.Model Calling Protocol
  • C.Multi-Chat Platform
  • D.Machine Control Protocol

答案:A。MCP 全称是 Model Context Protocol(模型上下文协议)。B 的 Calling 是函数调用方向的错误联想,C、D 是干扰项。记住"Context"二字,它强调为模型提供上下文和工具访问的标准化通道。

Q2. Function Calling 的核心作用是什么?

单选题 · easy

  • A.让模型以结构化形式调用外部工具← 正确答案
  • B.让模型批量生成训练数据样本
  • C.替代所有网络请求代理网关
  • D.让模型自动提升基础算力配置

答案:A。Function Calling 让模型输出结构化的“工具名 + 参数 JSON”,从而可靠地调用外部函数。B、D 与工具调用无关,C 夸大了它的职责——FC 不替代网关,只管意图的结构化表达。就像菜单只负责让顾客规范点菜,不管后厨怎么做菜。

Q3. 关于 Function Calling 的“静态定义”,下列说法正确的是?

单选题 · mid

  • A.工具由开发者在会话前静态声明传入← 正确答案
  • B.工具由开发者在会话中动态注册发现
  • C.工具由模型自主编写并调用函数代码
  • D.工具由第三方服务器实时下发注册

答案:A。FC 的工具 schema 由开发者在请求时预先传入,模型只能在给定集合里选,这就是“静态定义”。B、D 描述的是 MCP 的动态发现机制,C 把模型的能力幻想成了自主生成代码,都不正确。

Q4. MCP 动态发现工具主要使用哪个方法?

单选题 · mid

  • A.tools/list← 正确答案
  • B.tools/create
  • C.model/infer
  • D.server/connect

答案:A。MCP 客户端通过 tools/list 向服务端请求当前可用的工具清单,实现运行时动态发现。B 是“创建工具”的错误联想,MCP 的工具由服务端实现而非动态创建;C、D 是干扰项。tools/list 就像服务员拿平板刷新当天菜单。

Q5. 在“FC 决策 + MCP 执行”的组合模式下,下列分工正确的有?

多选题 · mid

  • A.FC 负责解析用户意图并选择工具← 正确答案
  • B.MCP 负责统一路由并执行工具调用← 正确答案
  • C.FC 负责直接访问数据库执行查询
  • D.MCP 负责替代模型做语义理解决策

答案:AB。组合模式的核心是决策与执行分离:FC 利用模型能力做意图理解和工具选择(A 对),MCP 负责将选中的工具路由到对应 Server 执行(B 对)。C 把执行职责误给了 FC,D 把决策职责误给了 MCP,顺序反了。

Q6. MCP 在生态兼容性上的核心优势是什么?

单选题 · hard

  • A.开放协议支持跨模型跨语言互通← 正确答案
  • B.仅支持 OpenAI 单家模型接入
  • C.依赖厂商私有 SDK 才能使用
  • D.只能连接外部网络 API 接口

答案:A。MCP 是开放的应用层协议,客户端与服务端可跨厂商、跨语言复用,一套 MCP Server 能服务多种模型的 Agent。B、C 描述的是封闭生态,D 中的“只能连接外部 API”是无依据的限制。连锁集团的服务台对任何门店开放,MCP 对任何模型开放。

Q7. 相比 Function Calling,MCP 在安全模型上的增强包括哪些?

多选题 · mid

  • A.工具权限声明与作用域约束← 正确答案
  • B.敏感操作的用户审批机制← 正确答案
  • C.取消所有中间权限校验环节
  • D.自动绕过安全策略执行操作

答案:AB。MCP 将安全做进协议层:Server 声明权限作用域(A 对),敏感操作可要求用户显式审批(B 对)。C、D 描述的是削弱安全的行为,与 MCP 设计方向完全相反。服务台要验资质、要登记、要审批,而不是放行一切。

Q8. 在“FC 决策、MCP 执行”模式中,“决策”具体指什么?

单选题 · easy

  • A.模型输出结构化的工具名与参数← 正确答案
  • B.模型直接执行后端函数逻辑
  • C.模型自动安装部署新服务
  • D.模型编写完整业务流程代码

答案:A。FC 决策的产物是结构化调用意图——工具名 + 参数字典,后续执行交给 MCP。B 说的是执行而非决策,C、D 超出了 FC 能力范围。顾客的任务是报出菜名和忌口,而不是进后厨炒菜。

Q9. 某团队只有 3 个固定工具、单一大模型、无第三方生态接入需求,合理的选型建议是?

单选题 · hard

  • A.直接用 Function Calling 保持轻量← 正确答案
  • B.必须搭建多套 MCP Server 才能运行
  • C.不适用任何工具调用方式
  • D.需要自研全新协议替代两者

答案:A。规模小、工具固定、生态需求低时,FC 是最优解——无需引入额外基础设施和运维成本。B 把 MCP 当成了必需品,C、D 否定了现成方案。小吃车一张菜单就够用,不必上豪华服务台。

Q10. 大规模企业级场景选择 MCP 的典型原因有哪些?

多选题 · hard

  • A.统一工具接入标准降低集成成本← 正确答案
  • B.动态发现新工具无需重新发版← 正确答案
  • C.权限声明与审计满足合规要求← 正确答案
  • D.取消权限控制加速工具上线速度

答案:ABC。企业级场景选择 MCP 是因为它统一标准(A)、动态扩展免发版(B)、协议层安全合规(C)。D 主张取消权限控制,这与企业级需求完全相反——安全合规恰恰是选择 MCP 的关键动机。