如果有任何問題或建議,歡迎隨時聯繫我:
Day 22 講 Claude Code 怎麼管理 MCP 伺服器的 token 開銷,但沒解釋 MCP 本身是什麼。今天把它補上——這是一個你會在 Claude Code、claude.ai,甚至自己寫的 API 整合裡反覆遇到的名詞。
先講白話版定義:MCP(Model Context Protocol)是一套讓 AI 存取外部工具與資料的通用協定。 沒有 MCP 之前,你想讓 Claude 查資料庫、串 Slack、讀 GitHub issue,每一種服務都要自己寫一套客製化的工具定義(Day 9 提過,工具定義本身就要算 token,還要自己維護)。MCP 的價值在於:服務提供者只要照著這套協定實作一次伺服器,任何支援 MCP 的 AI 應用都能直接接上,不用重新發明輪子。
本篇 MCP connector 的規格與範例,於 2026 年對照 MCP connector 官方文件 查證。
如果你用 Claude Code,你可能已經接過 MCP 伺服器了——裝一個 GitHub 的、裝一個資料庫的,然後 Claude 就會用了。很方便。
但這裡有一件事值得停下來想三秒鐘:
接上一個 MCP 伺服器,不只是「給 Claude 多一個能力」,同時也是「給它存取那個服務的權限」。
接了 GitHub 的伺服器,Claude 就能讀你的 repo——也可能能開 issue、關 PR、推 commit,取決於那個伺服器提供哪些工具、你開放了哪些。接了資料庫的,它能查資料——也可能能改資料、刪資料。
這不是要嚇你,MCP 本身是好東西。但多數人接 MCP 時只想著「它能幫我做什麼」,很少想「它被允許做什麼」——而這正是 Day 29 要講的那類盲區:你沒問的問題,對 AI 來說就不存在,它不會主動提醒你「你剛剛給了我刪除權限」。
所以今天的重點順序會跟你預期的不太一樣:先講怎麼控制權限(第二、三節),再講技術原理與怎麼自己接(第四節之後)。 如果你只是 Claude Code 使用者、不打算自己寫 API 整合,看完第三節就可以了。
| 天數 | 主題 | 描述 |
|---|---|---|
| Day 1 | Claude 模型怎麼選?2026 最新四階模型完整比較 | Fable 5 / Opus 5 / Sonnet 5 / Haiku 4.5 的定位、規格與適用場景 |
| Day 2 | Claude 的計價邏輯:搞懂 input / output 為什麼差 5 倍 | 不背數字,理解計價結構,建立可長期沿用的成本直覺 |
| Day 3 | 不知道用哪個模型?官方建議「從 Opus 5 開始」背後的思維 | 為什麼預設起手不是最便宜、也不是最強的那個 |
| Day 4 | Claude Haiku 4.5 適合做什麼?便宜模型的正確用法 | 便宜模型不是次等品,是專用工具 |
| Day 5 | Claude context window 是什麼?1M token 到底能塞多少東西 | 用實際檔案量換算,破除「塞越多越好」的迷思 |
| Day 6 | Claude 模型選擇決策表:一張圖判斷你該用哪一個 | 把前五天濃縮成一張可以貼在螢幕旁的決策流程 |
| Day 7 | Token 是什麼?為什麼你的 Claude 帳單比想像中貴 | 從 tokenizer 原理理解中文為什麼特別燒錢 |
| Day 8 | Claude 省 token 的 5 個實用技巧(一般使用者也適用) | 不寫程式也能立刻套用的五個習慣 |
| Day 9 | Prompt Caching 是什麼?讓重複內容只算 10% 費用 | 快取寫入與命中的計價邏輯,以及什麼時候會虧 |
| Day 10 | Claude Batch API 教學:非即時任務直接省一半費用 | 用時間換金錢,非同步任務的正確打開方式 |
| Day 11 | 新世代 tokenizer:同樣的中文為什麼變貴了 | Claude 4.7 世代換了 tokenizer,這對中文使用者的實際影響 |
| Day 12 | 對話越長越燒錢?Claude 長對話的成本陷阱與解法 | 每一輪都重算全部歷史——以及三種切斷成本累積的做法 |
| Day 13 | Claude 用量怎麼監控?成本失控前的預警機制 | 從 usage 欄位到 Console 儀表板,把帳單變成可觀測系統 |
| Day 14 | Claude effort 參數是什麼?五個檔位該怎麼設 | low / medium / high / xhigh / max 的取捨與實測建議 |
| Day 15 | Adaptive Thinking 是什麼?為什麼你不用再寫「think step by step」 | 模型自己決定何時思考,舊 prompt 技巧為何失效 |
| Day 16 | Claude 回答變淺了?檢查這兩個隱藏設定 | 排查思路:先看 effort,再看 thinking 設定 |
| Day 17 | Claude Prompt 寫法教學:官方最佳實踐的骨架 | 一個可以套用在 90% 情境的 prompt 結構 |
| Day 18 | 用 XML 標籤讓 Claude 輸出更穩定(結構化輸出教學) | 為什麼 Claude 特別吃 XML,以及怎麼設計標籤 |
| Day 19 | System Prompt 怎麼寫?角色設定的正確姿勢 | system 與 user 的分工,以及「你是一位專家」為什麼沒用 |
| Day 20 | Claude 幻覺怎麼防?降低錯誤輸出的實用做法 | 引用來源、允許說不知道、把驗證寫進流程 |
| Day 21 | Claude Code 是什麼?安裝與第一次使用完整教學 | 從安裝到跑完第一個任務,含常見卡關點 |
| Day 22 | Claude Code 省 token 設定:別讓它讀完整個專案 | CLAUDE.md、忽略規則與 context 控制的實戰配置 |
| Day 23 | MCP 是什麼?把外部工具接進 Claude 的原理與實作 | Model Context Protocol 的設計哲學與一個可跑的範例 |
| Day 24 | 前端如何呼叫 Claude API?Messages 端點入門 | 第一支 API 請求,以及為什麼不該在瀏覽器直接呼叫 |
| Day 25 | Claude 串流輸出(Streaming):打造即時回應體驗 | SSE 事件流解析與前端逐字渲染 |
| Day 26 | Claude API 錯誤處理與重試:正式環境該注意什麼 | 429 / 529 的正確退避策略與冪等性設計 |
| Day 27 | 模型分流(Model Routing)是什麼?別再一支模型用到底 | 依任務難度動態選模型的判斷邏輯 |
| Day 28 | LLM 成本優化架構:小模型前置分流 + 大模型收尾 | 一套可落地的分層架構與失敗處理 |
| Day 29 | Vibecoding 做出網站之後:AI 不會主動告訴你的那些事 | 門檻降低的是「做出來」,不是「做對」——怎麼問出你不知道要問的問題 |
| Day 30 | Claude 使用總整理:模型、成本、設定一次看懂 | 全系列濃縮成一份可以收藏的速查表 |
先講一個會讓你安心一點的機制——接了伺服器,不代表 Claude 每次都會去動它。
"Claude does not call an MCP tool for general knowledge questions about a connected service. Asking 'how do Notion databases work?' with a Notion server attached is answered directly; asking 'what's in my Projects database?' triggers the tool."
問「Notion 資料庫怎麼運作」這種一般知識問題,它直接用自己的知識回答;問「我的 Projects 資料庫裡有什麼」這種需要實際查詢的,才會真的伸手。
這件事有兩層意義:成本上,接了伺服器不會讓每次對話都多付工具呼叫的錢(呼應 Day 9);安全上,它不會沒事去翻你的東西——但一旦你的問題暗示需要外部資料,它就會動手,而且不會先問你。
如果你希望它更保守或更積極,Day 19 講過的 system prompt 技巧可以調整這個傾向。
這是本篇最該記住的一節,而且它是一個安全決策,不是設定技巧。
MCP 的權限有兩種設計方向,差別在於**「預設是開還是關」**:
| 模式 | 預設 | 適合什麼情況 |
|---|---|---|
| 允許清單(Allowlist) | 全部關閉,只開你明確列出的 | 你很清楚需要哪幾個工具——最安全,但要一個個列 |
| 拒絕清單(Denylist) | 全部開放,只關掉你點名的 | 你想要方便,但至少擋掉會造成破壞的那幾個 |
官方對拒絕清單給了一個很具體的使用建議:
"Denylisting write or destructive tools is recommended when building read-only assistants, or when you want a human confirmation step before state changes."
(建立唯讀助理時,或當你希望狀態變更前有人工確認步驟時,建議把寫入或破壞性的工具列入拒絕清單。)
這句話值得翻譯成白話:如果你接一個伺服器只是想「查東西」,那就把所有會改動、會刪除的工具關掉。你沒有損失任何你真正需要的能力,但你把「AI 誤判情況、執行了一個不可逆操作」這個風險整個移除了。
一個實用的判斷習慣:接上任何 MCP 伺服器之後,問自己一句——
「這裡面有哪個工具,如果它在錯誤的時機被呼叫,我會很想哭?」
有的話,關掉它。等你真的需要那個能力時再開。
在 Claude Code 裡,用
/mcp可以看到目前接了哪些伺服器並管理它們。Day 22 提過「停用沒在用的伺服器」能省 context——現在你知道那個動作同時也在縮小你的授權範圍,一舉兩得。
前兩節是每個接 MCP 的人都該知道的。接下來是給要自己寫 API 整合的人看的——如果你只是在 Claude Code 或其他工具裡用現成的 MCP 伺服器,可以直接跳到最後一節「什麼時候該接 MCP」。
官方文件開宗明義點出兩條路,選哪一條取決於你的伺服器在哪裡:
① MCP Connector(今天的主角):直接在 Messages API 請求裡宣告要連的 MCP 伺服器,不需要你自己實作一套 MCP client。適用條件很明確——伺服器必須是遠端、可透過 URL 存取的。
② Client-side 輔助工具:如果你要接的是本機執行的 stdio 伺服器,或需要用到 MCP 的 prompts、resources 功能,或想對連線有更細的控制,才需要自己管理 MCP client,官方 SDK 提供轉換函式(例如 Python 的 async_mcp_tool、TypeScript 的 mcpTools)省去手動轉換的工夫。
MCP Connector 用兩個獨立的參數協同運作:
response = client.beta.messages.create(
model="claude-opus-5",
max_tokens=1000,
messages=[{"role": "user", "content": "What tools do you have available?"}],
mcp_servers=[
{
"type": "url",
"url": "https://example-server.modelcontextprotocol.io/sse",
"name": "example-mcp",
"authorization_token": "YOUR_TOKEN",
}
],
tools=[{"type": "mcp_toolset", "mcp_server_name": "example-mcp"}],
betas=["mcp-client-2025-11-20"],
)
mcp_servers 定義連線細節——URL、名稱、認證權杖;tools 裡的 mcp_toolset 則定義「這個伺服器裡的哪些工具要開放」。這個設計把「連到哪裡」跟「能用什麼」分開,正是第二節那套權限控制在 API 層的實作位置。
三條驗證規則:每個 mcp_server_name 必須有對應的 server 定義、每個 server 都必須被剛好一個 toolset 引用、一個 server 不能被兩個 toolset 重複引用。
注意版本:目前是 mcp-client-2025-11-20。如果你看到教學把工具設定直接寫在 mcp_servers 裡的 tool_configuration 欄位,那是已棄用的舊版。
第二節那兩種權限模式,寫成設定長這樣:
// 允許清單:預設關閉,只開兩個
{
"type": "mcp_toolset",
"mcp_server_name": "google-calendar-mcp",
"default_config": { "enabled": false },
"configs": {
"search_events": { "enabled": true },
"create_event": { "enabled": true }
}
}
// 拒絕清單:預設開放,關掉破壞性的
{
"type": "mcp_toolset",
"mcp_server_name": "google-calendar-mcp",
"configs": {
"delete_all_events": { "enabled": false },
"share_calendar_publicly": { "enabled": false }
}
}
延遲載入(defer_loading):設成 true 的工具,一開始只有名稱進 context,完整描述要等真正被搜尋到才載入。這正是 Day 22 那句「MCP 工具定義預設延遲載入」的 API 端原始出處。
官方明確列出兩條限制:
需要認證的 MCP 伺服器,透過 authorization_token 欄位傳入 OAuth 存取權杖:
{
"mcp_servers": [{
"type": "url",
"url": "https://example-server.modelcontextprotocol.io/sse",
"name": "authenticated-server",
"authorization_token": "YOUR_ACCESS_TOKEN_HERE"
}]
}
取得與更新這個權杖的責任在你這邊——官方明講:「API consumers are expected to handle the OAuth flow and obtain the access token prior to making the API call, and to refresh the token as needed.」如果只是想先測試,官方推薦用 MCP Inspector(npx @modelcontextprotocol/inspector)跑一次 OAuth 流程,拿到測試用的權杖。
計價:MCP 工具呼叫跟一般 Messages API 請求用同一套計價方式,而且 Batch API(Day 10)也支援 mcp_servers——批次請求裡的 MCP 工具呼叫,計費方式跟即時請求一致,沒有額外的價差。
資料保留:官方明確標記 MCP connector 不符合零資料保留(ZDR)資格——跟 MCP 伺服器交換的資料,包含工具定義與執行結果,會依照 Anthropic 標準資料保留政策處理。如果你的應用場景對資料保留有嚴格要求,這是設計架構前就該確認的一項限制,不是事後才發現的意外。
Day 22 提過一個實務建議:「優先用 CLI 工具而非 MCP」。今天知道了 MCP 的完整機制之後,可以把這個判斷原則講得更完整。
適合用 MCP 的情境:你要接的服務沒有現成的指令列工具,或是你需要跨多個服務統一管理權限(今天第四節的允許清單/拒絕清單機制,能在同一套設定邏輯下管理不同服務的存取範圍)。企業內部系統、SaaS 服務的官方或社群 MCP 伺服器,通常就是為了填補「沒有 CLI、只有網頁介面或私有 API」的空缺。
不一定需要 MCP 的情境:如果目標服務已經有維護良好的 CLI 工具(例如 gh、aws、gcloud),直接讓 Claude 呼叫這些工具,通常比接一個 MCP 伺服器更省事——不用管連線、認證權杖更新、伺服器是否公開暴露這些額外的維運負擔,而且 Day 22 提過 CLI 工具不會有任何「工具清單」的 context 開銷。
一個簡單的判斷句:先問「這個服務有沒有好用的 CLI?」有,優先用 CLI;沒有,才考慮接 MCP。 兩者不是互斥的——同一個工作流裡,同時用 CLI 工具處理一部分、MCP 伺服器處理另一部分(例如今天第七節的 Before/After 範例接的 Jira,多數團隊不會有 Jira 的官方 CLI),是很常見的組合。
❌ Before:自己寫一套客製化工具定義,手動維護
tools = [{
"name": "search_jira_issues",
"description": "手動維護的 Jira 搜尋工具描述……",
"input_schema": {...}, # 手動對照 Jira API 文件自己寫
}]
# 每次 Jira API 改版,這裡都要跟著手動更新
✅ After:接上官方或第三方提供的 MCP 伺服器
response = client.beta.messages.create(
model="claude-opus-5",
max_tokens=1000,
messages=[{"role": "user", "content": "有哪些未解決的 Jira bug?"}],
mcp_servers=[{
"type": "url",
"url": "https://your-jira-mcp-server.example.com/sse",
"name": "jira-mcp",
"authorization_token": JIRA_TOKEN,
}],
tools=[{"type": "mcp_toolset", "mcp_server_name": "jira-mcp"}],
betas=["mcp-client-2025-11-20"],
)
Before 版本每接一個新服務就要重新設計一套工具 schema,服務改版你也要跟著改。After 版本把「工具長什麼樣子」的維護責任交給 MCP 伺服器本身——你只負責決定要不要接、開放哪些工具,這正是 MCP 作為「通用協定」的價值所在。
今日挑戰:如果你的團隊有內部系統(例如工單系統、內部知識庫),評估一下有沒有現成的 MCP 伺服器可以接,或者接一個公開的 MCP 伺服器(例如官方範例的 example-mcp)試跑一次今天的基本範例,觀察回應裡的 mcp_tool_use 與 mcp_tool_result 區塊長什麼樣子。
反思:MCP 的核心價值是「一次實作、到處能用」的協定思維,這跟 Day 18 講的 XML 標籤、Day 17 的 prompt 骨架其實是同一種精神——用標準化的結構,換取跨場景的可重複使用性。 你在自己的工作裡,有沒有類似「每次都重新客製化,卻其實可以標準化一次就好」的地方?
MCP 是一套讓 Claude 存取外部工具的通用協定,今天講的 MCP Connector 是 API 層級最直接的接法——不用自己管理 MCP client,只要伺服器公開暴露在 HTTP 上。mcp_servers 定義連線、tools 裡的 mcp_toolset 定義權限,允許清單、拒絕清單、延遲載入三種模式可以組合使用。
記住兩個容易被忽略的限制:目前只支援工具呼叫,其他 MCP 功能要靠 client-side SDK;不符合 ZDR 資格,資料保留採標準政策。計價上是好消息——跟一般請求同一套費率,批次 API 也能用。
本日關鍵字回顧
mcp_servers 與 mcp_toolset 兩個參數設定。明天從 Claude Code 這種現成工具,回到最基礎的一層——自己寫程式呼叫 Claude API。第一支 Messages API 請求,以及為什麼你不該在瀏覽器裡直接呼叫它。
Day 24,Messages 端點入門。