← 試験の目次へ

Architect Foundations ドメイン2: ツール設計と MCP 統合(18%)

この章で学ぶこと: ツールの説明文と境界の設計、構造化されたエラー応答、ツールの配分と tool_choice、MCP サーバーの設定(範囲、環境変数、リソース)、組み込みツールの選び方。

本番の60問のうち約11問が出ます。

タスクステートメント この章の節
2.1 明確な説明と境界を持つツールインターフェース 第1節
2.2 MCP ツールの構造化エラー応答 第2節
2.3 ツールの配分と tool_choice 第3節
2.4 MCP サーバーを Claude Code とエージェントに統合する 第4節
2.5 組み込みツールの選び方 第5節

Developer Foundations で学んだ基本(ここでは繰り返しません):


1. ツールの説明と境界(2.1)

1.1 説明文がツール選択の主な手がかり

Claude はツールの説明文を読んで、どれを呼ぶか決めます。公式ドキュメントは「とても詳しい説明」を、ツールの性能に効く最も大事な要素としています(少なくとも3〜4文)。

説明に入れるもの:

項目 例(lookup_order)
何をするか 注文番号から、注文の内容・状態・配送先を返す
入力の形式 注文番号は # と6桁の数字(例: #123456)
問い合わせの例 「注文 #123456 はどこ?」「届いた商品が違う」
例外ケース キャンセル済みの注文も返す。90日より前の注文は返さない
似たツールとの境界 顧客の名前や連絡先を調べるときは get_customer を使う

1.2 あいまい・重複した説明は誤った振り分けを生む

例: analyze_content(「内容を分析する」)と analyze_document(「文書を分析する」)。どちらを使えばよいか Claude にもわかりません。

直し方 例
名前と説明を変えて重なりをなくす analyze_content → extract_web_results(Web 検索結果だけを対象と説明に書く)
汎用ツールを目的別に分ける analyze_document → extract_data_points、summarize_content、verify_claim_against_source

「まとめる」と「分ける」の関係: 公式のベストプラクティスには「関係する操作は action パラメータで1つにまとめる」もあります(Developer D8 第1.2節)。どちらも目的は「どれを使うかをあいまいにしない」ことです。似たツールが散らばって迷うならまとめる。1つのツールの役割が広すぎて入出力がぶれるなら、決まった入出力の目的別ツールに分けます。

1.3 システムプロンプトがツール選択を上書きすることがある

例: システムプロンプトに「『分析』と言われたら、必ず詳しく分析すること」とある。すると「分析」という言葉に反応して、Web の結果にも analyze_document を呼ぶようになる。

よく書かれたツール説明があっても、キーワードに反応する指示がそれを上書きすることがあります。ツール選択がおかしいときは、ツールの説明と一緒にシステムプロンプトも見直します。

1.4 「最初の一手」として何を選ぶか

ツールの取り違えが起きたとき、最初にやることは「説明文を詳しくする」です。

選択肢 評価
説明文を詳しくする(入力形式、例、境界) 根本原因に効き、手間が小さい。最初の一手
few-shot 例を5〜8個足す トークンが増え、根本原因(説明不足)が残る
キーワードで振り分ける層を前に置く 作り込みすぎ。Claude の言葉の理解を使わなくなる
2つのツールを1つにまとめる 設計としてはありうるが、「最初の一手」としては手間が大きい

2. 構造化されたエラー応答(2.2)

2.1 MCP の isError

MCP の仕様では、ツールのエラーは2種類です。

種類 どう伝えるか 例
プロトコルのエラー JSON-RPC のエラー 存在しないツール、引数が不正、サーバーのエラー
ツール実行のエラー ツール結果に isError: true 外部 API の失敗、不正な入力データ、業務ルールのエラー

ツール実行のエラーは結果としてモデルに届くので、モデルが読んで対処を考えられます。Messages API の tool_result では同じものを is_error: true と書きます。

2.2 エラーの4つの種類

種類 例 再試行 エージェントがすべきこと
一時的(transient) タイムアウト、サービス停止 できる 待って再試行、または別の方法
検証(validation) 注文番号の形式が違う 入力を直せばできる 入力を直す、顧客に聞き直す
業務(business) 返品期限を過ぎた、ポリシー違反 できない 理由を顧客に説明する、必要ならエスカレーション
権限(permission) この操作の権限がない できない(そのままでは) 権限のある流れへ回す

「操作に失敗しました」だけの一律のエラーでは、どれなのかわかりません。エージェントは、むだな再試行をしたり、直せるのにあきらめたりします。

2.3 返す形の例

試験ガイドの例にならった形です。errorCategory や isRetryable は MCP の標準の項目ではなく、ツールの作り手が結果の中身として決める設計です。

{
  "isError": true,
  "content": [{
    "type": "text",
    "text": "{\"errorCategory\": \"business\", \"isRetryable\": false, \"message\": \"返品の受付期限(購入から30日)を過ぎています\", \"customerMessage\": \"申し訳ありません。この商品は返品期限を過ぎています。\"}"
  }]
}

業務ルールの違反には、再試行できない(retriable: false)ことと、顧客に伝える説明を入れます。エージェントは同じ呼び出しをくり返さず、顧客に正しく伝えられます。

2.4 失敗 と 正当な空の結果

アクセスの失敗 正当な空の結果
意味 調べられなかった 調べた結果、該当がなかった
例 検索がタイムアウトした 「その名前の顧客はいない」
返し方 isError: true と失敗の種類 成功として、空の一覧と「0件」
エージェントの判断 再試行するか、別の方法を試す 「該当なし」として次に進む

失敗を空の結果として返すと、エージェントは「存在しない」と誤って結論します。

2.5 どこで回復するか


3. ツールの配分と tool_choice(2.3)

3.1 ツールは多すぎないように

問題 例 対策
ツールが多すぎて選択が不安定 1つのエージェントに18個 役割に必要な4〜5個に絞る
専門外のツールを誤用する 統合エージェントが自分で Web 検索を始める そのエージェントから検索ツールを外す
汎用ツールで何でもできてしまう fetch_url でどんな URL でも読める 文書の URL だけを検証して読む load_document に替える

3.2 よく使う用途には、範囲を絞った横断ツール

例: 統合エージェントが事実確認のたびにコーディネーター経由で Web 検索エージェントを呼び、往復が増えている。確認の多く(例: 85%)は日付や名前などの簡単なもの。

全部の検索ツールを統合エージェントに渡すのは、役割の分離が崩れるので誤りです(最小権限の考え)。

3.3 tool_choice の使い方

値 意味 試験での使いどころ
"auto" 呼ぶかどうか Claude が決める。テキストだけ返すこともある ふつうの会話
"any" 必ずどれかのツールを呼ぶ テキストではなく、必ずツール(構造化出力)を得たい
{"type": "tool", "name": "extract_metadata"} 指定したツールを必ず呼ぶ 特定の処理を最初に必ず実行させる。続く手順は次のターンで
"none" ツールを使わない —

新しいモデルでの変化(2026年11月時点): 強制の "any" と {"type": "tool"} は、手動の extended thinking を使うときと、Claude Opus 5.5・Sonnet 5.5・Fable 5.1・Mythos 5.1 では使えず、400 エラーになります。そのときの代わりは、"auto" と strict: true(ツール入力がスキーマに合うことを保証)の組み合わせ、または固定の JSON の形が欲しいなら構造化出力(output_config.format)です。どのツールを使うかはプロンプトで導きます(Define tools: Forcing tool use)。試験ガイドの書き方は古い前提なので、試験では「強制」の考え方で答え、実務では使うモデルを確かめます。


4. MCP サーバーの統合(2.4)

4.1 範囲(どこに設定するか)

用途 試験ガイドの書き方 今の Claude Code
チームで共有するサーバー プロジェクト単位: リポジトリの .mcp.json project スコープ: .mcp.json(コミットして共有)
個人・実験用のサーバー ユーザー単位: ~/.claude.json user スコープ(全プロジェクト)と local スコープ(このプロジェクトだけ)。どちらも ~/.claude.json に保存

試験では「チーム共有 = .mcp.json」「個人 = ~/.claude.json」と答えます。

4.2 秘密情報は環境変数展開で

{
  "mcpServers": {
    "github": {
      "type": "http",
      "url": "https://mcp.example.com/github",
      "headers": { "Authorization": "Bearer ${GITHUB_TOKEN}" }
    }
  }
}

(URL は説明用の例です)

4.3 ツールは接続時に見つかり、同時に使える

設定したすべての MCP サーバーのツールは、接続したときに見つかり、同時に使えます。どのサーバーのツールを呼ぶかは、ツールの説明で決まります。ツールが多いときは、Claude Code のツール検索で必要なものだけ読み込まれます。

4.4 MCP ツールの説明で組み込みツールに負けないようにする

例: 社内の code_search MCP ツールは、シンボルの定義と参照を正確に返せる。でもエージェントは組み込みの Grep ばかり使う。

対策: MCP ツールの説明に、何ができるか、何を返すか、Grep より向いている場面(「関数の定義と全参照を、ファイル名と行番号付きで返す。名前の変更やリファクタリングの影響を調べるときは Grep ではなくこちらを使う」)を詳しく書きます。

4.5 既存のサーバーを先に探す

連携 選ぶもの
Jira、GitHub、Slack などの標準的なサービス 既存の(信頼できる)コミュニティや公式の MCP サーバー
チーム固有のワークフロー(社内の承認の流れなど) 自作の MCP サーバー

公式の注意: 使うのは、自分で作ったサーバーか、信頼できる提供元のサーバーにします。

4.6 リソースで「中身の一覧」を見せる

MCP のリソースは、アプリが読み取り専用で渡すデータです。

リソースの例 効果
課題の要約の一覧 「どんな課題があるか」を、検索ツールを何度も呼ばずにわかる
文書の階層(目次) どの文書を読めばよいか先にわかる
データベースのスキーマ テーブル名を探すクエリが要らない

探索のためのツール呼び出しが減り、エージェントは最初から全体を見渡せます。Claude Code では、リソースを @ で参照できます。


5. 組み込みツールの選び方(2.5)

5.1 どれを使うか

ツール 何をするか 例
Grep ファイルの中身を検索(正規表現) 関数 calculateTax の呼び出し元をすべて探す、エラーメッセージの場所
Glob ファイルのパスをパターンで探す **/*.test.tsx のテストファイルを全部探す
Read ファイル全体を読む 見つけたファイルの中身を読む
Write ファイル全体を書く 新しいファイルを作る、全体を書き直す
Edit 一意なテキストに一致した部分を置き換える 1か所の修正
Bash コマンドを実行する テストを動かす、git

覚え方: 中身なら Grep、名前なら Glob。

5.2 Edit が失敗したら

Edit は、置き換える前の文字列がファイルの中で一意でないと失敗します(同じ行が何か所もある場合など)。

  1. 前後の行を含めて、一意になる文字列にしてもう一度 Edit する
  2. それでも一意な目印が見つからないときは、Read でファイル全体を読み、直した全体を Write で書く

5.3 少しずつ理解する

知らないコードベースで、最初に全ファイルを Read するのはむだです(コンテキストが埋まる)。

  1. Grep で入口を見つける(例: ルーティングの定義、main)
  2. Read でそのファイルを読み、import をたどる
  3. 必要なところだけ次を読む

5.4 ラッパーをまたぐ関数の追い方

例: utils/index.ts が formatDate を fmt という別名で再公開している。formatDate だけで Grep すると、fmt を使う場所を見落とす。

  1. まず、その関数が公開されている名前をすべて特定する(export { formatDate as fmt } など)
  2. 次に、それぞれの名前でコードベース全体を Grep する

6. 試験に向けたまとめ

問われ方 答えの考え方
似たツールの取り違え。最初の一手 説明文を詳しくする(入力形式、例、例外、境界)
名前も説明もほぼ同じ2つのツール 名前と説明を変える。汎用ツールは目的別に分ける
説明は良いのに選択がおかしい システムプロンプトのキーワード依存の指示を見直す
エージェントがむだに再試行する 構造化エラー(種類、再試行できるか、説明)
業務ルール違反のエラー 再試行不可と、顧客向けの説明を返す
検索結果が0件か、失敗か 区別して返す。失敗を空の成功にしない
ツールが18個で選択が不安定 役割ごとに必要なものだけ
統合エージェントの往復が多い 範囲を絞った verify_fact。複雑なものはコーディネーター経由
必ずツールを呼ばせる / 特定のツールを最初に "any" / {"type": "tool", "name": ...}(新しいモデルでは auto + strict などに置き換え)
チームで共有する MCP / 個人の MCP .mcp.json / ~/.claude.json
トークンをコミットしない ${GITHUB_TOKEN} の環境変数展開
Jira と連携 既存の MCP サーバー
探索の呼び出しを減らす MCP リソースで一覧を見せる
中身を検索 / ファイル名で探す Grep / Glob
Edit が一意に一致しない Read して Write

7. 用語集

用語 意味
ツールの境界 そのツールを使う場面と使わない場面の線引き
isError MCP のツール結果で、実行が失敗したことを示す印
一時的エラー 時間をおけば成功しうるエラー(タイムアウトなど)
横断ツール 役割の違うエージェントにも、特定の用途だけ渡すツール
環境変数展開 設定ファイルの ${VAR} を、実行時に環境変数の値で置き換えること
MCP リソース MCP サーバーがアプリに渡す、読み取り専用のデータ

出典

注意: MCP の仕様は Anthropic が始めたオープンな仕様で、modelcontextprotocol.io で公開されています。errorCategory や isRetryable の名前は試験ガイドの例で、標準の項目ではありません。内容は2026年11月時点のもので、上の出典を要約・言い換えたものです(ライセンスに配慮して書き直しています)。