API キーをエージェントのコンテキストに入れてはいけません。
keygrant は AI コーディングエージェントのためのシークレット管理ツールです。モデルが見るのは名前だけ。値はプロセスに渡ります。すべてのコマンドはあなたが承認します。
コンテキストにあるものは漏れうる
エージェントは一日中、信頼できない入力を読んでいます。Web ページ、issue、README、ツールの結果。そこに注入された指示が一つあるだけで、モデルはコンテキストにあるものを URL やツール呼び出し、生成コードへと出力してしまうことがあります。コンテキストはログに残り、オブザーバビリティツールに保存され、会話記録として共有もされます。キーがそこにある限り、あらゆる出力経路が持ち出しの経路になります。
対策は「気をつける」ことではありません。アーキテクチャで解決します。
仕組み
OS ネイティブのストレージ
Windows は DPAPI、macOS はキーチェーン、Linux は Secret Service。dotfile にも、チャットにも置きません。
MCP 経由で注入
exec_with_secrets は、そのコマンドの子プロセスにだけ値を注入し、モデルが見る前に出力をマスクします。
コマンドごとに承認
ネイティブダイアログに正確なコマンドが表示されます。許可の対象はそのコマンド、そのエージェントセッション、15 分間だけで、メモリ上にのみ保持されます。タイムアウトは拒否扱いです。
保存用ツールはあえて用意しない
エージェントはシークレットを書き込むこともできません。ツール呼び出しに値が入れば、それはコンテキストに入ったのと同じだからです。値は別経路でのみ登録します。
インストール
uv tool install keygrant # または: pipx install keygrant(Python 3.10 以上)
keygrant init # プロジェクトに .mcp.json と CLAUDE.md を設定
echo "sk-..." | keygrant set STRIPE_KEY --desc "stripe, test mode" その後 Claude Code を再起動します。詳しい手順はクイックスタートをご覧ください。
オプション:同期とスマートフォンからの承認
複数のマシン間でのエンドツーエンド暗号化同期(サーバーは復号できない暗号文だけを保存します)と、席を離れているときのためのスマートフォン承認(判定はスマートフォン上で署名されるため、中継サーバーは偽造できません)。どちらもプレビュー版です。仕組みを読む →
防げないこと
- 承認したコマンドは、なお値を持ち出せます。 ダイアログには完全なコマンドが表示されます。それを読むことが防御策です。シークレットごとの送信先許可リストはロードマップにあります。
- マスキングは第二の防御線であり、保証ではありません。 本当の保証は、値がそもそもコンテキストに入らないことです。
- ローカルのマルウェアは対象外です。 keygrant が制限するのはエージェントが触れられる範囲であり、マルウェア対策製品ではありません。
ロードマップ
- 常駐トレイアプリ:承認履歴、ワンクリックでの取り消し
- シークレットごとの送信先許可リスト:キーを本来の API にだけ使えるように
- スマートフォン承認のプッシュ通知