keywarden
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: Echo Vault
インストール
npm install -g keywardenNode 20.10以降。ランタイム依存関係は2つ: MCP SDKとzod。ネイティブモジュール、コンパイラ、デーモンはありません。
クイックスタート
keywarden init --passphrase
keywarden add openai/prod --provider openai
keywarden mcp-configinitは、暗号化されたボールトとデフォルト拒否ポリシーを持つ~/.keywarden/を作成します。addは各フィールドをプロンプトで尋ねるため、シェル履歴に残りません。mcp-configはMCPクライアントに貼り付けるブロックを出力します。
次に、Claude Codeで:
本番キーでOpenAIモデルエンドポイントを呼び出して、アクセスできるものを教えてください。
モデルはref: "openai/prod"を指定してhttp_requestを呼び出します。keywardenはキーを添付し、呼び出しを行い、応答を返します。キーを印刷するように頼むと、できないと答えます。
エージェントが使えるツール
ツール | 機能 |
| メタデータのみ: ref、プロバイダー、フィールド名、最終使用日。値は含まれません。 |
| 1つの資格情報と、その使用方法、ホスト、環境変数。 |
| 組み込みプリセットと、それぞれが期待するもの。 |
| 認証付きHTTPS呼び出し。keywardenが資格情報を添付します。 |
| 資格情報を環境変数として注入してローカルプロセスを起動します。 |
| 改ざん防止ログの最近のエントリ。 |
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 8787curl -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 7dCREDENTIAL 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,401keywardenはトークンを記録し、金額は記録しません。価格は変わり、契約によって異なり、古いハードコードされたレートは財務レポートに自信満々の間違った数字を生成します。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サーバー内の対話型プロンプトを必要としない、人間が介在する承認ステップです。
ポリシー | グラント | 結果 |
許可、 | — | 許可 |
許可、 | 一致するもの | 許可 |
許可、 | なし | 拒否 |
拒否 | 一致するもの | 許可 |
拒否 | なし | 拒否 |
設定の整合性
シークレットを暗号化することは仕事の半分です。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リバインディングで窓が開くことはありません。シェルなし。
runはshell: falseでspawnにargv配列を渡します。注入するメタキャラクタ解析はありません。構築された子環境。 子プロセスは、継承された変数の許可リストと注入された変数を受け取ります。他のシークレットやkeywarden自身のパスフレーズは継承されません。
出力の編集。 すべてのツール結果は、既知の資格情報値、そのbase64およびURLエンコード形式、および約12の既知のキー形状についてスキャンされます。多層防御であり、主要な制御ではありません。
改ざん防止監査。 すべての決定(許可または拒否)は、ハッシュチェーンログに追加されます。
keywarden audit verifyはチェーンを再計算し、最初に変更または削除されたエントリを報告します。ファイル全体の整合性。 ボールトはメタデータを含めてMACされるため、資格情報を検出されずに別のプロバイダーに向け直すことはできません。
policy.jsonとproviders.jsonはボールトにハッシュ固定され、帯域外で変更されると拒否されます。環境の強化。 サーバーは、
NODE_TLS_REJECT_UNAUTHORIZED=0、NODE_OPTIONS、またはSSLKEYLOGFILEが設定されていると起動を拒否し、NODE_EXTRA_CA_CERTSとHTTPS_PROXYについては警告します。Claude Codeに対するCVE-2026-21852は、Authorizationヘッダーを添付した送信トラフィックをリダイレクトする環境オーバーライドでした。資格情報を添付する仕事のプロセスは、リクエストパスが他人の制御下にあるときに起動してはなりません。引数制約。
argsAllow/argsDenyは、許可リストされたコマンドのどの呼び出しが許可されるかを絞り込みます。バイナリだけではありません。減衰グラント。 期限付き、使用回数制限付き、オペレーター発行の機能で、ボールト由来のMACにより偽造耐性があります。
信頼できないデータのフレーミング。 プロキシされた応答ボディは、名前付きホストからの信頼できないコンテンツとしてラベル付けされるため、API応答に注入された命令はモデルにデータとして提示されます。
暗号
エンベロープ暗号化、すべてnode:cryptoから、サードパーティの暗号ライブラリはありません。
ランダムな256ビットデータキーが各フィールドをAES-256-GCMで暗号化し、資格情報のrefとフィールド名を追加認証データとして使用するため、暗号文をボールトエントリ間で移動できません。
データキーは、パスフレーズからscryptで
N=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 serverse2e スイートは、使い捨ての KEYWARDEN_HOME で実際のバイナリを駆動し、とりわけ、どのツール応答にも資格情報が含まれていないことを検証します。
関連資料
docs/RESEARCH.md — この設計の基となった2026年の文献、採用されたもの、検討されたが却下されたもの
docs/COMPETITORS.md — 競合状況、そして keywarden が単にマーケティングが異なるのではなく、本当に異なる点
docs/TEAM.md — マルチ開発者アーキテクチャ: アイデンティティ、読み取り可能なサーバーなしのキー共有、承認ワークフロー、コスト会計、ビルド順序
docs/PROVIDERS.md — カスタムプロバイダーの作成
ホスト型
ホスト型バージョンは、チームボールト、ブラウザベースの管理、マシン間の同期を希望する人向けに計画されており、同じゼロ露出の保証があります。このリポジトリのすべては MIT のままであり、スタンドアロンで完全に使用可能です。docs/HOSTED.md を参照してください。
ライセンス
MIT
Available Tools
6 toolsaudit_tailA
Recent entries from keywarden's tamper-evident audit log: which credential was used, by which capability, against which host or command, and whether it was allowed or denied.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Optional: only entries for this credential ref. | |
| limit | No | How many entries. Default 20, max 200. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the behavioral burden. It discloses that the tool returns recent entries, that the source log is tamper-evident, and what fields an entry contains. It does not explicitly discuss ordering, permissions, or read-only guarantees, but the audit-tail nature and field list make the behavior reasonably transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, tightly written sentence that immediately states the resource and the most important properties of the returned entries. Every phrase earns its place and there is no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple two-optional-parameter contract and a fully documented schema, the description covers everything needed for both selection and correct invocation. It explains what the tool does, what an entry includes, and the recent-history nature of the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters (ref and limit) are already fully described in the input schema, so the description adds no additional parameter meaning. The description reinforces the overall audit-log scope but does not go beyond what the schema already provides, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the exact resource: recent entries from the tamper-evident audit log, and enumerates the kinds of information the entries contain. It is easily distinguished from the sibling tools because it is about audit history, not secret lookup, provider listing, HTTP calls, or command execution.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The use case is clearly implied: the agent should use this when it needs recent audit log entries about credential use, capability, target host/command, and allow/deny results. It does not explicitly name alternatives or define when-not-to-use conditions, but the context is not ambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_secretB
Metadata for one credential plus how it can be used: whether it can be proxied over HTTP, which hosts it may reach, and which environment variables it maps to when injected.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | Credential ref, e.g. "openai/prod". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry some behavioral burden. It reveals what information the tool returns at a high level (proxying, hosts, env vars) but does not disclose things like whether it exposes secrets themselves, side effects, or auth requirements. It adds some value beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one clear sentence, front-loaded with the main intent and then enumerating the specific metadata categories. No waste, though it could be slightly more structured with a colon or list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one well-documented parameter and no output schema, the description covers the main purpose and key return aspects. However, it does not mention whether it returns the secret value itself, which could be relevant for an agent deciding between this and list_secrets. That gap leaves it merely adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers the ref parameter with 100% coverage including an example. The description does not add further meaning beyond referring to the credential, so it doesn't push above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: retrieving metadata for one credential and its usage characteristics. It specifies the resource (credential) and the relevant aspects (HTTP proxying, reachable hosts, environment variable mappings). It doesn't explicitly differentiate from sibling tools, but the focus is specific enough to avoid major confusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage is for inspecting a credential's metadata and how it can be used. It doesn't explicitly state when to use this over alternatives like list_secrets, nor does it provide exclusions. Context is clear but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
http_requestA
Make an authenticated HTTPS request using a vaulted credential. keywarden attaches the credential itself; you never see it. The destination must be an allowed host for that credential. Redirects are not followed and non-HTTPS is refused.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | Credential ref, e.g. "openai/prod". | |
| url | Yes | Absolute https URL, or a path resolved against the provider base URL (e.g. "/v1/models"). | |
| body | No | Request body. An object is JSON-encoded automatically; a string is sent verbatim. | |
| method | No | HTTP method. Defaults to GET. | |
| headers | No | Extra request headers. Auth headers are managed by keywarden and will be rejected here. | |
| timeout_ms | No | Per-request timeout. Default 60000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden and excels: it discloses that the credential is attached by keywarden and invisible to the caller, that the host must be allow-listed, that redirects are not followed, and that non-HTTP requests are rejected. This exceeds the typical transparency and preempts common failure modes, giving the agent a realistic picture of runtime behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four concise sentences front-load the core purpose and immediately follow with critical behavioral constraints. Every clause adds unique value—no redundant or fluff content—making it easy to parse and highly digestible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers authentication, host authorization, redirects, and HTTPS enforcement, which are the most critical behavioral aspects. However, since there is no output schema, the absence of any mention of response format or error handling is a minor gap—an agent might wonder what the tool returns. Still, for a generic HTTP client, the description is largely sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all parameters with 100% coverage (ref, url, body, method, headers, timeout_ms). The description adds general behavioral context (auth, host restrictions) but does not elaborate on parameter-specific semantics beyond what the schema provides. This meets the baseline for full schema coverage without adding parametric nuance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool makes an authenticated HTTPS request using a vaulted credential. It differentiates itself from sibling tools (audit_tail, list_secrets, etc.) by focusing on outgoing requests, and the scope is crisply defined: a single request with auth handled internally. The verb 'Make' plus the resource 'authenticated HTTPS request' is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use the tool, emphasizing the need for a vaulted credential and an allowed host, and explicitly notes restrictions (redirects not followed, non-HTTPS refused). It does not explicitly name alternatives or provide when-not-to-use guidance, but given the distinct sibling tools, the context is sufficient. A minor deduction for not explicitly contrasting with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_providersA
List known provider presets (openai, aws, stripe, ...) with their allowed hosts, expected field names, and env-var mappings. Useful before asking the user to add a new credential.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the burden. The verb 'list' strongly implies a read-only, side-effect-free operation, which is a core behavioral trait. However, it does not explicitly confirm a read-only nature, nor does it disclose any network calls, authentication dependencies, or failure modes, leaving some uncertainty.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that moves from the general operation to specific examples and output attributes. It is highly compact, with no redundant words. Every phrase adds value, and the essential 'List known provider presets' is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description takes responsibility for defining what is returned; it does so by naming permitted hosts, expected field names, and environment variable mappings. It also adds a practical use-case with clear context. It does not mention edge cases like empty providers or exact formatting, but these are not strongly demanded for such a simple read-only tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero properties, so there are no parameters to describe. The description correctly focuses on the operation and its output without mentioning input requirements. According to the baseline rule for zero-parameter tools, a score of 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the verb ('List'), the resource ('provider presets'), and the output contents ('allowed hosts, expected field names, and env-var mappings'). It clearly distinguishes itself from sibling secret-related tools by focusing on the provider domain. There is no tautology; it goes beyond merely restating the tool name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear when-to-use signal: 'Useful before asking the user to add a new credential.' This grounds the tool as a prerequisite step in a credential-adding workflow. It does not explicitly name alternative tools or state when-not-to-use, but the given context is sufficient for most cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_secretsA
List every credential in the vault as metadata only: ref, provider, description, which field names exist, when it was last used. Never returns credential values. Start here.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Optional: only secrets carrying this tag. | |
| provider | No | Optional: only secrets for this provider id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and meaningfully discloses that the tool only returns metadata and never credential values. It also surfaces the output fields and last-use flag, which is useful behavioral context. It does not mention edge behaviors such as pagination or permission failures, but those are minor for this tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences front-load the main action and output format, then add the critical safety note and a usage cue. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple optional-filter list tool with no output schema, the description sufficiently covers the return shape, the read-only metadata behavior, and the intended starting point. The schema covers the parameters, and no critical calling information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: both optional filters already have clear descriptions in the schema (filter by tag, filter by provider). The description adds no additional meaning to the parameters, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Describes a specific verb ('List') and resource ('every credential in the vault'), and explains the metadata-only output fields (ref, provider, description, field names, last used). It distinguishes itself from sibling tools by explicitly disclaiming credential values, so an agent can tell it apart from describe_secret.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Start here' gives a clear entry-point cue for exploring the vault, and the metadata-only behavior makes it appropriate for discovery before retrieving a single secret. It does not explicitly name alternatives or state when not to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
runA
Run a local command with one or more vaulted credentials injected as environment variables (e.g. aws, terraform, gh, psql, a build script). The command is executed directly with no shell, so pass arguments as an array. Output is scanned and any credential appearing in it is masked before you see it.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | Working directory. Defaults to the server's cwd. | |
| env | No | Extra non-secret environment variables. | |
| args | No | Arguments as separate strings, e.g. ["s3", "ls"]. No shell parsing happens. | |
| stdin | No | Optional text written to the process stdin. | |
| inject | Yes | Credential refs to inject, e.g. ["aws/prod"]. | |
| command | Yes | Executable name or path, e.g. "aws". | |
| timeout_ms | No | Wall-clock limit. Default 60000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses the no-shell execution model, the need to pass arguments as an array, and the key credential-masking behavior. It does not mention exit-code or error-handling behavior, but the most important safety-relevant traits are surfaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences deliver the core behavior, execution model, and output masking with no filler. The most important information is front-loaded and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The schema documents all seven parameters in detail, and the description covers the core execution semantics and output privacy behavior. It stops the short of explicitly describing the full output contract, such as stdout/stderr or exit-code handling, but for its complexity the definition is still reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the structured parameter descriptions already handle most meaning. The prose adds marginal clarification by tying 'inject' to environment variables and 'args' to the no-shell array convention, but it does not substantially go beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: run a local command with vaulted credentials injected as environment variables. It gives concrete examples (aws, terraform, gh, psql) and clearly positions itself as a local command runner, distinguishing it from the secret-management and HTTP sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: running local CLIs or scripts that need injected secrets. It does not explicitly state exclusions or compare against siblings, but the 'local command' framing and examples make the intended use obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v0.3.0- First observed
audit_tail - First observed
describe_secret - First observed
http_request - First observed
list_providers - First observed
list_secrets - First observed
run
TDQS
Scored across 6 tools
Each tool targets a clearly distinct concern: auditing, listing all secrets, inspecting one secret, listing provider presets, making an HTTP request, and running a local command. Even http_request and run, which both consume credentials, are clearly separated by remote HTTP vs local execution.
list_secrets, list_providers, and describe_secret follow a readable verb_noun pattern, but audit_tail, http_request, and run break it: audit_tail is noun-first, http_request is a noun phrase, and run is a bare verb. The set is understandable but mixes conventions.
Six tools is a well-scoped size for a credential vault/usage server. Each tool covers a meaningful part of the workflow without redundancy or bloat.
The server covers the core credential-usage workflow well: list, describe, use over HTTP, use locally, and audit past use. Credential creation/update/delete is absent, but the descriptions suggest new credentials may be added by the user outside the tool set, so this is a minor workaround gap rather than a fatal one.
Maintenance
Related MCP Connectors
- FullmaktOAuthai.fullmakt
Credential broker for AI agents: scoped, revocable API access with policy enforcement and audit.
Give your AI hands. Identity, credential vault, and API gateway for autonomous agents.
Secrets for developers and agents—secure context and workflows without exposing secret values.
Security gateway for AI agents: policy, approval, and audited execution, no secrets shared.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to securely access authenticated services (HTTP, SSH, SMTP) without exposing secrets, by acting as a server-side proxy that injects authentication.MIT
- FlicenseNot gradedqualityBmaintenanceEnables agents to securely use credentials for GitHub, Cloudflare, OpenAI, Stripe, and xAI without ever reading the secret values, including credential health, rotation, and audit features.-
- FlicenseNot gradedqualityBmaintenanceEnables AI agents to call external endpoints under per-endpoint policy enforcement, with credentials and personal data kept inside a hardware enclave and every allowed or denied attempt recorded to an immutable audit ledger.2-
- FlicenseNot gradedqualityAmaintenanceEnables AI agents to invoke upstream APIs without ever holding reusable credentials, using short-lived scoped capabilities and server-side secret injection. Also provides execution controls and x402 facilitator routing for secure agent actions.-