homula

エージェンティック・ハーネス設計ガイド — Part 4

ツール設計とスキル

読ませすぎない。選ばせすぎない。

18〜22分難易度 ★★☆(中級)最終更新: 2026年8月

「接続先を増やしたら、AIが正しいツールを選べなくなった」——これはよくある症状です。そして原因はモデルの能力ではなく、全件を常に見せている設計にあることがほとんどです。

Part 1の6つの構成要素でいう「ツール接続」と「再利用・統制」を扱います。Part 2が「文脈をどう保つか」だったのに対し、この記事はそもそも何を文脈に入れるかの話です。

扱うのは2つ。エージェントが外を触るためのツールと、繰り返す仕事の手順を外に置くスキルです。どちらにも共通する原則が「読ませすぎない」——必要になった分だけ見せる、という設計です。

1.ツールが選べなくなる、本当の理由

10個のツールなら、全部見せても問題は起きません。しかし接続先が増えて100を超えたあたりから、選択の精度が落ち始めます。

ツール 10 個全部見せても、選べるツール 200 個 — 全件を毎回提示枠を食い、似た名前が並び、選択を誤る原因はモデルの能力ではなく、「全件を常に見せている」設計人間のエンジニアが選択肢を見て迷うなら、モデルも迷う必要なのは、ツールを減らすことではなく「必要になった分だけ見せる」こと。
図1全件を常に提示する設計では、接続先が増えるほど枠を食い、似た名前のツールが並んで選択を誤る。必要なのはツールを減らすことではなく、必要になった分だけ見せること。

判断の目安

人間のエンジニアがそのツール一覧を見て「どれを使えばいいか分からない」と感じるなら、モデルも同じところで迷います。名前が似ている、説明が抽象的、粒度が揃っていない——これらはすべて、人にとっての分かりにくさがそのままモデルの誤選択になります。

2.ツール定義の4原則

個々のツールをどう定義するか。特別な作法はなく、人が使うAPIの設計とほぼ同じ原則が効きます。

名前空間で境界を作るどの領域のツールかが名前で分かる検索 → 案件検索 / 顧客検索意味の読み取れる識別子を返す後続の判断に使える値にするランダムな ID だけを返さない簡潔版と詳細版を選ばせる必要なときだけ詳細を取らせる既定は簡潔・引数で切り替え結果の量に上限を置く上限があると、設計が意図的になる超えたら「絞れ」と本文で伝えるいずれも「モデルが迷わないようにする」ための設計。人が使う API の作法とほぼ同じ。
図2名前空間で境界を作る、意味の読み取れる識別子を返す、簡潔版と詳細版を選ばせる、結果の量に上限を置く。いずれも「モデルが迷わないようにする」ための設計。

このうち見落とされやすいのが返す識別子です。ランダムなIDだけを返すツールは、後続の判断材料を何も渡していません。「INV-2026-0831-ACME」のように意味が読み取れる値を含めれば、エージェントは中身を再取得せずに判断を進められます。

結果の量に上限を置くことも、単なる保護ではありません。上限があると、設計が意図的になります。「全部返す」が選べないと、何を返すべきかを考えざるを得なくなるためです。

3.エラーは「状態の通知」ではなく「次の行動の指示」

ツール設計で最も効くのに、最も手を抜かれるのがエラーメッセージです。

不透明なエラーERR_INVALID_REQUEST何が悪いのか、次に何をすべきか分からない同じ呼び出しを、条件を変えずに繰り返す実行可能な改善を返す期間の指定が広すぎます。90 日以内に絞るか、取引先を指定して再実行してください。条件を変えて、次の呼び出しに進める結果を切り詰めるときも、同じ「上位 50 件のみ表示しています(全 1,240 件)。絞り込むか、次のページを取得してください」— 黙って切り詰めると、エージェントは「これで全部だ」と判断して先へ進むエラーも切り詰めも、「状態の通知」ではなく「次の行動の指示」として書く。
図3エラーコードだけを返すとエージェントは同じ呼び出しを繰り返す。次に取るべき行動を本文で伝えれば、条件を変えて先へ進める。結果の切り詰めも同じで、黙って切り詰めると「これで全部だ」と判断される。

とくに危険なのが黙って切り詰めることです。1,240件のうち上位50件だけを返し、そのことを伝えなければ、エージェントは50件で全体を判断します。表面上は正常に完了し、結論だけが間違っている——Part 3で扱った「誰も気づけない失敗」と同じ構造です。

4.段階的に見せる — 入口だけを常設する

ツール数の問題への答えが、段階的な読み込みです。全部を常設せず、絞り込みながら降りていきます。

起動時領域の一覧だけ検索 / 会計 / 顧客 / 通知 …領域が決まったらその中のツール一覧会計:請求書検索 / 仕訳登録 / 残高照会呼ぶ段になったら詳細な引数仕様請求書検索:期間・取引先・状態・並び順 200 個のツールを常時提示するのではなく、絞り込みながら降りていく。Anthropic は、必要な定義だけを読み込む方式で 150,000 → 2,000 トークン(98.7% 減)の例を報告している「Code execution with MCP」2025-11-04 / 削減幅は接続しているツールの数と規模に依存する枠の節約だけでなく、選択肢が少ないほど選択が正確になるという効果もある。
図4起動時は領域の一覧だけ、領域が決まったらその中のツール一覧、実際に呼ぶ段になって詳細な引数仕様。Anthropic は、必要な定義だけを読み込む方式で 150,000 → 2,000 トークン(98.7% 減)の例を報告している。

削減幅は大きくなり得ます。Anthropic は「Code execution with MCP」(2025年11月4日)で、必要な定義だけを読み込む方式により 150,000 → 2,000 トークン(98.7% 減)となった例を報告しています。削減幅は接続しているツールの数と規模に依存するため、常にこの比率になるわけではありません。

効果は枠の節約だけではありません。選択肢が少ないほど、選択は正確になります。段階を踏むことで、各段階での判断が「20個から1個」ではなく「5個から1個」になります。

5.往復で呼ぶか、コードで呼ぶか

ツールの呼び方そのものにも選択肢があります。1回ずつ往復して呼ぶか、呼び出しをまとめたコードを書いて実行環境で走らせるかです。

1 回ずつ往復して呼ぶ呼び出し 1中間結果が文脈に載る呼び出し 2中間結果が文脈に載る呼び出し 3中間結果が文脈に載る使い捨ての中間結果まで、すべて枠を食う呼び出しをまとめたコードを書いて実行するa = 検索(...)b = 突合(a)return 集計(b)中間結果は実行環境に留まる文脈に載るのは、最終結果だけ枠の消費が、桁で変わることがある中間結果が大きく、最後に要るのが集計値だけ — という形の処理でとくに効く効果は処理の形に依存する。往復のたびに人の判断を挟みたい処理には向かないただし、コードを走らせる以上、隔離された実行環境が前提になる。
図5往復方式では使い捨ての中間結果までモデルの文脈に載る。コード方式では中間結果は実行環境に留まり、最終結果だけが返る。中間結果が大きく、最後に要るのが集計値だけ、という形の処理でとくに効く。

効果が出るのは、中間結果が大きく、かつ最終的に必要なのは集計値だけ——という形の処理です。逆に、往復のたびに人の判断を挟みたい処理には向きません。前節の「必要な定義だけを読み込む」話と合わせて、どちらもツール接続まわりのトークンを削る手段として同じ資料で扱われています。

前提として、コードを走らせる以上は隔離された実行環境が要ります。この方式を選ぶことは、サンドボックスを持つことを意味します。

6.スキル — 繰り返す手順を、外に置く

ここからはスキルの話です。スキルとは、繰り返す仕事の手順を、その都度プロンプトに書くのではなく、呼び出せる形で外に置いたものを指します。

スキル(フォルダひとつ)メタデータ — 名前と、一行の説明いつ使うかを、ここだけで判断させる本文 — 手順書何を、どの順で、どう判断するか参照ファイル・スクリプト詳細な仕様、実例、決定的に動かしたい処理常に読む関連する時必要な時だけ軽い中くらい重い「繰り返す仕事の手順」を、その都度プロンプトに書くのではなく、呼び出せる形で外に置く。
図6名前と一行の説明(常に読む)、手順を書いた本文(関連する時に読む)、参照ファイルとスクリプト(必要な時だけ読む)。フォルダひとつにまとまり、段階を追って開かれる。

構造はツールの段階的開示と同じです。常に読まれるのはメタデータだけで、本文は関連すると判断されたときに、参照ファイルは実行中に必要になったときにだけ読み込まれます。スキルが100個あっても、常時の負担は100行程度の説明文で済みます。

7.説明文が、呼ばれるかどうかを決める

スキルが機能しない相談の大半は、実装ではなく説明文が原因です。呼ぶかどうかの判断に使われるのは、名前と一行の説明だけだからです。

依頼:「先月の請求書を突合して」曖昧な説明「経理まわりの作業を支援します」いつ使うのかが書かれていない→ 該当するのに、呼ばれないいつ使うかが書かれた説明「請求書と入金明細の突合。月次締め、差異調査、入金消込のときに使う」→ 正しく呼ばれる説明文は「何ができるか」ではなく「どういうときに使うか」を書く判断に使われるのは、この一行だけスキルが増えるほど、この一行の精度が全体の挙動を左右する。
図7「経理まわりの作業を支援します」では、該当する依頼でも呼ばれない。「請求書と入金明細の突合。月次締め、差異調査、入金消込のときに使う」なら正しく呼ばれる。書くべきは、何ができるかではなく、どういうときに使うか。

コツは、利用者が使いそうな言葉を説明文に含めることです。「突合」と書いてあっても、現場が「消込」と呼んでいるなら、その語も入れておく。説明文はドキュメントではなく、検索のためのインデックスに近いものと考えると設計しやすくなります。

スキルが増えてきたら、互いに排他的な文脈は別のスキルに分けることも効きます。1つのスキルに複数の用途を詰め込むと、説明文が抽象的にならざるを得ず、結果としてどの場面でも呼ばれにくくなります。

8.決定性が要るなら、指示ではなくスクリプト

スキルの本文に手順を書くか、スクリプトを同梱して実行させるか。判断基準は単純で、結果が毎回同じであるべきかです。

毎回、手順を考えさせる同じ依頼そのつど推論結果 A結果 B結果 C揺れる・遅い・高い確定した手順は、スクリプトとして同梱する同じ依頼スクリプトを実行常に同じ結果速い・安い・確実判断が要るところだけモデルに任せ、決まっている手順はコードに落とす
図8毎回モデルに考えさせると結果が揺れ、遅く、高くつく。確定した手順をスクリプトにすれば、同じ入力なら常に同じ結果になる。判断が要るところだけモデルに任せる。

ここはトークン効率より決定性を優先する場面です。ファイル形式の変換、集計、命名規則の適用——手順が確定しているものは、モデルに毎回組み立てさせる理由がありません。

9.スキルは、運用の中で育てる

最初から完璧な説明文は書けません。実際の依頼と突き合わせて、呼ばれ方を合わせていく必要があります。

01実際の依頼で使わせる想定と違う使われ方が出る02外れた場面を集める呼ばれなかった/誤って呼ばれた03説明文と本文を直すトリガーの語彙、判断の観点04また使わせる外れが減ったかを見る繰り返すスキルは「書いて終わり」ではなく、運用の中で育てる最初から完璧な説明文は書けない。実際の依頼と突き合わせて、呼ばれ方を合わせていく。この反復を回す前提として、「どのスキルが、いつ呼ばれたか」が記録に残っている必要がある。
図9実際の依頼で使わせ、想定から外れた場面(呼ばれなかった/誤って呼ばれた)を集め、説明文と本文を直し、また使わせる。この反復の前提として、どのスキルがいつ呼ばれたかが記録に残っている必要がある。

この反復を回すために必要なのが、実行の記録です。どのスキルが、どの依頼で、呼ばれたか・呼ばれなかったか。これが残っていなければ、改善の材料そのものが手に入りません。ツールとスキルの設計は、Part 1で挙げた「⑥ 再利用・統制」の記録と、セットで機能します。

10.アンチパターン早見表

ここまでの内容を、実装で見かける形にして並べます。

よくある実装何が問題かどうするか
全ツールを常に提示する枠を食い、似た名前が並んで選択を誤る領域→ツール→引数の順に段階的に見せる
エラーコードだけを返す同じ呼び出しを条件を変えずに繰り返す次に取るべき行動を本文で伝える
黙って結果を切り詰める「これで全部だ」と判断して先へ進む総件数と、絞り込み方を一緒に返す
ランダムな識別子だけを返す後続の判断に使えず、文脈を復元できない意味の読み取れる値を含める
中間結果を毎回モデルに返す使い捨ての結果まで枠を食うまとめて実行し、最終結果だけ返す
スキルの説明に「何ができるか」を書くいつ使うかが分からず、呼ばれないどういうときに使うかを書く
確定した手順もプロンプトで指示する毎回揺れる・遅い・高いスクリプトとして同梱して実行させる
スキルを作って放置する想定と違う使われ方に気づけない呼ばれ方を記録し、説明文を直し続ける

Summary

この記事の要点

  1. 1ツールが選べない原因は、モデルの能力ではなく「全件を常に見せている」設計にあることがほとんど。
  2. 2人間のエンジニアが迷う一覧は、モデルも迷う。名前・説明・粒度の分かりにくさは、そのまま誤選択になる。
  3. 3ツール定義は人が使うAPIと同じ原則 — 名前空間、意味の読み取れる識別子、簡潔版と詳細版、結果量の上限。
  4. 4エラーは「状態の通知」ではなく「次の行動の指示」として書く。
  5. 5黙って結果を切り詰めない。総件数と絞り込み方を一緒に返さないと、部分で全体を判断される。
  6. 6ツールは段階的に見せる — 領域 → ツール → 引数仕様。選択肢が少ないほど選択は正確になる。
  7. 7必要なツール定義だけを読み込む方式で、Anthropic は 150,000→2,000 トークン(98.7%減)の例を報告している。
  8. 8中間結果が多い処理は、往復ではなくコードで呼ぶ。中間結果は実行環境に留め、最終結果だけを文脈に載せる。
  9. 9スキルは、繰り返す手順を呼び出せる形で外に置いたもの。常に読まれるのは説明文だけ。
  10. 10説明文には「何ができるか」ではなく「どういうときに使うか」を書く。現場の語彙を含める。
  11. 11結果が毎回同じであるべき処理は、指示ではなくスクリプトにする。決定性はトークン効率に優先する。
  12. 12スキルは書いて終わりではない。呼ばれ方を記録し、説明文を直し続ける。

FAQ

よくある質問

多くの場合、原因はモデルの能力ではなく「全件のツールを常に提示している」設計にあります。選択肢が増えるほど枠を食い、似た名前のツールが並んで選択を誤ります。人間のエンジニアが選択肢を見て迷うなら、モデルも迷います。対策はツールを減らすことではなく、領域→ツール→引数仕様の順に、必要になった分だけ見せることです。

「状態の通知」ではなく「次の行動の指示」として書きます。エラーコードだけを返すと、エージェントは同じ呼び出しを条件を変えずに繰り返します。「期間の指定が広すぎます。90日以内に絞るか、取引先を指定して再実行してください」のように、次に取るべき行動を本文で伝えます。結果を切り詰めるときも同様で、黙って切り詰めるとエージェントは「これで全部だ」と判断して先へ進みます。

中間結果が多い処理では有利です。1回ずつ往復して呼ぶ方式では、使い捨ての中間結果まですべてモデルの文脈に載ります。呼び出しをまとめたコードを実行環境で走らせれば、中間結果は実行環境に留まり、最終結果だけが返ります。ただし効果は処理の形に依存し、往復のたびに人の判断を挟みたい処理には向きません。またコードを走らせる以上、隔離された実行環境が前提になります。なおAnthropicは同じ「Code execution with MCP」(2025-11-04)で、必要なツール定義だけを読み込む方式により150,000→2,000トークン(98.7%減)となった例も報告しています。

繰り返す仕事の手順を、その都度プロンプトに書くのではなく、呼び出せる形で外に置いたものです。名前と一行の説明(メタデータ)、手順を書いた本文、参照ファイルやスクリプトの3つがフォルダひとつにまとまっており、必要になった段階だけを読み込む「段階的開示」の構造になっています。

まず説明文です。呼ぶかどうかの判断に使われるのは、名前と一行の説明だけです。「経理まわりの作業を支援します」のような曖昧な説明では、該当する依頼でも呼ばれません。「請求書と入金明細の突合。月次締め、差異調査、入金消込のときに使う」のように、何ができるかではなく“どういうときに使うか”を書きます。

結果が毎回同じであるべき処理は、スクリプトにします。毎回モデルに考えさせると結果が揺れ、遅く、高くつきます。判断が要るところだけモデルに任せ、確定している手順はコードに落とすのが基本です。トークン効率より、決定性を優先する場面と考えてください。

Part 3

耐久実行と再開 — 中断を前提に組む

落ちない設計ではなく、落ちても続きから戻れる設計へ。

Part 5 — 準備中

封じ込めと承認設計 — 境界を先に敷く

隔離強度の選び方、許可リストを「能力の付与」として捉える視点、非同期の承認と束ね承認。

実行基盤を、自社で持ちたい方へ

homulaは、AIエージェント実行基盤の要件定義から設計・構築・運用までを支援しています。ツール設計とスキル運用は、接続先が増えてから作り直すと高くつく領域です。