AI エージェントに自律実行を任せるとき、権限・証跡・コストはどう設計するのか?
LLM に文章を要約させる、候補を提示させるだけの機能なら、出力が多少ズレても実害は小さい。だが「請求書を発行する」「DB のレコードを更新する」といった書き込み操作までエージェントに任せた瞬間、話は変わる。出力は非決定的なままなのに、その先で現実のシステムが動いてしまうからだ。この一線を越えるとき、実装は具体的に何を足す必要があるのか。
- 自律実行するエージェントの安全性は「機能」「権限」「自律性」のどれかが過剰なときに崩れる。まず絞るべきはエージェントが持つ権限そのもの
- 権限を絞っても、判断をエージェント自身に委ねたままでは足りない。破壊的な操作の手前にサーバー側の強制ポイントを置き、記録を残す設計が要る
- 自律実行はやり取りの往復が増えて入力トークンが膨らみやすく、同じ文脈を毎回払わずに済ませるキャッシュの仕組みがコスト面でも効いてくる
なぜ「自律実行」になると設計の負荷が跳ね上がるのか
OWASP が LLM アプリケーションのリスクとしてまとめるExcessive Agency(過剰な代理行為)は、AI エージェントの安全性が崩れる原因を 3 つに整理している。エージェントが本来の業務に不要な機能まで持ってしまう「過剰な機能」、その機能が業務に必要な範囲を超えた権限で動く「過剰な権限」、そして高リスクな操作が人の確認なしに実行されてしまう「過剰な自律性」だ。単に候補を提示するだけのアシスタントならこの 3 つはさほど問題にならない。しかし書き込み操作を伴うエージェントでは、出力が想定と少しでもズレたときにその先の実システムが動いてしまうため、3 つとも設計で潰しておく必要がある。
ここから先は、この 3 つの原因に対応する形で「権限を絞る」「実行の手前で止める仕組みを作る」「起きたことを記録する」「コストを制御する」という 4 つの実装の柱を順に見ていく。
権限制御 ― エージェントに「渡す鍵」を最小にする
複数のツールをまとめて外部に公開するMCP(Model Context Protocol)の認可仕様では、MCP サーバーは OAuth 2.1 のリソースサーバーとして振る舞う。クライアントが認可なしにアクセスすると、サーバーは 401 応答の WWW-Authenticate ヘッダーで必要なOAuth スコープ(アクセストークンに紐づく、実行を許可する操作の範囲を表す文字列)を提示し、クライアントはその範囲だけを要求する。これは「最小権限の原則」を仕様レベルで後押しする仕組みだ。
HTTP/1.1 401 Unauthorized WWW-Authenticate: Bearer resource_metadata="https://mcp.example.com/.well-known/oauth-protected-resource", scope="files:read"
さらに運用中に権限が足りない操作を呼ぶと、サーバーは 403 で error="insufficient_scope" と不足しているスコープ名を返し、クライアントは必要な分だけ追加で認可を取り直す(ステップアップ認可)。最初から広いスコープを一括で渡すのではなく、必要になった時点で最小限を積み増す設計だ。ただし MCP の仕様書自身が明記する通り、認可の実装はOPTIONAL(任意)であり、サーバー側が実装しなければ何もしなくても動いてしまう。「MCP を使えば権限管理がついてくる」わけではなく、スコープ設計は実装者が引き受ける仕事だ。
新人に会社の法人カードを渡す場面を思い浮かべてほしい。渡すカードには最初から利用可能な費目の上限を設定し(権限制御)、上限を超える買い物をしようとしたら経理システムがその場で決済を止めて上長の承認を要求し(ガードレール)、使った内容は明細として自動的に記帳される(監査ログ)。カードを渡した後は本人の判断に任せきりにせず、システム側に強制力のあるチェックポイントを組み込んでおくから、あとから「誰が何にいくら使ったか」を追える。
ガードレール ― 判断をエージェント任せにしない
権限を絞っても、そのスコープ内で実行するかどうかの判断をエージェント自身の出力だけに委ねると、プロンプトインジェクションなどで想定外の指示に従ってしまうリスクが残る。OWASP のガイドはこれをComplete Mediation(完全な仲介)と呼び、認可の判定はエージェントの自己申告ではなく、実行対象となる下流のシステム側で強制するべきだとしている。具体的には、取消不能な操作や影響範囲の大きい操作(送金・削除・請求書発行など)はサーバー側のポリシー層で機械的にブロックし、必要なら人の承認を挟んでから実行するHuman-in-the-Loopの経路を用意する。「エージェントに気をつけるよう指示する」のはガードレールではなく、実行経路上に外せない関所を作ることがガードレールだ。
┌─────────────┐
│ LLM エージェント │
└──────┬──────┘
│ 呼び出し
▼
┌─────────────┐
│ ガードレール層 │
└──────┬──────┘
│ 許可された操作のみ通過
▼
┌─────────────┐
│ 実ツール / API │
└──────┬──────┘
│ 実行結果
▼
┌─────────────┐
│ 監査ログ │
└─────────────┘
証跡ログ ― 起きたことを後から機械的に追えるようにする
通常のアプリケーションログは「どの関数が呼ばれたか」を追えれば十分なことが多い。しかしエージェントは同じ入力でも毎回異なる手順・異なる引数でツールを呼び得るため、事後に「なぜこの操作をしたのか」を人が再現できる形で残す監査ログが要る。最低限、誰が(どのユーザー・どのエージェントセッション)、いつ、どのツールを、どんな引数で呼び、実行前後の状態がどう変わったかの 4 点を構造化して残す。この記録がなければ、ガードレールをすり抜けた操作があっても後から検知しようがない。OWASP のガイドも、エージェントの活動を継続的に監視・記録する仕組みを Excessive Agency への対策の一つに挙げている。
トークンコスト最適化 ― 同じ文脈を毎回払わない
自律実行するエージェントはツール定義や過去のやり取りを毎ターン読み直すため、単発のチャット機能より入力トークンが膨らみやすい。Anthropic のプロンプトキャッシュは、直前と同じプレフィックス(システムプロンプトやツール定義など)をサーバー側に保持し、2 回目以降はそのぶんの計算をスキップして安く読み出す仕組みだ。キャッシュへの書き込みは通常価格の 1.25 倍(5 分保持の場合)かかる一方、書き込んだ内容を読み出すキャッシュヒットは通常価格の 0.1 倍まで下がる。ただし最小 1,024 トークン(Claude Sonnet 5 の場合)に満たないプレフィックスはキャッシュされず、5 分以内に再利用されなければ書き込みコストだけが乗って割高になる。同じ文脈を最低 2 回以上使い回して初めて元が取れる設計だ。
自分のプロダクトにツール実行型のエージェントを組み込むときも、この 4 本柱の順序で設計するとよい。まずエージェントに渡す API・ツールをスコープ単位で最小化し、次に破壊的操作の手前にサーバー側で強制できるチェックポイントを置き、その実行結果を構造化ログで残す。この 3 つを終えてから、長い会話やツール定義が繰り返し流れる箇所にキャッシュを効かせてコストを抑える。逆にコスト最適化を最初にやってしまうと、権限とガードレールが甘いまま安く大量に実行できる状態を作ってしまう。
プロンプトキャッシュの料金倍率(書き込み 1.25 倍・読み出し 0.1 倍)をそのまま使って、何回のやり取りで元が取れるかを手元で計算してみる。
python3 -c "
base = 3 # 例: 1 ターンぶんの入力コストの相対値
write = base * 1.25 # 5 分キャッシュの書き込み
read = base * 0.1 # キャッシュヒット時の読み出し
turns = 10
no_cache = base * turns
with_cache = write + read * (turns - 1)
print(f'キャッシュなし: {no_cache:.2f}')
print(f'キャッシュあり: {with_cache:.2f}')
print(f'削減率: {(1 - with_cache/no_cache)*100:.0f}%')
"
10 ターンのやり取りで、キャッシュなしの 30.00 に対してキャッシュありは 6.45 まで下がり、削減率はおよそ 78% になるはずだ。turns を 2 に減らすと削減率が大きく縮むのも確認でき、「2 回以上再利用して初めて元が取れる」という損益分岐点を数字で体感できる。
- 権限さえ最小にすれば AI エージェントは安全 — 最小権限は必要条件だが、絞った権限の中でも誤った操作は起こり得るため、実行を強制的に止められるガードレールと事後に追える監査ログがなければ実害を防げない。
- MCP を使えば認可・権限管理は自動でついてくる — MCP の認可仕様は実装が任意であり、サーバー側がスコープや 401/403 のハンドリングを実装して初めて機能する。
- プロンプトキャッシュを使えば常にコストが下がる — 最小トークン数に満たない短いプロンプトはキャッシュされず、キャッシュしても短時間内に複数回再利用しなければ書き込みコストの分だけ割高になる場合がある。
- OAuth スコープ
- アクセストークンに紐づく、実行を許可する操作の範囲を表す文字列。
- 最小権限の原則
- 主体に与える権限を、業務の遂行に必要な最小限にとどめる設計原則。
- Human-in-the-Loop
- AI の判断を自動実行させず、一定条件下で人の承認・確認を挟む設計。
- プロンプトキャッシュ
- 直前と共通するプロンプトの前半部分をサーバー側に保持し、再計算を省いて安く読み出す仕組み。
- 監査ログ
- 誰が・いつ・何を・どう変更したかを構造化して記録し、後から追跡・検証できるようにするログ。
- ガードレール
- AI エージェントが実行できる操作の範囲や条件を、実行経路上で強制的に制限する仕組み。
- Authorization - Model Context Protocol — MCP のスコープ設計とステップアップ認可の 401/403 フローを一次仕様で確認できる。
- Prompt caching - Claude Platform Docs — キャッシュ書き込み・読み出しの料金倍率と最小トークン数を一次情報で確認できる。
- LLM06: Excessive Agency - FireTail blog — OWASP LLM Top 10 における過剰な代理行為の 3 つの原因と緩和策を解説している。