快速參考
建立自訂工具
工具由四個部分定義,作為引數傳遞給 TypeScript 中的tool() 輔助函式或 Python 中的 @tool 裝飾器:
- 名稱: Claude 用來呼叫工具的唯一識別碼。
- 描述: 工具的功能。Claude 讀取此項以決定何時呼叫它。
- 輸入綱要: Claude 必須提供的引數。在 TypeScript 中,這始終是 Zod 綱要,處理程式的
args會自動從中輸入。在 Python 中,這是將名稱對應到類型的字典,例如{"latitude": float},SDK 會為您將其轉換為 JSON 綱要。Python 裝飾器也接受完整的 JSON 綱要字典,當您需要列舉、範圍、選用欄位或巢狀物件時。 - 處理程式: Claude 呼叫工具時執行的非同步函式。它接收已驗證的引數,並且必須傳回包含以下內容的物件:
createSdkMcpServer(TypeScript)或 create_sdk_mcp_server(Python)將其包裝在伺服器中。伺服器在應用程式內部以同步程序執行,而不是作為單獨的程序。
天氣工具範例
此範例定義get_temperature 工具並將其包裝在 MCP 伺服器中。它只設定工具;若要將其傳遞給 query 並執行它,請參閱下面的呼叫自訂工具。
tool() TypeScript 參考或 @tool Python 參考以取得完整的參數詳細資訊,包括 JSON 綱要輸入格式和傳回值結構。
呼叫自訂工具
透過mcpServers 選項將您建立的 MCP 伺服器傳遞給 query。mcpServers 中的鍵成為每個工具的完全限定名稱中的 {server_name} 區段:mcp__{server_name}__{tool_name}。在 allowedTools 中列出該名稱,以便工具執行而不會出現權限提示。
這些程式碼片段重複使用上面範例中的 weatherServer 來詢問 Claude 特定位置的天氣。
python weather.py(Python)或 npx tsx weather.ts(TypeScript)執行它。Claude 呼叫 get_temperature,指令碼會列印一行答案,顯示舊金山目前的溫度。
新增更多工具
伺服器在其tools 陣列中列出的工具數量不限。當伺服器上有多個工具時,您可以在 allowedTools 中個別列出每個工具,或使用萬用字元 mcp__weather__* 來涵蓋伺服器公開的每個工具。
下面的範例定義第二個工具 get_precipitation_chance,並將天氣工具範例中的 weatherServer 定義替換為在陣列中列出兩個工具的定義。
tool() 的 extras 引數或 createSdkMcpServer() 的選項中傳遞 alwaysLoad: true,以在初始提示中保留工具的完整綱要。
新增工具註釋
工具註釋是描述工具行為方式的選用中繼資料。在 TypeScript 中將它們作為tool() 輔助函式的第五個引數傳遞,或在 Python 中透過 @tool 裝飾器的 annotations 關鍵字引數傳遞。所有提示欄位都是布林值。
註釋是中繼資料,不是強制執行。標記為
readOnlyHint: true 的工具如果處理程式執行該操作,仍然可以寫入磁碟。保持註釋與處理程式準確。
此範例將 readOnlyHint 新增至天氣工具範例中的 get_temperature 工具。
ToolAnnotations。
控制工具存取
天氣工具範例註冊了伺服器並在allowedTools 中列出工具。本節涵蓋當您有多個工具或想要限制內建工具時如何限制存取範圍。如需了解工具名稱的構成方式,請參閱呼叫自訂工具。
設定允許的工具
tools 選項和允許/不允許清單會影響兩個層級:可用性(控制工具是否出現在 Claude 的上下文中)和權限(控制 Claude 嘗試呼叫後是否獲得批准)。tools 和裸名稱 disallowedTools 項目會變更可用性。allowedTools 和限定範圍的 disallowedTools 規則會變更權限。如果您在 allowedTools 中命名其中一個任務追蹤工具,Claude Code 也會選擇加入工作階段。
若要完全移除內建工具,請從
tools 中省略它或在 disallowedTools 中列出其裸名稱(Python:disallowed_tools);兩者都會將工具保留在上下文之外,以便 Claude 永遠不會嘗試它。限定範圍的 disallowedTools 規則會阻止相符的呼叫,但將工具保留為可見,因此 Claude 可能會浪費一個回合嘗試它。如需完整的評估順序,請參閱設定權限。
處理錯誤
處理程式錯誤不會停止代理迴圈。SDK 的同處理程序 MCP 伺服器會捕捉未捕捉的例外狀況,並將其作為錯誤結果返回,因此您報告錯誤的方式決定了 Claude 讀取的內容,而不是查詢是否失敗:
在這兩種情況下,Claude 都可以重試、嘗試不同的工具或解釋失敗。當原始例外狀況訊息不足以讓 Claude 採取行動時,請自行捕捉錯誤。
下面的範例在處理程式內捕捉兩種失敗,並撰寫 Claude 讀取的錯誤訊息。非 200 HTTP 狀態碼從回應中捕捉並作為錯誤結果返回。網路錯誤或無效的 JSON 由周圍的
try/except (Python) 或 try/catch (TypeScript) 捕捉,也作為錯誤結果返回。在這兩種情況下,Claude 都會收到描述失敗的訊息,而不是裸露的例外狀況字串。
返回影像和資源
工具結果中的content 陣列接受 text、image、audio、resource 和 resource_link 區塊。您可以在同一個回應中混合使用它們。在 TypeScript 中,SDK 會將音訊區塊儲存到磁碟,Claude 會收到一個包含已儲存檔案路徑的文字區塊;在 Python 中,SDK 會從工具結果中移除音訊區塊並記錄警告。
Claude 會將每個資源連結區塊作為文字區塊接收,其中包含連結的名稱、URI 和描述。在 TypeScript 中,您的應用程式也會在使用者訊息的 tool_use_result 上以 resourceLinks 的形式接收連結本身;在 Python 中,SDK 會在 CLI 看到結果之前將它們扁平化為文字,因此 Python resourceLinks 鍵 永遠不會針對程序內工具產生。
影像
影像區塊以 base64 編碼的方式內聯攜帶影像位元組。沒有 URL 欄位。若要返回位於 URL 的影像,請在處理程式中擷取它、讀取回應位元組,並在返回之前進行 base64 編碼。結果會作為視覺輸入進行處理。資源
資源區塊嵌入由 URI 識別的內容片段。URI 是 Claude 稍後參考的標籤;實際內容位於區塊的text 或 blob 欄位中。當您的工具產生的內容稍後按名稱尋址時使用此功能,例如產生的檔案或來自外部系統的記錄。
此範例顯示從工具處理程式內部返回的資源區塊。URI
file:///tmp/report.md 是 Claude 稍後可以參考的標籤;SDK 不會從該路徑讀取。
CallToolResult 類型。請參閱 MCP 規格 以取得完整定義。
返回結構化資料
structuredContent 是結果上的選用 JSON 物件,與 content 陣列分開。使用它來返回原始值,Claude 可以將其讀取為確切的欄位,而不是從文字字串或影像中解析它們。
當設定 structuredContent 時,Claude 會收到 JSON 加上來自 content 的任何影像或資源區塊。content 中的文字區塊不會被轉發,因為假設它們會複製結構化資料。下面的範例將圖表呈現為影像區塊,並從同一個處理程式的 structuredContent 中返回其背後的資料點。在程式碼片段中,chartPngBuffer 是一個包含已呈現 PNG 位元組的 Buffer。
TypeScript
Python
@tool 裝飾器只會從處理程式的返回字典中轉發 content 和 is_error。若要從 Python 返回 structuredContent,請改為執行獨立 MCP 伺服器,而不是同處理程序 SDK 伺服器。範例:單位轉換器
此工具在長度、溫度和重量的單位之間轉換數值。使用者可以詢問「將 100 公里轉換為英里」或「72°F 是多少攝氏度」,Claude 會從請求中選擇正確的單位類型和單位。 它展示了兩種模式:- Enum schemas:
unit_type受限於一組固定值。在 TypeScript 中,使用z.enum()。在 Python 中,dict schema 不支援 enum,因此需要完整的 JSON Schema dict。 - 不支援的輸入處理: 當找不到轉換對時,處理程式會傳回
isError: true,以便 Claude 可以告訴使用者出了什麼問題,而不是將失敗視為正常結果。
query。此範例在迴圈中發送三個不同的提示,以展示相同的工具處理不同的單位類型。對於每個回應,它檢查 AssistantMessage 物件(包含該輪中 Claude 進行的工具呼叫)並在列印最終 ResultMessage 文字之前列印每個 ToolUseBlock。這讓您可以看到 Claude 何時使用工具與何時從自己的知識回答。
因為 tool search 預設為開啟,輸出也可能包含 ToolSearch 呼叫,因為 Claude 載入延遲的工具 schema。
後續步驟
您可以在同一個伺服器上混合使用本頁面的模式:單一伺服器可以同時包含資料庫工具、API 閘道工具和影像渲染器。 從這裡開始:- 如果您的伺服器增長到數十個工具,請參閱工具搜尋以延遲載入它們,直到 Claude 需要它們為止。
- 若要連接到外部 MCP 伺服器(檔案系統、GitHub、Slack)而不是建立您自己的伺服器,請參閱連接 MCP 伺服器。
- 若要控制哪些工具自動執行與需要核准,請參閱設定權限。