教程
MCP 与 JSON Schema 是什么关系?2026 AI Agent Tool Calling 数据结构完整解析
Agent 流水线里至少有三份 JSON:模型选工具时的 arguments、MCP tools/call 的 params.arguments、Server 调下游 API 的 body。它们形状应来自同一份 Schema——MCP 与 JSON Schema 的关系,就是「工具契约」怎么在协议层与模型层对齐。
2026 年的 AI Agent 几乎都离不开 Tool Calling:模型决定调用哪个函数、填什么参数;运行时把参数交给 MCP Server、REST API 或内部服务。JSON Schema 是这些参数最常见的「形状说明书」——OpenAI 的 function.parameters、Anthropic 的 input_schema、Gemini 的 function declarations、MCP 的 inputSchema,本质都在描述同一件事:arguments 对象有哪些键、什么类型、哪些必填。但 MCP 是传输与发现协议,JSON Schema 是字段契约;Structured Output 又管模型最终答复。三者容易混成一锅。这篇按数据流拆开:从 tools/list 里的 Schema,到模型吐出的 arguments JSON 字符串,再到 JSON-RPC tools/call,最后到 Server 侧校验与下游 HTTP。并接上站内 Stateless MCP、Structured Output 与 JSON 错误排查文。
MCP 与 JSON Schema 各管哪一层
Model Context Protocol(MCP)定义客户端与 Server 之间怎么发现工具、怎么发 JSON-RPC 请求、怎么返回结果。它不发明一种新的类型系统——工具参数用 JSON Schema(Draft 2020-12 子集)写在每个 Tool 的 inputSchema 字段里。JSON Schema 在这里的角色是「工具契约」:告诉客户端与模型,searchInvoices 需要 startDate、endDate,status 只能是 draft/sent/paid/void。
JSON Schema 在 Agent 栈里还出现在别处:Structured Output 约束模型最终答复;OpenAI Responses API 的 text.format.json_schema 管抽取结果;REST OpenAPI 描述 HTTP body。MCP inputSchema 只管工具入参。搞混这三者,会出现「模型输出 Schema 校验过了,但 tools/call 参数仍缺键」——因为约束的是不同 hop。
规范层面,MCP Tool 对象包含 name、description、inputSchema(及可选 outputSchema)。Server 在 tools/list 响应里暴露清单;客户端缓存后注入模型上下文。2026-07-28 无状态 MCP 把 Session 从协议层拿掉,但不会自动校验 arguments——inputSchema 是声明,执行层仍要 JSON.parse + Schema 校验。详见Stateless MCP 解析。
Tool Calling 数据流:从模型到 MCP Server
一条典型的 Remote MCP Agent 链路可以拆成五步:
- 客户端 tools/list(或缓存)拿到 Tool 定义,含 inputSchema。
- 把 Tool 列表转成模型 API 格式(OpenAI tools[]、Anthropic tools[] 等),Schema 字段名可能从 inputSchema 映射成 parameters。
- 模型返回 tool_calls / tool_use,arguments 通常是JSON 字符串(个别 SDK 已 parse 成对象)。
- 客户端 JSON.parse arguments,组装 MCP JSON-RPC tools/call,params 含 name 与 arguments 对象。
- MCP Server 再次校验 arguments,执行业务逻辑,返回 result.content(常为 text JSON)。
容易出错的点集中在第 3→4 步:模型把数字写成字符串、漏 required、或工具名与 Schema 版本不一致(客户端缓存了旧 tools/list)。无状态 MCP 下每次请求自带 _meta,但 arguments 形状仍依赖你在第 2 步喂给模型的 Schema 是否与 Server 一致。
下面是一个 tools/call 请求体示例(2026-07-28,省略 HTTP 头):
{
"jsonrpc": "2.0",
"id": 42,
"method": "tools/call",
"params": {
"name": "searchInvoices",
"arguments": {
"startDate": "2026-01-01",
"endDate": "2026-01-31",
"status": "paid"
},
"_meta": {
"io.modelcontextprotocol/protocolVersion": "2026-07-28"
}
}
}
inputSchema 与 OpenAI parameters 的对照
MCP 与 OpenAI function calling 在 Schema 字段上高度同构,但工程细节有差:
| 概念 | MCP Tool | OpenAI function tool |
|---|---|---|
| Schema 容器 | inputSchema | function.parameters |
| 严格模式 | 规范建议 Server 校验;模型侧无统一 strict 开关 | tools[].strict: true(Beta)约束 arguments 形状 |
| required 语义 | JSON Schema 标准 | strict 下所有 properties 必须列入 required |
| 传输 | JSON-RPC tools/call | Chat/Responses API tool_calls |
同一份发票搜索工具,MCP 侧写法:
{
"name": "searchInvoices",
"description": "Search invoices by date range and status",
"inputSchema": {
"type": "object",
"properties": {
"startDate": { "type": "string", "format": "date" },
"endDate": { "type": "string", "format": "date" },
"status": {
"type": "string",
"enum": ["draft", "sent", "paid", "void"]
}
},
"required": ["startDate", "endDate"],
"additionalProperties": false
}
}
OpenAI strict tool 侧写法(注意 required 需列全 properties 才能通过 strict 编译):
{
"type": "function",
"function": {
"name": "searchInvoices",
"description": "Search invoices by date range and status",
"strict": true,
"parameters": {
"type": "object",
"properties": {
"startDate": { "type": "string", "format": "date" },
"endDate": { "type": "string", "format": "date" },
"status": {
"type": "string",
"enum": ["draft", "sent", "paid", "void"]
}
},
"required": ["startDate", "endDate", "status"],
"additionalProperties": false
}
}
}
Anthropic 把同构 Schema 放在 input_schema;Gemini function declaration 用 parameters 对象。差异主要在字段名与 strict 子集,不是业务字段本身。维护一份 canonical Schema(YAML/JSON 文件),CI 里生成 MCP Tool、OpenAI tool、OpenAPI 三种外壳,比三处手写更不易 drift。
2026 各栈:OpenAI、Anthropic、Gemini、MCP
2026 年没有「一个 Schema 走天下」,但 Tool Calling 数据结构的共同点越来越多:arguments 是 JSON object,Schema 基于 JSON Schema 子集。粗粒度对照:
| 栈 / 协议 | 工具 Schema 字段 | arguments 保障 |
|---|---|---|
| MCP 2026-07-28 | Tool.inputSchema | 协议不校验;Server 必须本地 Schema 校验 |
| OpenAI Responses / Chat | function.parameters + strict | Beta strict 约束 arguments 形状;执行层仍建议二次校验 |
| Anthropic Messages | tool.input_schema | 工具 use 块带 input object;形状靠 Schema + 本地校验 |
| Gemini | function_declarations.parameters | functionCall args;responseSchema 管最终 JSON 输出 |
Structured Output(模型最终 JSON 答复)与 Tool arguments 是两条 hop。站内AI Structured Output 教程讲前者;AI 生成 JSON 错误指南讲四层错误 taxonomy。Agent 集成要把「答复 Schema」和「工具 Schema」分文件、分版本号,避免改了一个 tool 却误伤 extraction Schema。
DeepSeek V4-Flash 等仍偏 json_object 输出,Tool strict 在 Beta;Remote MCP 则无状态化后更适合水平扩展,但 arguments 校验责任不变。Apple 生态里同一 Swift 函数可同时服务 App Intent、Foundation Models Tool 与 MCP——见Apple AI Agent 与 JSON。
一份 Schema 三处复用
推荐在仓库里维护单一真相源(Single Source of Truth),例如 schemas/search-invoices.schema.json:
- 生成 MCP Tool 的 inputSchema(直接嵌入或 $ref)。
- 生成 OpenAI/Anthropic tool 定义,strict 模式下自动补全 required。
- 生成 OpenAPI requestBody,供 Server 调下游 HTTP 时复用同一字段表。
版本策略:Breaking 改字段时 bump schema_version 或 tool name(如 searchInvoices_v2),并缩短 tools/list 缓存 TTL。无状态 MCP 下客户端常缓存 Tool 列表;stale Schema 会把错误 shape 写进 arguments——这在Stateless MCP 文FAQ 里强调过。
outputSchema(MCP 可选)描述工具返回 JSON 形状,便于客户端或模型解析 result;与 inputSchema 对称,但 2026 实践里 many Server 仍返回自由 text,由调用方 Schema 校验。若你控制 Server,给结构化 result 也挂 Schema,Agent 重试逻辑会更稳。
校验链路与 JSONVue 实操
每个 hop 建议固定三步:parse → Schema → 业务规则。
- 模型 arguments 字符串:JSON.parse,失败则记录 raw 与 tool_call id。
- 对照 inputSchema(或 strict parameters)做 Draft 2020-12 校验,输出 path/keyword。
- 业务 gate:日期范围合法、status 与权限匹配、外键存在。
联调时把三份 JSON 并排:模型吐出的 arguments、MCP tools/call params.arguments、Server 实际 HTTP body。形状不一致时,问题几乎总在适配层映射,而不是模型「不够聪明」。在浏览器里:JSON 格式化确认 parse;JSON Schema 校验对 arguments 与 Schema 文件;JSON Diff对比模型 arguments 与 HTTP body。固定 fixture:valid、missing-field、wrong-enum,CI 与 JSONVue 手动排查共用。
延伸阅读:AI Structured Output 教程、Stateless MCP 解析、AI 生成 JSON 错误指南、DeepSeek V4-Flash JSON。
常见问题 FAQ
MCP 会替 Server 校验 inputSchema 吗?
不会。inputSchema 是工具声明,供客户端与模型理解参数形状。MCP Server 必须在 tools/call 处理函数里 JSON.parse 并 Schema 校验 arguments,再调业务 API。返回 JSON-RPC error 比静默 500 更利于 Agent 重试。
inputSchema 和 Structured Output 的 Schema 能共用吗?
技术上可以共用 JSON Schema 语法,但语义上通常不应共用同一份文件——工具入参描述「调用 searchInvoices 要什么」,Structured Output 描述「模型最终答复长什么样」。字段表可能重叠,应分文件维护,避免改 tool 破坏 extraction。
OpenAI strict 下 required 为什么要列全 properties?
OpenAI strict 编译器要求 object 的每个 property 都在 required 里,否则模型可能合法地省略你以为有默认值的字段。MCP inputSchema 无此编译规则,但若你映射到 OpenAI strict tool,生成层要自动补全 required。
tools/list 缓存多久合适?
看变更频率。Schema 稳定时可按 Server 返回的 ttlMs 缓存;发布 breaking Schema 时应 bump 工具名或版本、缩短 TTL,并通知客户端刷新。无状态 MCP 没有 Session 绑定的「自动失效」,要靠显式版本策略。
总结与下一步
MCP 与 JSON Schema 的关系可以概括成:MCP 用 JSON Schema 描述工具入参(inputSchema),用 JSON-RPC 传输 tools/call;JSON Schema 本身还服务 Structured Output 与 OpenAPI。2026 Agent Tool Calling 的数据结构主线是「一份 canonical Schema → 多 API 外壳 → 每 hop parse + Schema + 业务校验」。
下一步:对照 tools/list 与 OpenAI tools[] 是否同源 Schema;用 JSONVue 验一条完整 tools/call 往返。需要协议细节读 Stateless MCP;需要模型输出形状读 Structured Output;需要失败分层读 JSON 错误指南。