mcpField
A
anthropic-tool-mastery

anthropic-tool-mastery

github.com/itallstartedwithaideaエージェントワークフロー4475 回インストール28 週間前に更新
リポジトリ

anthropic-tool-mastery について

Anthropic Tool Mastery は、エージェントでの Claude のツール利用を設計、調整するスキルです。ツールスキーマ、並列呼び出し、ストリーミング、拡張思考、結果の統合、エラー回復、キャッシュを扱い、カスタム MCP サーバーのツールにも応用できます。

主な機能

  1. 01ツールスキーマの設計
  2. 02ツール呼び出しの並列実行
  3. 03ツール結果のストリーミング
  4. 04拡張思考による計画
  5. 05部分的な失敗への対処と結果統合
  6. 06ツール結果のキャッシュ

活用シーン

  1. 01複数ツールを使うエージェントの構築
  2. 02ツール選択と引数精度の改善
  3. 03複数ツールのワークフロー調整
  4. 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

ベストプラクティス

  1. ツールを使う場面がわかる説明を書く — モデルは説明に基づいてツールを選択します。「推奨事項の生成前に使用してください」は、「データベースを検索します」より効果的です。
  2. 値に制約があるパラメーターには列挙型を使う — パラメーターに有効な値の固定セットがある場合は、必ず列挙型を使います。これにより、パラメーターの誤りを引き起こす原因を一つ取り除けます。
  3. 並列実行を前提に設計する — 可能な限り、ツールを独立させ、副作用のないものにします。モデルは独立した呼び出しを自然に並列化します。
  4. 部分的な失敗にも適切に対処する — 4つの並列ツール呼び出しのうち3つが成功した場合は、バッチ全体を失敗させるのではなく、成功した3つの結果を使います。
  5. 決定的なツール結果をキャッシュする — 同じデータに同じクエリを実行すると同じ結果が得られる場合は、重複した計算とトークン消費を避けるためにキャッシュします。
  6. ツール結果のペイロードはコンパクトに保つ — 大きなツール結果はコンテキストウィンドウを消費します。データベースの行全体ではなく、モデルに必要なフィールドだけを返します。
  7. ツールスキーマをバージョン管理する — ツールのインターフェースが変わったら、モデルを新しいパラメーター形式に誘導するため、説明を更新します。

プラットフォームの互換性

機能Claude CodeCursorCodexGemini 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

コメント