ツール使用(tool use、いわゆる function calling)を使うと、Claude に「自分で用意した関数やAPIを呼びたい」と判断させ、その結果を受け取って最終的な回答を作らせることができます。天気の取得、データベース検索、計算など、モデル単体ではできない処理を安全に外部へ委ねるための仕組みです。この記事では、tools の定義からツール呼び出しの往復までを、実際のリクエストの形に沿って解説します。
ツール使用とは
ツール使用は、Claude に「どのツールをどんな引数で呼ぶべきか」を判断させ、実際の実行はあなたのコード側で行い、その結果をモデルに返して回答を続けさせる仕組みです。重要なのは、Claude 自身がツールを実行するわけではないという点です。Claude は「このツールをこの引数で呼びたい」というリクエスト(tool_use ブロック)を返すだけで、実際の関数呼び出しやAPIアクセスはあなたが行い、その戻り値を tool_result としてモデルに渡します。
これにより、最新の天気やデータベースの中身のような「モデルが知らない情報」を取り込んだり、計算・予約・メール送信のような「副作用のある操作」を、あなたのコードの管理下で実行できます。
tools を定義してリクエストする
まず、モデルに使わせたいツールを tools 配列で宣言します。各ツールには name、description、そして引数の形を表す input_schema(JSON Schema)を与えます。説明文はモデルが「いつ・どう使うか」を判断する材料になるので、丁寧に書くほど精度が上がります。
{
"model": "claude-sonnet-5",
"max_tokens": 1024,
"tools": [
{
"name": "get_weather",
"description": "指定した都市の現在の天気を取得する。都市名は日本語または英語。",
"input_schema": {
"type": "object",
"properties": {
"city": { "type": "string", "description": "天気を知りたい都市名" }
},
"required": ["city"]
}
}
],
"messages": [
{ "role": "user", "content": "東京の天気を教えて" }
]
}
ユーザーの質問がツールの出番だとモデルが判断すると、応答の stop_reason は tool_use になり、content に type: "tool_use" のブロック(id・name・input)が含まれます。
tool_use と tool_result を往復する
モデルが返した tool_use ブロックを見て、あなたのコードで対応する関数(ここでは天気APIの呼び出し)を実行します。その結果を、同じ tool_use_id を持つ tool_result ブロックとして、会話に追記して再度リクエストします。
"messages": [
{ "role": "user", "content": "東京の天気を教えて" },
{ "role": "assistant", "content": [
{ "type": "tool_use", "id": "toolu_01A...", "name": "get_weather",
"input": { "city": "東京" } }
]},
{ "role": "user", "content": [
{ "type": "tool_result", "tool_use_id": "toolu_01A...",
"content": "晴れ、30度、湿度60%" }
]}
]
この往復を繰り返し、モデルがツールを必要としなくなると、通常のテキスト応答(stop_reason: "end_turn")が返ります。エラーが起きた場合は tool_result に "is_error": true を付けて返すと、モデルがそれを踏まえて対応します。
tool_choice と並列ツール呼び出し
tool_choice でツールの使い方を制御できます。{"type": "auto"} はモデルに任せる既定動作、{"type": "any"} はいずれかのツールを必ず使わせる、{"type": "tool", "name": "get_weather"} は特定のツールを強制する指定です。
1回の応答で複数のツールを同時に呼びたい場合、モデルは複数の tool_use ブロックを一度に返すことがあります(並列ツール呼び出し)。その場合は、それぞれに対応する tool_result を同じユーザーメッセージ内にまとめて返します。並列呼び出しを確実に無効化したい場合は tool_choice の disable_parallel_tool_use を true にします。
よくあるつまずき
つまずきやすい点をいくつか挙げます。第一に、tool_result の tool_use_id は、モデルが返した tool_use の id と厳密に一致させる必要があります。第二に、tool_use を含むアシスタントメッセージを会話に残したまま、その直後に tool_result を返す順序を崩さないことです。第三に、ツールの description と input_schema が曖昧だと、モデルが誤った引数を渡したり、必要なのに呼ばなかったりします。最後に、実行結果をそのまま信頼せず、副作用のある操作(送金・削除など)は人間の確認を挟む設計にすると安全です。