複雑なツールと曖昧なクエリには、最新のClaude Sonnet (4.5)またはClaude Opus (4.1)モデルの使用をお勧めします。これらは複数のツールをより適切に処理し、必要に応じて明確化を求めます。
シンプルなツールにはClaude Haikuモデルを使用できますが、欠落しているパラメータを推測する可能性があることに注意してください。
Claudeでツール使用と拡張思考を使用する場合は、こちらのガイドを参照してください。
クライアントツール(Anthropic定義のものとユーザー定義のもの両方)は、APIリクエストのtoolsトップレベルパラメータで指定されます。各ツール定義には以下が含まれます:
| パラメータ | 説明 |
|---|---|
name | ツールの名前。正規表現^[a-zA-Z0-9_-]{1,64}$と一致する必要があります。 |
description | ツールが何をするのか、いつ使用すべきか、どのように動作するかについての詳細なプレーンテキスト説明。 |
input_schema | ツールの予期されるパラメータを定義するJSON Schemaオブジェクト。 |
input_examples | (オプション、ベータ版)Claudeがツールの使用方法を理解するのに役立つサンプル入力オブジェクトの配列。ツール使用例の提供を参照してください。 |
toolsパラメータを使用してClaude APIを呼び出すと、ツール定義、ツール設定、およびユーザー指定のシステムプロンプトから特別なシステムプロンプトを構築します。構築されたプロンプトは、モデルに指定されたツールを使用するよう指示し、ツールが適切に動作するために必要なコンテキストを提供するように設計されています:
In this environment you have access to a set of tools you can use to answer the user's question.
{{ FORMATTING INSTRUCTIONS }}
String and scalar parameters should be specified as is, while lists and objects should use JSON format. Note that spaces for string values are not stripped. The output is not expected to be valid XML and is parsed with regular expressions.
Here are the functions available in JSONSchema format:
{{ TOOL DEFINITIONS IN JSON SCHEMA }}
{{ USER SYSTEM PROMPT }}
{{ TOOL CONFIGURATION }}Claudeでツールを使用する際に最高のパフォーマンスを得るには、以下のガイドラインに従ってください:
input_examplesの使用を検討してください。 明確な説明が最も重要ですが、複雑な入力、ネストされたオブジェクト、またはフォーマットに敏感なパラメータを持つツールの場合、input_examplesフィールド(ベータ版)を使用してスキーマ検証済みの例を提供できます。詳細はツール使用例の提供を参照してください。優れた説明は、ツールが何をするのか、いつ使用するのか、どのようなデータを返すのか、およびtickerパラメータが何を意味するのかを明確に説明しています。悪い説明は短すぎて、ツールの動作と使用方法についてClaudeに多くの未解決の質問を残しています。
有効なツール入力の具体的な例を提供して、Claudeがツールをより効果的に使用する方法を理解するのに役立てることができます。これは、ネストされたオブジェクト、オプションパラメータ、またはフォーマットに敏感な入力を持つ複雑なツールに特に役立ちます。
ツール使用例はベータ機能です。プロバイダーに適切なベータヘッダーを含めてください:
| プロバイダー | ベータヘッダー | サポートされているモデル |
|---|---|---|
| Claude API, Microsoft Foundry | advanced-tool-use-2025-11-20 | すべてのモデル |
| Vertex AI, Amazon Bedrock | tool-examples-2025-10-29 | Claude Opus 4.5のみ |
ツール定義にオプションのinput_examplesフィールドを追加し、サンプル入力オブジェクトの配列を指定します。各例はツールのinput_schemaに従って有効である必要があります:
import anthropic
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
betas=["advanced-tool-use-2025-11-20"],
tools=[
{
"name": "get_weather",
"description": "Get the current weather in a given location",
"input_schema": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "The unit of temperature"
}
},
"required": ["location"]
},
"input_examples": [
{
"location": "San Francisco, CA",
"unit": "fahrenheit"
},
{
"location": "Tokyo, Japan",
"unit": "celsius"
},
{
"location": "New York, NY" # 'unit' is optional
}
]
}
],
messages=[
{"role": "user", "content": "What's the weather like in San Francisco?"}
]
)例はツールスキーマと一緒にプロンプトに含まれ、Claudeに適切に形成されたツール呼び出しの具体的なパターンを示します。これにより、Claudeはオプションパラメータをいつ含めるか、どのフォーマットを使用するか、複雑な入力をどのように構造化するかを理解するのに役立ちます。
input_schemaに従って有効である必要があります。無効な例は400エラーを返しますツールランナーは、Claudeでツールを実行するためのすぐに使用できるソリューションを提供します。ツール呼び出し、ツール結果、会話管理を手動で処理する代わりに、ツールランナーは自動的に:
ほとんどのツール使用実装にはツールランナーの使用をお勧めします。
ツールランナーは現在ベータ版であり、Python、TypeScript、およびRuby SDKで利用可能です。
圧縮による自動コンテキスト管理
ツールランナーは自動圧縮をサポートしており、トークン使用量がしきい値を超えたときに要約を生成します。これにより、長時間実行されるエージェントタスクがコンテキストウィンドウの制限を超えて続行できます。
SDK ツールランナーはベータ版です。このドキュメントの残りの部分は、手動ツール実装をカバーしています。
場合によっては、Claudeがツールなしで答えを提供できると考えていても、特定のツールを使用してユーザーの質問に答えるようにClaudeに強制したいことがあります。これは、tool_choiceフィールドでツールを指定することで実行できます:
tool_choice = {"type": "tool", "name": "get_weather"}tool_choiceパラメータを使用する場合、4つの可能なオプションがあります:
autoはClaudeが提供されたツールを呼び出すかどうかを決定することを許可します。これはtoolsが提供されるときのデフォルト値です。anyはClaudeに提供されたツールの1つを使用する必要があることを伝えますが、特定のツールを強制しません。toolは特定のツールを常に使用するようにClaudeを強制することを許可します。noneはClaudeがツールを使用することを防止します。これはtoolsが提供されないときのデフォルト値です。プロンプトキャッシングを使用する場合、tool_choiceパラメータへの変更はキャッシュされたメッセージブロックを無効化します。ツール定義とシステムプロンプトはキャッシュされたままですが、メッセージコンテンツは再処理される必要があります。
このダイアグラムは、各オプションがどのように機能するかを示しています:

tool_choiceがanyまたはtoolの場合、アシスタントメッセージをプリフィルして、ツールを使用するよう強制することに注意してください。これは、明示的に要求された場合でも、モデルがtool_useコンテンツブロックの前に自然言語応答または説明を発行しないことを意味します。
拡張思考でツール使用を使用する場合、tool_choice: {"type": "any"}とtool_choice: {"type": "tool", "name": "..."}はサポートされておらず、エラーが発生します。tool_choice: {"type": "auto"}(デフォルト)とtool_choice: {"type": "none"}のみが拡張思考と互換性があります。
テストでは、これがパフォーマンスを低下させないことが示されています。モデルが特定のツールを使用するよう要求しながら、自然言語コンテキストまたは説明を提供するようにモデルに希望する場合は、tool_choiceに{"type": "auto"}(デフォルト)を使用し、userメッセージに明示的な指示を追加できます。例えば:What's the weather like in London? Use the get_weather tool in your response.
厳密なツールで保証されたツール呼び出し
tool_choice: {"type": "any"}を厳密なツール使用と組み合わせて、ツールの1つが呼び出されることを保証し、ツール入力がスキーマに厳密に従うことを保証します。ツール定義でstrict: trueを設定してスキーマ検証を有効にします。
ツールは必ずしもクライアント関数である必要はありません。提供されたスキーマに従うJSON出力をモデルに返させたい場合はいつでも、ツールを使用できます。例えば、特定のスキーマを持つrecord_summaryツールを使用する場合があります。完全に機能する例については、Claudeでのツール使用を参照してください。
ツールを使用する場合、Claudeはツールを呼び出す前に、自分が何をしているかについてコメントしたり、ユーザーに自然に応答したりすることがよくあります。
例えば、「サンフランシスコの現在の天気はどうですか、そこの時刻は何ですか?」というプロンプトが与えられた場合、Claudeは以下のように応答する可能性があります:
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "I'll help you check the current weather and time in San Francisco."
},
{
"type": "tool_use",
"id": "toolu_01A09q90qw90lq917835lq9",
"name": "get_weather",
"input": {"location": "San Francisco, CA"}
}
]
}この自然な応答スタイルは、ユーザーがClaudeが何をしているかを理解するのに役立ち、より会話的なインタラクションを作成します。システムプロンプトと、プロンプトに<examples>を提供することで、これらの応答のスタイルと内容をガイドできます。
Claudeが自分のアクションを説明する際に、様々な言い回しとアプローチを使用する可能性があることに注意することが重要です。コードはこれらの応答を他のアシスタント生成テキストと同じように扱い、特定のフォーマット規約に依存しないようにする必要があります。
デフォルトでは、Claudeはユーザークエリに答えるために複数のツールを使用する可能性があります。この動作は以下の方法で無効にできます:
autoの場合にdisable_parallel_tool_use=trueを設定すると、Claudeは最大1つのツールを使用しますanyまたはtoolの場合にdisable_parallel_tool_use=trueを設定すると、Claudeは正確に1つのツールを使用しますClaude 4モデルはデフォルトで優れた並列ツール使用機能を備えていますが、ターゲットプロンプティングを使用してすべてのモデルで並列ツール実行の可能性を高めることができます:
Claude Sonnet 3.7での並列ツール使用
Claude Sonnet 3.7は、disable_parallel_tool_useを設定していない場合でも、応答で並列ツール呼び出しを行う可能性が低い場合があります。Claude 4モデルへのアップグレードをお勧めします。これらはトークン効率的なツール使用と改善された並列ツール呼び出しを備えています。
Claude Sonnet 3.7をまだ使用している場合は、token-efficient-tools-2025-02-19 ベータヘッダーを有効にすることができます。これはClaudeが並列ツールを使用するよう促すのに役立ちます。また、他のツールへの呼び出しを同時にラップできるメタツールとして機能できる「バッチツール」を導入することもできます。
このワークアラウンドの使用方法については、このクックブックの例を参照してください。
ツールランナーの方がシンプル:このセクションで説明されている手動ツール処理は、ツールランナーによって自動的に管理されます。ツール実行をカスタム制御する必要がある場合は、このセクションを使用してください。
Claudeの応答は、クライアントツールとサーバーツールのどちらを使用するかによって異なります。
応答にはtool_useのstop_reasonと、以下を含む1つ以上のtool_useコンテンツブロックがあります:
id:この特定のツール使用ブロックの一意の識別子。これは後でツール結果と照合するために使用されます。name:使用されているツールの名前。input:ツールのinput_schemaに準拠するツールに渡される入力を含むオブジェクト。クライアントツールのツール使用応答を受け取った場合、以下を実行する必要があります:
tool_useブロックからname、id、およびinputを抽出します。inputを渡します。roleがuserの新しいメッセージを送信して会話を続行し、tool_resultタイプを含むcontentブロックと以下の情報を含めます:
tool_use_id:これが結果である対象のツール使用リクエストのid。content:ツールの結果。文字列(例:"content": "15 degrees")、ネストされたコンテンツブロックのリスト(例:"content": [{"type": "text", "text": "15 degrees"}])、またはドキュメントブロックのリスト(例:"content": ["type": "document", "source": {"type": "text", "media_type": "text/plain", "data": "15 degrees"}])。これらのコンテンツブロックはtext、image、またはdocumentタイプを使用できます。is_error(オプション):ツール実行がエラーで終了した場合はtrueに設定します。重要なフォーマット要件:
例えば、これは400エラーを引き起こします:
{"role": "user", "content": [
{"type": "text", "text": "Here are the results:"}, // ❌ tool_resultの前のテキスト
{"type": "tool_result", "tool_use_id": "toolu_01", ...}
]}これは正しいです:
{"role": "user", "content": [
{"type": "tool_result", "tool_use_id": "toolu_01", ...},
{"type": "text", "text": "What should I do next?"} // ✅ tool_resultの後のテキスト
]}「tool_use idsが見つかりましたが、その直後にtool_resultブロックがありません」というエラーが表示される場合は、ツール結果が正しくフォーマットされていることを確認してください。
ツール結果を受け取った後、Claudeはその情報を使用して、元のユーザープロンプトへの応答の生成を続行します。
Claudeはツールを内部で実行し、追加のユーザーインタラクションを必要とせずに結果を応答に直接組み込みます。
他のAPIとの違い
ツール使用を分離したり、toolまたはfunctionなどの特別なロールを使用したりするAPIとは異なり、Claude APIはツールをuserおよびassistantメッセージ構造に直接統合します。
メッセージにはtext、image、tool_use、およびtool_resultブロックの配列が含まれます。userメッセージにはクライアントコンテンツとtool_resultが含まれ、assistantメッセージにはAI生成コンテンツとtool_useが含まれます。
max_tokens停止理由の処理Claudeの応答がmax_tokens制限に達したため切り取られた場合、切り取られた応答に不完全なツール使用ブロックが含まれている場合は、より高いmax_tokens値でリクエストを再試行して、完全なツール使用を取得する必要があります。
# ツール使用中に応答が切り取られたかどうかを確認
if response.stop_reason == "max_tokens":
# 最後のコンテンツブロックが不完全なtool_useであるかどうかを確認
last_block = response.content[-1]
if last_block.type == "tool_use":
# より高いmax_tokensでリクエストを送信
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=4096, # 増加した制限
messages=messages,
tools=tools
)pause_turn停止理由の処理Webサーチなどのサーバーツールを使用する場合、APIはpause_turn停止理由を返す可能性があり、APIが長時間実行されているターンを一時停止したことを示します。
pause_turn停止理由を処理する方法は以下の通りです:
import anthropic
client = anthropic.Anthropic()
# Webサーチを使用した初期リクエスト
response = client.messages.create(
model="claude-3-7-sonnet-latest",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Search for comprehensive information about quantum computing breakthroughs in 2025"
}
],
tools=[{
"type": "web_search_20250305",
"name": "web_search",
"max_uses": 10
}]
)
# 応答がpause_turn停止理由を持つかどうかを確認
if response.stop_reason == "pause_turn":
# 一時停止されたコンテンツを含む会話を続行
messages = [
{"role": "user", "content": "Search for comprehensive information about quantum computing breakthroughs in 2025"},
{"role": "assistant", "content": response.content}
]
# 継続リクエストを送信
continuation = client.messages.create(
model="claude-3-7-sonnet-latest",
max_tokens=1024,
messages=messages,
tools=[{
"type": "web_search_20250305",
"name": "web_search",
"max_uses": 10
}]
)
print(continuation)
else:
print(response)pause_turnを処理する場合:
組み込みエラー処理:ツールランナーは、ほとんどの一般的なシナリオに対して自動エラー処理を提供します。このセクションでは、高度なユースケースの手動エラー処理について説明します。
Claudeでツールを使用する場合、いくつかの異なるタイプのエラーが発生する可能性があります: