Claude + MCP 實戰教學:我把踩過的坑全攤出來給你看

重點摘要
- MCP 不是插件,是協議層:搞懂這個,你才不會一直在錯的地方找問題。
- Claude + MCP 的組合,坑主要集中在三個地方:伺服器連線、工具描述寫法、context 用量控制。
- 跑通之後,Coding 效率的提升是真實的:不是行銷話術,但前提是你得先把架構設對。
為什麼 MCP 和 Claude 的組合這麼難上手?
直接說結論:因為大部分教學都在講「MCP 是什麼」,卻沒人告訴你「連上去之後為什麼不動」。
MCP(Model Context Protocol)是 Anthropic 在 2024 年底推出的開放協議,設計目標是讓 AI 模型能夠跟外部工具、資料來源建立標準化的溝通介面。換句話說,它不是 Claude 的某個功能按鈕,而是一套讓 Claude 「看得懂」外部工具的語言規範。
問題在於,這套協議的生態系還很新。官方文件寫得頗為學術,社群裡的範例程式碼版本又常常對不上,許多開發者第一次跑,根本不確定自己是設定錯了、還是工具本身有 bug。
怎麼把 MCP 伺服器跑起來?
先把環境確認清楚,這步跳掉後面一定卡。
基本前置條件:
- Node.js 18 以上(MCP SDK 有版本要求)
- 安裝
@anthropic-ai/sdk與@modelcontextprotocol/sdk - Claude API Key(用 claude-3-5-sonnet 或更新的模型)
最小可跑的 MCP Server 結構(以 TypeScript 為例):
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
const server = new Server(
{ name: 'my-coding-tools', version: '1.0.0' },
{ capabilities: { tools: {} } }
);
// 在這裡註冊你的工具
server.setRequestHandler(ListToolsRequestSchema, async () => ({
tools: [{
name: 'read_file',
description: '讀取指定路徑的檔案內容',
inputSchema: {
type: 'object',
properties: { path: { type: 'string' } },
required: ['path']
}
}]
}));
const transport = new StdioServerTransport();
await server.connect(transport);
這是最簡版本。很多教學跳過了 StdioServerTransport 這個細節——MCP 預設用標準輸入輸出溝通,不是 HTTP,這個搞錯方向會浪費你很多時間。
為什麼工具描述寫不好、Claude 就不會用?
這是我觀察到開發者最常忽略的地方,也是真正影響 Coding 輔助品質的核心。
Claude 決定要不要呼叫某個工具,靠的是 description 欄位。這不是給人看的備注,是給模型做決策的 prompt。
差的寫法 vs 好的寫法:
| 差的 | 好的 | |
|---|---|---|
| read_file | 「讀檔案」 | 「讀取本地檔案系統中指定路徑的文字內容,適合在需要查看程式碼、設定檔或文字資料時使用」 |
| run_command | 「執行指令」 | 「在專案根目錄執行 shell 指令並回傳 stdout/stderr,適合跑測試、build 或 lint 等開發指令」 |
| search_code | 「搜尋程式碼」 | 「在指定目錄內以關鍵字搜尋程式碼,回傳符合的行號與上下文,適合定位特定函式或變數的使用位置」 |
描述越具體,Claude 的工具選擇準確度越高。這不是玄學,是因為模型本質上是在做語義匹配。
怎麼控制 context 用量,讓 Coding 流程不爆掉?
MCP 帶來的最大副作用是 context 膨脹。每次工具呼叫的結果都會推進對話 context,一個複雜的 Coding 任務跑下來,很快就會碰到 token 上限。
幾個實用的控制策略:
- 工具回傳截斷:讓
read_file工具只回傳前 200 行,需要更多再呼叫,而不是一口氣把整個檔案塞進去。 - 分任務拆對話:大功能拆成獨立子任務,每個子任務開新對話,避免單一 session 太長。
- 摘要 checkpoint:在對話中途請 Claude 產生一份「目前進度摘要」,存起來,下個 session 用這份摘要接力,而不是從頭讀完整紀錄。
- 過濾無用工具輸出:如果工具回傳的內容包含大量不相關資訊(例如完整的 package-lock.json),在 server 端先過濾,只傳關鍵欄位。
跑通之後,實際的 Coding 體驗是什麼樣子?
把環境設好之後,Claude + MCP 的 Coding 輔助確實進入另一個層次。
它可以主動讀你的程式碼、執行測試、看到錯誤訊息再修正,整個迴圈不需要你手動複製貼上。我自己測試過讓它接一個有 failing test 的 TypeScript 專案,它能夠自主跑 npm test、讀錯誤 log、定位問題、修改程式碼、再跑一次測試,整個過程幾乎不需要介入。
這才是 MCP 真正的價值主張——不是讓 Claude 「知道更多」,而是讓它能夠「行動」。
但前提是:你的工具設計要合理、描述要精確、context 要管理好。這三件事沒做對,你得到的只是一個更複雜的 debug 問題。
把這套架構跑起來需要一些前期投資,但一旦通了,它的可擴展性是相當驚人的——你可以持續加入新工具,讓 Claude 的 Coding 能力隨著你的工具庫一起成長。這才是值得認真投入的方向。
常見問題
MCP 和一般的 Claude API 工具呼叫有什麼差別?
一般工具呼叫是在 API 請求裡直接定義工具;MCP 是把工具抽離成獨立伺服器,透過標準協議溝通,更
一定要用 TypeScript 才能寫 MCP Server 嗎?
不是。官方有 Python SDK,社群也有 Go、Rust 的實作。TypeScript 是目前文
Claude 的哪個版本最適合搭配 MCP 做 Coding?
目前 claude-3-5-sonnet 在工具使用準確度和 Coding 能力上表現最均衡,是多數
MCP Server 需要部署到雲端嗎?
不需要。本地開發時直接跑在本機即可,透過 stdio 傳輸。如果需要讓多個使用者共用工具,才需要考慮
context 超過上限時,對話會直接崩潰嗎?
Claude API 會回傳錯誤,對話中斷。解決方式是提前監控 token 用量,在接近上限前主動產
分享這篇

