Claude API のツール使用は「コードがどこで実行されるか」によって大きく2種類に分かれます。この違いを理解していないと、エージェント実装の設計が大きく変わります。

クライアントツール:自分で定義・実行する

クライアントツールはスキーマをユーザーが記述し、ツールの実行もユーザーのコードで行います。Claude は stop_reason: "tool_use" とともに tool_use ブロックを返してくるので、そのツール名と引数を見て自分でツールを実行し、結果を tool_result として返すループを繰り返します。

messages = [{"role": "user", "content": "東京と大阪の天気を教えて"}]
response = client.messages.create(model="claude-opus-4-8", max_tokens=1024,
                                   tools=tools, messages=messages)

while response.stop_reason == "tool_use":
    tool_results = []
    for block in response.content:
        if block.type == "tool_use":
            result = execute_tool(block.name, block.input)
            tool_results.append({
                "type": "tool_result",
                "tool_use_id": block.id,
                "content": result,
            })
    # 並列呼び出し時:全結果を単一メッセージにまとめる
    messages.append({"role": "assistant", "content": response.content})
    messages.append({"role": "user", "content": tool_results})
    response = client.messages.create(model="claude-opus-4-8", max_tokens=1024,
                                       tools=tools, messages=messages)

サーバーツール:Anthropic が実行する

サーバーツールはAnthropicのインフラ上で実行されます。現在提供されているサーバーツールは web_searchweb_fetchcode_executiontool_search の4種類です。リクエストにツールを指定するだけで、Claude が内部でツールを実行し最終回答を返します。エージェントループを自分で実装する必要がありません。

response = client.messages.create(
    model="claude-opus-4-8",
    max_tokens=1024,
    tools=[{"type": "web_search_20260209", "name": "web_search"}],
    messages=[{"role": "user", "content": "Claude 4 の最新情報を調べて"}],
)
# ループ不要。response には検索結果を踏まえた最終回答が入っている

サーバーツールの tool_use ブロックの ID は srvtoolu_ で始まります。サーバーが長時間実行中に上限に達すると stop_reason: "pause_turn" が返ります。その場合は一時停止されたコンテンツをそのまま送り直すことで処理を再開できます。

strict: true でスキーマ準拠を強制する

クライアントツール(ユーザー定義)に strict: true を設定すると、文法制約付きサンプリングによって Claude のツール呼び出しが必ずスキーマと一致するようになります。型の不一致や必須フィールドの欠落がなくなるため、呼び出し時のバリデーションコードが不要になります。additionalProperties: Falserequired の明示が必須です。

tools=[{
    "name": "get_weather",
    "description": "指定都市の天気を取得する",
    "strict": True,
    "input_schema": {
        "type": "object",
        "properties": {
            "location": {"type": "string", "description": "都市名"},
            "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},
        },
        "required": ["location", "unit"],
        "additionalProperties": False,
    },
}]

strict: true はスキーマの文法検証だけでなく、Claude が「スキーマに存在しないフィールドを生成しない」保証を与えます。構造化データ抽出やフォーム入力補助など、出力形式の厳密さが重要な場面で特に有効です。

並列ツール使用

Claude は1つのターンで複数のツールを同時に呼び出すことができます(デフォルトで有効)。並列呼び出し時は、すべての tool_result単一のユーザーメッセージにまとめて返す必要があります。結果を別メッセージに分けると、次回以降の並列呼び出しが減る原因になります。

無効化したい場合は tool_choicedisable_parallel_tool_use: true を設定します。

まとめ

項目 クライアントツール サーバーツール
定義者 ユーザー Anthropic
実行者 ユーザーのコード Anthropicのインフラ
エージェントループ 必要 不要
ID プレフィックス toolu_ srvtoolu_
代表例 カスタム関数・DB検索 web_search, code_execution
  • サーバーツールはシンプルに使えるが、実行の細かい制御はできない
  • クライアントツールには strict: true でスキーマ準拠を保証できる
  • 並列ツール呼び出しの結果は必ず単一のユーザーメッセージにまとめる