AI 开发

MCP Tool Schema vs Function Calling:2026 AI Agent 到底该用哪种 JSON 工具调用?

阅读约 14 分钟

2026 年构建 AI Agent 时,几乎绕不开一个问题:工具能力该用厂商原生的 Function Calling 描述,还是走 MCP(Model Context Protocol) 的 Tool Schema?两者都输出 JSON,看起来相似,却在协议层、生命周期和生态上截然不同。本文从 JSON 结构对比出发,结合架构边界与落地场景,给出可执行的选型建议。

阅读前速览

维度 Function Calling MCP Tool Schema
定位 模型 API 内置能力,描述单次可调函数 开放协议,描述外部 MCP Server 暴露的工具
JSON 载体 tools[] + tool_calls inputSchema(JSON Schema 子集)
执行方 应用代码解析 tool_calls 后自行调用 MCP Client 经 stdio/SSE 转发至 MCP Server
2026 推荐 单体 App、快速原型、厂商深度集成 多工具生态、IDE/Agent 平台、可插拔能力

LLM 工具调用在解决什么问题?

大模型本身只能生成文本。要让 Agent 查数据库、调 API、读写文件,就需要一种机器可读的「能力描述 + 调用约定」:模型在合适时机输出结构化 JSON,宿主程序据此执行真实操作,再把结果塞回对话上下文。

2026 年主流路线有两条:各云厂商/OpenAI 兼容 API 提供的 Function Calling(Tool Use),以及 Anthropic 推动的 MCP(Model Context Protocol)。二者都重度依赖 JSON,但层级不同——前者是「模型请求里的一帧数据」,后者是「客户端与服务端之间的协议层」。

Function Calling 是什么?

Function Calling(OpenAI 文档现多称 tools)在每次 Chat Completions 请求中,向模型注入一组工具定义。模型若决定调用,会在响应里返回 tool_calls,包含函数名与 JSON 参数字符串;你的后端执行后,再以 role: tool 消息回传结果。

典型工具定义(OpenAI 风格):

{
  "type": "function",
  "function": {
    "name": "get_weather",
    "description": "查询指定城市的当前天气",
    "parameters": {
      "type": "object",
      "properties": {
        "city": { "type": "string", "description": "城市名,如 Shanghai" },
        "unit": { "type": "string", "enum": ["celsius", "fahrenheit"] }
      },
      "required": ["city"]
    }
  }
}

模型返回的调用意图:

{
  "tool_calls": [{
    "id": "call_abc123",
    "type": "function",
    "function": {
      "name": "get_weather",
      "arguments": "{\"city\":\"Shanghai\",\"unit\":\"celsius\"}"
    }
  }]
}

注意 arguments字符串化的 JSON,解析时务必二次 JSON.parse,并用 Schema 校验,避免注入或类型错误。调试这类嵌套 JSON 时,JSONSort 的格式化与语法检查很有用。

MCP Tool Schema 是什么?

MCP 把「工具」定义在独立的 MCP Server 上。Client(如 Cursor、Claude Desktop、自研 Agent)连接 Server 后,通过 tools/list 发现能力,通过 tools/call 执行。每个工具的参数用 JSON Schema 描述的 inputSchema 声明。

{
  "name": "search_repo",
  "description": "在 Git 仓库中搜索代码",
  "inputSchema": {
    "type": "object",
    "properties": {
      "query": { "type": "string", "description": "搜索关键词" },
      "glob": { "type": "string", "description": "文件 glob,可选" }
    },
    "required": ["query"]
  }
}

MCP 还标准化了认证、资源(Resources)、提示词(Prompts)等能力,Tool Schema 只是其中一层。对 Agent 平台而言,MCP 的价值是工具可插拔、跨宿主复用——写一次 GitHub MCP Server,Cursor 和 Claude Desktop 都能连。

JSON 结构对比:相似处与关键差异

字段 Function Calling MCP Tool Schema
名称 function.name name
描述 function.description description
参数 Schema function.parameters inputSchema
调用结果回传 Chat 消息流 tool role MCP 协议 tools/call 响应
Schema 标准 JSON Schema 子集(各厂商略有差异) JSON Schema(MCP 规范明确)

从 JSON 视角看,两者都能用 JSON Schema 描述参数;差异在于谁持有 Schema、谁发起调用、结果如何回流。Function Calling 的 Schema 随每次 LLM 请求发送;MCP 的 Schema 在 Server 注册,Client 动态拉取并可能缓存。

架构边界:内嵌 API vs 开放协议

  • Function Calling:工具逻辑通常写在同一应用进程;Schema 与业务代码同仓库;换模型厂商可能要适配 tools 字段细微差别。
  • MCP:工具运行在独立 Server(Node/Python/Go);通过 stdio 或 HTTP+SSE 通信;适合「能力市场」——用户自行安装 Slack、Postgres、Filesystem 等 MCP 插件。

2026 年的 Cursor、Windsurf、Claude Code 等 IDE Agent 大量采用 MCP,正是因为第三方工具供应链比每家模型 API 各自封装 Function 更可扩展。而内部微服务编排、Serverless 函数触发,Function Calling 往往更轻。

2026 选型决策树

  1. 只需 3~5 个稳定内部 API,且已锁定 OpenAI/Anthropic/Google 某一 SDK → 优先 Function Calling。
  2. 工具要给用户自行安装/卸载,或跨 IDE、桌面客户端复用 → 优先 MCP Server。
  3. 同时需要:常见做法是 MCP Server 作为能力层,上层 Agent 框架再把 MCP 工具映射为模型 API 的 tools 数组——不是二选一,而是分层。
  4. 强合规与审计:MCP 便于单独部署、网络隔离;Function Calling 需在应用层自行记录 tool_calls 日志。

实战:同一「查订单」能力的两种写法

Function Calling 路径:在 FastAPI 服务里维护 tools=[...],模型返回 get_order 后,你的代码查数据库并构造 tool 消息。

MCP 路径:部署 order-mcp-server,暴露 get_order;Cursor 连接该 Server,Agent 框架负责把 MCP 调用结果注入模型上下文。

JSON 参数定义几乎可复用同一份 Schema——这也是为何团队应维护单一 Schema 源,再分别导出为 OpenAI parameters 与 MCP inputSchema,避免两套定义漂移。Diff 两份 JSON 时可用 JSON Diff 工具快速比对。

无论选哪条路线,参数约束的「单一事实来源」都应是 JSON Schema。MCP 直接采用 inputSchema;Function Calling 的 parameters 本质也是 JSON Schema object。建议:

  • 在仓库中维护 schemas/tools/*.json
  • CI 中用 ajv 等校验示例 payload
  • 模型返回的 arguments 字符串必须先 parse 再 validate

关于 JSON Schema 本身的写法,可参考本站另一篇JSON Schema 完整教程

常见误区

  • 把 MCP 当成模型 API 替代品:MCP 不调用 LLM,只提供工具与上下文;模型调用仍在 Client/宿主完成。
  • Schema 过于庞大:一次塞入 50+ 工具会拖慢推理并提高误调用率;应做工具路由或分层暴露。
  • 忽略 arguments 双重编码:Function Calling 的参数字符串是常见 bug 来源。
  • 假设两家 JSON 完全兼容:Gemini、Claude、OpenAI 对 tools 的字段支持仍有差异,需做适配层。

常见问题(FAQ)

MCP 会取代 Function Calling 吗?

不会完全取代。MCP 解决工具供给与互操作;Function Calling 解决模型如何表达调用意图。2026 年趋势是两者叠加:MCP 提供工具,API 层映射为 tools 数组。

哪个 JSON 更简单?

单次定义复杂度相近。Function Calling 额外多一层 tool_calls 往返消息;MCP 额外多 Server 进程与传输配置,但工具 JSON 本身往往更扁平。

私有 Agent 只有内部 API,还要上 MCP 吗?

不必。内部闭环、工具固定且团队不打算开放插件生态时,Function Calling 足够。若预期接入越来越多外部数据源,可预留 MCP 接口。

如何调试工具 JSON?

用 JSONSort 在本地格式化、校验 Schema 与 diff 多版本定义;切勿把含密钥的 tool 响应上传到在线 JSON 站点。

结论

Function Calling 是模型侧的 JSON 工具描述与调用帧;MCP Tool Schema 是生态侧的开放工具注册格式。2026 年构建 Agent:快速业务闭环选 Function Calling;可扩展工具平台选 MCP;成熟团队往往两者并存,并用 JSON Schema 统一参数定义。先理清架构边界,再选 JSON 载体,比争论「哪个协议会赢」更务实。

延伸阅读

更新日志: 初稿发布