先別管 MCP 能接多少工具、能串多少服務。先問一件更基本的事:當你接上一個 MCP server 的那一刻,Claude Code 到底從它那裡拿到了幾種東西?

大部分人的答案是「一種」——工具。你接了 GitHub server,就叫它開 PR;接了資料庫 server,就叫它查資料。工具(Tools)確實是 MCP 最常被用到的部分。但如果你只用到工具,那你手上這台機器,其實只發動了三分之一。

把 MCP 拆開,裡面有三個抽屜

MCP 這個協定,設計上暴露給你的不是一種介面,是三種。官方把它們叫做三個 primitives:Tools、Resources、Prompts。它們最關鍵的差別不在「能做什麼」,而在一個你大概沒想過的問題上——這東西是誰決定要用的?

工具(Tools),是模型決定要不要用的。你說「幫我開個 PR」,Claude 自己判斷「這需要呼叫 GitHub 的 create_pr 工具」,然後就去按了。決定權在 AI 手上。

資源(Resources),是你或應用程式決定要不要用的。它是一份唯讀的資料——一個檔案、一張資料表的 schema、一則 issue 的內容。AI 不會自己跑去讀,得你指給它看:「欸,讀這份。」

提示(Prompts),是明確叫出來的。它是 server 作者事先寫好、包裝好的一段互動模板,等你去觸發。

換個生活一點的講法。工具是「AI 自己能按的按鈕」;資源是「一整櫃檔案,AI 自己不會去翻,你抽哪份給它、它才看哪份」;提示則是「別人幫你出好、還填了一半的考卷,你只要拿起來寫」。三個抽屜,三種主人。多數人只拉開了第一個。

提示:把常打的長指令,變成一條斜線

先看被冷落得最嚴重的那個——Prompts。

想像你們團隊每次開 issue,都有一套固定講究:標題怎麼寫、要標什麼優先級、要 tag 誰。這段話你一週打二十次,每次都重打。這就是 Prompts 要解決的浪費:server 作者把這套模板寫好一次,之後它會自動變成一條斜線指令,全團隊直接叫。

它長成這樣。你在 Claude Code 打一個 /,除了內建指令,MCP server 提供的提示也會冒出來,格式固定是 /mcp__servername__promptname。中間那個 servername 是你接的 server 名字,後面是那段提示的名字。

要帶參數的話,空格分隔就好,順序照提示定義的來:

1
2
3
/mcp__github__list_prs
/mcp__github__pr_review 456
/mcp__jira__create_issue "Bug in login flow" high

第一條列出所有 PR,第二條指定去 review 第 456 號,第三條直接建一張標題是「Bug in login flow」、優先級 high 的 Jira issue。這些字你本來要打一大串跟 AI 描述半天,現在一條斜線解決。它之所以優雅,正是因為它把「重複」這件事,收斂成了一個你不用再想的動作。

資源:要 AI 看什麼,用 @ 指過去就好

第二個抽屜是 Resources,觸發它的鑰匙是 @

平常你要 Claude 讀某個東西——一則 issue、一份 API 文件、一張資料表結構——你會怎麼做?多半是切過去、複製、貼回來。資源就是來省掉這段搬運的。你在對話裡打一個 @,Claude Code 會把所有接上的 server 能提供的資源列給你挑,支援模糊搜尋,格式是 @server:protocol://resource/path

實際用起來像這樣:

1
2
Can you analyze @github:issue://123 and suggest a fix?
Please review the API documentation at @docs:file://api/authentication

你沒有貼任何內容,只是用 @ 指了一下「就那個東西」,Claude 就把它拉進 context 了。更漂亮的是,一句話裡可以指好幾個,讓它互相對照:

1
Compare @postgres:schema://users with @docs:file://database/user-model

這句話讓 Claude 直接把「線上資料庫裡 users 表的實際結構」跟「文件裡寫的資料模型」擺在一起比,幫你抓出兩邊哪裡對不上。schema 漂移這種事,以前得人工兩邊翻,現在一句話。

兩個你八成會撞到的坎

講原理很順,實際用會卡。兩個最常見的。

第一個:打了 /,卻沒看到你期待的那條提示指令。先別懷疑人生,跑一下 /mcp。這個指令會列出你所有接上的 server、各自的狀態、有幾個工具、有沒有報錯。提示沒出現,通常是 server 根本沒連上,或者那個 server 本來就沒宣告任何 prompt——不是每個 server 都有。

第二個:用 @ 拉了一份資源進來,結果 context 瞬間被灌爆。這不是錯覺。Claude Code 對超過 10,000 tokens 的 MCP 輸出會跳警告,提醒你這份東西很肥。真的需要塞更大的,可以調環境變數 MAX_MCP_OUTPUT_TOKENS,例如設成 MAX_MCP_OUTPUT_TOKENS=50000。但先想清楚——你是真的需要整份,還是其實只要其中一段?把整個檔案櫃搬進來,跟抽出你要的那一份,成本差很多。

回頭看那台只發動三分之一的機器

繞回開頭那個問題。你接一個 MCP server,拿到的從來不是一種東西,是三種:AI 自己會按的按鈕、你指給它翻的檔案櫃、別人幫你填好一半的考卷。

多數人只用按鈕,是因為按鈕最直覺——你喊一聲,AI 就動了。但另外兩個抽屜省掉的,是你每天都在做、卻從沒意識到在浪費的兩件事:重複打同一段長指令,和不停地複製貼上。下次你接上一個新的 MCP server,先別急著使喚它做事。先打一個 /,再打一個 @,看看它其實還準備了什麼給你。你會發現,很多你以為得自己扛的搬運工,它早就內建好了,只是一直沒人去拉那兩個抽屜。

語法與行為依 Claude Code 官方 MCP 文件(code.claude.com/docs/en/mcp)與 MCP 架構文件(modelcontextprotocol.io)核對。本文聚焦「使用端」——如何用好別人做好的 server;至於怎麼從零寫一個含 Prompts/Resources 的 server,屬 server 開發範疇,本文不涉及。文中指令範例出自官方文件,我尚未逐條在所有 server 上實跑,實際 server 支援哪些 prompt/resource 以該 server 宣告為準。