教程
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 錯誤指南。