MCP Tool Schema vs Function Calling:2026 AI Agent 到底该用哪种 JSON 工具调用?
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 选型决策树
- 只需 3~5 个稳定内部 API,且已锁定 OpenAI/Anthropic/Google 某一 SDK → 优先 Function Calling。
- 工具要给用户自行安装/卸载,或跨 IDE、桌面客户端复用 → 优先 MCP Server。
- 同时需要:常见做法是 MCP Server 作为能力层,上层 Agent 框架再把 MCP 工具映射为模型 API 的
tools数组——不是二选一,而是分层。 - 强合规与审计: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 的关系
无论选哪条路线,参数约束的「单一事实来源」都应是 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 载体,比争论「哪个协议会赢」更务实。
延伸阅读
- MCP 官方规范 Tool Schema 与传输层定义
- OpenAI Function Calling 文档 tools / tool_calls 消息格式
- JSONSort 本地 JSON 工具箱 格式化、语法校验、Diff
- 博客全部文章 更多 JSON 与 AI 开发笔记
更新日志: 初稿发布