Ian Chou's Blog

MCP Resources 最佳實踐:從官方範例到實戰設計

MCP Resources 最佳實踐:從官方範例到實戰設計

深入剖析社群與官方生態中成熟的 Resource 設計模式,幫助你打造對 LLM 友善的資源架構。


成功的 Resource 設計共通點

觀察目前做得成功的 resource 用法,大多有幾個共通點:

設計原則 說明
資源樹結構 把重要上下文做成可瀏覽的資源樹(logs、設定檔、文件、repo 結構…)
Resource Templates 善用 resource templates 讓 LLM 可以動態指定參數,例如 repo://{owner}/{name}
LLM 友善格式 資源內容盡量是「可直接餵模型」的格式(純文字、結構化 JSON),避免讓工具再包一層

官方 Reference Servers 的 Resource 設計

這幾個是 MCP 官方 example servers,基本都示範了「正統」的 resource 實作方式,適合直接學習 + 參考程式碼結構。

Everything Server

官方綜合範例,包含 tools / resources / prompts 三種。

特色:


Filesystem Server

透過 resources 暴露特定目錄下的檔案為可讀資源。

支援格式: file:///path/to/file.txt

做得好的地方:


Git / GitHub Server

用資源把 repo 的內容暴露給 LLM。

暴露的資源類型:

設計 Pattern:

先 Resources 給 context,再 Tools 做 action

LLM 可以先用資源理解專案,再用 tools 做進一步操作。這個 pattern 非常值得學習。


第三方開源專案的成熟案例

在各種 MCP server 彙整清單與教學 repo 裡,有幾種 resource pattern 是用得比較成熟的:

1. Observability / DevOps 類

把 logs、metrics query 結果、dashboard 設定檔等暴露成 resources。

常見作法:

效果: LLM 可以先「閱讀」關鍵 context 再提出診斷建議。


2. 資料分析型 Server

例如 pandas-mcp-server,把可用的 dataset(CSV/Parquet 等)當作資源列出。

優點:


3. API 封裝型 Server

例如 Zapier / OpenAPI 轉 MCP 類專案。

設計方式:

好處: LLM 可以先讀資源了解有哪些系統與權限,再選對 tool 和參數。


推薦學習資源

官方文檔

資源 說明
MCP Resources 官方文檔 說明 resources / resource templates 概念、協定格式,並有簡單 server 實作範例

中文教學

資源 說明
HackMD:三大核心機制 中文說明,把 resources 比喻成「原料倉庫」,示範如何根據任務自動推薦資源 URI

實作範例

資源 說明
FastMCP 展示 @mcp.resource("data://example") decorator 寫法,以及動態啟用/停用資源時如何觸發 resources/list_changed 通知
Composio 教學 用 Python decorator 示範各種回傳型別的資源,強調「資源不只是檔案,可以是動態計算後的內容」

彙整清單


實戰設計範例:Infra / DevOps MCP Server

以下是一個「Infra / DevOps 環境觀測 MCP server」的 resource 設計範例:

固定資源 (Static Resources)

infra://k8s/clusters          # 列出可用 cluster 與基本描述(region、用途)
infra://vercel/projects       # 列出專案清單與環境 URL

Resource Templates (動態資源)

infra://k8s/cluster/{name}/namespaces
infra://k8s/cluster/{name}/ns/{ns}/recent-events

設計理念

┌─────────────────────────────────────────────────────────┐
│                    LLM 工作流程                          │
├─────────────────────────────────────────────────────────┤
│  1. 先用 Resources 看結構(瀏覽資源樹)                   │
│                    ↓                                    │
│  2. 再用 Tools 下更具體的操作(kubectl / API 呼叫)       │
└─────────────────────────────────────────────────────────┘

這個 pattern 在 observability、git、filesystem 那些成熟案例裡都有影子。


Resource 訂閱機制 (Subscription)

在現在的生態裡,「有把 resources 訂閱做得完整」的專案其實還不多,但有幾個方向與 repo 算是比較成熟、值得參考的實作風格。

成熟的訂閱使用場景

1. 動態配置 / 清單變化 (listChanged)

像 Mastra 的 MCPServer 類別就有直接支援 resources.notifyUpdated()prompts.notifyListChanged(),專門用在「長連線環境」推送更新,不靠 polling。

適合場景: 專案列表、環境列表、工作 queue 這種會常變的資源。

2. 檔案 / 程式碼變更訂閱

MCP 規格本身以檔案範例講得最清楚:

對 file:///project/src/main.rs 做 resources/subscribe
    ↓
變動時 server 主動發 notifications/resources/updated

很多 IDE / FS 類 server 都會直接照這個 pattern:底層用 file watcher / git diff,觸發時就推更新。

3. 串流資料 / 監控類 Server

把事件流透過 SSE 或類似機制推給 MCP client,避免 client 一直打工具查詢。

實務作法: Server 內部訂閱 log / Kafka / Pulsar topic,一有新事件就觸發 updated 通知。


訂閱相關教學與設計指南

資源 說明
MCP Resources 規格(新版 spec) 明確定義 subscribe: truelistChanged: true capability,並給出 JSON 範例
Active Data / Subscriptions 教學 用圖解說明 client 呼叫 resources/subscribe → server 監聽底層變更 → 推 updated 的整個 event loop
Mastra MCPServer 有把「notifyUpdated 只在長連線 server 才有效」這類實作細節講清楚

實作 Pattern(適合 Infra / DevOps)

Capabilities 宣告

{
  "resources": {
    "subscribe": true,
    "listChanged": true
  }
}

讓 host 知道可以訂閱單一資源、也會收到清單變更。

訂閱表 + Watcher 架構

┌─────────────────────────────────────────────────────────────┐
│                    Subscription Manager                      │
├─────────────────────────────────────────────────────────────┤
│  維護 uri -> subscribers 的 map                              │
│                                                              │
│  當底層變化時:                                               │
│  ┌─────────────────┐    ┌──────────────────┐                │
│  │ file watcher    │    │                  │                │
│  │ DB change stream│ -> │ 查哪些 uri 有訂閱 │ -> 發 updated  │
│  │ message queue   │    │                  │                │
│  └─────────────────┘    └──────────────────┘                │
└─────────────────────────────────────────────────────────────┘

若你的系統本來就有 event bus,可以直接把這層 MCP adapter 做成 library。

listChanged 的用法

有新的 deployment / job / project 出現時:

觸發 notifications/resources/list_changed
    ↓
LLM 不用硬猜還有哪些資源,也不用一直 call resources/list

Repo 選擇建議

因為真正「把 subscription 做到 production 等級」的多半是商業產品或框架,不一定全開源,建議學習路徑:

步驟 資源 目的
1 MCP 規格 + Active Data 教學 拿到正確協定與 flow
2 Mastra MCPServer 學它怎麼處理長連線與通知
3 Streaming / Observability / FS 類 server 把事件觸發邏輯對照到 MCP subscription

核心設計原則總結

[!TIP]
Resource 給 Context,Tool 做 Action

讓 LLM 先透過 Resources 理解環境與可用選項,再透過 Tools 執行具體操作。

設計 Checklist