Skip to main content
Glama
DINAKAR-S

keywarden

by DINAKAR-S

keywarden

あなたのAIエージェントはAPIキーを使えますが、決して読むことはできません。

keywardenは、MCPを話すローカルで暗号化された資格情報ボールトです。 Claude Code、Claude Desktop、Cursor、または任意のMCPクライアントが接続すると、2つの機能を利用できます。 認証付きAPI呼び出しと、資格情報を環境に注入したコマンド実行です。どちらも資格情報自体をモデルのコンテキストに入れることはありません。

get_secretツールは存在しません。その不在こそが製品のすべてです。

   agent                keywarden                    upstream
     |                     |                          |
     |  "POST /v1/chat     |                          |
     |   using openai/prod"|                          |
     |-------------------->|                          |
     |                     | check policy             |
     |                     | decrypt key              |
     |                     | attach Authorization     |
     |                     |------------------------->|
     |                     |<-------------------------|
     |  response only      | scrub any key from body  |
     |<--------------------| append to audit log      |

なぜ

現在、エージェントにOpenAIキーを使わせる通常の方法は、キーを.envファイルに入れてエージェントに読ませることです。その瞬間、キーはモデルのコンテキストウィンドウに入ります。そこからプロバイダーのログ、場合によってはトレーニングセット、クラッシュレポート、そして間違いなく6か月後にバグレポートに貼り付けるあなた自身のトランスクリプト履歴に入ります。

キーのローテーションは面倒です。漏れたかどうかわからないことはもっと悪いです。

keywardenは、モデルがキーを一切見るステップを排除します。

Related MCP server: AgentPay MCP Server

インストール

npm install -g keywarden

Node 20.10以降。ランタイム依存関係は2つ: MCP SDKとzod。ネイティブモジュール、コンパイラ、デーモンはありません。

クイックスタート

keywarden init --passphrase
keywarden add openai/prod --provider openai
keywarden mcp-config

initは、暗号化されたボールトとデフォルト拒否ポリシーを持つ~/.keywarden/を作成します。addは各フィールドをプロンプトで尋ねるため、シェル履歴に残りません。mcp-configはMCPクライアントに貼り付けるブロックを出力します。

次に、Claude Codeで:

本番キーでOpenAIモデルエンドポイントを呼び出して、アクセスできるものを教えてください。

モデルはref: "openai/prod"を指定してhttp_requestを呼び出します。keywardenはキーを添付し、呼び出しを行い、応答を返します。キーを印刷するように頼むと、できないと答えます。

エージェントが使えるツール

ツール

機能

list_secrets

メタデータのみ: ref、プロバイダー、フィールド、最終使用日。値は含まれません。

describe_secret

1つの資格情報と、その使用方法、ホスト、環境変数。

list_providers

組み込みプリセットと、それぞれが期待するもの。

http_request

認証付きHTTPS呼び出し。keywardenが資格情報を添付します。

run

資格情報を環境変数として注入してローカルプロセスを起動します。

audit_tail

改ざん防止ログの最近のエントリ。

KEYWARDEN_DISABLE_EXEC=1を設定すると、runを完全に削除し、HTTPプロキシのみを公開します。

3つのサーフェス、1つの認可モデル

同じボールト、ポリシーエンジン、グラント、監査ログに3つの方法でアクセスできます。どれを使っても許可される内容は変わりません。

サーフェス

対象

呼び出し元の識別方法

MCP (stdio)

Claude Code、Claude Desktop、Cursor

サーバーを起動したクライアント

CLI

ターミナルでのあなた

ボールトへのファイルシステムアクセス

HTTP (ループバック)

任意の言語、CI、スクリプト、Web UI

スコープ付きkeywarden APIキー

HTTPサーフェスは、MCPを話さないコードからkeywardenを使えるようにするものであり、keywardenが呼び出し元を区別できる最初の場所です:

keywarden apikey create ci-runner --ref 'openai/**' --http --audit --ttl 30d
keywarden serve --port 8787
curl -s http://127.0.0.1:8787/v1/proxy/openai%2Fprod \
  -H "Authorization: Bearer kw_live_..." \
  -H "content-type: application/json" \
  -d '{"method":"POST","url":"/v1/chat/completions","body":{"model":"gpt-4o","messages":[]}}'

呼び出し元は、openai/**にスコープされたkeywardenキーを保持し、付与された機能のみを持ち、30日で期限切れになり、1つのコマンドで失効できます。OpenAIキーは決して保持しません。ルート: /v1/secrets/v1/secrets/:ref/v1/proxy/:ref/v1/run/v1/audit/v1/usage/v1/whoami/healthz

サーバーは127.0.0.1にバインドし、--allow-remoteなしではルーティング可能なインターフェースを拒否します。そのポートに到達できる人は誰でも、キーがカバーするすべての資格情報に対する認可オラクルを取得できるからです。

誰が何を使ったか、そしてそのコスト

監査ログの各エントリはアクターを指名し、アクターはハッシュ内にあるため、チェーンを壊さずに帰属を書き換えることはできません。プロキシされた各応答は、プロバイダーが報告するトークン数が解析されます。

keywarden usage --since 7d
CREDENTIAL        CALLS          IN         OUT       TOTAL
openai/prod         142     418,220      96,410     514,630
anthropic/prod       38      92,004      31,887     123,891

ACTOR             CALLS          IN         OUT       TOTAL
http:ci-runner      118     356,900      74,220     431,120
mcp:mcp-client       62     153,324      54,077     207,401

keywardenはトークンを記録し、金額は記録しません。価格は変わり、契約によって異なり、古いハードコードされたレートは財務レポートに自信満々の間違った数字を生成します。runはメータリングできないことに注意してください: 資格情報がサブプロセスに入ると、keywardenは終了コードを見るだけで、トークン数は見ません。

資格情報の2つの使い方

プロキシは、HTTP API用です。エージェントがリクエストを記述し、keywardenが資格情報を添付して呼び出しを行います。OpenAI、Anthropic、Stripe、GitHub、Slack、Cloudflare、Vercel、Supabase、およびヘッダーまたはクエリパラメータで認証する任意のAPIで動作します。

// what the agent sends
{ "ref": "openai/prod", "method": "POST", "url": "/v1/chat/completions", "body": { "model": "gpt-4o", "messages": [] } }

インジェクションは、その他すべて用です。AWSはSigV4リクエスト署名が必要で、Postgres URLはHTTPではなく、terraform applyは実際の環境変数を必要とします。keywardenはプロセス自体を起動します:

{ "command": "aws", "args": ["s3", "ls"], "inject": ["aws/prod"] }

子プロセスはAWS_ACCESS_KEY_IDなどを受け取ります。モデルはstdoutを受け取り、その中に現れる資格情報は出力時にマスクされます。

ポリシー

~/.keywarden/policy.jsonは、どの資格情報が、どの機能によって、何に対して使用できるかを決定します。ルールは上から下に評価され、最初に一致したものが優先され、デフォルトは拒否です。

{
  "version": 1,
  "default": "deny",
  "redactResponses": true,
  "rules": [
    {
      "ref": "openai/**",
      "http": { "allow": true, "methods": ["POST"], "paths": ["/v1/**"] },
      "exec": { "allow": false, "commands": [] },
      "rateLimitPerMinute": 30
    },
    {
      "ref": "aws/prod",
      "http": { "allow": false },
      "exec": { "allow": true, "commands": ["aws", "terraform"] },
      "rateLimitPerMinute": 10,
      "expiresAt": "2026-12-31T00:00:00.000Z"
    }
  ]
}

またはCLIから:

keywarden policy allow "openai/**" --http --path "/v1/**" --method POST
keywarden policy allow aws/prod --exec aws --exec terraform --arg-deny "s3://*"
keywarden policy test aws/prod exec terraform

*は1つのパスセグメント内で一致し、**はセグメントをまたぎます。expiresAtはルールを一時的にします。

コマンド名を指定するだけでは不十分です。aws s3 lsのためにawsを許可リストに追加すると、同じバイナリがaws s3 cpを他人のバケットに対して実行できます。これがMCP脅威文献が指摘し続けているシーケンスレベルのギャップです: 個々の呼び出しはすべて認可されているが、その組み合わせがデータ流出です。そのため、ルールは引数も制約します:

"exec": {
  "allow": true,
  "commands": ["aws"],
  "argsDeny": ["s3://*", "--endpoint-url"],   // any match refuses the call
  "argsAllow": ["s3", "ls", "--region", "*"]  // if set, every argument must match
}

グラント: 一時的で、期限付きで、使用回数制限のあるアクセス

ポリシーは常設の設定です。「エージェントにこれを今、15分だけやらせる」という形には合いません。今日では、ルールを広げて、再び狭めるのを忘れることを意味します。

グラントは、独自の制限を伴う機能であり、マカロンとビスケットの系統から借用され、ターミナルで発行されます:

keywarden grant aws/prod --exec aws --ttl 15m --uses 5 --arg-deny "s3://*"
keywarden grant openai/prod --http --path "/v1/chat/**" --method POST --ttl 1h --uses 20
keywarden grant list
keywarden grant revoke <id>

グラントは自動的に期限切れになり、使用予算が尽きると消滅し、ボールトから派生したキーでHMACされるため、手編集されたgrants.jsonは尊重されず拒否されます。拒否された試行は使用回数を消費しません。

ポリシールールに"requireGrant": trueを設定すると、常設設定は必要だが十分ではなくなります: グラントを発行するまで何も起こりません。これが、stdioサーバー内の対話型プロンプトを必要としない、人間が介在する承認ステップです。

ポリシー

グラント

結果

許可、requireGrantなし

許可

許可、requireGrant

一致するもの

許可

許可、requireGrant

なし

拒否

拒否

一致するもの

許可

拒否

なし

拒否

設定の整合性

シークレットを暗号化することは仕事の半分です。policy.jsonは資格情報を使用できるかどうかを決定し、providers.jsonはどこに送信されるかを決定します。どちらもプレーンファイルです。1バイトも復号できない人でも、自分のホストを持つプロバイダーを追加して、資格情報をそこに向け直すことができます。

そのため、ボールトは両方のファイルのハッシュを固定し、変更を確認するまでどちらに対しても動作を拒否します:

keywarden trust show    # what drifted
keywarden trust         # review, then pin the current contents

ボールトファイル自体は、フィールドごとではなく全体がMACされます。provider: "openai"を他のものに変更しても暗号文には触れず、そうでなければ正常に検証されるからです。

keywardenが実際に強制すること

  • 平文ツールなし。 MCPサーフェスには、資格情報の値を返すコードパスがありません。

  • 送信許可リスト。 資格情報は、プロバイダーが宣言したホストと、ポリシーで追加したホストにのみ送信できます。エージェントにキーをattacker.exampleにPOSTするように指示するプロンプトインジェクションは、ネットワークに触れる前にホストチェックで失敗します。

  • HTTPSのみ、リダイレクト追従なし。 別のオリジンへの302は、Authorizationヘッダーをオフホストで再生しません。

  • SSRFガード。 ループバック、プライベートレンジ、CGNAT、リンクローカル(169.254.169.254クラウドメタデータエンドポイントを含む)はブロックされ、アドレスはソケットが実際に使用するDNSルックアップで検証されるため、DNSリバインディングで窓が開くことはありません。

  • シェルなし。 runshell: falsespawnにargv配列を渡します。注入するメタキャラクタ解析はありません。

  • 構築された子環境。 子プロセスは、継承された変数の許可リストと注入された変数を受け取ります。他のシークレットやkeywarden自身のパスフレーズは継承されません。

  • 出力の編集。 すべてのツール結果は、既知の資格情報値、そのbase64およびURLエンコード形式、および約12の既知のキー形状についてスキャンされます。多層防御であり、主要な制御ではありません。

  • 改ざん防止監査。 すべての決定(許可または拒否)は、ハッシュチェーンログに追加されます。keywarden audit verifyはチェーンを再計算し、最初に変更または削除されたエントリを報告します。

  • ファイル全体の整合性。 ボールトはメタデータを含めてMACされるため、資格情報を検出されずに別のプロバイダーに向け直すことはできません。policy.jsonproviders.jsonはボールトにハッシュ固定され、帯域外で変更されると拒否されます。

  • 環境の強化。 サーバーは、NODE_TLS_REJECT_UNAUTHORIZED=0NODE_OPTIONS、またはSSLKEYLOGFILEが設定されていると起動を拒否し、NODE_EXTRA_CA_CERTSHTTPS_PROXYについては警告します。Claude Codeに対するCVE-2026-21852は、Authorizationヘッダーを添付した送信トラフィックをリダイレクトする環境オーバーライドでした。資格情報を添付する仕事のプロセスは、リクエストパスが他人の制御下にあるときに起動してはなりません。

  • 引数制約。 argsAllow / argsDenyは、許可リストされたコマンドのどの呼び出しが許可されるかを絞り込みます。バイナリだけではありません。

  • 減衰グラント。 期限付き、使用回数制限付き、オペレーター発行の機能で、ボールト由来のMACにより偽造耐性があります。

  • 信頼できないデータのフレーミング。 プロキシされた応答ボディは、名前付きホストからの信頼できないコンテンツとしてラベル付けされるため、API応答に注入された命令はモデルにデータとして提示されます。

暗号

エンベロープ暗号化、すべてnode:cryptoから、サードパーティの暗号ライブラリはありません。

  • ランダムな256ビットデータキーが各フィールドをAES-256-GCMで暗号化し、資格情報のrefとフィールド名を追加認証データとして使用するため、暗号文をボールトエントリ間で移動できません。

  • データキーは、パスフレーズからscryptN=2^17, r=8で導出されたキーでラップされ、約128 MiBで1回の試行に約1秒かかります。これは意図的です: ボールトファイルは攻撃者が持ち去るものなので、オフライン推測は高コストでなければなりません。

  • パスフレーズのローテーションは32バイトを再ラップします。すべてのシークレットを再暗号化するわけではありません。

ボールトモード

--passphraseは強力な方です。MCPサーバーは、プロンプトなしでロックを解除するために環境にKEYWARDEN_PASSPHRASEを必要とします。

--keyfileはランダムキーを~/.keywarden/masterkeyに書き込むため、プロンプトは不要です。便利ですが、ホームディレクトリを読める人は誰でもボールトを開けることを意味します。それでも、プロジェクトに散らばった平文の.envファイルよりははるかに優れています。キーが1か所にあり、その使用はポリシーで制限され、すべての使用が記録されるからです。どのトレードオフを選んだかを理解してください。keywarden doctorが思い出させてくれます。

Windowsでは、ファイルモードは設定されますが、POSIXが0600を強制するようには強制されません。THREAT_MODEL.mdを参照してください。

CLI

keywarden init --passphrase|--keyfile   create the vault
keywarden doctor                        check the install, flag weak settings
keywarden trust [show]                  re-pin policy.json + providers.json after reviewing a change
keywarden grant <ref> ...               issue a temporary, use-capped capability
keywarden grant list | revoke <id>
keywarden add <ref> --provider <id>     store a credential (prompts for each field)
keywarden list                          metadata only
keywarden describe <ref>                metadata plus how it can be used
keywarden reveal <ref>                  print plaintext, asks first, always audited
keywarden rm <ref> [--field f]          delete
keywarden exec <ref[,ref]> -- <cmd>     run a command with credentials injected
keywarden policy show|init|allow|deny|test
keywarden audit [tail|verify]
keywarden passphrase                    rotate
keywarden providers                     built-in presets
keywarden mcp-config                    print the MCP client config
keywarden doctor                        check the install, flag weak settings

カスタムプロバイダー

組み込みでないものはすべて~/.keywarden/providers.jsonに入ります。docs/PROVIDERS.mdを参照してください。

{
  "acme": {
    "label": "Acme Internal API",
    "hosts": ["api.acme.internal", "*.acme.io"],
    "baseUrl": "https://api.acme.io",
    "fields": ["token", "tenant"],
    "required": ["token"],
    "auth": { "type": "header", "name": "X-Acme-Key", "template": "{{token}}" },
    "env": { "ACME_TOKEN": "{{token}}", "ACME_TENANT": "{{tenant}}" }
  }
}

keywardenがあなたを守らないもの

高価なものを任せる前にTHREAT_MODEL.mdを読んでください。短いバージョン:

  • エージェントが何らかの他のツールを通じて任意のローカルコマンドを実行できる場合、そのエージェントはボールトファイルを読み取ることができ、キーファイルモードではマスターキーも読み取れます。keywarden はモデルのコンテキストを保護するのであって、ディスクを保護するわけではありません。

  • run は資格情報を実際のプロセスに渡します。自身の環境を外部に持ち出せるように誘導できるコマンドを許可リストに登録した場合、資格情報は外部に漏れます。許可リストは狭く設定してください。

  • 編集は穴のある安全策です。API が認識できない方法で再エンコードして返した資格情報は、検出されません。

  • keywarden は、エージェントが正当に使用を許可された資格情報を使って、高額または破壊的な何かを行うことを防ぎません。それはポリシーのスコープとレート制限の役割です。

開発

npm install
npm run build
npm test          # 89 unit tests + 46 end-to-end checks against the real CLI, MCP and HTTP servers

e2e スイートは、使い捨ての KEYWARDEN_HOME で実際のバイナリを駆動し、とりわけ、どのツール応答にも資格情報が含まれていないことを検証します。

関連資料

  • THREAT_MODEL.md — スコープに含まれるもの、そして正直に言って含まれないもの

  • docs/RESEARCH.md — この設計の基となった2026年の文献、採用されたもの、検討されたが却下されたもの

  • docs/COMPETITORS.md — 競合状況、そして keywarden が単にマーケティングが異なるのではなく、本当に異なる点

  • docs/TEAM.md — マルチ開発者アーキテクチャ: アイデンティティ、読み取り可能なサーバーなしのキー共有、承認ワークフロー、コスト会計、ビルド順序

  • docs/PROVIDERS.md — カスタムプロバイダーの作成

ホスト型

ホスト型バージョンは、チームボールト、ブラウザベースの管理、マシン間の同期を希望する人向けに計画されており、同じゼロ露出の保証があります。このリポジトリのすべては MIT のままであり、スタンドアロンで完全に使用可能です。docs/HOSTED.md を参照してください。

ライセンス

MIT

Install Server
A
license - permissive license
A
quality
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Credential isolation proxy for AI agents. Injects API keys at the network boundary so your agent never sees the raw credential. Supports domain allowlists, agent auth, policy enforcement, and audit logging.
    3
    89
    13
    Apache 2.0
  • F
    license
    Not graded
    quality
    A
    maintenance
    Provides a trust and governance layer for AI agents, enabling secure API access, credential vaulting, paid execution with human approval, and automatic call resume.
    8
    2
  • A
    license
    A
    quality
    A
    maintenance
    Identity and credential governance for AI agents. Every agent gets its own cryptographic identity, scoped short-lived credentials per platform, human approval on sensitive actions, and an immutable audit log.
    7
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to securely perform privileged actions like creating GitHub issues by minting short-lived, single-purpose tokens on demand, with policy enforcement and audit logging.
    MIT

View all related MCP servers

Related MCP Connectors

  • Issue, rotate and revoke scoped API-key passes for 25+ providers — the agent never sees a real key

  • Encrypted secret store and rotation for autonomous agent credentials

  • Operate Linux, macOS and Windows from your LLM. Every action runs through an auditable allowlist.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/DINAKAR-S/keywarden'

If you have feedback or need assistance with the MCP directory API, please join our Discord server