query に渡し、Claude がアクセスできるツールを制御する方法について説明します。また、エラーハンドリング、ツール注釈、および画像などの非テキストコンテンツを返す方法についても説明します。
クイックリファレンス
| 実行したい操作 | 方法 |
|---|---|
| ツールを定義する | Python では @tool、TypeScript では tool() を使用して、名前、説明、スキーマ、ハンドラーを指定します。カスタムツールを作成するを参照してください。 |
| Claude にツールを登録する | create_sdk_mcp_server / createSdkMcpServer でラップし、query() の mcpServers に渡します。カスタムツールを呼び出すを参照してください。 |
| ツールを事前承認する | 許可されたツールに追加します。許可されたツールを設定するを参照してください。 |
| Claude のコンテキストから組み込みツールを削除する | 必要な組み込みのみをリストする tools 配列を渡します。許可されたツールを設定するを参照してください。 |
| Claude がツールを並列で呼び出せるようにする | 副作用のないツールに readOnlyHint: true を設定します。ツール注釈を追加するを参照してください。 |
| ループを停止せずにエラーを処理する | throw の代わりに isError: true を返します。エラーを処理するを参照してください。 |
| 画像またはファイルを返す | コンテンツ配列で image または resource ブロックを使用します。画像とリソースを返すを参照してください。 |
| マシン可読 JSON 結果を返す | 結果に structuredContent を設定します。構造化データを返すを参照してください。 |
| 多くのツールにスケーリングする | ツール検索を使用して、オンデマンドでツールを読み込みます。 |
カスタムツールを作成する
ツールは 4 つの部分で定義され、TypeScript のtool() ヘルパーまたは Python の @tool デコレーターに引数として渡されます。
- 名前: Claude がツールを呼び出すために使用する一意の識別子。
- 説明: ツールが何をするかを説明します。Claude はこれを読んで、ツールをいつ呼び出すかを決定します。
- 入力スキーマ: Claude が提供する必要がある引数。TypeScript では常に Zod スキーマであり、ハンドラーの
argsは自動的に型付けされます。Python では{"latitude": float}のような名前から型へのマッピングであり、SDK が JSON Schema に変換します。Python デコレーターは、列挙型、範囲、オプションフィールド、またはネストされたオブジェクトが必要な場合、完全な JSON Schema 辞書も受け入れます。 - ハンドラー: Claude がツールを呼び出すときに実行される非同期関数。検証された引数を受け取り、以下を含むオブジェクトを返す必要があります。
content(必須):結果ブロックの配列。各ブロックは"text"、"image"、または"resource"のtypeを持ちます。非テキストブロックについては、画像とリソースを返すを参照してください。structuredContent(オプション):結果をマシン可読データとして保持する JSON オブジェクト。contentと共に返されます。構造化データを返すを参照してください。isError(オプション):ツール障害を通知するためにtrueに設定し、Claude が対応できるようにします。エラーを処理するを参照してください。
createSdkMcpServer(TypeScript)または create_sdk_mcp_server(Python)でサーバーにラップします。サーバーはアプリケーション内でインプロセスで実行され、別のプロセスとしては実行されません。
天気ツールの例
この例はget_temperature ツールを定義し、MCP サーバーにラップします。ツールのセットアップのみを行います。query に渡して実行するには、以下の カスタムツールを呼び出すを参照してください。
tool() TypeScript リファレンスまたは @tool Python リファレンスを参照してください。JSON Schema 入力形式と戻り値の構造を含みます。
カスタムツールを呼び出す
作成した MCP サーバーをmcpServers オプション経由で query に渡します。mcpServers のキーは各ツールの完全修飾名の {server_name} セグメントになります:mcp__{server_name}__{tool_name}。その名前を allowedTools にリストして、ツールが許可プロンプトなしで実行されるようにします。
これらのスニペットは、上記の例の weatherServer を再利用して、特定の場所の天気について Claude に尋ねます。
さらにツールを追加する
サーバーはtools 配列にリストされた数だけのツールを保持します。複数のツールがサーバーにある場合、allowedTools で各ツールを個別にリストするか、ワイルドカード mcp__weather__* を使用してサーバーが公開するすべてのツールをカバーできます。
以下の例は、天気ツールの例の weatherServer に 2 番目のツール get_precipitation_chance を追加し、両方のツールを配列で再構築します。
ツール注釈を追加する
ツール注釈は、ツールの動作を説明するオプションのメタデータです。TypeScript のtool() ヘルパーの 5 番目の引数として、または Python の @tool デコレーターの annotations キーワード引数として渡します。すべてのヒントフィールドはブール値です。
| フィールド | デフォルト | 意味 |
|---|---|---|
readOnlyHint | false | ツールは環境を変更しません。ツールが他の読み取り専用ツールと並列で呼び出せるかどうかを制御します。 |
destructiveHint | true | ツールは破壊的な更新を実行する可能性があります。情報提供のみです。 |
idempotentHint | false | 同じ引数での繰り返し呼び出しは追加の効果がありません。情報提供のみです。 |
openWorldHint | true | ツールはプロセス外のシステムに到達します。情報提供のみです。 |
readOnlyHint: true でマークされたツールは、ハンドラーがそれを行う場合、ディスクに書き込むことができます。注釈をハンドラーに正確に保ちます。
この例は、天気ツールの例の get_temperature ツールに readOnlyHint を追加します。
ToolAnnotations を参照してください。
ツールアクセスを制御する
天気ツールの例はサーバーを登録し、allowedTools にツールをリストしました。このセクションでは、ツール名がどのように構成されるか、および複数のツールがある場合や組み込みを制限したい場合にアクセスをスコープする方法について説明します。
ツール名形式
MCP ツールが Claude に公開されるとき、それらの名前は特定の形式に従います。- パターン:
mcp__{server_name}__{tool_name} - 例:
weatherサーバーのget_temperatureという名前のツールはmcp__weather__get_temperatureになります
許可されたツールを設定する
tools オプションと許可/禁止リストは 2 つのレイヤーに影響します。可用性はツールが Claude のコンテキストに表示されるかどうかを制御し、許可は Claude がそれを試みた後に呼び出しが承認されるかどうかを制御します。tools と裸の名前の disallowedTools エントリは可用性を変更します。allowedTools とスコープされた disallowedTools ルールは許可のみを変更します。
| オプション | レイヤー | 効果 |
|---|---|---|
tools: ["Read", "Grep"] | 可用性 | リストされた組み込みのみが Claude のコンテキストにあります。リストされていない組み込みは削除されます。MCP ツールは影響を受けません。 |
tools: [] | 可用性 | すべての組み込みが削除されます。Claude は MCP ツールのみを使用できます。 |
| 許可されたツール | 許可 | リストされたツールは許可プロンプトなしで実行されます。リストされていないツールは利用可能なままです。呼び出しは許可フローを通ります。 |
| 禁止されたツール | 両方 | "Bash" などの裸のツール名はツールを Claude のコンテキストから削除します。これは tools から省略するのと同じです。"Bash(rm *)" などのスコープされたルールはツールをコンテキストに残し、一致する呼び出しのみを拒否します。 |
tools から省略するか、disallowedTools(Python:disallowed_tools)に裸の名前をリストします。どちらもツールをコンテキストから外すため、Claude はそれを試みることはありません。スコープされた disallowedTools ルールは一致する呼び出しをブロックしますが、ツールを表示したままにするため、Claude はそれを試みるターンを無駄にする可能性があります。完全な評価順序については、許可を設定するを参照してください。
エラーを処理する
ハンドラーがエラーを報告する方法は、エージェントループが続行するか停止するかを決定します。| 何が起こるか | 結果 |
|---|---|
| ハンドラーがキャッチされない例外をスロー | エージェントループが停止します。Claude はエラーを見ず、query 呼び出しが失敗します。 |
ハンドラーがエラーをキャッチして isError: true(TS)/ "is_error": True(Python)を返す | エージェントループが続行します。Claude はエラーをデータとして見て、再試行、別のツールを試す、または失敗を説明できます。 |
try/except(Python)または try/catch(TypeScript)でキャッチされ、エラー結果としても返されます。どちらの場合も、ハンドラーは正常に返され、エージェントループが続行されます。
画像とリソースを返す
ツール結果のcontent 配列は text、image、および resource ブロックを受け入れます。同じ応答でそれらを混ぜることができます。
画像
画像ブロックは画像バイトをインラインで、base64 としてエンコードされた状態で運びます。URL フィールドはありません。URL に存在する画像を返すには、ハンドラーで取得し、応答バイトを読み取り、返す前に base64 エンコードします。結果は視覚入力として処理されます。| フィールド | 型 | 注釈 |
|---|---|---|
type | "image" | |
data | string | Base64 エンコードされたバイト。data:image/...;base64, プレフィックスなしの生の base64 のみ |
mimeType | string | 必須。例えば image/png、image/jpeg、image/webp、image/gif |
リソース
リソースブロックは URI で識別されるコンテンツを埋め込みます。URI は Claude が参照するためのラベルです。実際のコンテンツはブロックのtext または blob フィールドに含まれます。これは、生成されたファイルや外部システムのレコードなど、後で名前で対処することが理にかなっているツールが生成するものを使用します。
| フィールド | 型 | 注釈 |
|---|---|---|
type | "resource" | |
resource.uri | string | コンテンツの識別子。任意の URI スキーム |
resource.text | string | テキストの場合のコンテンツ。blob ではなく、これを提供します |
resource.blob | string | バイナリの場合、base64 エンコードされたコンテンツ |
resource.mimeType | string | オプション |
file:///tmp/report.md は Claude が後で参照できるラベルです。SDK はそのパスから読み取りません。
CallToolResult 型から来ています。完全な定義については、MCP 仕様を参照してください。
構造化データを返す
structuredContent は結果のオプションの JSON オブジェクトで、content 配列とは別です。テキスト文字列または画像から解析する代わりに、Claude が正確なフィールドとして読み取ることができる生の値を返すために使用します。
structuredContent が設定されると、Claude は JSON と content からの任意の画像またはリソースブロックを受け取ります。content のテキストブロックは転送されません。構造化データを複製すると想定されるためです。以下の例は、チャートを画像ブロックとしてレンダリングし、同じハンドラーから structuredContent でそれの背後にあるデータポイントを返します。
TypeScript
Python
@tool デコレーターはハンドラーの戻り辞書から content と is_error のみを転送します。Python から structuredContent を返すには、インプロセス SDK サーバーの代わりに スタンドアロン MCP サーバーを実行します。例:単位変換ツール
このツールは長さ、温度、重量の単位間で値を変換します。ユーザーは「100 キロメートルをマイルに変換」または「72°F は摂氏何度か」と尋ねることができ、Claude はリクエストから正しい単位タイプと単位を選択します。 2 つのパターンを示しています。- 列挙型スキーマ:
unit_typeは固定値のセットに制限されます。TypeScript ではz.enum()を使用します。Python では、辞書スキーマは列挙型をサポートしないため、完全な JSON Schema 辞書が必要です。 - サポートされていない入力処理: 変換ペアが見つからない場合、ハンドラーは
isError: trueを返すため、Claude はユーザーに何が間違っていたかを伝えることができ、失敗を通常の結果として扱いません。
query に渡します。この例は、同じツールが異なる単位タイプを処理することを示すために、ループで 3 つの異なるプロンプトを送信します。各応答について、AssistantMessage オブジェクト(Claude がそのターン中に行ったツール呼び出しを含む)を検査し、最終的な ResultMessage テキストを出力する前に各 ToolUseBlock を出力します。これにより、Claude がツールを使用しているのか、独自の知識から答えているのかを確認できます。
次のステップ
カスタムツールは非同期関数を標準インターフェースにラップします。このページのパターンを同じサーバーで混ぜることができます。単一のサーバーは、データベースツール、API ゲートウェイツール、および画像レンダラーを並べて保持できます。 ここから:- サーバーが数十のツールに成長する場合は、ツール検索を参照して、Claude がそれらを必要とするまで読み込みを遅延させます。
- 独自のツールを構築する代わりに、外部 MCP サーバー(ファイルシステム、GitHub、Slack)に接続するには、MCP サーバーを接続するを参照してください。
- どのツールが自動的に実行されるか、承認が必要かを制御するには、許可を設定するを参照してください。