Zilmac 博客
← 返回技术实践

MCP vs Function Calling:AI Agent 工具调用有什么区别?JSON Schema、API 与 Tool Calling 全面对比

AI Agent ·约 15 分钟阅读

一个 Agent 接入几个内部函数后,代码很快就能跑起来;但一旦换模型、接入第二个客户端或把工具放到远程服务器,工具定义、权限和错误处理就开始重复。

最快的判断是:MCP vs Function Calling 不属于同一层,通常不应二选一。 Function Calling 让模型表达“要调用哪个工具及参数”,MCP 让应用用标准协议发现和连接工具;单应用少量工具直接使用 Function Calling,多客户端共享工具时再引入 MCP。

这篇内容适合三类读者:单应用开发者,用来避免过度设计;多模型平台团队,用来统一工具事件和 Schema;MCP 改造负责人,用来划定迁移边界并设计组合架构。

先把两者放回正确的架构层

>

Function Calling 的核心流程是:开发者向模型声明函数名称、描述和参数结构,模型返回工具调用意图,应用负责真正执行 API,再把结果交回模型。官方文档明确说明,函数代码并不是由模型直接执行,而是由应用提取名称和参数后完成执行。可参考函数调用的官方流程说明。(ai.google.dev)

因此,Function Calling 主要回答三个问题:

  • 模型是否判断当前任务需要工具;
  • 模型准备调用哪个工具;
  • 模型生成的参数是否符合 JSON Schema。

MCP,也就是 Model Context Protocol,处理的是另一段链路。它定义了 Host、Client 和 Server 之间的连接方式,并通过 JSON-RPC 2.0 传递初始化、能力协商、工具发现和调用消息。MCP Server 可以提供 Tools、Resources 和 Prompts,其中 Tools 才是能够被模型控制、用于执行动作或查询数据的部分。(modelcontextprotocol.io)

可以把两者理解成:

Function Calling 是“模型提出调用请求”;MCP 是“应用找到并连接可用工具”。前者不负责工具部署,后者也不负责替模型做推理决策。

这一区分很重要。把 MCP 当成模型能力,会导致团队误以为“接上 MCP 就自动拥有更强 Agent”;把 Function Calling 当成完整工具平台,则容易忽略连接复用、权限隔离、版本管理和远程可用性。

单应用少量工具:先保持 Function Calling 的简单边界

>

如果项目只有一个 Agent、一个后端应用和少量内部工具,直接使用 Function Calling 通常更合理。典型链路可以是:

  1. 在应用代码中定义工具描述;
  2. 使用 JSON Schema 约束参数;
  3. 将工具声明发送给模型;
  4. 校验模型返回的工具名称和参数;
  5. 调用内部 API;
  6. 把 API 结果作为工具结果返回模型;
  7. 输出最终回答或等待下一轮调用。

这种方案的隐性成本较低,因为工具注册、调用路由、日志和权限都在同一个应用边界内。此时贸然加入 MCP,反而会新增 Server 生命周期、连接初始化、协议版本、远程认证和部署监控等工作。

Function Calling 也并不等于“参数绝对安全”。即使模型返回了符合 Schema 的对象,amount、user_id 或 environment 的业务含义仍然可能不合法。Schema 只能验证形状和部分取值,不能替代数据库权限、租户隔离和业务状态检查。

单应用阶段更值得提前做的是内部接口抽象,而不是马上部署 MCP:

  • 工具调用事件统一为 tool_name、arguments、call_id、trace_id;
  • 工具参数 Schema 单独存档,并保留版本号;
  • API 执行结果区分成功、可重试失败和不可重试失败;
  • 高风险操作增加用户确认字段;
  • 模型供应商格式不要直接渗透到业务代码。

这样未来需要接入 MCP 时,迁移的是连接层,而不是重写整个 Agent。

多模型平台:先做内部适配层,再决定是否接 MCP

>

不同模型平台对工具声明、调用事件、结果回传和并行调用的字段命名并不完全一致。即使它们都支持 Function Calling,实际代码仍可能面对不同的消息结构、工具选择参数和错误返回格式。

此时更稳妥的结构是:

模型适配器
    ↓
统一 Tool Call Event
    ↓
权限与 Schema 校验
    ↓
内部工具路由
    ↓
业务 API

内部统一事件可以类似这样设计:

{
  "call_id": "call_123",
  "tool_name": "create_build",
  "arguments": {
    "project_id": "demo",
    "target": "release"
  },
  "source": "agent",
  "schema_version": "v2"
}

这里的关键不是复制某一家模型的字段,而是建立团队自己的稳定契约。模型侧出现变化时,只改适配器;工具执行、审计和业务授权保持不变。

JSON Schema 适合放在这个内部边界上,因为它可以同时服务于参数校验、类型生成、测试样例和文档生成。不过,不同平台支持的 Schema 子集可能不同,团队不能看到“都支持 JSON Schema”就假设可以无修改复用。某些结构、默认值、联合类型或额外属性规则,仍需按具体 API 版本验证。

官方资料也提醒,结构化输出主要解决格式约束,并不保证字段值本身符合业务事实;拒绝、截断和并行工具调用等情况仍需单独处理。可参考结构化输出与 Schema 限制说明。(openai.com)

多客户端共享工具:MCP 开始产生实际收益

>

当同一组工具需要被多个 Agent、IDE、桌面客户端或内部自动化服务发现时,直接为每个客户端写一套连接代码,维护成本会快速上升。每个客户端都要重新处理工具列表、参数定义、调用路由和错误映射,版本更新也容易出现部分客户端落后。

这正是 Model Context Protocol 更适合介入的场景。MCP Client 可以向 Server 请求工具列表,Server 返回工具名称、描述和输入 Schema;工具集合发生变化时,还可以通过协议提供变化通知。MCP 工具名称建议控制在 1 至 128 个字符,并且在同一 Server 内保持唯一;多个 Server 聚合时,客户端仍需自行处理名称冲突。(modelcontextprotocol.io)

引入 MCP 后,团队得到的不是“更聪明的模型”,而是更清晰的工具供应关系:

  • 工具由 Server 负责发布和生命周期管理;
  • 客户端通过标准协议发现能力;
  • 多个 Agent 可以复用同一个工具服务;
  • 工具描述和输入 Schema 不必在每个客户端重复维护;
  • 权限可以根据调用凭证返回不同的工具集合。

但这套收益只有在“共享”确实存在时才明显。如果工具永远只服务一个应用,MCP 的标准化价值可能小于它带来的部署和排障成本。

按实际团队形态选择三条路线

>

下面的表格不是给 MCP 或 Function Calling 排名,而是根据工具数量、客户端数量和治理需求判断架构触发条件。评分只表示该路线在对应场景中的匹配度,不代表绝对优劣。

架构路线 适合的团队场景 工具与客户端条件 主要新增工作 场景匹配评分
只用 Function Calling 单应用、少量内部工具、快速验证 工具数量较少,客户端单一 函数声明、参数校验、API 执行和权限全部由应用维护 ★★★★★
Function Calling + 内部适配层 多模型、已有多套供应商接口 模型来源多,工具仍由一个平台统一管理 统一调用事件、Schema 版本、错误码和模型适配器 ★★★★★
Function Calling + MCP 多 Agent、多客户端、远程或共享工具 工具需要被多个客户端发现和复用 MCP Client、Server 治理、认证、版本兼容、审计和可用性 ★★★★☆

决策顺序应当是:先判断客户端是否会增加,再判断工具是否需要独立部署,最后才决定是否使用 MCP。不能只因为工具数量变多就引入 MCP,也不能因为当前只有一个客户端,就把未来可能共享的工具接口写成完全不可迁移的私有格式。

远程工具部署:协议解决连接,团队仍要解决运维

>

Function Calling 本身不会提供远程服务认证、网络重试、负载均衡、密钥轮换或审计。它只让模型返回调用意图,真正的网络请求、服务发现和失败恢复仍属于应用与基础设施责任。

远程 MCP Server 还会增加几类容易被低估的问题:

  • 认证边界:要区分客户端身份、用户身份和工具执行身份,不能把一个长期有效的高权限密钥传给所有 Agent;
  • 网络稳定性:连接中断、超时、重复请求和结果迟到都要定义处理方式;
  • 可用性管理:Server 更新、工具列表变化和依赖服务故障需要可观测;
  • 审计要求:至少记录调用者、工具名、参数摘要、授权结果、执行结果和追踪标识;
  • 版本兼容:协议版本、工具 Schema 和业务 API 版本不能同时无约束变化。

如果工具依赖 macOS 环境、桌面应用或特定开发工具,可以把执行端部署到受控的远程 Mac 上,但这属于基础设施选择,不是 MCP 的协议要求。涉及远程 Mac 的网络访问、权限隔离和运维边界时,可先阅读远程 Mac VDI 的连接与管理说明。

第一步:先把工具分成读取与写入两类。查询状态、读取日志和获取构建结果,通常可以先采用较宽松的调用流程;创建资源、删除数据、发布版本和修改权限,则必须进入更严格的授权路径。

第二步:为每个工具建立独立 Schema。除了类型和必填字段,还要明确枚举值、最大长度、环境限制和不可接受的组合参数,并为 Schema 变化保留兼容策略。

第三步:实现直接 Function Calling 最小样例。记录模型输出、参数校验、API 请求、错误回传和最终回答,确认应用能够识别重复调用、空参数和未知工具。

第四步:再实现通过 MCP 暴露同一工具的最小样例。比较的重点不是代码行数,而是工具发现、认证、权限传递、连接失败和错误路径是否更清晰。

第五步:对高风险操作增加三层防线。模型侧限制可选工具,MCP 或执行层限制连接范围,业务 API 再做最终授权;其中任意一层的 Schema 合规,都不能代替用户确认。

第六步:在协议或平台接口升级后重跑两套样例。至少检查初始化、能力协商、工具列表、输入 Schema、结果格式和超时行为,避免“开发环境能调用,生产环境却因为版本差异失败”。

FAQ:迁移边界与组合方式

>

MCP 会不会取代 Function Calling?

不会。Function Calling 负责把自然语言任务转换成工具名称和参数,MCP 负责标准化应用与工具服务之间的连接。即便工具通过 MCP 发布,模型仍可能需要以 Tool Calling 形式选择工具;因此,MCP 更像连接和治理层,而不是 Function Calling 的替代模型能力。

MCP 和 Tool Calling 分别在哪一层?

Tool Calling 位于模型交互层,关注模型输出什么调用意图;MCP 位于工具协议层,关注客户端如何发现 Server、读取工具描述并发送调用请求。两者之间通常还需要应用自己的权限校验、调用路由和结果转换层,不能把协议层和模型层混为一谈。

只有一个 Agent 时需要使用 MCP 吗?

如果只有一个 Agent、一个应用和少量稳定工具,通常不需要。直接维护函数声明和内部 API 会减少连接管理、部署监控及版本协商成本。但如果工具即将被多个客户端复用,提前设计 MCP 兼容的内部接口,可以避免未来迁移时重写业务执行逻辑。

MCP 是否可以直接执行业务 API?

可以通过 MCP Server 封装业务 API,但不能绕过业务系统的最终授权。Server 应完成身份验证、参数校验、幂等控制、超时和审计,业务 API 还应重新确认租户、资源归属和操作权限,特别是删除、发布、付款等不可逆操作。

MCP 与 Function Calling 如何组合?

常见组合是模型使用 Function Calling 生成工具调用,应用把调用事件转换成内部格式,再通过 MCP Client 发现或调用 MCP Server,Server 最终访问业务 API。这样模型供应商变化由适配层吸收,工具复用和远程治理则由 MCP 层承担。

高风险写操作不能只靠协议和 Schema

>

读取操作的失败通常表现为答案不完整或需要重试,写操作则可能造成重复创建、错误发布或权限扩大。因此,写工具最好采用显式的执行状态:

待确认 → 已授权 → 执行中 → 成功 / 失败 / 可重试

工具参数中可以带上幂等键和目标环境,但最终是否允许执行,仍应由服务端根据当前用户、租户、资源状态和审批记录判断。对于删除或发布类操作,界面应展示即将执行的动作、影响范围和目标资源,而不是只显示“工具调用成功”。

MCP 规范本身也强调用户同意、数据隐私和工具安全,并指出协议无法在底层自动强制实现所有安全原则,具体的授权流程仍需由实现方负责。可参考官方安全与工具安全要求。(modelcontextprotocol.io)

另外,MCP Server 不应把所有内部 API 原样暴露。更稳妥的方式是按业务动作重新设计工具边界,例如提供 preview_release 和 confirm_release 两个阶段,而不是让模型直接获得一个包含任意参数的通用发布接口。

最终判断:先选架构边界,再决定是否部署 MCP

>

如果当前方案是单应用直接调用 Function Calling,它的真实缺点通常是:模型供应商切换时需要重复适配,工具定义容易散落在应用代码中,多个客户端接入时会重复开发,远程工具的认证和审计也需要自行补齐。

如果当前方案是把所有工具都直接放在一个远程后端里,则还可能出现权限范围过宽、工具列表难以按客户端隔离,以及桌面或 macOS 依赖无法稳定复用的问题。相比之下,当决策表明确显示项目需要共享 macOS 工具、多个 Agent 复用同一套能力,或长期运行远程 MCP Server 时,使用 Zilmac 提供的可隔离、可回收远程 Mac 环境,会比临时拼接本地机器和公共执行节点更容易控制生命周期。若团队还处于方案评估期,可先查看云 Mac 租用的适用场景,确认短期测试、远程开发和长期重负载是否属于同一种需求。

真正稳妥的路线不是宣布 MCP 或 Function Calling 谁赢,而是按触发条件渐进演进:单应用先用 Function Calling,多模型先加内部适配层,多客户端共享工具时再引入 MCP;等权限、审计和远程运维边界都能验收后,再把需要 macOS 资源的工具部署到受控环境中。

为 AI Agent 快速配备稳定的远程 Mac 环境

使用 Zilmac 云 Mac 或远程 Mac,快速获得适合工具调用、自动化任务与开发测试的独立运行环境。

无需采购和维护实体设备,按需租用 Mac 资源,帮助团队降低 AI Agent 项目的部署与运维成本。 — 立即了解套餐方案

限时优惠

Zilmac

使用 Zilmac 云 Mac 或远程 Mac,快速获得适合工具调用、自动化任务与开发测试的独立运行环境。

返回首页
限时优惠 点击查看套餐