Writing effective tools for agents — with agents

概要

この記事は「AI エージェントのためのツールをどう設計すれば効果的か」について、Anthropic 社のエンジニアが実践的なノウハウをまとめたものです。さらに面白いことに、Claude 自身を使ってツールを改善する方法も紹介しています。

🔧 そもそも「ツール」とは何か?

従来のソフトウェアとの違い

従来のプログラミングでは、関数は 決定論的(deterministic) に動作します。

getWeather("東京") → 常に同じ方法で東京の天気を取得

しかしAIエージェントは**非決定論的(non-deterministic)**です。同じ質問をしても、毎回異なるアプローチを取る可能性があります。

例えば「今日傘を持っていくべき?」と聞かれたとき、エージェントは以下のどれかを選ぶかもしれません。

  1. 天気ツールを呼び出す
  2. 一般的な知識から答える
  3. 「どこにお住まいですか?」と確認する

ツールの本質

ツールとは、決定論的なシステム(従来のソフトウェア)と非決定論的なエージェント(AI)の間の「契約」 です。

これは従来の API 設計とは根本的に異なる発想が必要になります。開発者向けに API を書くのではなく、AI エージェント向けに設計する必要があるのです。

🛠️ ツールの作り方(3ステップ)

ステップ1:プロトタイプを作る

まずは素早くプロトタイプを作成します。

ポイント

  • Claude Code を使えば、一発でツールを生成できることもある
  • 依存するライブラリや API のドキュメントを Claude に渡すと効果的
  • llms.txt という形式のLLM向けドキュメントがある場合は活用する

テスト方法

  • ローカルの MCP サーバーにラップする
  • Claude Desktop や Claude Code に接続してテスト
  • 実際に使ってみて「使いにくいところ」を見つける

ステップ2:評価(Evaluation)を実行する

「どれくらいうまく動くか」を測定するために評価を行います。

良い評価タスクの例

✅ 良い例:
「来週Janeとミーティングを設定して、前回のプロジェクト会議のメモを添付し、
会議室を予約してください」

❌ 悪い例:
「jane@acme.corpと来週ミーティングを設定して」

良い評価タスクの特徴は、複数のツール呼び出しが必要で、現実世界の複雑さを反映していることです。

評価の実行方法

  1. 各タスクに対して「正解」を用意
  2. エージェントに解かせる
  3. 成功率、ツール呼び出し回数、トークン消費量などを計測
  4. エージェントの「思考過程」を分析して改善点を見つける

ステップ3:エージェントと協力して改善する

ここが面白いところです。Claudeに評価結果を分析させ、ツール自体を改善させることができます。

  1. 評価エージェントのトランスクリプト(やり取りの記録)を集める
  2. Claude Codeに渡して分析させる
  3. Claude がツールの改善案を提案・実装する

実際に Anthropic では、この方法で人間が書いたツールよりも 性能が向上した と報告しています。

📐 効果的なツールを書くための5つの原則

原則1:適切なツールを選ぶ(作りすぎない)

「とりあえず全部ツール化」は逆効果です。

例えば「連絡先を検索する」タスクを考えてみましょう。

❌ 悪い設計:
list_contacts → 全連絡先を返す → エージェントが1つずつ読む

✅ 良い設計:
search_contacts("田中") → 該当する連絡先だけを返す

エージェントのコンテキスト(処理できる情報量)は限られています。人間が電話帳を最初から順番に読まないように、エージェントも効率的に情報にアクセスできる設計にすべきです。

実践的なアドバイス

悪い設計 良い設計
list_users + list_events + create_event schedule_event(一括で処理)
read_logs search_logs(関連するログだけ返す)
get_customer_by_id + list_transactions + list_notes get_customer_context(全情報をまとめて返す)

原則2:名前空間(Namespace)で整理する

エージェントは何百ものツールにアクセスする可能性があります。似た機能のツールがあると混乱します

✅ 良い命名:
asana_projects_search
asana_users_search
jira_projects_search
jira_users_search

❌ 曖昧な命名:
search_projects
search_users
project_search

プレフィックス(接頭辞)やサフィックス(接尾辞)を使って、ツールをグループ化しましょう。

原則3:意味のある情報を返す

ツールの戻り値はエージェントにとって有用な情報に絞りましょう。

❌ 技術的すぎる戻り値:
{
  "uuid": "550e8400-e29b-41d4-a716-446655440000",
  "256px_image_url": "...",
  "mime_type": "image/jpeg"
}

✅ 意味のある戻り値:
{
  "name": "田中太郎",
  "image_url": "...",
  "file_type": "jpeg"
}

また、UUID のような意味不明な ID よりも、人間が読める識別子の方がエージェントの精度が上がるという発見もあります。

原則4:トークン効率を最適化する

エージェントのコンテキストは有限です。大量のデータを返すツールは問題になります。

対策

  • ページネーション:結果を小分けにして返す
  • フィルタリング:関連するものだけを返す、ターゲットを絞った検索
  • 切り詰め(truncation):上限を設けて切る

エラーメッセージも重要です。

❌ 不親切なエラー:
Error: ValidationError

✅ 親切なエラー:
Error: Invalid date format.
Expected: YYYY-MM-DD (e.g., 2025-01-15)
Received: January 15, 2025

原則5:ツールの説明文をプロンプトエンジニアリングする

ツールの説明文(description)は、エージェントの「システムプロンプト」に読み込まれます。説明文の質がパフォーマンスに直結します

良い説明文のポイント

  • 新入社員に説明するように、暗黙知を明示化する
  • 曖昧さを排除する(userよりuser_id
  • 期待する入出力を明確にする
  • 特殊なクエリ形式や専門用語があれば定義する

実際、Claude Sonnet 3.5 が SWE-bench Verified で最高性能を達成したのは、ツールの説明文を精密に調整した結果だそうです。