Anthropicの最新記事「Writing tools for agents」を読み解く
はじめに
2025年9月、AnthropicがAIエージェント向けのツール設計に関する技術記事を公開しました。
前回の公開から約半年ぶりとなる今回の記事では、実践的な開発経験から得られた貴重な知見が共有されています。本記事では、その内容を実際の開発に活かせる形で整理し、解説していきます。なぜツール設計が重要なのか
AIエージェントの実用化が進む中で、多くの開発者が直面する課題があります。それは「ツールをどう設計すれば、エージェントが効果的に活用できるのか」という問題です。
Anthropicは、この問いに対して重要な洞察を提供しています。「Tools are a new kind of software」―つまり、AIエージェント向けのツールは、決定論的システムと非決定論的システムを橋渡しする「新しい種類のソフトウェア」だというのです。
実際に検証してみると、ツールの設計次第でエージェントのパフォーマンスは大きく変わることがわかりました。Anthropicの実験では、Claude最適化版のMCPサーバーが人間作成版と比較して以下の改善を示しています:
- Slackツール:67.4% → 80.1%(+12.7%改善)
- Asanaツール:79.6% → 85.7%(+6.1%改善)
この差は決して小さくない。では、具体的にどのような設計原則に従えばよいのでしょうか。
ツール設計の3つの原則
1. 量より質:統合型ツールの重要性
多くの開発者が陥りがちな誤解として「ツールは多ければ多いほど良い」というものがあります。しかし、実際にはその逆でした。
問題のある設計例:
# 細分化されすぎたツール群
tools = [
"list_users",
"list_events",
"create_event",
"get_user_details",
"check_availability"
]
このような設計では、エージェントは「どのツールをどの順番で使うべきか」という判断に多くのリソースを費やしてしまいます。
改善された設計例:
# 統合型ツール
tools = [
"schedule_event" # ユーザー検索、空き確認、イベント作成を一括処理
]
統合型のアプローチにより、エージェントは本質的なタスクに集中できるようになります。
2. 柔軟な出力形式:responseFormatパラメータの活用
同じツールでも、使用する文脈によって必要な情報の詳細度は異なります。Anthropicが提案するresponseFormatパラメータは、この問題を解決する優れたアプローチです。
# 用途に応じて出力形式を切り替え
slack_search(
query="bug",
responseFormat="concise" # 簡潔な一覧表示
)
slack_search(
query="bug",
responseFormat="detailed" # 詳細情報を含む
)
詳細モードでは、Channel ID、User ID、タイムスタンプなど、後続処理に必要な情報を含めることができます。一方、簡潔モードではトークン消費を抑えながら、人間が読みやすい形式で情報を提供します。
3. 意味のあるエラーメッセージ
エラーが発生した際、単にエラーコードを返すだけでは、エージェントは適切な対処ができません。構造化された詳細なエラー情報を提供することが重要です。
{
"error": {
"code": "RESOURCE_NOT_FOUND",
"status": 422,
"message": "Invalid value",
"details": {
"field": "userId",
"value": "john.doe@acme.corp",
"type": "invalid_value"
}
}
}
このような構造化されたエラーメッセージにより、エージェントは問題の原因を理解し、適切な修正アクションを取ることができます。
評価駆動開発の実践
興味深いことに、Anthropicはツール開発においてClaude Code自体を積極的に活用しています。
実際の開発フローは以下のようになります:
- Claude CodeにGmail MCPサーバーの作成を依頼
- 評価テストの実行(85%の成功率を達成)
- エージェントがバグを検出
- 修正とテストの繰り返し
この協働的なアプローチにより、人間の開発者だけでは気づきにくい問題点を発見し、より洗練されたツールを作成することができます。
実装時の具体的な推奨事項
トークン効率の最適化
# 推奨:必要な情報のみを返す
def search_transactions(limit=100, responseFormat="concise"):
results = fetch_data()
if responseFormat == "concise":
# 基本情報のみ
return format_concise(results[:3])
else:
# 詳細情報を含む
return format_detailed(results)
上記の例では、2,847件の検索結果から最初の3件のみを表示し、要約情報を付加しています。これにより、トークン消費を抑えながら必要な情報を提供できます。
ネームスペースの活用
# ツールを論理的にグループ化
tools = {
"slack": ["search", "post", "update"],
"asana": ["create_task", "update_task", "search_tasks"],
"stripe": ["transactions_search", "refund_payment"]
}
ネームスペースを使用することで、エージェントがツールの用途を理解しやすくなり、適切な選択が可能になります。
実装における留意点
この新しいアプローチには多くの利点がありますが、いくつかの制約も存在します。
まず、統合型ツールの設計には、より深いドメイン知識が必要です。単純な機能を組み合わせるだけでなく、実際のワークフローを理解し、それをツールに反映させる必要があります。
また、評価駆動開発を実践するには、適切な評価基準とテストケースの設計が不可欠です。これには初期投資として時間がかかりますが、長期的には品質向上につながります。
今後の展望
Anthropicの記事で示された方向性は、AIエージェント開発の新しいパラダイムを示唆しています。人間とAIが協働してツールを開発し、継続的に改善していくというアプローチは、Claude最適化版のツールが人間作成版を上回る性能を示したことで、その有効性が実証されました。
まとめ
AIエージェント向けのツール設計は、従来のAPI設計とは異なる視点が必要です。Anthropicが提案する「量より質」「柔軟な出力形式」「意味のあるエラーメッセージ」という3つの原則は、実践的で効果的なガイドラインとなります。
また、評価駆動開発とAIとの協働開発という新しいアプローチは、ツールの品質を大幅に向上させる可能性を秘めています。これらの知見を活用することで、より効果的なAIエージェントシステムの構築が可能になるでしょう。
所感として、この分野はまだ発展途上であり、今後も新しい発見や改善が続くと考えられます。開発者としては、これらの原則を参考にしながら、自身のプロジェクトに最適な実装方法を探求していくことが重要だと思います。
Discussion