Ian Chou's Blog

為什麼 Code 裡寫的是 Zod,但協議卻說要 JSON Schema?

為什麼 Code 裡寫的是 Zod,但協議卻說要 JSON Schema?

這觸及到了 「開發者體驗 (DX)」「通訊協議 (Protocol)」 之間的分離。

直接回答:MCP 協議本身只認得 JSON Schema,完全不知道 Zod 的存在。

你在程式碼裡看到的 Zod,其實是 SDK 提供的一個 「語法糖」與「翻譯機」

1. 為什麼要用 Zod?

如果用原始 JSON Schema 寫:

inputSchema: {
  type: "object",
  properties: {
    a: { type: "number" },
    b: { type: "number" }
  },
  required: ["a", "b"]
}

如果用 Zod 寫:

inputSchema: { 
  a: z.number(), 
  b: z.number() 
}

Zod 的兩大優勢:

  1. 自動推斷型別:TypeScript 會自動知道 abnumber
  2. 執行時驗證:SDK 會用 Zod Schema 來檢查 AI 傳進來的參數。

2. SDK 默默做了什麼?

當你呼叫 server.registerTool(...) 時,SDK 在背後做了 轉換

  1. 啟動時:SDK 把 Zod 定義編譯成標準的 JSON Schema。
  2. 握手時:透過 stdout 回傳的 JSON 封包裡放的是 JSON Schema。

3. 不同語言的 SDK

最終透過 stdout 傳出來的,全部都會變成 標準 JSON Schema

總結