知識がなくても始められる、AIと共にある豊かな毎日。
Blog

CCA試験対策 D2完全解説 — ツール設計とMCP統合で18%を確実に取る

CCA試験対策 D2 ツール設計 MCP統合
ゲンキ

CCA試験対策 D2完全解説 — ツール設計とMCP統合で18%を確実に取る

結論として、CCA(Claude Certified Architect)Foundations試験のDomain 2はCCA試験 ツール設計 MCP統合に関する領域であり、全体の18%を占める。つまり、LLMがツールを正しく選択・実行するための設計原則、エラーハンドリング、MCPサーバー構成、組み込みツールの使い分けが出題される。 さらに、この記事では、試験ガイドのTask 2.1〜2.5を完全に網羅し、コード例・JSON Schema・模擬問題を交えながら合格に必要な知識を体系的に解説する。さらに、前回のDomain 1解説で学んだエージェントループの知識を土台に、ツール層の設計へと進もう。
目次
  1. ツールインターフェース設計 — descriptionが選択の生命線(T2.1)
  2. 構造化エラーレスポンス — isErrorだけでは足りない(T2.2)
  3. ツール配分とtool_choice設定 — 少ないほど正確(T2.3)
  4. MCPサーバーの統合 — 構成とスコープを理解する(T2.4)
  5. 組み込みツールの効果的使用 — 正しいツールを正しい場面で(T2.5)
  6. 実践演習:MCPサーバーを設計する
  7. Domain 2 総合チェックリストと出題パターン
  8. まとめ — 18%を落とさないための戦略

ツールインターフェース設計 — descriptionが選択の生命線(T2.1)

なぜdescriptionが最重要なのか

具体的には、LLMはツールのdescriptionフィールドを読んで、どのツールを呼び出すか判断する。特に、これがCCA試験 ツール設計 MCP統合の領域で最も重要な概念だ。つまり、コード内部のロジックではなく、説明文の質がツール利用の正確性を左右する。 また、descriptionが不十分な場合、以下の問題が発生する。
  • さらに、選択の不安定化: 似た名前のツールが複数あると、LLMがランダムに近い選択をする
  • また、誤ルーティング: get_customerlookup_orderの区別がつかず、顧客情報の問い合わせで注文検索ツールが呼ばれる
  • 具体的には、システムプロンプトの干渉: システムプロンプト内のキーワードが意図せずツール選択に影響を与える

悪い定義と良い定義の比較

つまり、以下のコード例で、descriptionの質がどれほど重要かを確認しよう。 悪い定義 — 最小限の説明
さらに、tools = [{
    "name": "get_customer",
    "description": "Gets customer info",
    "input_schema": {
        "type": "object",
        "properties": {
            "id": {"type": "string"}
        }
    }
}]
良い定義 — 用途・フォーマット・境界を明示

重要なポイント

tools = [{
    "name": "get_customer",
    "description": "Retrieves customer profile by customer ID "
                   "(format: CUST-XXXXX). Returns name, email, "
                   "account status, order history summary. "
                   "Use this when you need customer details "
                   "for support cases. "
                   "Do NOT use for order lookups "
                   "- use lookup_order instead.",
    "input_schema": {
        "type": "object",
        "properties": {
            "customer_id": {
                "type": "string",
                "description": "Customer ID in format "
                    "CUST-XXXXX (e.g., CUST-12345)"
            }
        },
        "required": ["customer_id"]
    }
}]
具体的には、良いdescriptionには4つの要素が含まれる。
要素説明
入力フォーマットcustomer_idの形式を明示(例: CUST-XXXXX
クエリ例「サポートケースで顧客情報が必要な場合に使用」
エッジケース「注文の検索には使用しないこと」
境界の明示他ツールとの役割分担をdescription内に記述

汎用ツールの分割

例えば、1つの汎用ツール(例: search_database)を目的別に分割すると、LLMの選択精度が向上する。 また、search_databaselookup_customer_by_email + lookup_order_by_id + search_products_by_keyword つまり、各ツールの責務が明確になり、LLMの判断負荷が下がる。

模擬問題

具体的には、Q: get_customerlookup_orderを両方持つシステムで、顧客からの問い合わせが誤ったツールにルーティングされる。また、最も効果的な対処は? 特に、A) few-shotプロンプトでルーティング例を追加する B) 各ツールのdescriptionを拡充し、用途・入力形式・他ツールとの境界を明記する C) ツール名をより具体的に変更する D) ルーティング専用の分類レイヤーを追加する したがって、正解はB — descriptionの改善が根本原因への対処。したがって、ツール名変更やルーティング層の追加は間接的な対処であり、試験では不正解になりやすい。

構造化エラーレスポンス — isErrorだけでは足りない(T2.2)

isErrorフラグとエラーメタデータ

さらに、MCPではツール結果にisErrorフラグを設定でき、LLMにエラー発生を明示的に伝達する。しかし、ただしフラグだけでは不十分で、構造化されたエラーメタデータがリカバリ判断の鍵となる。 しかし、汎用メッセージ("Operation failed")だけでは、LLMは以下の判断ができない。
  • 特に、リトライすべきか? → 判断不能
  • つまり、入力を修正すべきか? → どのパラメータか不明
  • 例えば、ユーザーに何を伝えるべきか? → 有用な情報がない

エラーカテゴリの4分類

特に、特に、CCA試験では、以下の4カテゴリの区別が頻出する。
カテゴリリトライ可否対処
transientタイムアウト、一時的なネットワーク障害再試行
validation不正な入力形式、必須パラメータ欠落不可(修正後は可)入力を修正して再送
businessポリシー違反(返金上限超過など)不可エスカレーション
permission権限不足、認証切れ不可(通常)権限確認・再認証

構造化エラーレスポンスの実装例

例えば、ビジネスルール違反(リトライ不可)
つまり、{
    "type": "tool_result",
    "tool_use_id": "toolu_abc123",
    "is_error": True,
    "content": json.dumps({
        "errorCategory": "business",
        "isRetryable": False,
        "message": "Refund amount $750 exceeds "
            "policy limit of $500",
        "suggestedAction": "escalate_to_supervisor",
        "context": {
            "requested_amount": 750,
            "policy_limit": 500
        }
    })
}
一時的エラー(リトライ可能)

重要なポイント

{
    "type": "tool_result",
    "tool_use_id": "toolu_def456",
    "is_error": True,
    "content": json.dumps({
        "errorCategory": "transient",
        "isRetryable": True,
        "message": "Database connection timed out "
            "after 30s",
        "suggestedAction": "retry_with_backoff",
        "retryAfterMs": 5000
    })
}

サブエージェントのエラー伝播ルール

具体的には、マルチエージェント構成での原則は3つ。
  1. しかし、サブエージェントはローカルでリカバリを試みる(リトライ、入力修正など)
  2. したがって、解決不能なエラーのみコーディネーターに伝播する
  3. 加えて、伝播する際は、試行した対処と結果も含める

模擬問題

例えば、Q: ビジネスルール違反(返金上限超過)のエラーレスポンスに含めるべき要素の組み合わせとして最も適切なものは? しかし、A) エラーメッセージのみ B) isRetryable: false、ポリシー上限と要求額のコンテキスト、推奨アクション(エスカレーション) C) isRetryable: trueとリトライ間隔 D) 汎用エラーステータスとHTTPステータスコード つまり、正解はB — ビジネスルール違反はリトライ不可。加えて、コンテキスト(上限額・要求額)と推奨アクションを含めることで、LLMが適切な次のステップを判断できる。

ツール配分とtool_choice設定 — 少ないほど正確(T2.3)

ツール数と選択信頼性の関係

特に、ツール数が増えると選択の信頼性が低下する。例えば、18個のツールを持つエージェントより、4〜5個に絞ったエージェントの方が正確にツールを選択できる。結論として、これはCCA試験 ツール設計 MCP統合の中核的な設計原則だ。

tool_choiceの3つのモード

モード動作使用場面
auto"auto"モデルがツール使用かテキスト応答かを判断汎用的な会話エージェント
any"any"必ずいずれかのツールを呼び出す(どれかはモデルが選択)ツール呼び出しを保証したいワークフロー
forced{"type": "tool", "name": "specific_tool"}特定のツールを強制的に呼び出すパイプラインの固定ステップ

コード例

したがって、# auto: モデルが判断(デフォルト)
response = client.messages.create(
    model="claude-sonnet-4-6",
    tools=tools,
    tool_choice={"type": "auto"},
    messages=messages
)

# any: 必ずツールを呼ぶが、
# どれかはモデルが選ぶ
response = client.messages.create(
    model="claude-sonnet-4-6",
    tools=tools,
    tool_choice={"type": "any"},
    messages=messages
)

# forced: 特定ツールを強制
response = client.messages.create(
    model="claude-sonnet-4-6",
    tools=tools,
    tool_choice={
        "type": "tool",
        "name": "lookup_order"
    },
    messages=messages
)

重要なポイント

スコープ付きツールアクセス

エージェントには役割に必要なツールのみを付与する。
  • 同様に、顧客対応エージェント: get_customer, lookup_order, create_ticket
  • さらに、在庫管理エージェント: check_inventory, update_stock, reorder_item
  • また、横断的に必要なツールは限定的に追加(例: verify_factを合成エージェントに付与)
さらに、制約のないfetch_urlのような汎用ツールは、目的に応じた制約付きツールに置換する。 加えて、fetch_urlload_document(url, allowed_domains=["docs.example.com"])

模擬問題

Q: 合成エージェントがファクトチェックのためにコーディネーターを経由している。したがって、レイテンシを改善するには? 同様に、A) 合成エージェントにスコープ付きのverify_factツールを直接付与し、コーディネーターへの往復を排除する B) コーディネーターのレスポンスキャッシュを追加する C) ファクトチェックのステップを削除する D) コーディネーターにより高速なモデルを使用する 結論として、正解: A — スコープ付きツールを直接付与することで、コーディネーターへの不要な往復を排除し、レイテンシを改善する。

MCPサーバーの統合 — 構成とスコープを理解する(T2.4)

MCPの構成と接続

このプロトコルのサーバーは.mcp.json(プロジェクトスコープ)または~/.claude.json(ユーザースコープ)で構成する。つまり、接続時にツールが自動検出され、複数のMCPサーバーのツールが同時に利用可能になる。

スコープの使い分け

スコープファイル用途
プロジェクト.mcp.json(リポジトリルート)チーム共有のMCPサーバー設定
ユーザー~/.claude.json個人環境のMCPサーバー設定
とりわけ、.mcp.jsonはリポジトリにコミットされるため、チーム全員が同じMCPサーバー設定を使える。具体的には、~/.claude.jsonは個人のマシンに閉じた設定で、個人用のAPIトークンやローカル環境に依存するサーバーに適している。

構成例

{
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-github"
      ],
      "env": {
        "GITHUB_TOKEN": "${GITHUB_TOKEN}"
      }
    },
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/path/to/dir"
      ],
      "env": {}
    }
  }
}
環境変数の展開: ${GITHUB_TOKEN}のように記述すると、実行時に環境変数の値が展開される。つまり、トークンをハードコードせずセキュアに管理できる。

重要なポイント

MCPの3つの機能

具体的には、CCA試験では、Tools・Resources・Promptsの3機能の区別が問われる。
機能説明効果
Toolsサーバーが提供する実行可能な操作LLMが外部システムと対話
Resourcesコンテンツカタログ(Issueリスト、ドキュメント階層、DBスキーマ)探索的なツール呼び出しを削減
Prompts再利用可能なプロンプトテンプレート一貫性のある操作パターンを提供

Resourcesの活用

加えて、Resourcesはサーバーが公開するコンテンツカタログであり、LLMが「何が利用可能か」を事前に把握できる。
  • 具体的には、GitHubサーバーのResources: リポジトリ一覧、Issue一覧、PR一覧
  • 特に、DBサーバーのResources: テーブルスキーマ、利用可能なクエリ
  • 効果: 「まずリスト取得→詳細取得」の探索的呼び出しが不要になる

模擬問題

一方、Q: .mcp.json~/.claude.jsonの違いとして正しいものは? まず、A) .mcp.jsonはユーザー固有、~/.claude.jsonはプロジェクト固有 B) .mcp.jsonはプロジェクトスコープ(リポジトリ内で共有)、~/.claude.jsonはユーザースコープ(個人環境) C) どちらも同一スコープで互換性がある D) .mcp.jsonはCLI専用、~/.claude.jsonはAPI専用 最終的に、正解: B.mcp.jsonはリポジトリルートに配置しチーム共有。特に、~/.claude.jsonは個人環境の設定。

組み込みツールの効果的使用 — 正しいツールを正しい場面で(T2.5)

各ツールの役割と使い分け

例えば、Claude Codeなどの環境に組み込まれたツールには、それぞれ明確な用途がある。
ツール用途使用例
Grepコンテンツ検索(ファイル内容から検索)関数名、エラーメッセージ、import文の検索
Globファイルパスのパターンマッチ名前・拡張子でファイルを探す(**/*.test.ts
Readファイル全体の読み取りファイル内容の確認、設定ファイルの読み込み
Writeファイル全体の書き込み新規ファイル作成、全面的な書き換え
Editユニークなテキストマッチによる部分編集特定の関数やセクションの修正

Grep vs Globの使い分け

さらに、この判断は試験で頻出する。判断基準は単純だ。
  • つまり、ファイルの中身(コード、テキスト)を探す → Grep
  • 例えば、例: getUserByIdを含むファイルを探す
  • しかし、ファイル名やパスを探す → Glob
  • したがって、例: *.config.tsというファイルを探す

Editの失敗と対処

また、Editツールはファイル内でユニークなテキストをマッチさせて部分置換する。つまり、マッチが曖昧(複数箇所に一致)だと失敗する。
  • 加えて、失敗時のフォールバック: Readでファイル全体を取得 → 内容を修正 → Writeで書き戻す
  • 同様に、Editが使えるならEditを優先(差分のみ送信するため効率的)

段階的な理解の構築

したがって、全ファイルを一括で読み込むのではなく、段階的にコードベースを理解する。
  1. さらに、Grepでimport/require文を検索 → 依存関係を把握
  2. また、Globで関連ファイルの一覧を取得 → 構造を把握
  3. 具体的には、Readで必要なファイルのみ読み込み → 詳細を確認
一方、この手順により、不要なファイル読み込みを避け、コンテキストウィンドウを節約できる。

判断ツリー

具体的には、タスク
├── ファイル名/パスで探す → Glob
├── ファイル内容で探す → Grep
├── ファイルを読む → Read
├── 新規ファイル作成 or 全面書き換え → Write
├── 部分的な変更
│   ├── ユニークなテキストがある → Edit
│   └── Edit失敗 → Read + Write(フォールバック)
└── コードベースの理解
    └── Grep → Read の段階的アプローチ

模擬問題

Q: 特定のエラーメッセージがコードベースのどこで発生しているか調べたい。例えば、どのツールを使うべきか? 特に、A) Glob B) Grep C) Read D) Edit つまり、正解: B — ファイル内容からテキストを検索するツールはGrep。しかし、Globはファイル名のパターンマッチに使う。 例えば、Q: Editツールが失敗した場合のフォールバックとして最も適切なのは? しかし、A) Bashでsedコマンドを実行する B) Writeで空ファイルを作成し直す C) Readでファイルを読み取り、内容を修正してWriteで書き戻す D) Grepで該当箇所を検索してからEditを再試行する したがって、正解: C — Editのフォールバックは「Read → 修正 → Write」のパターン。

実践演習:MCPサーバーを設計する

同様に、Domain 2の知識を実際の設計課題に落とし込む。したがって、ここでは、社内ドキュメント管理システム用のMCPサーバーを設計し、CCA試験のツール設計・MCP統合に関する判断力を鍛える。

シナリオ設定

とりわけ、社内のConfluenceライクなドキュメント管理システムに接続するMCPサーバーを設計する。加えて、要件は以下の3つだ。
  1. 特に、ドキュメントの検索・閲覧ができること
  2. つまり、ドキュメントの作成・編集ができること
  3. 例えば、ドキュメントの権限管理情報を参照できること

ステップ1:ツール設計(T2.1の適用)

まず、1つの汎用ツールmanage_documentではなく、目的別に分割する。
ツール名description(要点)分割の理由
search_docsキーワード/タグでドキュメントを検索。タイトル・要約・最終更新日を返す。特定ドキュメントの内容取得にはread_docを使用検索と閲覧の分離
read_docドキュメントID(形式: DOC-XXXXX)で全文を取得。Markdown形式で返す単一ドキュメントの読み取りに特化
create_doc新規ドキュメントを作成。title, content, tags, spaceが必須作成と編集の分離
update_doc既存ドキュメントのcontentを更新。doc_idとcontentが必須。タイトル変更にはrename_docを使用部分更新に限定
check_permissionsドキュメントまたはスペースの閲覧・編集権限を確認。変更はできない読み取り専用
結論として、各descriptionに「このツールでできないこと」を明記している点が重要だ。同様に、search_docsに「特定ドキュメントの内容取得にはread_docを使用」と書くことで、LLMが検索結果から直接内容を取得しようとする誤ルーティングを防ぐ。

ステップ2:エラーレスポンス設計(T2.2の適用)

加えて、各ツールのエラーレスポンスに4カテゴリの分類を適用する。
# 権限エラー(permission)— リトライ不可
{
    "is_error": True,
    "content": {
        "errorCategory": "permission",
        "isRetryable": False,
        "message": "DOC-12345 の編集権限がありません",
        "suggestedAction": "request_access",
        "context": {
            "doc_id": "DOC-12345",
            "required_role": "editor",
            "current_role": "viewer"
        }
    }
}

# 一時的エラー(transient)— リトライ可能
{
    "is_error": True,
    "content": {
        "errorCategory": "transient",
        "isRetryable": True,
        "message": "ドキュメントサーバーが応答しません",
        "suggestedAction": "retry_with_backoff",
        "retryAfterMs": 3000
    }
}
さらに、「ドキュメントが見つからない」場合はvalidationカテゴリでisRetryable: Falseとし、suggestedActionに"verify_doc_id"を指定する。さらに、LLMはこの情報から「ドキュメントIDを再確認して別のIDで検索する」という判断ができる。

重要なポイント

ステップ3:MCP構成とスコープ設計(T2.4の適用)

また、プロジェクトスコープとユーザースコープの使い分けを設計する。
同様に、// .mcp.json(プロジェクトスコープ — チーム共有)
{
  "mcpServers": {
    "docs": {
      "command": "npx",
      "args": ["-y", "@company/mcp-docs-server"],
      "env": {
        "DOCS_API_URL": "${DOCS_API_URL}",
        "DOCS_API_TOKEN": "${DOCS_API_TOKEN}"
      }
    }
  }
}
APIトークンは${DOCS_API_TOKEN}で環境変数から展開する。また、ハードコードはセキュリティリスクだ。個人の認証情報が必要な場合は~/.claude.jsonに分離する。

ステップ4:ツール配分の最適化(T2.3の適用)

つまり、MCPサーバーのツールを全エージェントに付与するのではなく、役割に応じて配分する。
エージェントの役割付与するツール付与しない理由
リサーチ担当search_docs, read_doc編集権限は不要
コンテンツ作成担当search_docs, read_doc, create_doc, update_doc権限管理は管理者が担当
管理者全ツールフルアクセスが必要
結論として、リサーチ担当にupdate_docを付与しないことで、調査中の誤編集を構造的に防止する。具体的には、これはDomain 1のT1.3で学んだ最小権限の原則と同じ考え方だ。

ステップ5:Resourcesの活用(T2.4の適用)

特に、MCPサーバーにResourcesを実装し、探索的なツール呼び出しを削減する。
Resource内容削減効果
スペース一覧利用可能なドキュメントスペースとその説明「まずスペースを検索して」という手順が不要に
最近の更新直近24時間に更新されたドキュメント一覧日次レビュー時のツール呼び出し削減
テンプレート一覧利用可能なドキュメントテンプレートテンプレート検索のツール呼び出し削減
Resourcesを活用すると、LLMは「何が利用可能か」を事前に把握でき、「まず一覧を取得→詳細を取得」という2段階の探索が1段階に短縮される。

設計チェックポイント

チェック項目該当タスク
各ツールのdescriptionに用途・フォーマット・境界が含まれるかT2.1
エラーレスポンスにerrorCategoryisRetryableが含まれるかT2.2
エージェントごとにツールが最小限に配分されているかT2.3
環境変数でトークンを管理しているかT2.4
Resourcesで探索的呼び出しを削減しているかT2.4

Domain 2 総合チェックリストと出題パターン

5つの出題パターン

具体的には、CCA試験 ツール設計 MCP統合の領域では、以下5つのパターンが頻出する。 とりわけ、パターン1: ツール誤選択の修正 「エージェントが間違ったツールを呼び出す」→ descriptionの改善が正解。特に、コード側のロジック変更やツール名変更は不正解。 一方、パターン2: エラーハンドリングの設計 「エージェントがエラー後にリトライすべきか判断できない」→ 構造化エラーレスポンスにisRetryableerrorCategoryを含めるのが正解。 まず、パターン3: ツール数の最適化 「18個のツールを持つエージェントの選択精度が低い」→ 役割ごとにエージェントを分割し、各エージェントのツール数を4〜5個に絞るのが正解。 最終的に、パターン4: MCP構成の理解 環境変数、スコープ(プロジェクト vs ユーザー)、Resourcesの役割を問う問題。 さらに、パターン5: 組み込みツールの選択 「Xを達成したい。つまり、どのツールを使うべきか?」→ Grep / Glob / Read / Write / Editの判断ツリーに基づいて回答。

合格のための最終チェックリスト

  • しかし、ツールdescriptionが選択の最重要メカニズムであることを説明できるか
  • したがって、良いdescriptionの4要素(フォーマット、用途、境界、例)を列挙できるか
  • 加えて、MCPのisErrorフラグと構造化エラーメタデータの設計を説明できるか
  • 同様に、エラーカテゴリ(transient / validation / business / permission)を区別できるか
  • さらに、isRetryableの判断基準を説明できるか
  • また、サブエージェントのエラー伝播ルール(ローカルリカバリ優先)を理解しているか
  • 具体的には、tool_choiceの3モード(auto / any / forced)の違いと使用場面を説明できるか
  • 特に、ツール数と選択信頼性の関係(少ない方が正確)を理解しているか
  • つまり、スコープ付きツールアクセスの原則を説明できるか
  • 例えば、.mcp.json~/.claude.jsonのスコープの違いを説明できるか
  • しかし、環境変数展開${VAR}の仕組みを理解しているか
  • したがって、MCPの3機能(Tools / Resources / Prompts)を区別できるか
  • 加えて、Grep / Glob / Read / Write / Editの使い分けを即答できるか
  • 同様に、Edit失敗時のフォールバック戦略を説明できるか

まとめ — 18%を落とさないための戦略

加えて、Domain 2は5つのTaskで構成され、全体の18%を占める。出題傾向は明確だ。 また、ツール設計: descriptionの質がすべて。例えば、LLMはコードを見ない。説明文を見る。 具体的には、エラーハンドリング: isRetryableerrorCategoryで構造化する。しかし、汎用メッセージは不正解の選択肢として登場する。 特に、ツール配分: 少ない方が正確。したがって、スコープ付きアクセスでレイテンシを削減。 つまり、MCP構成: .mcp.json(プロジェクト)vs ~/.claude.json(ユーザー)。加えて、Resourcesが探索的呼び出しを削減。 例えば、組み込みツール: Grep(中身)とGlob(ファイル名)の違い。同様に、EditのフォールバックはRead + Write

重要なポイント

しかし、次回のDomain 3解説では、CLAUDE.mdの階層構造、カスタムスラッシュコマンド、CI/CD統合といった実務直結の設定・ワークフロー領域に進む。さらに、Domain 2で学んだツール設計の知識が、Domain 3のClaude Code構成で具体的にどう活きるかを確認しよう。
さらに深く学ぶために: 本記事はCCA試験の設計判断パターンを概説したものです。また、合格に向けた実践的な準備には、Anthropic Academy公式コースでのハンズオン学習と、模擬問題サイトでの演習を併せて実施してください。本シリーズの完全ガイド(Day 1)で推奨する「3本柱」の学習戦略も参照してください。

さらに詳しい情報はModel Context Protocol公式サイトでご覧いただけます。

ABOUT ME
swiftwand
swiftwand
AIを使って、毎日の生活をもっと快適にするアイデアや将来像を発信しています。 初心者にもわかりやすく、すぐに取り入れられる実践的な情報をお届けします。 Sharing ideas and visions for a better daily life with AI. Practical tips that anyone can start using right away.
記事URLをコピーしました