認識 MCP 與 2026-07-28 新版規格:Vibe Coder 的入門地圖

測驗:認識 MCP 與 2026-07-28 新版規格

共 5 題,點選答案後會立即顯示結果

1. MCP(Model Context Protocol)最主要想解決什麼問題?

  • A. 讓 LLM 的推論速度變更快
  • B. 把「AI 應用接外部工具/資料」標準化,避免 N×M 份膠水程式碼
  • C. 取代 REST API,讓所有後端都改用 MCP
  • D. 提供一個訓練模型的資料集格式

2. 關於 MCP 的三方架構,下列哪個描述正確?

  • A. 一個 Client 可以同時連很多個 Server
  • B. Server 負責彙整整段對話並協調 LLM
  • C. 一個 Host 可開多個 Client,每個 Client 對應一個 Server(1:1)
  • D. Host 只是資料庫,實際運算由 Client 完成

3. 分辨三大原語最快的方法是問「誰來決定何時使用它」。下列配對何者正確?

  • A. Tools 由模型控制、Resources 由應用控制、Prompts 由使用者控制
  • B. Tools 由使用者控制、Resources 由模型控制、Prompts 由應用控制
  • C. 三者都完全由模型自動控制,使用者不介入
  • D. 三者都由 Host 隨機指派

4. 2026-07-28 版規格的一項「大手術」是把協定變成無狀態(stateless)。這具體代表什麼?

  • A. Server 不能再有任何資料庫
  • B. 每次請求都必須是同一條 TCP 連線
  • C. 模型不再需要任何上下文
  • D. 移除 initialize 握手與 session,每個請求自帶協定版本與能力(放在 _meta)

5. 下列哪一組功能在 2026-07-28 版被標記為 deprecated(棄用中),新專案不該再採用?

  • A. Tools、Resources、Prompts
  • B. Roots、Sampling、Logging
  • C. server/discover、subscriptions/listen
  • D. JSON-RPC、Streamable HTTP

系列:【MCP 與 FastMCP 實戰】#01(共 4 篇)|難度:L2-進階

前置知識:知道 LLM/AI 代理(agent)大概在幹嘛、看得懂 JSON 與 client/server 的基本概念。

一句話說明

MCP(Model Context Protocol,模型上下文協定)是一套「讓 AI 應用程式跟外部工具、資料溝通」的標準介面——你可以把它想成「AI 世界的 USB-C」:不管是哪個模型、哪個工具,只要兩邊都講 MCP,就能插上就用,不用每次都重寫一套對接程式碼。

這篇文章不是教你「怎麼寫一個 MCP server」(那是後面幾篇的事),而是先讓你看懂 MCP 在講什麼、名詞對應到什麼、以及 2026-07-28 這版規格改了哪些會影響你驗收的重點。因為當 AI 幫你生一個 MCP 專案時,你要能判斷它寫的東西是不是「這個時代的寫法」。


MCP 要解決什麼問題

在 MCP 出現前,「讓 LLM 用外部工具」大致是這樣做的:

  • 你在程式裡自己定義一堆 function,寫一份 JSON schema 描述它們,塞進 API 呼叫裡(這就是 function calling)。
  • 每換一個模型供應商、每接一個新工具,就得重寫一次對接。
  • N 個 AI 應用 × M 個工具= N×M 份膠水程式碼,維護到崩潰。

MCP 的目標就是把這件事標準化:工具那一端寫成一個 MCP server(只寫一次),AI 應用那一端當 MCP client(只實作一次協定),兩邊透過統一的訊息格式溝通。於是 N×M 變成 N+M。

一句話翻譯:**function calling 是「這一次對話裡臨時告訴模型有哪些 function」;MCP 是「把工具打包成一個可重複插拔的標準服務」。** 兩者不衝突——MCP server 提供的工具,最後常常還是以 function calling 的形式餵給模型。


三方架構:Host、Client、Server

MCP 的官方說法是 client-host-server 架構。三個角色一定要分清楚,不然後面看 code 會很亂:

角色 白話 誰來扮演 負責什麼
Host(宿主) 那個「AI 應用程式本體」 Claude Desktop、Cursor、你自己寫的 agent 管理多個 client、掌控權限與使用者授權、協調 LLM、彙整上下文
Client(客戶端) Host 內部「一對一連到某個 server」的連線器 由 Host 建立 一個 client 只connect 一個 server,雙向傳遞協定訊息
Server(伺服器) 提供工具/資料的那一端 檔案系統 server、GitHub server、資料庫 server… 對外暴露 Tools / Resources / Prompts

關鍵心智模型:一個 Host 可以開很多個 Client,每個 Client 對應一個 Server(1:1)。這樣設計是為了安全邊界——一個 server 看不到整段對話,也「看不進」其他 server。

        ┌─────────────── Host(例如 Cursor)───────────────┐
        │   ┌────────┐        ┌────────┐        ┌────────┐  │
        │   │Client A│        │Client B│        │Client C│  │
        └───┴───┬────┴────────┴───┬────┴────────┴───┬────┴──┘
                │ (1:1)           │ (1:1)           │ (1:1)
           ┌────▼─────┐      ┌────▼─────┐      ┌────▼─────┐
           │ Server:  │      │ Server:  │      │ Server:  │
           │ 檔案系統 │      │  GitHub  │      │ Postgres │
           └──────────┘      └──────────┘      └──────────┘
Code language: CSS (css)

訊息流:底層是 JSON-RPC

MCP 的訊息用 JSON-RPC 2.0 格式(一種很單純的「請求/回應」JSON 約定)。一個最小的「列出這個 server 有哪些工具」請求長這樣:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/list",
  "params": {}
}
Code language: JSON / JSON with Comments (json)

翻譯:「用 JSON-RPC,這是第 1 號請求,我要呼叫 tools/list 這個方法。」

Server 回:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "resultType": "complete",
    "tools": [
      { "name": "search_files", "description": "在專案裡搜尋檔案", "inputSchema": { "...": "..." } }
    ]
  }
}
Code language: JSON / JSON with Comments (json)

翻譯:「第 1 號請求的結果,這是一個『完整』結果(resultType: complete,2026-07-28 新增,等等會講),我有一個叫 search_files 的工具。」

必看懂method 是動詞(tools/listtools/callresources/read…),id 用來把請求跟回應配對,result 是結果、error 是出錯。看到這幾個關鍵字就知道這是 MCP 訊息。


三大核心原語:Tools / Resources / Prompts

MCP server 能提供三種東西,官方叫「原語(primitives)」。分辨它們的最快方法是問「誰來決定什麼時候用它」

原語 由誰控制 是什麼 例子
Tools(工具) 模型控制(model-controlled) 模型可以「主動呼叫」來做事、產生副作用 查資料庫、呼叫 API、寄信、跑計算
Resources(資源) 應用控制(application-driven) 唯讀的資料/上下文,由 URI 識別,交給模型當背景知識 檔案內容、資料庫 schema、文件
Prompts(提示範本) 使用者控制(user-controlled) 預先寫好的訊息範本,通常做成使用者可選的指令 slash 指令、「幫我 code review」範本

一句話記法:

  • Tool = 動詞:模型自己判斷要不要呼叫(會做事、可能改變外部狀態)。
  • Resource = 名詞:像檔案,用 URI(例如 file:///project/README.md)指名,唯讀。
  • Prompt = 範本:使用者主動挑來用,例如在輸入框打 /review

📌 知道就好:Tools 是「model-controlled」不代表沒人管——規格明確要求應用程式應該保留 human in the loop,讓使用者能否決工具呼叫。所以你在 Host 上看到「是否允許這個工具執行?」的確認框,是符合規格的正確設計。


2026-07-28 新版規格:改了什麼、為什麼要在意

先搞清楚版本輩分。MCP 的規格版本用「日期」當版號,一路是:

2024-11-05 → 2025-03-26 → 2025-06-18 → 2025-11-25 → 2026-07-28(最新)

2026-07-28 是目前最新修訂版,它相對於前一版 2025-11-25 做了一次「大手術」。如果你之前讀的是 2025-06-18 那份廣為流傳的規格,會發現很多名詞對不上——這很正常,因為中間改很大。以下是對 Vibe Coder 最有感的幾項:

1. 協定變「無狀態(stateless)」,拿掉 initialize 握手

舊版:client 連上 server 要先做一次 initialize / notifications/initialized 握手,交換一次協定版本與能力,之後靠一個 Mcp-Session-Id session 維持狀態。

新版握手沒了、session 沒了。每一個請求都自帶協定版本與能力,放在 _meta 欄位裡:

"_meta": {
  "io.modelcontextprotocol/protocolVersion": "2026-07-28",
  "io.modelcontextprotocol/clientInfo": { "name": "cursor", "version": "1.0" },
  "io.modelcontextprotocol/clientCapabilities": { "...": "..." }
}
Code language: JavaScript (javascript)

翻譯:「每次請求我都重新報一次:我講哪版協定、我是誰、我支援哪些能力。」

為什麼改:無狀態的協定比較好做水平擴展(server 可以隨便換一台機器處理,不用記得你上次講了什麼),也更適合雲端部署。相容性重點:跨版本協商靠新的 server/discover RPC——server 必須實作它來公告自己支援哪些協定版本與能力;版本不合會回 UnsupportedProtocolVersionError

2. 訂閱改成 subscriptions/listen 一條長連線

舊版用 HTTP GET endpoint 加上 resources/subscribe/unsubscribe 收變更通知。新版統一成一條 subscriptions/listen 的長連線 POST,client 主動 opt-in 想收哪幾種通知(toolsListChangedresourcesListChanged…)。同時移除了 SSE 斷線重送——連線斷了,進行中的請求就當作丟失,client 要用新的 request ID 重發。

3. 「多輪往返請求」(MRTR)取代 server 主動發問

舊版 server 想反過來問 client(例如要 client 幫忙 sampling、elicitation、給 roots)是靠 server 主動送請求。新版改成:server 回一個 resultType: "input_required"InputRequiredResult,把「我還需要什麼」寫在 inputRequests;client 補齊資料後重試原本那個請求。這也是為什麼每個 result 現在都有 resultType 欄位"complete""input_required")。

相容性提醒:**舊版 server 回的 result 沒有 resultType,新版 client 必須把它一律當成 "complete"**。

4. 砍掉/降級了一批舊功能

  • 移除 pinglogging/setLevelnotifications/roots/list_changed。log 等級改成每個請求用 _meta 帶。
  • Roots、Sampling、Logging 三個功能被標記為 deprecated(棄用中):還能用,但新專案不該再採用。官方建議:用工具參數/資源 URI 取代 Roots;直接接 LLM 供應商 API 取代 Sampling;用 stderr 或 OpenTelemetry 取代 Logging。
  • 舊的 HTTP+SSE transport 正式歸類為 deprecated,請改用 Streamable HTTP
  • 實驗性的 tasks 從核心協定移到官方擴充(extension)。

為什麼要升級:無狀態化讓部署更簡單、擴展更容易,MRTR 讓「server 需要 client 補資料」的流程更乾淨,而砍掉 session/握手降低了實作複雜度。但代價是跟舊版不相容——所以你會在同一個生態裡同時看到新舊寫法,這正是驗收時要盯的地方。


MCP vs REST API vs function calling:怎麼取捨

function calling REST API MCP
定位 這次對話臨時給模型的工具清單 一般服務對服務的介面 AI 專用、可插拔的工具/資料標準
誰是消費者 LLM 任何程式 AI 應用(透過 client)
可重用性 綁在你的 app 裡 高,但沒有 AI 語意 高,且自帶「給模型看」的描述與能力協商
何時用 只有一兩個簡單工具、懶得架 server 本來就有的後端 API 想讓工具能被多個 AI 應用重複使用

重點取捨:MCP 不是要取代 REST。很多 MCP server 內部其實就是去打一支 REST API,只是外面包了一層「模型看得懂、能被 client 統一發現與協商」的標準殼。小專案只有一兩個工具時,直接 function calling 反而更省事。


🚩 紅旗:AI 生 MCP 專案時要警覺什麼

  1. 🚩 還在寫 initialize 握手、Mcp-Session-Idresources/subscribe:這是 2025 舊版寫法。若你要的是 2026-07-28,這代表 AI 參考了過時資料,要請它改成 stateless + server/discover + subscriptions/listen
  2. 🚩 把 Resource 當 Tool 用來「執行動作」:Resource 是唯讀資料。看到某個「resource」會寄信、改資料庫,就是搞混原語了。
  3. 🚩 新專案還在用 Roots / Sampling / Logging:這三個已 deprecated,新專案不該採用,AI 若主動加進來要質疑。
  4. 🚩 result 沒處理 resultType:client 端若完全沒有「遇到 input_required 就補資料重試」的邏輯,碰到需要多輪往返的 server 會直接壞掉。
  5. 🚩 宣稱「MCP 取代 REST/function calling」:這是行銷式誤解,通常代表對取捨沒想清楚。

看不懂某段是不是舊寫法時,直接問 AI:「這段 MCP code 是對應哪個版本的規格?2026-07-28 的話有沒有用到已經被移除或棄用的方法?」


Vibe Coder 驗收檢查點

  • [ ] 能用一句話說出 Host / Client / Server 各是誰、Client 跟 Server 是不是 1:1。
  • [ ] 給你一段功能描述(「查資料庫」「提供 README 內容」「/review 指令」),能正確歸類成 Tool / Resource / Prompt。
  • [ ] 看到一段 MCP JSON,能指出 methodidresult 分別在幹嘛。
  • [ ] 能講出 2026-07-28 至少 2 項「跟舊版不相容」的變更(stateless 無握手、server/discoversubscriptions/listenresultType、Roots/Sampling/Logging 棄用,任選)。
  • [ ] 驗收動作:把 AI 生成的 server 骨架貼給它問「這是 2026-07-28 規格嗎?有沒有用到 deprecated 功能?」,看它能不能自我盤點。

看不懂就這樣問 AI

「用白話解釋 MCP 的 Host、Client、Server 三個角色,各舉一個真實例子,我是初學者。」

「我手上這份 MCP server code 是哪一版規格?跟 2026-07-28 最新版比,有哪些方法已經被移除或標記 deprecated?請列表對照。」

「幫我判斷這個需求該做成 Tool、Resource 還是 Prompt,並說明理由:______」


下一篇預告:#02 會進到 FastMCP——用 Python 幾行程式碼就把一個函式變成 MCP server,並帶你讀懂它生出來的 code 對應到本篇哪些概念。

進階測驗:認識 MCP 與 2026-07-28 新版規格

測驗目標:驗證你是否能在實際情境中應用所學。
共 5 題,包含情境題與錯誤診斷題。

1. 你要幫團隊做一個 MCP server,讓 AI 能「查訂單資料庫」「寄出通知信」,同時也想讓使用者能在輸入框打 /report 叫出固定的週報範本。這三件事應該分別做成哪種原語? 情境題

  • A. 全部做成 Tools,最簡單一致
  • B. 查資料庫→Resource、寄信→Resource、/report→Tool
  • C. 查資料庫→Tool、寄信→Tool、/report→Prompt
  • D. 全部做成 Prompts,反正都跟模型互動

2. 你的專案只需要「一個把兩個數字相加」的簡單工具,且只在自家 app 內用、不打算給別的 AI 應用共用。從本文的取捨建議看,最務實的做法是? 情境題

  • A. 一定要架成 MCP server,否則不專業
  • B. 直接用 function calling 即可,MCP 是為了「跨應用重複使用」才划算
  • C. 改用 REST API,讓模型自己去呼叫
  • D. 用 Resource 提供加法結果

3. 你在對接一個 2026-07-28 版的 server,它回了一個 result,其中 resultType"input_required",並附上 inputRequests。你的 client 該怎麼處理才正確? 情境題

  • A. 當成錯誤,直接中止流程
  • B. 忽略 resultType,把它當完整結果用
  • C. 重新做一次 initialize 握手
  • D. 依 inputRequests 補齊資料,帶著 inputResponses 重試原本那個請求(MRTR)

4. AI 幫你生了一個「MCP server」骨架,開頭長這樣。你要的是 2026-07-28 最新版,這段最大的問題是什麼? 錯誤診斷

// 連線建立後第一步 handle(“initialize”, …) // 交換協定版本與能力 handle(“notifications/initialized”, …) // 之後用 Mcp-Session-Id 維持 session resources.subscribe(“file:///a.txt”)
  • A. 沒問題,這就是最新寫法
  • B. 只是變數命名不好,功能正確
  • C. 這是 2025 舊版寫法:新版已移除 initialize 握手與 session,訂閱改用 subscriptions/listen
  • D. 問題在於缺少 REST 端點

5. Code review 時你看到 AI 在一個名為 Resource 的定義裡做了這件事。哪裡不對? 錯誤診斷

resource “send_invoice”: uri = “invoice://send” on_read(): charge_credit_card(customer) # 讀取時就扣款並寄出帳單 send_email(customer)
  • A. URI 不該用自訂 scheme,其他都正確
  • B. 原語用錯:Resource 應是唯讀資料,會扣款/寄信這種有副作用的動作應該做成 Tool
  • C. 只是少了錯誤處理,邏輯本身沒問題
  • D. 應該改成 Prompt 才對

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *