Domain 2 / 全5項目 / 主戦場: S1 サポート・S3 調査・S4 生産性

ツール設計とMCP統合(配点18%)

MCPを「使う側」から「作る側」の視点へ。AIが正しいツールを選べるかは説明文の書き方で決まり、エラーから回復できるかはエラーの返し方で決まる——という設計思想のドメイン。tomoさんの伸びしろが最も大きい領域。

Task Statement 2.1ツール説明文の設計(AIはdescriptionでツールを選ぶ)

AIがどのツールを使うか決めるほぼ唯一の手がかりが説明文(description)。説明が貧弱・曖昧・重複していると、似たツール同士で誤選択が起きる。ツール選択の不具合は、まず説明文を疑う。
試験が問うこと
  • 説明文には「入力の形式・クエリ例・エッジケース・境界(いつ使い、いつ使わないか)」を含める
  • 説明がほぼ同じ2つのツール(例:analyze_contentanalyze_document)は誤ルーティングの温床
  • 対処の型:説明文の差別化 → 機能重複を無くすリネーム(例:analyze_contentextract_web_results)→ 汎用ツールを目的別に分割(例:analyze_document を「データ点抽出」「要約」「出典照合」の3つへ)
  • システムプロンプトの言い回しが特定キーワードでツール選択を歪めることがある(意図しない連想を作る)→ プロンプト側もレビュー対象
  • サンプル問題Q2の正解筋:ツール誤選択の「最初の一手」は説明文の充実。few-shot追加・ルーティング層新設・ツール統合はどれも第一手としては過剰または的外れ
うちの組織の実物

agents/skills の frontmatter description がまさにこれ。config-optimizer エージェントが「description品質」を監査項目にしているのは、この試験思想の運用版。skills の description に「〜のときに起動 / 〜は別スキルへ」と境界を書き込む流儀(例: seo-schema「サイトマップはseo-sitemapを使う」)は満点回答のパターン。

ひっかけ
  • 「ツール選択ミスにはfew-shot例を5〜8個足す」→ 根本原因(説明文)を放置してトークンを浪費。第一手ではない
  • 「入力を解析して事前にツールを選ぶルーティング層を作る」→ 過剰設計。LLMの自然言語理解を自らバイパスしている
  • 「2つを1つの汎用ツールに統合」→ 設計としてはあり得るが「最初の一歩」としては重すぎる

Task Statement 2.2構造化エラー応答(エラーは情報として設計する)

ツールが失敗したとき「Operation failed」としか返さないと、AIはリトライすべきか・諦めるべきか・別の手を試すべきか判断できない。エラーには種類と回復可能性のメタ情報を付けて返す。
試験が問うこと
  • MCPの isError フラグ:ツールの失敗をエージェントに伝える標準の仕組み
  • エラーの4分類:一時的(タイムアウト・サービス停止=リトライで直るかも)/入力検証(invalid input)/業務ルール違反(ポリシー違反)/権限
  • 構造化メタデータの型:errorCategory(transient/validation/permission)+ isRetryable(真偽値)+ 人間が読める説明文
  • 業務ルール違反には retriable: false + 顧客向けに説明できる文言を付ける(AIが適切に謝れる)
  • 一時的エラーはサブエージェント内でローカルにリトライし、解決できないものだけを「部分結果+試したこと」付きでコーディネーターに上げる
  • 頻出の区別:アクセス失敗(リトライ判断が要る)と正当な0件(検索は成功、該当なし)を混同しない
うちの組織の実物

failed経験の宝庫。integration-discovery ルールの「2>/dev/null でstderrを捨てて空判定するな」は「一般エラーと正当な0件の混同」事故そのもの(Metabase初見化事件)。x-posting-worker のIPガチャ(Geminiの間欠エラー→5分後リトライで自己回復)は transient / isRetryable=true の実例。n8n診断の「生エラーログから読む」も同じ思想。

ひっかけ
  • 「タイムアウトは握りつぶして空の成功として返す」→ 回復の機会を奪い、調査に穴が開く(Q8の誤答C)
  • 「リトライを尽くしたら一律 "search unavailable" を返す」→ コーディネーターから文脈を隠す(Q8の誤答B)
  • 「例外をトップまで投げてワークフロー全体を止める」→ 部分結果で前進できたはずの場面で全損(Q8の誤答D)

Task Statement 2.3ツール配分と tool_choice(渡しすぎは選択ミスを生む)

エージェントに18個もツールを渡すと、4〜5個のときより選択の信頼性が下がる。役割に必要な分だけ渡す(最小権限)。そして「必ずツールを呼ばせたい」場面には tool_choice で強制する。
試験が問うこと
  • ツール過多→判断の複雑化→誤選択。専門外のツールを持たせると誤用する(統合係が勝手にWeb検索を始める等)
  • スコープ付きクロスロールツール:高頻度の単純ニーズには専用の限定ツールを渡す。例:統合係に verify_fact(単純な事実確認専用)を渡し、複雑な検証は従来どおりコーディネーター経由——85%の単純ケースの往復を削減しつつ関心の分離を守る(サンプル問題Q9の正解)
  • 汎用ツールを制約付き代替に置換する(例:fetch_url → 文書URLだけ通す load_document
  • tool_choice の3モード:"auto"(ツールを使うかもモデル判断=テキスト返答もあり得る)/"any"(必ずどれかのツールを呼ぶ)/{"type":"tool","name":"..."}(特定ツールを強制)
  • 使い分け例:最初に必ず extract_metadata を走らせたい→強制指定、会話文でなく必ず構造化出力が欲しい→ "any"
うちの組織の実物

agents/*.md の tools 制限そのもの。verification-agent は読み取り専用(Read/Grep/Glob/Bash)、planner は Read/Grep/Glob のみ、audit系はWrite封印——「役割外のツールは渡さない」の実装。52体のエージェントにフルツールを渡していないのは、まさにこの試験原則。

ひっかけ
  • 「統合係に全Web検索ツールを渡して自己完結させる」→ 過剰供与、関心の分離が壊れる(Q9の誤答C)
  • 「検証ニーズを溜めて最後にまとめてバッチで」→ 後続の統合が前の検証結果に依存する場合、ブロッキングが発生(Q9の誤答B)
  • 「将来の必要に備えて先回りキャッシュ」→ 何が要るかは事前予測できない。投機的で誤答(Q9の誤答D)

Task Statement 2.4MCPサーバーの設定(プロジェクト共有 vs 個人)

MCPサーバーの設定には置き場所が2つある。チームで共有するなら .mcp.json(プロジェクト直下・git管理)、個人の実験なら ~/.claude.json(ユーザー領域)。秘密鍵は環境変数参照で書き、ファイルに直書きしない。
試験が問うこと
  • スコープの使い分け:project-level .mcp.json(チーム共通ツール)vs user-level ~/.claude.json(個人・実験用)
  • .mcp.json 内の環境変数展開(例:${GITHUB_TOKEN})で、シークレットをコミットせずに認証情報を管理
  • 接続時に全設定済みMCPサーバーのツールが発見され、同時に利用可能になる
  • MCPリソース:ツール(アクション実行)と別に、コンテンツのカタログ(issue一覧・ドキュメント階層・DBスキーマ等)を「参照データ」として公開する仕組み。エージェントの探索的ツールコールを減らせる
  • 標準的な統合(Jira等)は既存のコミュニティMCPサーバーを使い、自作はチーム固有ワークフローに限定する
  • MCPツールの説明文を充実させ、エージェントが組み込みツール(Grep等)を誤って優先しないようにする
うちの組織の実物

16本のMCPサーバー運用と registry/integrations.yaml(接続情報のSSOT)。「シークレットは環境変数参照」は、うちでは op:// 参照+opx で徹底している(試験の${VAR}方式と同じ思想の上位互換)。「コミュニティサーバー優先・自作は固有ニーズのみ」は resilience-first の判定表と同じ考え方。

ひっかけ
  • 「トークンを .mcp.json に直書きしてコミット」→ 環境変数展開が正解
  • 「個人の実験サーバーをプロジェクトの .mcp.json に足す」→ チーム全員に配られてしまう。userスコープへ
  • 「データ参照もすべてツールとして実装」→ カタログ的な参照はMCPリソースの方が探索コストを減らせる

Task Statement 2.5組み込みツールの選択(Read / Write / Edit / Bash / Grep / Glob)

「内容で探すならGrep、ファイル名で探すならGlob、ピンポイント修正はEdit、Editが効かないときはRead+Write」。地味だが確実に出る、道具の使い分け問題。
試験が問うこと
  • Grep=ファイルの中身をパターン検索(関数名・エラーメッセージ・import文)/Glob=ファイルパスのパターンでファイルを見つける(**/*.test.tsx
  • Read/Write=ファイル全体の読み書き/Edit=一意なテキスト一致によるピンポイント修正
  • Editが「一致箇所が一意でない」せいで失敗したら、Read+Write(全読み→全書き)にフォールバック
  • コードベース理解は段階的に:Grepで入口を見つける→Readでimportを辿る、が正解。「全ファイルを最初に読む」は誤答
  • ラッパー越しの関数利用を追うには、まずexportされた全名称を特定→各名称を横断検索
うちの組織の実物

毎日使っている道具そのもの。運用知見の蓄積(feedback-edit-before-read「Edit/Write前に同一会話でRead」、ensoレッスン「Globにはpathを付けて範囲を絞る」)は試験知識の実戦版。このタスクステートメントは新規学習ゼロでよい。

ひっかけ
  • 「ファイル名で探したいのにGrep/中身で探したいのにGlob」→ 逆。用途の混同を突いてくる
  • 「理解のためにまず全ファイルをReadで読み込む」→ 段階的探索(Grep→Read)が正解

用語ミニ辞書(Domain 2)

isError フラグ

MCPツールの結果が「失敗である」ことをエージェントに伝える標準フラグ。これに errorCategory / isRetryable などのメタ情報を添えるのが構造化エラー応答。

errorCategory / isRetryable

エラーの種類(transient=一時的 / validation=入力不正 / permission=権限)と、リトライで直る見込みがあるかの真偽値。これが無いとAIは「もう一回試す価値があるか」を判断できない。

tool_choice

ツール使用の強制度を決めるAPI設定。"auto"=使うかはモデル次第/"any"=必ずどれかのツールを呼ぶ/{"type":"tool","name":"..."}=指名したツールを必ず呼ぶ。

スコープ付きクロスロールツール

役割の壁を越える高頻度ニーズにだけ、機能を絞った専用ツールを渡す設計。「85%の単純ケースは直接、15%の複雑ケースはコーディネーター経由」のような最小権限の落とし所。

.mcp.json / ~/.claude.json

MCPサーバー設定の置き場所。前者=プロジェクト直下・git共有(チーム用)、後者=ユーザー個人(実験用)。シークレットは ${ENV_VAR} 参照で書く。

MCPリソース

「実行するもの(ツール)」ではなく「参照するもの(コンテンツカタログ)」をMCPサーバーが公開する仕組み。issue一覧・DBスキーマなどを渡しておくと、エージェントの探り打ちツールコールが減る。

正当な0件 vs アクセス失敗

「検索は成功したが該当なし」と「検索自体ができなかった」は別物。混同すると、無いだけのものを延々リトライしたり、障害を「該当なし」と誤報したりする。

仕上げチェックリスト(30秒で説明できたらチェック)

← D1 エージェント設計 D3 Claude Code →