2025 年後半から 2026 年にかけて、AI エージェント実装は「人間 → エージェント → ツール」という 1 段モデルから、「人間 → A → B → C → ツール」という**多段委譲モデル**に急速に移行している。Google の A2A プロトコル、Anthropic の Sub-agents、各社のオーケストレーション層の標準化が同時並行で進み、エージェント同士が互いを「ツール」として呼び出すアーキテクチャが現実になった。だが、ここで前回扱った MCP の JIT 権限付与だけでは解けない **4 つの新しい問題**が立ち上がる。本記事では A2A 通信で崩れる前提を整理し、OAuth on-behalf-of の応用パターン、監査連鎖の設計、暴走遮断のサーキットブレーカーまで、実装視点で踏み込む。
1. A2A 通信が一般化する背景
エージェント実装は、2024 年までは「単一エージェントが MCP を経由して外部ツールを叩く」モデルが主流だった。2025 年後半以降、これが次のように変質した:
- 専門特化エージェントの再利用 — 「契約レビュー専門」「請求書処理専門」など、特定タスクに最適化したエージェントを共通基盤として運用する流れ
- マルチエージェント・オーケストレーション — 1 つの上流エージェントが、複数の下流エージェントを並列に呼び出して結果を統合
- A2A プロトコルの標準化 — Google A2A(Agent2Agent Protocol)、Anthropic Sub-agents、各社のエージェントレジストリが整備され、組織横断・テナント横断の呼び出しが現実に
- MCP の「ツール」拡張 — MCP サーバーがラップする対象が、単純な API から「他のエージェント」に拡大
結果として、「ある業務リクエストを処理するためのコールチェーン」が 3 段・4 段に伸びる実装が日常になった。問題はここからだ。
2. 多段委譲で崩れる 4 つの前提
MCP のスコープクリープ議論(前回記事)では、1 段の「エージェント → ツール」の関係でも RBAC が破綻することを示した。A2A では、これに加えて以下 4 つの前提が崩れる。
前提① 身元証明:呼ばれたエージェントは「誰の依頼か」を本当に知れるか
下流エージェント B から見ると、自分を呼んだのは上流エージェント A だ。しかし、本当に責任を負うべきは A の背後にいる人間ユーザー(Alice)である。
Alice → Agent A → Agent B → CRM
↑
ここでBが見えるのは「Aの認証情報」だけ
Aliceの存在は構造化されていない
「Alice の依頼」であることを B が 暗号学的に検証可能な形で知らない限り、B は誤った権限判定をする。これは OAuth における Confused Deputy 問題の AI 版だ。
前提② 権限委譲:上流の権限はどこまで継承される(されない)べきか
Alice → A → B → C のチェーンで、各段は次のいずれかを取りうる:
| パターン | 内容 | リスク |
|---|---|---|
| 完全継承 | A の権限をそのまま B に渡す | スコープ過剰、横展開で爆発 |
| 縮退委譲 | A は B に「必要な分」だけ渡す | 実装が複雑、忘却で機能不全 |
| 再認可 | B が改めて Alice に同意を取る | UX 破壊 |
| 専用権限 | B 自体が独自の権限を持つ | A 経由の意図と分離してしまう |
RBAC は「主体ごとに静的」を前提とするため、この 4 択を動的に切り替える表現力を持たない。
前提③ 監査連鎖:チェーン全体を 1 つのトレースとして残せるか
問題発生時にトレースしたいのは「Alice の発話 → A の解釈 → B への依頼 → C への依頼 → CRM へのアクセス」の 一本のストーリーだ。
しかし実装上は、各エージェントが独立にログを吐く。trace_id が伝播していなければ、事後の調査でチェーンを復元できない。これは AI-SPM や SIEM の側で監査する場合の致命傷になる。
前提④ 暴走遮断:チェーンの途中で異常を検知して遮断できるか
A2A は再帰呼び出しを構造的に許す。プロンプトインジェクションが 1 箇所で成功すると、
- 想定外のサブエージェントが呼ばれる
- 1 つのリクエストが数十回の連鎖呼び出しに膨張する
- コストが指数的に拡大する
- スコープが「ついで」で拡大していく
これらをチェーンの途中で止める仕組みが要る。エンドポイントの WAF では遅すぎる。
3. 設計パターン:OAuth on-behalf-of の A2A 応用
幸い、この問題はゼロから設計し直す必要はない。OAuth 2.0 の Token Exchange(RFC 8693) と act クレーム、そして on-behalf-of フローを素直に拡張すれば実装できる。
基本構造:actor token のチェーン化
各段で発行されるトークンに、**直接の actor(呼び出し元エージェント)と究極の主体(人間ユーザー)**を分離して埋め込む。
{
"iss": "ai-secure-gateway.example.com",
"sub": "user:alice@example.com",
"act": {
"sub": "agent:contract-reviewer-v2",
"act": {
"sub": "agent:legal-orchestrator-v1"
}
},
"intent": {
"action": "fetch_contract",
"contract_id": "K-2026-0571"
},
"scope": ["read:contract:K-2026-0571"],
"trace_id": "trc-2026-05-29-9f3a",
"parent_request_id": "req-2026-05-29-7b21",
"depth": 3,
"max_depth": 5,
"iat": 1780012800,
"exp": 1780012830
}
ポイント:
subは 究極の責任主体(Alice)。RFC 8693 の作法どおり、直近の呼び出し元が最上位のactに、それ以前の経路がネストされたactに入る(sub自身はactチェーンには含めない)actチェーンを辿れば「誰が誰を介して呼んだか」が暗号学的に検証可能(→ 前提①の解)intentは各段で新しく宣言する(上流の intent をそのまま再利用しない)scopeは intent から導出される最小スコープ(→ 前提②の縮退委譲の実装)trace_idとparent_request_idでチェーン全体が 1 本のストーリーとして復元可能(→ 前提③の解)depth/max_depthで連鎖の深さに上限を持たせる(→ 前提④への第一歩)
Token Exchange の実フロー(3 段の例)
Step 1: Alice → Gateway
Alice が Orchestrator(A) を呼び出すための初期トークンを発行
sub=alice, act=null, scope=最大スコープ
Step 2: A → Gateway → B
A は B を呼ぶ前に Token Exchange でトークンを再発行
sub=alice, act={sub: agent:A}, scope=Bに渡す最小スコープ, intent=B用に再宣言
Step 3: B → Gateway → C(MCP/CRM)
B も同様に再発行
sub=alice, act={sub: agent:B, act: {sub: agent:A}}, scope=さらに絞る, intent=C用に再宣言
各段で Gateway を必ず経由する点が肝。直接 A から B にトークンをパススルーさせると、scope の縮退と intent の再宣言が忘れられがちになる。
4. A2A 監査ログの設計
A2A の監査では「3 点セット」を必ず残す:
| フィールド | 役割 |
|---|---|
trace_id |
チェーン全体で共通。Alice の 1 リクエストに対応 |
parent_agent_id |
直接の呼び出し元。チェーン構造の復元に必須 |
intent(各段独立) |
各段で何のために呼んだか。意図のドリフト検出に使う |
チェーン可視化のサンプル
trace_id: trc-2026-05-29-9f3a
└─ [depth=0] user:alice intent={request:"今期の契約更新可否を整理して"}
└─ [depth=1] agent:legal-orchestrator intent={action:"fan_out_review"}
├─ [depth=2] agent:contract-reviewer intent={action:"review", contract_id:K-2026-0571}
│ └─ [depth=3] mcp:crm intent={action:"fetch_contract", contract_id:K-2026-0571}
└─ [depth=2] agent:risk-checker intent={action:"assess_risk", contract_id:K-2026-0571}
└─ [depth=3] mcp:risk-db intent={action:"lookup", entity:"counterparty-X"}
この粒度でログが残っていれば、事後に「Alice の発話に対して、結局どのデータが触られたか」を 1 本のストーリーで再現できる。AI-SPM 側(AI-SPM アーキテクチャ記事)でこの形のログを集約する前提で設計する。
検出したい逸脱パターン
depthがmax_depthに達した(無限再帰の兆候)- 1 つの
trace_id内で 同一エージェントが想定回数を超えて呼ばれた - 上流の
intentと下流のintentの意味的乖離(例:「契約レビュー」から突然「全顧客リスト取得」に飛ぶ) scopeがチェーンを下るほど広がっている(本来は縮退すべき)
5. 暴走遮断:サーキットブレーカーの設計
A2A の遮断は、ネットワーク機器の WAF ではなく Gateway 層の論理ブレーカーとして実装する。最低限、次の 4 つを持つ:
- 深さブレーカー:
depth > max_depthで即遮断(デフォルト 5) - 回数ブレーカー:同一
trace_id内の総 API 呼び出し回数に上限(デフォルト 50) - コストブレーカー:同一
trace_id内の累積トークン消費に上限(金額換算で運用) - スコープ拡大率ブレーカー:チェーンを下って
scopeが広がる呼び出しは原則拒否
これらは「正常系を妨げない」よう、最初はアラートのみ・後段で自動遮断、という二段運用が現実的だ。
6. 実装チェックリスト
A2A 通信を導入する設計レビューで確認する項目:
- エージェント間呼び出しが 必ず Gateway を経由しているか(直接呼び出しが残っていないか)
- トークンに
sub(究極の主体)とactチェーン(呼び出し経路)を分離して埋めているか - 各段で
intentを新しく宣言しているか(上流の intent の使い回しになっていないか) -
scopeがチェーンを下るほど狭まる設計になっているか -
trace_idがチェーン全体で伝播しているか -
parent_agent_idをログに残しているか -
depth/max_depthを持ち、再帰深度を制限しているか -
trace_id単位での回数ブレーカー・コストブレーカーが動いているか - 副作用のあるツール呼び出し(書き込み・送信・課金)には人間承認のフックがあるか
- チェーン途中で発火したアラートを SOC が一本のストーリーとして見られるか
7. 3 軸評価との接続
AITB の 3 軸評価フレームワーク の文脈で、A2A 案件は次のように整理できる:
| 軸 | A2A で問うこと |
|---|---|
| Technology | チェーンが安定して完走するか/レイテンシ・コストが許容範囲か/障害が局所化されるか |
| Business Value | マルチエージェント化で本当に価値が増えているか(単一エージェントで足りない明確な理由があるか) |
| Trust | 上記 4 前提(身元・委譲・監査・遮断)が設計レベルで解かれているか |
特に Trust 軸では、A2A は「単一エージェントよりリスクが連鎖的に拡大する」という構造的な不利を持つ。本当に多段化が必要か、まず単一エージェントで実装し、必要になった時点で A2A 化するという順序を推奨したい。
8. 始めかた
すべてを一気にやる必要はない。次の順序が現実的:
- 既存の A2A 呼び出しを棚卸し(意図せず多段化している箇所がないか)
trace_idとparent_agent_idをログに残す(最小投資で監査連鎖が立ち上がる)depth/max_depthの導入(暴走遮断の最小実装)- Gateway 経由化と Token Exchange の段階導入(高リスク経路から順に)
- スコープ縮退の自動化と監査ダッシュボード化
DataSign の AI MONBAN は、JIT 権限付与(前回記事)と A2A チェーン監査をひとつの Gateway 上で統合して扱う設計を取っており、上記 1〜5 を段階的に載せていける。とはいえ製品選定の前に、まず trace_id を残すことから始めれば、自社にとって何が足りていないかが見えるはずだ。
関連:MCP サーバーのスコープクリープ問題 は本記事の前提となる 1 段モデルの議論。AI-SPM 実装アーキテクチャ では A2A のチェーンログを集約する基盤側の設計を扱っている。AITB の 3 軸評価フレームワーク では、Trust 軸の中で本記事のチェック観点を必須項目として運用する。A2A を含むエージェント案件のレビュー希望は 無料相談 よりお問い合わせください。