API を使った AI 統合を進める中で、こんな課題に直面していませんか。「Claude に単純な質問だけでなく、実際にプログラムを実行させたい」「API から外部のツールやデータベースを自動で呼び出したい」「複雑なワークフローを AI に自動化させたい」。こうした課題は、エンジニアなら誰もが一度は感じるはずです。
実は、Claude API が提供するツールユース(Tool Use)機能を使えば、こうした課題は驚くほど簡単に解決します。ツールユースを活用することで、Claude を単なるテキスト生成エンジンから、外部システムと連携する知的なエージェントへと進化させることができるのです。
このガイドでは、Claude API のツールユース機能を Python で実装する方法を、初心者向けから実践的なレベルまで段階的に説明します。コード例を交えながら、実装の細部まで解説していきます。
Claude API のツールユースとは
ツールユースは、Claude が関数を実行したり、外部のツール・API を呼び出したりできる仕組みです。従来の Claude との会話では、Claude が返すのはテキスト応答だけでした。しかし、ツールユースを有効にすると、Claude は「このタスクを実行するには、この関数を呼び出す必要があります」と判断し、その関数の呼び出しを要求できるようになります。
わかりやすく言えば、Claude が「計算機」「ブラウザ」「データベース」などの道具を使えるようになる、ということです。これにより、Claude は知識ベースだけでなく、リアルタイムデータの取得やシステム操作など、より複雑なタスクに対応できるようになります。
ツールユースの基本的なフロー:
- ユーザーが Claude にタスクを依頼する
- Claude がタスク完遂に必要なツールを判断する
- Claude がツール(関数)の呼び出しを API レスポンスで返す
- アプリケーションがその関数を実行する
- 実行結果を Claude に返す
- 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 を単なるテキスト生成ツールから、外部システムと連携する知的なエージェントへと進化させることができます。
このガイドで学んだ内容をまとめると:
- ツール定義を JSON スキーマで記述する
- ツール実行関数を実装する
- Claude API のレスポンスを処理し、ツール呼び出しを実行する
- 結果を Claude に返してワークフローを完成させる
- エラーハンドリングとセキュリティを強化する
これらのステップを理解・実装できれば、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連携の実務経験多数。