読み取り→プレビュー→確認→書き込みが安全な理由
AIエージェントへ外部サービスの書き込み権限を渡す時、最も効果的な設計の一つが「考える」と「変更する」を分けることです。
四段階の流れ
“`text
Read
↓ 現在状態と対象IDを確認
Prepare
↓ 実行内容・差分・影響を表示
Confirm
↓ 人または明示的ポリシーが承認
Write
↓ 同じ内容だけを実行し監査
“`
Readでは対象を一意に特定します。Prepareでは外部状態を変えず、送信するpayload、変更前後、警告を表示します。Confirmでは人が内容を承認し、Writeではprepareと同一の内容だけを実行します。
なぜ確認ボタンだけでは足りないか
「実行しますか?」と尋ねても、その後にAIがpayloadを作り直せば、確認した内容と実行内容が違う可能性があります。確認コードやpayload hashを使い、内容が一文字でも変われば再確認を要求します。
さらに、prepare後に別の利用者が対象を変更する場合があります。ファイルならrevision、APIなら更新時刻やETagなどを使い、古い状態を前提に上書きしない楽観的ロックを検討します。
防御を重ねる
安全条件は一つに集約しません。
- 書き込み機能の初期値を無効
- 対象をallowlistで限定
- 入力の型、日付、金額、件数を検証
- prepareとwriteを別Toolにする
- payload hashを確認
- 直前状態のrevisionを確認
- 成功・失敗を監査
- 削除や高額処理は別の承認へ分ける
いずれか一つをすり抜けても、次の層で止める設計です。
自動実行ではどうするか
人がいないcronで、毎回手動承認はできません。その場合は、十分にテストした決定論的処理だけを自動承認し、対象と上限を狭くします。たとえば「前日の日次ノートの自動生成範囲だけ」を許可し、「任意ファイルを書き換える」は許可しません。
高リスク処理は、cronで下書きや候補まで作り、朝に人が承認して実行する二段階運用が現実的です。
まとめ
Human in the loopは、単に人へ聞くことではありません。人が確認した内容と、実際に実行される内容を技術的に結び付けることです。読み取りから書き込みまでの境界をTool設計へ落とし込みます。
参考にした一次情報
- [MCP Tools—User Interaction Model](https://modelcontextprotocol.io/specification/2025-11-25/server/tools)
- [Hermes Agent Security](https://hermes-agent.nousresearch.com/docs/user-guide/security/)
- [OWASP Transaction Authorization Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Transaction_Authorization_Cheat_Sheet.html)
