Skip to content

高频面试题

Agent 系统中的 Function Calling 和 MCP 有什么区别?各自的优缺点是什么?

这是工具调用体系的高频分层题。面试官想确认你知道 Function Calling 解决“模型怎么提出工具调用”,MCP 解决“工具怎么被 Agent 标准化接入”。

适合阶段:Agent 工具链 / MCP / 生产集成面核心能力:协议分层 · Tool Schema · 工具生态 · 安全治理

面试官角度分析,想考什么

  • Function Calling 和 MCP 是替代关系吗?
    考分层:前者是模型如何表达调用意图,后者是工具如何标准化接入。

  • 一次调用从模型到外部系统怎么走?
    考链路:模型输出 tool call,Host 或应用层执行,或经 MCP Client 调 Server,结果再回灌。

  • 什么时候引入 MCP?安全边界在哪?
    考取舍:工具要跨 Agent 复用再上 MCP;权限、确认和审计仍在 Host 和应用层。

可直接抄走的 30 秒参考答案

text
Function Calling 和 MCP 不在同一层。Function Calling 是模型 API 层能力,解决模型怎么用结构化 JSON 表达“我要调哪个工具、参数是什么”;MCP 是 Agent 或 Host 到工具进程的标准协议,解决外部工具、资源和 prompt 怎么被不同 Agent 复用。小型应用里几个自有函数直接用 Function Calling 就够了;如果工具要跨应用、跨团队、跨 Agent 复用,或者需要动态发现和独立部署,就适合引入 MCP。生产上两者通常组合:模型用 Function Calling 决策,Host 通过 MCP 执行工具调用。

面试回答详解,知其所以然

这道题最重要的是不要把它们放在同一层比较。Function Calling 是模型能力,MCP 是工具接入协议。它们经常一起出现,但解决的问题不同。

1. Function Calling 是模型 API 层能力

Function Calling 的基本流程是:

text
应用声明 tools schema -> LLM 返回 tool_calls -> 应用执行函数 -> 工具结果回传 LLM

它关注的是模型如何稳定输出结构化调用请求。你把函数名、描述和 JSON Schema 给模型,模型判断需要调用工具时,返回工具名和参数。真正执行函数的是应用代码。

优点:

  • 简单直接:一个应用、几个自有函数,很快就能接起来。
  • 模型原生支持:主流模型 API 对工具调用、结构化参数和并行 tool calls 支持越来越成熟。
  • 低运维成本:不需要额外起 MCP Server 或处理长连接协议。
  • 适合强业务内聚:工具只服务当前应用,不需要复用给其他 Agent。

缺点:

  • 复用性差:每个应用都要重新声明工具、写适配层、处理鉴权和错误格式。
  • 跨厂商差异:不同模型厂商的 tools 格式、tool_choice、返回结构不完全一样。
  • 发现能力弱:工具通常由应用静态传入,动态发现、订阅和版本管理要自己做。
  • 工具生态难扩展:第三方工具无法“一次实现,到处可用”。

2. MCP 是 Agent 到工具进程的标准协议

MCP 的基本链路是:

text
Host/Agent -> MCP Client -> MCP Server -> 外部工具 / 数据源

MCP Server 暴露 tools、resources、prompts。Host 连接 Server 后,可以通过 tools/list 发现工具,通过 tools/call 调用工具,通过 resources/read 读取资源。Host 再把这些工具转译成模型 API 能理解的 Function Calling / Tool Calling schema。

优点:

  • 标准化接入:一个 MCP Server 可以被多个支持 MCP 的 Host 或 Agent 使用。
  • 动态能力发现:Server 可以暴露工具列表、资源列表和 prompt 模板。
  • 工具与应用解耦:工具方独立发布,Host 方统一连接,不必 N 个应用乘 M 个工具重复适配。
  • 更适合生态:数据库、GitHub、浏览器、文件系统、内部平台都可以包装成 MCP Server。
  • 资源和 prompt 不是硬塞成函数:MCP 把可读资源、可执行工具和可复用 prompt 分开建模。

缺点:

  • 架构复杂度更高:要运行 server、处理 transport、初始化握手、鉴权、超时和错误。
  • 安全面更大:MCP Server 可能是供应链风险入口,尤其是本地文件、shell、浏览器和数据库工具。
  • 调试链路更长:失败可能发生在模型选择、Host 转译、MCP Client、Server、外部 API 任一层。
  • 不是所有模型都直接理解 MCP:模型通常仍然通过 Function Calling 表达调用意图,MCP 在 Host 执行层。

3. 两者如何组合工作

最常见的组合链路是:

text
① Host 连接 MCP Server,拉取 tools/list
② Host 把 MCP tool schema 转成模型 API 的 tools
③ 模型通过 Function Calling 返回 tool_call
④ Host 根据 tool 名找到对应 MCP Server
⑤ MCP Client 发送 tools/call
⑥ MCP Server 执行并返回结果
⑦ Host 把结果作为 tool result 回传给模型

所以 Function Calling 和 MCP 不是“谁替代谁”,而是上下游:

  • Function Calling 让模型能说:“我要调用 search_docs,参数是这些。”
  • MCP 让 Host 能说:“search_docs 来自这个 MCP Server,我用标准协议去调用它。”

4. 什么时候选哪个

直接用 Function Calling:

  • 工具数量少,且只服务当前应用。
  • 工具就是你代码里的几个函数或内部 API wrapper。
  • 你需要最低延迟、最低运维复杂度。
  • 团队还在原型阶段,协议标准化收益不明显。

引入 MCP:

  • 同一批工具要给多个 Agent、IDE、桌面应用或团队复用。
  • 工具来自第三方生态,或者你希望对外发布工具能力。
  • 需要动态发现 tools/resources/prompts。
  • 工具需要独立进程隔离、独立部署、独立版本管理。
  • 企业内部有统一工具网关,希望模型应用只接标准协议。

组合使用:

  • 多数生产 Agent 会组合使用:模型侧仍用 Function Calling,工具生态和外部系统接入走 MCP。

5. 安全取舍

Function Calling 的安全重点在应用执行层:

  • 校验模型返回的参数。
  • 做用户级 ACL 和业务规则检查。
  • 高风险函数人工确认。
  • 函数执行超时、重试、幂等和审计。

MCP 的安全重点除了执行层,还多了供应链和进程边界:

  • 审核 MCP Server 来源和版本。
  • 限制 Server 可访问的文件、网络、环境变量和凭据。
  • 为每个 Server 配最小 scope token。
  • 记录 tools/list、tools/call、参数和结果摘要。
  • 防止工具描述或返回内容携带 prompt injection。

面试官追问3个问题

追问一:模型能直接调用 MCP Server 吗?

  • 考察点:是否理解执行主体。
  • 回答方向:通常不能。模型返回的是工具调用意图,Host/Agent Runtime 负责把它路由到 MCP Client,再由 MCP Client 调 MCP Server。模型本身不直接连 Server。

追问二:MCP tools 和 OpenAI tools schema 能完全一一映射吗?

  • 考察点:协议差异意识。
  • 回答方向:常见工具名、描述、参数 schema 可以映射,但 MCP 还有 resources、prompts、capabilities、transport、连接状态等概念,不是简单 JSON Schema 等价。Host 需要做适配。

追问三:什么时候不该引入 MCP?

  • 考察点:是否会控制复杂度。
  • 回答方向:工具很少、只服务单个应用、生命周期跟应用强绑定、延迟敏感、团队没有运维 MCP Server 的需求时,直接 Function Calling 更合适。

扩展知识

一个完整工具调用链路

text
MCP tools/list
  -> Host 转成 LLM tools schema
  -> LLM 返回 Function Calling tool_call
  -> Host 路由到 MCP Client
  -> MCP tools/call
  -> 外部系统执行
  -> tool result 回到 LLM

这个流程能帮你在面试里避免一句“模型调 MCP”说糊。严格说,是 Host/Agent Runtime 把模型的 tool call 转成 MCP 调用。

Resource 不应该都做成 Function

MCP 把 Resource 单独建模很重要。文件、数据库 schema、文档片段这类“可读上下文”不一定要让模型主动调用函数读取。很多时候由用户或 Host 选择资源放进上下文更安全、更可控。

MCP 不会消灭自定义函数

项目内部的小工具、强业务逻辑、强事务操作,仍然适合直接写在应用层。MCP 更适合边界清晰、可复用、可独立部署的能力。不要为了标准化把所有内部函数都包装成 MCP Server。

基于 MIT 协议开源