Claude API ツールユース完全ガイド|Python実装と活用例

AI・ChatGPT活用

API を使った AI 統合を進める中で、こんな課題に直面していませんか。「Claude に単純な質問だけでなく、実際にプログラムを実行させたい」「API から外部のツールやデータベースを自動で呼び出したい」「複雑なワークフローを AI に自動化させたい」。こうした課題は、エンジニアなら誰もが一度は感じるはずです。

実は、Claude API が提供するツールユース(Tool Use)機能を使えば、こうした課題は驚くほど簡単に解決します。ツールユースを活用することで、Claude を単なるテキスト生成エンジンから、外部システムと連携する知的なエージェントへと進化させることができるのです。

このガイドでは、Claude API のツールユース機能を Python で実装する方法を、初心者向けから実践的なレベルまで段階的に説明します。コード例を交えながら、実装の細部まで解説していきます。

Claude API のツールユースとは

ツールユースは、Claude が関数を実行したり、外部のツール・API を呼び出したりできる仕組みです。従来の Claude との会話では、Claude が返すのはテキスト応答だけでした。しかし、ツールユースを有効にすると、Claude は「このタスクを実行するには、この関数を呼び出す必要があります」と判断し、その関数の呼び出しを要求できるようになります。

わかりやすく言えば、Claude が「計算機」「ブラウザ」「データベース」などの道具を使えるようになる、ということです。これにより、Claude は知識ベースだけでなく、リアルタイムデータの取得システム操作など、より複雑なタスクに対応できるようになります。

ツールユースの基本的なフロー:

  1. ユーザーが Claude にタスクを依頼する
  2. Claude がタスク完遂に必要なツールを判断する
  3. Claude がツール(関数)の呼び出しを API レスポンスで返す
  4. アプリケーションがその関数を実行する
  5. 実行結果を Claude に返す
  6. Claude が結果に基づいて最終的な応答を生成する

Python で Claude API を セットアップする

まず、Claude API を使うための基本的なセットアップを行います。Python 環境がある場合は、次のコマンドで Anthropic ライブラリをインストールしてください。

pip install anthropic python-dotenv

次に、API キーを環境変数に設定します。Anthropic コンソールから API キーを取得し、.env ファイルに保存してください。

ANTHROPIC_API_KEY=your-api-key-here

Python コード内では次のように読み込みます。

import os
from anthropic import Anthropic
from dotenv import load_dotenv

load_dotenv()
client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))

ツールユースの実装ステップ

ステップ 1:ツール定義を準備する

Claude にツールを使わせるには、まずツール定義を JSON 形式で用意する必要があります。ツール定義には、関数の名前、説明、そしてパラメータの仕様が含まれます。

例えば、天気情報を取得するツールを定義する場合:

tools = [
    {
        "name": "get_weather",
        "description": "指定した都市の現在の気象情報を取得します",
        "input_schema": {
            "type": "object",
            "properties": {
                "city": {
                    "type": "string",
                    "description": "都市名(例:東京、ニューヨーク)"
                },
                "unit": {
                    "type": "string",
                    "enum": ["celsius", "fahrenheit"],
                    "description": "気温の単位"
                }
            },
            "required": ["city"]
        }
    }
]

このツール定義に重要なポイントがあります。description フィールドは詳細にすることが極めて重要です。Claude がツールを適切に選択・実行できるかは、説明の質にかかっているのです。

ステップ 2:ツール実行ロジックを実装する

次に、Claude が指定したツールを実際に実行するロジックを実装します。以下は、天気情報取得関数の例です。

def get_weather(city: str, unit: str = "celsius") -> dict:
    """実際の天気情報取得ロジック(ここではダミーデータを返す)"""
    weather_data = {
        "東京": {"temp": 22, "condition": "晴れ", "humidity": 60},
        "ニューヨーク": {"temp": 18, "condition": "曇り", "humidity": 55},
        "ロンドン": {"temp": 15, "condition": "雨", "humidity": 75}
    }
    
    if city not in weather_data:
        return {"error": f"都市 {city} の情報が見つかりません"}
    
    data = weather_data[city]
    if unit == "fahrenheit":
        data["temp"] = (data["temp"] * 9/5) + 32
    
    return data

def process_tool_call(tool_name: str, tool_input: dict) -> str:
    """Claude からのツール呼び出しを処理する"""
    if tool_name == "get_weather":
        result = get_weather(**tool_input)
        return str(result)
    else:
        return f"不明なツール: {tool_name}"

ステップ 3:Claude API を呼び出す

ツール定義と実行ロジックが整ったら、Claude API を呼び出します。重要なのは、Claude がツールを使いたいと判断した場合、API はtool_useタイプの content ブロックを返すという点です。

def chat_with_tools(user_message: str) -> str:
    """ツールユースを有効にして Claude と会話する"""
    messages = [{"role": "user", "content": user_message}]
    
    # Claude API を呼び出す(ツール定義を含める)
    response = client.messages.create(
        model="claude-3-5-sonnet-20241022",
        max_tokens=1024,
        tools=tools,
        messages=messages
    )
    
    # response.stop_reason がツール呼び出しの場合、ツールを実行
    while response.stop_reason == "tool_use":
        # ツール呼び出しコンテンツを取得
        tool_use_block = next(
            (block for block in response.content if block.type == "tool_use"),
            None
        )
        
        if not tool_use_block:
            break
        
        # ツール実行結果を取得
        tool_result = process_tool_call(
            tool_use_block.name,
            tool_use_block.input
        )
        
        # 会話履歴に追加
        messages.append({"role": "assistant", "content": response.content})
        messages.append({
            "role": "user",
            "content": [
                {
                    "type": "tool_result",
                    "tool_use_id": tool_use_block.id,
                    "content": tool_result
                }
            ]
        })
        
        # 次のレスポンスを取得(Claude は結果を踏まえて応答)
        response = client.messages.create(
            model="claude-3-5-sonnet-20241022",
            max_tokens=1024,
            tools=tools,
            messages=messages
        )
    
    # 最終的なテキスト応答を抽出
    final_response = next(
        (block.text for block in response.content if hasattr(block, "text")),
        "応答がありません"
    )
    
    return final_response

ステップ 4:実装をテストする

完成した関数をテストしてみましょう。

if __name__ == "__main__":
    # 例 1:単純な質問
    result = chat_with_tools("東京の天気はどうですか?")
    print(f"Claude: {result}\n")
    
    # 例 2:複数都市の比較
    result = chat_with_tools("東京とニューヨークの気温を摂氏で比べてください")
    print(f"Claude: {result}\n")
    
    # 例 3:単位変換を含む
    result = chat_with_tools("ロンドンの気温を華氏で教えてください")
    print(f"Claude: {result}\n")

このコードを実行すると、Claude が自動的にget_weatherツールを呼び出し、取得した情報を用いて自然な日本語の応答を生成します。

実践的な応用例

複数ツールの組み合わせ

実際のアプリケーションでは、複数のツールを組み合わせることが一般的です。例えば、電卓と通貨換算ツールを組み合わせた例を示します。

tools = [
    {
        "name": "calculate",
        "description": "数式を計算します(例:100 * 2 + 50)",
        "input_schema": {
            "type": "object",
            "properties": {
                "expression": {
                    "type": "string",
                    "description": "計算する数式"
                }
            },
            "required": ["expression"]
        }
    },
    {
        "name": "convert_currency",
        "description": "金額を別の通貨に換算します",
        "input_schema": {
            "type": "object",
            "properties": {
                "amount": {
                    "type": "number",
                    "description": "金額"
                },
                "from_currency": {
                    "type": "string",
                    "description": "元の通貨コード(例:JPY、USD)"
                },
                "to_currency": {
                    "type": "string",
                    "description": "変換先通貨コード(例:JPY、USD)"
                }
            },
            "required": ["amount", "from_currency", "to_currency"]
        }
    }
]

def calculate(expression: str) -> str:
    """数式を計算する"""
    try:
        result = eval(expression)
        return str(result)
    except Exception as e:
        return f"計算エラー: {str(e)}"

def convert_currency(amount: float, from_currency: str, to_currency: str) -> str:
    """通貨を換算する(ダミー為替レート)"""
    rates = {
        ("JPY", "USD"): 0.0067,
        ("USD", "JPY"): 149.5,
        ("USD", "EUR"): 0.92,
        ("EUR", "USD"): 1.09
    }
    
    rate = rates.get((from_currency, to_currency))
    if rate is None:
        return f"換算レートが見つかりません: {from_currency} -> {to_currency}"
    
    result = amount * rate
    return f"{amount} {from_currency} = {result:.2f} {to_currency}"

def process_tool_call(tool_name: str, tool_input: dict) -> str:
    """ツール呼び出しを処理する(複数ツール対応)"""
    if tool_name == "calculate":
        return calculate(tool_input["expression"])
    elif tool_name == "convert_currency":
        return convert_currency(
            tool_input["amount"],
            tool_input["from_currency"],
            tool_input["to_currency"]
        )
    else:
        return f"不明なツール: {tool_name}"

このような複数ツール構成では、Claude が自動的に必要なツールを組み合わせて使用します。例えば「100ドルをユーロに換算して、さらに 50% 増加した額を計算してください」というリクエストに対応できます。

リアルタイムデータの活用

ツールユースの本当の力は、リアルタイムデータを活用する際に発揮されます。API や Web スクレイピングを組み込むことで、Claude は常に最新の情報を使用できるようになります。

例えば、実際のニュース API や金融データベースと連携することで、Claude は「現在の株価に基づいて、投資の判断を助言する」といった高度なタスクに対応できます。

ツールユース実装時の注意点

トークン消費量の管理

ツールユースを使う場合、Claude への往復通信が増加するため、トークン消費量が増えます。特に複雑なワークフローでは、多数の API 呼び出しが発生する可能性があります。本番環境では最大ループ数の制限を設けることをお勧めします。

max_iterations = 5
iteration = 0

while response.stop_reason == "tool_use" and iteration < max_iterations:
    # ツール処理...
    iteration += 1

if iteration >= max_iterations:
    print("最大ループ数に達しました")

エラーハンドリングの強化

ツール実行時にエラーが発生することは避けられません。Claude にわかりやすいエラーメッセージを返すことが、適切な対応を促します。

tool_result = process_tool_call(tool_name, tool_input)

# エラーメッセージに "error" キーワードが含まれる場合
if "error" in tool_result.lower():
    messages.append({
        "role": "user",
        "content": [
            {
                "type": "tool_result",
                "tool_use_id": tool_use_block.id,
                "content": tool_result,
                "is_error": True  # Claude にエラーを認識させる
            }
        ]
    })
else:
    # 通常の結果
    messages.append({
        "role": "user",
        "content": [
            {
                "type": "tool_result",
                "tool_use_id": tool_use_block.id,
                "content": tool_result
            }
        ]
    })

セキュリティとのバランス

Claude がツール経由でシステムにアクセスできるようにする場合、セキュリティの確保が極めて重要です。ユーザー入力のバリデーション、実行権限の制限、監査ログの記録などを必ず実装してください。

Claude API との統合時のスキルアップ

ツールユース実装は、AI エージェント開発の基礎となるスキルです。この知識を深めることで、より複雑なシステム構築が可能になります。例えば、OpenAI Realtime API を使った音声対応 AI エージェントへの応用も、同じ考え方で実装できます。

また、自動化スキルをさらに高めたい場合は、Claude Computer Use によるブラウザ自動化も検討する価値があります。これらの技術を組み合わせることで、AI の可能性は大きく広がります。

加えて、AI 開発スキルは転職市場でも高く評価されるようになっています。SIer エンジニアが Web 系へ転職する際にも、こうした AI 活用スキルは大きな差別化要因になります。

おすすめ書籍・ガジェット

  • Claude API 実装ガイド:Claude の全機能を網羅した実践的な解説書。ツールユースから高度な活用法まで、プロダクション環境での実装ノウハウが詰まっています。
  • LLM エージェント開発:実践的な AI システム構築:複数の大規模言語モデルを使ったエージェント開発の包括的ガイド。Claude だけでなく、他のモデルとの比較も豊富です。
  • HHKB Hybrid キーボード:長時間のコーディング作業を快適にするプログラマー向けキーボード。Claude API 実装の効率化に役立つアイテムです。

まとめ

Claude API のツールユース機能を使うことで、Claude を単なるテキスト生成ツールから、外部システムと連携する知的なエージェントへと進化させることができます。

このガイドで学んだ内容をまとめると:

  1. ツール定義を JSON スキーマで記述する
  2. ツール実行関数を実装する
  3. Claude API のレスポンスを処理し、ツール呼び出しを実行する
  4. 結果を Claude に返してワークフローを完成させる
  5. エラーハンドリングとセキュリティを強化する

これらのステップを理解・実装できれば、AI を活用した自動化システムの構築は確実に近づきます。ぜひ、このガイドのコード例を参考に、自分のプロジェクトに適用してみてください。

Claude API のツールユースとは何ですか?

Claude API のツールユースは、Claude が外部の関数やツール、API を自動的に呼び出して実行できる機能です。従来のテキストベースの応答に加えて、Claude は「このタスクを実行するには、この関数を呼び出す必要がある」と判断し、その関数実行をリクエストします。これにより、Claude はリアルタイムデータの取得やシステム操作など、より複雑なタスクに対応できるようになります。ツールユースを活用することで、AI を単なる情報検索ツールから、システムと連携する知的なエージェントへと進化させることが可能になるのです。

Python で Claude のツールユースを実装する際の最初のステップは?

最初のステップは、ツール定義を JSON スキーマ形式で準備することです。ツール定義には、関数の名前、詳細な説明、パラメータの仕様を含める必要があります。例えば、天気情報を取得するツールであれば、ツール名「get_weather」、説明「指定した都市の気象情報を取得」、パラメータに「city」と「unit」を定義します。この定義がしっかりしていることが、Claude がツールを適切に選択・実行する上で極めて重要です。その後、実際のツール実行ロジックを Python 関数として実装し、Claude API のレスポンスを処理するメイン処理を書きます。

Claude がツール実行を要求した場合、どうしたらよいですか?

Claude API のレスポンスでstop_reasonが「tool_use」の場合、Claude はツール実行を要求しています。この際、レスポンスのcontent内からtool_useブロックを抽出し、ツール名とパラメータを取得します。その後、対応する Python 関数を実行して結果を得ます。その実行結果を「tool_result」タイプのメッセージとして会話履歴に追加し、再度 Claude API を呼び出します。Claude は返された結果に基づいて、さらにツール実行が必要か、それとも最終的な応答を生成すればよいかを判断します。このプロセスを繰り返すことで、複数ステップのワークフローが実現します。

複数のツールを組み合わせることはできますか?

はい、複数のツールを組み合わせることは完全に可能です。Claude API のtoolsパラメータに複数のツール定義を配列で渡すだけで、Claude が自動的に必要なツールを適切に選択・実行します。例えば、電卓ツール、通貨換算ツール、天気取得ツールなどを同時に定義した場合、「100ドルをユーロに換算して、さらに 50% 増加した額を計算してください」というようなリクエストに対して、Claude が自動的に必要なツールを順序立てて実行し、最終的な結果を提供します。各ツールの説明(description フィールド)を詳細にすることが、Claude が正しいツール選択をする上で重要です。

ツールユース実装時のセキュリティで注意すべき点は?

Claude がツール経由でシステムにアクセスできるようにする場合、セキュリティ対策は極めて重要です。具体的には、ユーザー入力の厳密なバリデーション、ツール実行時の権限制限、実行されたツール呼び出しの監査ログ記録、タイムアウト設定による無限ループの防止などを必ず実装してください。また、本番環境では最大ループ回数を制限し、想定外のワークフローが発生した場合の安全装置を用意することも重要です。さらに、API キーなどのセンシティブな情報がツール実行中に流出しないよう、環境変数管理や暗号化を徹底してください。

💡 社内でのAI導入を検討中の方へ

エンジニアだけでなく、経営者・管理職向けのAI導入支援も行っています。無料相談ページからお気軽にご連絡ください。

この記事を書いた人

EngiNear編集部|現役ITエンジニア(エンジニア歴10年以上)

インフラ・バックエンド・クラウド領域を中心に、ChatGPT・Claude・GitHub Copilotを業務で日常的に活用。AIを使ってエンジニアの市場価値を高める方法を実践・発信中。AWS・GCP・Python・API連携の実務経験多数。

著者プロフィールを見る →

🤖 このブログはAIで自動運営しています。 同じ仕組みを御社にも導入できます。 無料相談はこちら
タイトルとURLをコピーしました