載入中

MCP 伺服器中的資源允許您向客戶端公開數據,類似於典型 HTTP 伺服器中的 GET 請求處理程式。它們非常適合您需要獲取資訊而非執行動作的情境。

透過範例理解資源

假設您想要建立一個文件提及功能,讓使用者可以輸入 @document_name 來引用檔案。這需要兩個操作:

  • 獲取所有可用文件的清單(用於自動完成)
  • 獲取特定文件的內容(當被提及時)

功能投影片:使用者可以透過輸入 @doc_name 來提及文件;輸入 @ 會在自動完成中顯示所有可用文件的清單,而被提及文件的內容會自動注入到提示中

當使用者提及某個文件時,您的系統會自動將該文件的內容注入到發送給 Claude 的提示中,從而消除 Claude 需要使用工具來獲取資訊的需求。

圖表:使用者詢問「@report.pdf 檔案裡有什麼?」——我們的程式碼將查詢包裝在提示中給 Claude,並將被引用文件的內容注入到文件標籤內

資源如何運作

資源遵循請求-回應模式。當您的客戶端需要數據時,它會發送一個帶有 URI 的 ReadResourceRequest 來識別它想要哪個資源。MCP 伺服器處理此請求並在 ReadResourceResult 中返回數據。

序列圖:使用者輸入「@ 裡有什麼…」,我們的程式碼向 MCP 客戶端請求文件名稱清單以供自動完成,客戶端向 MCP 伺服器發送帶有 docs://documents URI 的 ReadResourceRequest

流程如下:您的程式碼向 MCP 客戶端請求資源,客戶端將請求轉發給 MCP 伺服器。伺服器處理 URI,執行適當的函式,並返回結果。

序列圖(續):MCP 伺服器返回包含文件名稱清單的 ReadResourceResult,MCP 客戶端將其傳回給我們的程式碼以放入自動完成中

資源的類型

資源有兩種類型:

直接資源

直接資源具有永不改變的靜態 URI。它們非常適合不需要參數的操作。

python
@mcp.resource(
    "docs://documents",
    mime_type="application/json"
)
def list_docs() -> list[str]:
    return list(docs.keys())

範本化資源

範本化資源在其 URI 中包含參數。Python SDK 會自動解析這些參數,並將它們作為關鍵字引數傳遞給您的函式。

python
@mcp.resource(
    "docs://documents/{doc_id}",
    mime_type="text/plain"
)
def fetch_doc(doc_id: str) -> str:
    if doc_id not in docs:
        raise ValueError(f"Doc with id {doc_id} not found")
    return docs[doc_id]

並排比較:一個 URI 不包含任何參數的直接資源,以及一個 URI 包含一個或多個參數的範本化資源,Python SDK 會解析這些參數並作為引數傳遞給您的函式

實作細節

資源可以返回任何類型的數據——字串、JSON、二進位數據等。使用 mime_type 參數向客戶端提示您返回的數據類型:

  • "application/json" 用於結構化數據
  • "text/plain" 用於純文字
  • "application/pdf" 用於二進位檔案

MCP Python SDK 會自動序列化您的返回值。您不需要手動將物件轉換為 JSON 字串——只需返回數據結構,讓 SDK 處理序列化即可。

測試您的資源

您可以使用 MCP Inspector 測試資源。使用以下命令啟動您的伺服器:

uv run mcp dev mcp_server.py

然後在瀏覽器中連接到 inspector。您會看到兩個區段:

  • Resources - 列出您的直接/靜態資源
  • Resource Templates - 列出您的範本化資源

開啟 Resources 標籤的 MCP Inspector,顯示 Resources 下的 docs://documents 直接資源、Resource Templates 下的 fetch_doc 範本,以及 docs://documents 的 JSON 回應,包含其 URI、mimeType 和序列化的文件名稱清單

點擊任何資源以測試它。對於範本化資源,您需要為參數提供值。inspector 會顯示您的客戶端將收到的確切回應結構,包括 MIME 類型和序列化數據。

資源提供了一種乾淨的方式來公開來自您 MCP 伺服器的唯讀數據,讓客戶端能夠輕鬆獲取資訊,而無需處理工具呼叫的複雜性。