anthropic-tool-mastery について
Anthropic Tool Mastery は、エージェントでの Claude のツール利用を設計、調整するスキルです。ツールスキーマ、並列呼び出し、ストリーミング、拡張思考、結果の統合、エラー回復、キャッシュを扱い、カスタム MCP サーバーのツールにも応用できます。
主な機能
- 01ツールスキーマの設計
- 02ツール呼び出しの並列実行
- 03ツール結果のストリーミング
- 04拡張思考による計画
- 05部分的な失敗への対処と結果統合
- 06ツール結果のキャッシュ
活用シーン
- 01複数ツールを使うエージェントの構築
- 02ツール選択と引数精度の改善
- 03複数ツールのワークフロー調整
- 04長時間実行ツールの進捗表示
MCP 対応
カスタム MCP サーバーのツールを Claude が利用する方法として、ツール定義、並列実行、結果処理のパターンを説明します。プロジェクト自体は MCP サーバーではありません。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ itallstartedwithaidea/ agent-skills --skill anthropic-tool-masteryインストール後、Claude Code で/anthropic-tool-masteryを入力して読み込まれたか確認します。
詳細
Anthropic ツールの習熟
Agent Skills™ の一部です。googleadsagent.ai™ 提供
説明
Anthropic ツールの習熟は、Claude のネイティブな tool_use 機能を最大限に活用するための決定版スキルです。Claude のツールシステムは、単なる関数呼び出しインターフェースではありません。モデルが問題を分解し、並列操作を実行し、ストリーミング結果を処理し、拡張思考を通じてツールの出力を連鎖させるための、構造化された推論プロトコルです。こうしたパターンを習得することで、一度に1つのツールをぎこちなく呼び出すエージェントと、熟練エンジニアのように複雑な複数ツールのワークフローを流暢に連携させるエージェントとの差が生まれます。
このスキルでは、googleadsagent.ai™ の Buddy™ エージェントで実証されたパターンを体系化しています。そこでは、単一の推論ターン内で、Google Ads API の同時呼び出し、ウェブ検索、ファイル操作、分析計算をツールオーケストレーションによって処理します。手法は、ツール定義の設計(スキーマの品質は呼び出し精度に直接影響します)、並列実行(単一ターン内での複数の独立したツール呼び出し)、結果の組み合わせ(並列呼び出しの出力の統合)、エラー復旧(複数ツールのバッチ処理における部分的な失敗への対処)を対象としています。
高度なパターンには、リアルタイムのフィードバックを得るためのツール結果のストリーミング、拡張思考との統合(実行前に思考ブロックを使ってツールの実行順序を計画すること)、重複した呼び出しを避けるためのツール結果のキャッシュなどがあります。これらの手法は、Claude Code の組み込みツールに直接適用でき、カスタム MCP サーバーのツールにも応用できます。
使用する場面
- 推論ターンごとに複数のツールを呼び出す必要があるエージェントを構築するとき
- ツール呼び出しの精度が許容できる水準に達していないとき(パラメーターの誤り、選択するツールの誤り)
- 長時間実行されるツール操作からリアルタイムのストリーミングフィードバックが必要なとき
- 拡張思考をツールの選択やパラメーターの組み立てに反映させる必要があるとき
- 複数ツールのワークフローで、連携や結果の組み合わせが必要なとき
- モデルとの互換性を最大限に高めるカスタムツールを設計するとき
仕組み
sequenceDiagram
participant U as User/System
participant C as Claude (Extended Thinking)
participant T1 as Tool A
participant T2 as Tool B
participant T3 as Tool C
U->>C: Task + Tool Definitions
Note over C: Extended Thinking:<br/>Plan tool sequence
C->>T1: Parallel Call 1
C->>T2: Parallel Call 2
T1-->>C: Result A (streamed)
T2-->>C: Result B (streamed)
Note over C: Extended Thinking:<br/>Compose results, plan next step
C->>T3: Sequential Call (depends on A+B)
T3-->>C: Result C
C->>U: Final composed response
Claude のツール実行モデルは、1回のアシスタントターン内で、独立したツール呼び出しを並列に実行できます。モデルは拡張思考を使ってツールの実行順序を計画し、独立している(並列化できる)呼び出しと、依存関係がある(順番に実行する必要がある)呼び出しを特定します。ストリーミングを有効にすると、長時間実行されるツールの進捗をリアルタイムで確認できます。すべてのツール結果が届くと、拡張思考によって結果を一貫性のある応答にまとめるか、次のツール呼び出しを計画します。
実装
最適なツール定義パターン:
{
"name": "search_knowledge_base",
"description": "Search the domain knowledge base for patterns matching a query. Returns ranked results with confidence scores. Use this BEFORE generating recommendations to ground them in verified patterns.",
"input_schema": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Natural language search query describing the pattern or information needed"
},
"category": {
"type": "string",
"enum": ["bidding", "targeting", "creative", "budget", "general"],
"description": "Knowledge category to search within"
},
"max_results": {
"type": "integer",
"default": 5,
"description": "Maximum number of results to return (1-20)"
}
},
"required": ["query"]
}
}
並列ツール実行ハンドラー:
interface ToolCall {
id: string;
name: string;
input: Record<string, unknown>;
}
interface ToolResult {
tool_use_id: string;
content: string;
is_error: boolean;
}
async function executeToolCalls(calls: ToolCall[], registry: ToolRegistry): Promise<ToolResult[]> {
const results = await Promise.allSettled(
calls.map(async (call) => {
const handler = registry.get(call.name);
if (!handler) {
return { tool_use_id: call.id, content: `Unknown tool: ${call.name}`, is_error: true };
}
try {
const result = await handler.execute(call.input);
return { tool_use_id: call.id, content: JSON.stringify(result), is_error: false };
} catch (error) {
return { tool_use_id: call.id, content: `Error: ${String(error)}`, is_error: true };
}
})
);
return results.map((r) =>
r.status === "fulfilled" ? r.value : { tool_use_id: "", content: `Execution failed: ${r.reason}`, is_error: true }
);
}
ツール結果のストリーミング統合:
async def stream_tool_execution(client, messages, tools):
"""Execute tools with streaming for real-time progress."""
async with client.messages.stream(
model="claude-sonnet-4-20250514",
max_tokens=8096,
tools=tools,
messages=messages,
) as stream:
tool_calls = []
async for event in stream:
if event.type == "content_block_start" and event.content_block.type == "tool_use":
tool_calls.append({
"id": event.content_block.id,
"name": event.content_block.name,
"input_json": "",
})
elif event.type == "content_block_delta" and hasattr(event.delta, "partial_json"):
tool_calls[-1]["input_json"] += event.delta.partial_json
elif event.type == "content_block_stop" and tool_calls:
call = tool_calls[-1]
call["input"] = json.loads(call["input_json"])
if tool_calls:
results = await execute_parallel_tools(tool_calls)
messages.append({"role": "assistant", "content": stream.get_final_message().content})
messages.append({"role": "user", "content": results})
return await stream_tool_execution(client, messages, tools)
return stream.get_final_message()
ツール結果のキャッシュ:
class ToolCache:
def __init__(self, ttl_seconds=300):
self.cache = {}
self.ttl = ttl_seconds
def cache_key(self, tool_name: str, params: dict) -> str:
normalized = json.dumps(params, sort_keys=True)
return f"{tool_name}:{hashlib.sha256(normalized.encode()).hexdigest()[:16]}"
async def execute_with_cache(self, tool_name, params, executor):
key = self.cache_key(tool_name, params)
if key in self.cache:
entry = self.cache[key]
if time.time() - entry["timestamp"] < self.ttl:
return entry["result"]
result = await executor(tool_name, params)
self.cache[key] = {"result": result, "timestamp": time.time()}
return result
ベストプラクティス
- ツールを使う場面がわかる説明を書く — モデルは説明に基づいてツールを選択します。「推奨事項の生成前に使用してください」は、「データベースを検索します」より効果的です。
- 値に制約があるパラメーターには列挙型を使う — パラメーターに有効な値の固定セットがある場合は、必ず列挙型を使います。これにより、パラメーターの誤りを引き起こす原因を一つ取り除けます。
- 並列実行を前提に設計する — 可能な限り、ツールを独立させ、副作用のないものにします。モデルは独立した呼び出しを自然に並列化します。
- 部分的な失敗にも適切に対処する — 4つの並列ツール呼び出しのうち3つが成功した場合は、バッチ全体を失敗させるのではなく、成功した3つの結果を使います。
- 決定的なツール結果をキャッシュする — 同じデータに同じクエリを実行すると同じ結果が得られる場合は、重複した計算とトークン消費を避けるためにキャッシュします。
- ツール結果のペイロードはコンパクトに保つ — 大きなツール結果はコンテキストウィンドウを消費します。データベースの行全体ではなく、モデルに必要なフィールドだけを返します。
- ツールスキーマをバージョン管理する — ツールのインターフェースが変わったら、モデルを新しいパラメーター形式に誘導するため、説明を更新します。
プラットフォームの互換性
| 機能 | Claude Code | Cursor | Codex | Gemini CLI |
|---|---|---|---|---|
| ネイティブな tool_use | ✅ 完全対応 | ✅ API 経由 | ⚠️ 関数呼び出し | ⚠️ 関数呼び出し |
| 並列ディスパッチ | ✅ ネイティブ対応 | ✅ ネイティブ対応 | ✅ 対応 | ✅ 対応 |
| 結果のストリーミング | ✅ 完全対応 | ✅ 完全対応 | ✅ 対応 | ✅ 対応 |
| 拡張思考 | ✅ ネイティブ対応 | ⚠️ モデルに依存 | ❌ 利用不可 | ⚠️ 制限あり |
| ツール結果のキャッシュ | ✅ カスタム | ✅ カスタム | ✅ カスタム | ✅ カスタム |
関連スキル
- プロンプトアーキテクチャ - ツール選択の精度とパラメーターの構築を最適化する構造的なプロンプト設計
- コンテキストエンジニアリング - ツールの結果をコンテキスト制限内に収めるためのトークン予算管理
- マルチハーネスの移植性 - あらゆるハーネスで動作するツール連携を記述するための、クロスプラットフォームなツール抽象化
キーワード
tool-use, parallel-tool-calling, streaming, extended-thinking, tool-definitions, tool-orchestration, result-composition, error-recovery, tool-caching, agent-skills
© 2026 googleadsagent.ai™ | Agent Skills™ | MIT License