$ keygrant

API キーをエージェントのコンテキストに入れてはいけません。

keygrant は AI コーディングエージェントのためのシークレット管理ツールです。モデルが見るのは名前だけ。値はプロセスに渡ります。すべてのコマンドはあなたが承認します。

はじめる → GitHub 設計思想:脅威モデル
デモ:エージェントがシークレットを要求し、ユーザーがネイティブダイアログで承認すると、出力はマスクされて返ります

コンテキストにあるものは漏れうる

エージェントは一日中、信頼できない入力を読んでいます。Web ページ、issue、README、ツールの結果。そこに注入された指示が一つあるだけで、モデルはコンテキストにあるものを URL やツール呼び出し、生成コードへと出力してしまうことがあります。コンテキストはログに残り、オブザーバビリティツールに保存され、会話記録として共有もされます。キーがそこにある限り、あらゆる出力経路が持ち出しの経路になります。

対策は「気をつける」ことではありません。アーキテクチャで解決します。

model context: $STRIPE_KEY (名前だけ)
child process: sk-live-************ (実行時に注入)
output channel: [STRIPE_KEY:REDACTED] (base64/hex/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 を再起動します。詳しい手順はクイックスタートをご覧ください。

オプション:同期とスマートフォンからの承認

複数のマシン間でのエンドツーエンド暗号化同期(サーバーは復号できない暗号文だけを保存します)と、席を離れているときのためのスマートフォン承認(判定はスマートフォン上で署名されるため、中継サーバーは偽造できません)。どちらもプレビュー版です。仕組みを読む →

防げないこと

ロードマップ