Skip to main content
Glama

Veil

CI License: Apache 2.0 Python 3.11+

AIエージェントは、資格情報の値を一切受け取ることなく、その配置を調整できます。一方、信頼された人間が操作するインターフェースは、その資格情報の送信先を独立して承認します。

この一文が、Veilのすべての約束です。VeilはMCPサーバーとセキュアな入力ブローカーを組み合わせたものです。エージェントが「Stripeの本番キーをGoogle Secret Managerに配置して」と指示すると、人間はどのプロジェクトとシークレットに書き込まれるかを正確に確認し、Veil自身のウィンドウに値を入力します。すると、値は直接宛先に送られます。モデルが値を保持することは決してありません。

SPEC.md に基づいて実装されています。


インストール

Veilはstdio MCPサーバーであるため、自分で実行するのではなく、MCPクライアントが起動します。通常のPython-MCPパターンが適用されます。uvx は、TypeScriptサーバーで npx -y が行うのとまったく同様に、使い捨て環境でVeilを取得して実行します。uv と Python 3.11+ が必要です。

Claude Code

claude mcp add veil -e VEIL_ENV_ALLOWED_ROOTS="$PWD" -- \
  uvx --from git+https://github.com/rosostolato/veil-mcp veil-mcp serve

-s project を追加すると、自身の設定ではなく、リポジトリの .mcp.json に記録されます。

その他のクライアント(Claude Desktop、Cursor、Windsurf、VS Code、Zed…)

クライアントのMCP設定ファイルにこれを追加します。mcpServers ブロックの構造はどこでも同じです。

{
  "mcpServers": {
    "veil": {
      "command": "uvx",
      "args": [
        "--from", "git+https://github.com/rosostolato/veil-mcp",
        "veil-mcp", "serve"
      ],
      "env": {
        "VEIL_ENV_ALLOWED_ROOTS": "/absolute/path/to/your/project"
      }
    }
  }
}

VeilがPyPIに公開されると、--from git+… のペアは不要になり、呼び出しは uvx veil-mcp serve になります。クラウド宛先には追加のパッケージが必要です。使用する仕様に応じて veil-mcp[gcp]、veil-mcp[firestore]、またはその両方を追加してください。

一時的なインストールよりも永続的なインストールを推奨します。

uv tool install "veil-mcp[gcp] @ git+https://github.com/rosostolato/veil-mcp"
# then use `veil-mcp serve` as the command, with no uvx

VEIL_ENV_ALLOWED_ROOTS を設定してください。 .env アダプターは、これらのディレクトリ外への書き込みを拒否し、デフォルトではサーバーの作業ディレクトリのみに制限されます。その他はすべてオプションです。設定 を参照してください。

初回実行

エージェントに「Stripeのテストキーを.envに保存して」などと依頼してみてください。以下の流れになります。

  1. エージェントは secret.store を呼び出し、資格情報の送信先を説明します。このツールには値を運べるフィールドがないため、エージェントは値を送信しません。

  2. Veilは、資格情報名、送信先、プロジェクト、環境、操作、リスクを表示する独自のウィンドウをマシン上に開きます。エージェントはそのリンクを受け取りません。

  3. マスクされたフィールドに値を入力します。中リスクおよび高リスクの操作では、入力後、書き込み前に2回目の確認が求められます。

  4. Veilは値を書き込み、エージェントに STORED と送信先の参照情報を返します。値は決して返しません。

Veil自身の標準エラー出力には、構造化された監査JSONが出力されます。ターミナルで他に操作する必要はありません。


Related MCP server: Janee

Veilが解決するもの

エージェントがシークレットを知っていることに起因する、あるクラスの障害を完全に排除します。Veilが介在することで、資格情報は以下を通過しなくなります。

  • LLMプロンプトまたは会話履歴

  • MCPツールの引数またはツールの結果

  • エージェントのメモリまたは生成されたコード

  • シェルコマンドの引数またはプロセスのargv

  • ログ、デバッグトレース、テレメトリ

  • URL

  • モデルから見えるコマンド出力

Veilが解決しないもの

VeilはAIエージェントを信頼できるものにせず、「安全なAI」でもありません。エージェントが正しい送信先を選んだこと、ユーザーの意図を理解したこと、プロンプトインジェクションがないこと、送信先自体が安全であること、マシンが侵害されていないこと、後で正当に受け取ったソフトウェアによって資格情報が悪用されないことを保証するものではありません。

ここには2つの別個の問題があります。

質問

Veilの回答

エージェントはシークレットを知るべきか?

いいえ。

エージェントはシークレットの送信先を単独で決定すべきか?

人間の承認なしではいけません。

Veilはこれら2つの質問に答えます。残りの質問に答えるとは主張していません。


信頼モデル

Trusted with the credential value:

  The human at the keyboard
  Veil's secure input UI          (loopback only, in your control)
  Veil's secure input broker      (this process)
  The selected destination adapter
  The destination provider        (e.g. Google Secret Manager)

NOT trusted with the credential value:

  The LLM
  The agent / MCP client
  The conversation
  The prompt and any repository content it read
  Generated code
  Logs, telemetry, crash reports

この図は、信頼されたコンポーネントが無敵であると主張するものではありません。これは、資格情報が存在することを許可されている場所を示しています。Veilはセキュリティ重視のソフトウェアです。Veil自体が悪意を持っていたり、侵害されていたりすると、境界はなくなります。そのソースコード、依存関係、リリースは、資格情報を扱うツールにふさわしい精査を受ける必要があります。


2つのフロー

シークレットフロー — モデルが観測できない、人間の経路。

Human ─▶ Veil secure UI (127.0.0.1) ─▶ Broker ─▶ Adapter ─▶ Destination

エージェントフロー — モデルが見るすべて。

LLM ─▶ MCP client ─▶ Veil MCP server ─▶ non-sensitive result metadata

MCPツールのスキーマには、資格情報を運ぶことができるプロパティはありません。これは構造的なものであり、プロンプトの指示ではありません。悪用可能な value、secret_value、password、token、content、raw_secret フィールドは存在せず、クローズドスキーマは未知のプロパティを拒否し、引数はパースされる前に資格情報の形をした値がないかスクリーニングされます。

エージェントが呼び出すもの

{
  "destination": "gcp-secret-manager",
  "name": "STRIPE_SECRET_KEY",
  "target": { "project": "my-production-project", "secret": "STRIPE_SECRET_KEY" },
  "write_mode": "new-version",
  "environment": "production",
  "description": "Stripe production API key"
}

Veilは request_id、リスク分類、正規化された送信先を返し、マシン上に自身の承認ウィンドウを開きます。エージェントは secret.status をポーリングします。

エージェントは承認リンクを取得しません。 そのリンクは機能です。それを保持するものは誰でもフローの人間側を完了でき、シェルやHTTPツールを持つエージェントはまさに脅威モデルです。Veilはリンクをブラウザに渡し、代わりに自身のコンソールに出力します。セットアップでエージェントがリンクを中継する必要がある場合(リモートセッションやヘッドレスセッションなど)は、VEIL_DISCLOSE_AUTHORIZATION_URL=true を設定してください。ただし、これにより侵害されたエージェントが自身のリクエストを承認できるようになることを理解しておいてください。

ツール

目的

secret.store

資格情報リクエストを作成します。機密性のないメタデータとリクエストIDを返します。

secret.status

リクエストをポーリングします。資格情報の内容を返すことは決してありません。

secret.cancel

保留中のリクエストをキャンセルします。入力された値は破棄されます。

secret.revise

承認を無効にし、新しい承認を開始します。その場で編集されるものはありません。

secret.destinations

送信先と、各送信先が期待するターゲットフィールドを一覧表示します。

人間が見るもの

ステージAでは、値が入力される前に、資格情報名、送信先プロバイダー、プロジェクト/アカウント、リソース、操作、リスクが表示されます。高リスクの操作(本番環境の上書き、平文ストレージ、アプリケーションデータベース、資格情報の置き換え)では、ステージBで、値の入力後、書き込み前に2回目の確認が必要です。値が再表示されることは決してありません。

人間が読むページと、実行部が実行する操作は、同じ不変のオブジェクトです。別個の「表示用送信先」は存在しません。送信先、プロジェクト、シークレット名、操作、書き込みモード、アダプターのいずれかが変更されると、承認は無効になり、新しい承認が必要になります。


サポートされているアダプター

アダプター

クラス

備考

gcp-secret-manager

secret-store

推奨。veil-mcp[gcp] が必要。create、new-version、replace(以前のバージョンを無効化)。

env-file

local-plaintext

パス制限、シンボリックリンク拒否、アトミックな 0600 書き込み。デフォルトでGit追跡ファイルはブロック。

firestore

remote-application-storage

veil-mcp[firestore] が必要。常に警告。常にステージBが必要。

arbitrary-network 送信先(汎用HTTP POST、ウェブフック)は実装されておらず、アダプターレジストリは登録を拒否します。


セキュリティの前提と制限

セキュリティツールが過大評価されることは、ないより悪いため、明確に述べます。

  • ブローカープロセスはシークレットを見ます。 それが目的です。そうでなければ、ストレージは不可能です。保証されるのは、最小限の信頼されたトランスポートと送信先コンポーネントだけがシークレットを見ることです。

  • CPythonはメモリを確実に消去できません。 SecretBuffer は自身が所有する可変バッファを消去しますが、パーセントデコード、str/bytes 変換、プロバイダーSDKは、インタプリタがガベージコレクションまで保持する可能性のある不変のコピーを作成します。Veilはこの保証を最小限に抑え、偽造しません。

  • UIはループバックHTTPです。 マシン上でユーザーとして実行されているプロセスは誰でもUIに到達でき、そのようなプロセスはUIを模倣することもできます。各Veilプロセスは、そのページに表示されるランダムな識別フレーズを出力します(なりすまし防止の補助であり、暗号化制御ではありません)。エージェントからリンクを隠すことはハードルを上げますが、Veilのコンソール出力を読んだり、ブラウザのargvをリストしたり、ループバックポートをスキャンしたりできるプロセスを止めることはできません。

  • Veilは送信先を監査しません。 Firestoreドキュメントへの資格情報の書き込みを承認した場合、Veilはそこに書き込み、それが悪い考えであることを伝えますが、止めはしません。

  • タイムアウトはプロバイダーレベルです。 Veilは外部からブロッキングSDK呼び出しをキャンセルできないため、各アダプターはプロバイダーに明示的なタイムアウトを渡します。自身のタイムアウトを無視する送信先SDKは、リクエストとそのシークレットを開いたままにすることができます。

  • 事前チェックはベストエフォートです。 事前チェックで到達不能なプロバイダーは、推測されるのではなく、利用不可として報告されます。

  • クラッシュ時のセマンティクス。 プロバイダー書き込みと応答の間のクラッシュにより、資格情報が書き込まれたまま、ローカルに成功の記録が残らない可能性があります。Veilはリクエストを失敗として報告します。送信先が信頼できる情報源です。


ローカル開発

git clone https://github.com/rosostolato/veil-mcp && cd veil-mcp
uv venv
uv pip install -e ".[dev,gcp,firestore]"

# drive it the way a client would
uv run veil serve

クライアントをチェックアウトに向けるには、uvx の代わりに /path/to/veil-mcp/.venv/bin/veil-mcp をコマンドとして使用します。

設定

設定はVeil自身の環境変数から読み取られます。ツールの引数からは決して読み取られないため、エージェントがポリシーを緩和することはできません。

変数

デフォルト

意味

VEIL_REQUEST_TTL_SECONDS

300

リクエストの有効期限。

VEIL_ADAPTER_TIMEOUT_SECONDS

30

1回の送信先書き込みの上限時間。

VEIL_STAGE_B_FOR_MEDIUM

true

中リスク操作に確認を要求する。

VEIL_UI_HOST / VEIL_UI_PORT

127.0.0.1 / エフェメラル

セキュアなUIバインドアドレス。

VEIL_OPEN_BROWSER

true

承認ウィンドウを自動的に開く。

VEIL_DISCLOSE_AUTHORIZATION_URL

false

承認リンクをエージェントに返す。

VEIL_ENV_ALLOWED_ROOTS

カレントディレクトリ

.env アダプターが書き込みを許可されるルートディレクトリ。

VEIL_ALLOW_GIT_TRACKED_ENV

false

Git追跡されたenvファイルへの書き込みを許可する。

VEIL_ENABLED_ADAPTERS

すべて

カンマ区切りの許可リスト。

テスト

uv run pytest                  # everything
uv run pytest tests/security   # the adversarial suite only
uv run ruff check .
uv run mypy

セキュリティスイートは、単なる付加機能ではなく、製品要件です。これには、観測可能なすべてのチャネルにわたるカナリア漏洩検出、悪意のあるエージェントテスト、プロンプトインジェクションのフィクスチャ、TOCTOUおよびリプレイテスト、100方向の並行性ストレステスト、競合状態、クラッシュパス、プロバイダー障害シミュレーション、UIチェック、ファジングが含まれます。カナリアが漏洩した場合、承認バイパスが成功した場合、承認後の変更が成功した場合、完了したリクエストがリプレイ可能な場合、シークレットがリクエスト境界を越えた場合、生のプロバイダーエラーがMCPに到達した場合、または高リスク操作が確認をスキップした場合、リリースはブロックされます。

docs/SECURITY_MODEL.md に、不変条件とテストの対応マップがあります。

プロジェクトのステータス

バージョン0.1.0はSPEC.mdに基づいて構築されており、このファイルはリポジトリ内で意図された動作の信頼できる説明として残ります。実質的なすべてのモジュールとテストは、実装するセクションを引用しているため、レビュアーはコードを要件の要約ではなく、要件自体と照らし合わせて確認できます。

MVPは完了しており、敵対的なテストを含む全スイートが合格しています。誰かが本番環境で信頼する前に残っている作業は、独立したレビュー、確認UI(SPEC.md §35)の人間工学的テスト、および署名付きリリース成果物(§43)です。

コントリビューション

ここではセキュリティが製品であるため、変更の基準は官僚的ではなく具体的です。

  • 認証情報の処理、認可、またはMCPサーフェスに影響を与える変更には、影響を受ける不変条件を破ろうとするテストが必要であり、正常に動作することを示すテストだけでは不十分です。

  • スイートを通すためにセキュリティテストを弱めてはいけません。テストがアーキテクチャ上の欠陥を明らかにした場合、変更されるのはアーキテクチャです。

  • コアへの新しいランタイム依存関係は、デフォルトで拒否されます。ブローカーは認証情報のための信頼できるコンピューティングベースであり、プロバイダーSDKはオプションの拡張機能の背後に配置されます。

  • プルリクエストを開く前に、ruff check .、ruff format --check .、mypy、pytestを実行してください。

脆弱性を発見しましたか?公開されたIssueを開くのではなく、GitHubのセキュリティアドバイザリを通じて非公開で報告してください。

ライセンス

Apache License 2.0 © 2026 Eduardo Rosostolato.

Available Tools

5 tools
secret.cancelCancel a credential requestA

Cancel a pending request. Any credential already entered is destroyed.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNo
request_idYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It explicitly discloses a critical side effect: 'Any credential already entered is destroyed.' This is valuable transparency for a destructive mutation. However, it doesn't mention other effects like whether cancellation is reversible or requires special permissions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences long, highly concise, and front-loaded with the core action ('Cancel a pending request') followed by a key consequence. There is no fluff or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description doesn't explain return values or error conditions. While it covers the key destructive behavior, it lacks guidance on when to use the reason parameter, potential side effects beyond credential destruction, and any prerequisites. For a security-related tool, more context would be helpful, but the essential purpose is clear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, and the description does not explain the parameters at all. It doesn't mention that request_id is required or that reason is optional. The schema itself provides clear names, but the description adds no additional meaning, leaving the agent to infer that request_id identifies the request and reason is for audit context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Cancel a pending request' which is a specific verb (cancel) and resource (request). It distinguishes from siblings like secret.store and secret.revise, as it focuses on cancellation and the destruction of already-entered credentials.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for pending requests ('Cancel a pending request') but gives no explicit guidance on when to use it versus alternatives, nor exclusions. It lacks context like 'use secret.revise to modify instead' or 'do not use for completed requests'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

secret.destinationsList available destinationsA
Read-only

List the destinations this Veil instance can write to, with the target fields each one expects.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations include readOnlyHint: true, and the description does not contradict it. It adds context about the content (target fields) which is useful for the agent. Given the annotation already covers safety, the description provides adequate extra behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, front-loaded with the verb and resource, no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with no parameters and no output schema, the description fully explains what it does and includes the key detail about target fields, which is likely sufficient for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameterswing schema coverage is 100% (vacuously). Baseline for 0 params is 4, and the description clarifies that the output includes target fields per destination, which adds contextual meaning beyond the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (List) and the specific resource (destinations this Veil instance can write to), and adds the detail about target fields. It distinguishes itself from sibling tools like store, cancel, revise, which involve mutations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it (to discover available destinations and their required fields), but does not explicitly contrast with alternatives. Since it's a simple listing tool, the purpose clarity implicitly covers usage, though no exclusions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

secret.reviseReplace a credential request with a corrected oneA

Cancel a pending request and create a new one. The original authorization is invalidated and the human must authorize the new operation from scratch; an authorized operation can never be edited in place.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesLogical name of the credential, e.g. STRIPE_SECRET_KEY. This is a label, never the credential value.
targetYesWhere the credential goes. Fields depend on the destination; call secret.destinations for the exact contract.
request_idYes
write_modeNocreate
descriptionNoShort human-readable purpose, shown to the user.
destinationYesWhich destination adapter should receive the credential.
environmentNoEnvironment you believe this destination belongs to. Advisory only: Veil classifies the destination itself and uses the stricter of the two.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well. It discloses that the original authorization is invalidated, the human must reauthorize from scratch, and authorized operations cannot be edited in place. This covers the key side effects and workflow consequences of a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. The first sentence states the core action, and the second provides the key behavioral consequence and an important invariant. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter tool with nested objects and no output schema, the description explains the compound nature and authorization consequences sufficiently. It could additionally mention that all parameters must be resubmitted for the new request, but the schema and existing wording make the required inputs inferable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 71%, so most parameters have descriptions already. The tool description adds context around request_id by referring to 'pending request' and 'new operation from scratch,' but it does not explain parameter interactions or destination-specific requirements beyond what the schema provides. This is adequate but not enhanced.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a compound operation: 'Cancel a pending request and create a new one.' The title, 'Replace a credential request with a corrected one,' further specifies the resource and intent, distinguishing this from sibling tools like secret.cancel and secret.store.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear context for when to use the tool: when a pending request must be corrected, and specifically notes that 'an authorized operation can never be edited in place.' It doesn't explicitly contrast with secret.cancel or secret.store, but the described workflow makes the intended use case unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

secret.statusCheck a credential requestA
Read-only

Return the non-sensitive status of a credential request. Never returns credential material.

ParametersJSON Schema
NameRequiredDescriptionDefault
request_idYes
wait_secondsNoOptionally block until the request reaches a terminal state or this many seconds elapse.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds valuable behavioral context beyond the readOnlyHint annotation by guaranteeing that no credential material is ever returned. This safety guarantee is a key trait not covered by annotations, though it does not disclose blocking behavior or error handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences that front-load the core purpose and add a critical safety note. There is no unnecessary detail or verbosity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple with two parameters and a read-only annotation, but the description omits key behavioral details such as the optional blocking behavior via wait_seconds and what the response actually contains (e.g., status list, error scenarios). Without an output schema, the description should describe the return value format more fully.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description provides no explanation of the parameters. request_id is self-explanatory from its name, but wait_seconds is already described in the schema. With only 50% schema description coverage, the description fails to compensate for the missing request_id semantics or clarify how to obtain such an ID.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns the status of a credential request and explicitly mentions it never returns credential material. This distinguishes it from siblings like secret.cancel or secret.store, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for checking status but provides no explicit guidance on when to use it versus alternatives. There is no mention of 'use when you need to check status' or exclusions like 'do not use to cancel requests'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

secret.storeRequest that the user store a credentialA
Destructive

Ask the human to provide a credential and have Veil write it to the destination described here. The credential value is never passed through this tool, never returned by it, and never becomes visible to the model: the user enters it in Veil's own trusted window. Share the returned authorization_url with the user, then poll secret.status.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesLogical name of the credential, e.g. STRIPE_SECRET_KEY. This is a label, never the credential value.
targetYesWhere the credential goes. Fields depend on the destination; call secret.destinations for the exact contract.
write_modeNocreate
descriptionNoShort human-readable purpose, shown to the user.
destinationYesWhich destination adapter should receive the credential.
environmentNoEnvironment you believe this destination belongs to. Advisory only: Veil classifies the destination itself and uses the stricter of the two.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explicitly discloses that the credential value never passes through the tool, is never returned, and never becomes visible to the model—a key behavioral trait. It also outlines the multi-step process involving an authorization_url and polling. Annotations already signal destructive and open-world behavior, and the description complements these without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the core action, and includes essential security and workflow context. Every sentence earns its place, and there is no redundant or extraneous text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (nested target, multiple destinations, write modes, environment), the description covers the critical workflow and security aspects, and points to secret.destinations for detailed contracts. It does not explain write_mode or environment semantics, but those are well-documented in the schema. Overall, it is reasonably complete for a tool of this intricacy.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description does not directly elaborate on any input parameters, but the schema provides extensive descriptions for 83% of fields. It directs users to secret.destinations for the target contract, which covers the remaining nuance. Since the schema already carries the semantic load, the description adds little beyond baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action: asking the human for a credential and having Veil write it to a specified destination. It distinguishes itself from siblings like secret.status and secret.cancel by focusing on the store action and includes critical security context (credential not visible to model) and subsequent steps (share authorization_url, poll status).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear workflow guidance: ask the user, share the authorization_url, and poll secret.status. It implies this tool is for new credentials but does not explicitly contrast with secret.revise or specify when not to use it. The flow is described well, but alternative exclusions are missing.

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.

  1. 5 tool updatesv0.1.0
    • First observedsecret.cancel
    • First observedsecret.destinations
    • First observedsecret.revise
    • First observedsecret.status
    • First observedsecret.store

TDQS

A4.3/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a clearly distinct role: status checks a pending request, store initiates a credential request, cancel aborts it, revise replaces it, and destinations lists available targets. No overlap in purpose, making agent selection unambiguous.

Naming Consistency5/5

All tool names follow a consistent 'secret.<action>' pattern with clear, concise verbs (status, store, cancel, revise) and one noun (destinations). The pattern is uniform and predictable, though 'destinations' is a noun rather than a verb, it still fits the domain prefix style.

Tool Count5/5

With 5 tools, the server is tightly scoped to credential request management. This is within the ideal range and each tool earns its place; no redundancy or bloat.

Completeness5/5

The tool surface covers the entire lifecycle of a credential request: create (store), read (status), update/replace (revise), delete (cancel), and context (destinations). There are no evident gaps—even revision gracefully handles invalidation of prior authorizations.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server that lets AI agents call APIs without ever seeing the credentials, using a local encrypted vault and per-secret allowlist policies for HTTP requests and subprocess environment variables.
    1
    AGPL 3.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Secrets management MCP server that injects credentials into API requests for AI agents, enforcing policies and logging all activity without exposing raw keys.
    112 npm
    30
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for AI-native credential management, enabling agents to securely store, retrieve, and manage API keys with encryption, spending budgets, and audit logging.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server for DemiPass secrets management, enabling AI agents to securely store, rotate, and use credentials without exposing them in context windows.
    44 npm
    MIT