Skip to main content
Glama

Veil

CI 许可证:Apache 2.0 Python 3.11+

AI 智能体可以编排凭证的放置位置,而自身从未获取凭证值;同时,一个可信的人类控制界面独立授权该凭证允许被放置到何处。

这句话就是整个承诺。Veil 是一个 MCP 服务器加上一个安全的输入代理:智能体说 "把 Stripe 生产密钥放到 Google Secret Manager",人类看到确切的项目和将要写入的密钥,然后将值输入到 Veil 自己的窗口中,这个值直接到达目的地。模型从未持有它。

根据 SPEC.md 实现。


安装

Veil 是一个 stdio MCP 服务器,因此您不需要自己运行它 —— 您的 MCP 客户端会启动它。通常的 Python-MCP 模式适用:uvx 会在一个一次性环境中获取并运行它,就像 TypeScript 服务器的 npx -y 一样。需要 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. 您将值输入到一个掩码字段中。中高风险操作在输入之后、写入之前要求第二次确认。

  4. Veil 写入它,并告诉智能体 STORED 加上一个目的地引用 —— 从不返回该值。

Veil 自己的 stderr 输出结构化的审计 JSON。您不需要在终端中做任何其他操作。


Related MCP server: Janee

Veil 解决的问题

它消除了由智能体知道秘密而导致的一整类故障。有了 Veil 的介入,凭证不会经过以下任何地方:

  • LLM 提示或对话历史

  • MCP 工具参数或工具结果

  • 智能体的记忆或生成的代码

  • shell 命令参数或进程 argv

  • 日志、调试跟踪或遥测

  • URL

  • 模型可见的命令输出

Veil 不能解决的问题

Veil 并不能使 AI 智能体变得可信,它也不是 "安全的 AI"。它不能保证智能体选择了正确的目的地,不能保证它理解了您的意思,不能保证它没有提示注入,不能保证目的地本身是安全的,不能保证您的机器未被入侵,也不能保证凭证以后不会被合法接收它的软件滥用。

这里有两个独立的问题:

问题

Veil 的回答

智能体是否应该知道密码?

不。

智能体是否应该单独决定密码的去向?

未经人类授权则不行。

Veil 回答了这两个问题。它并未声称能回答其余问题。


信任模型

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 本身是恶意的或被入侵,那么边界就消失了。其源代码、依赖项和版本值得您像对待任何凭证处理工具那样进行审查。


两种流程

凭证流程 —— 人类的路径,模型无法看到:

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。

智能体不会收到授权链接。 该链接是一种能力:持有它的任何东西都可以完成流程中人类的部分,而拥有 shell 或 HTTP 工具的智能体恰恰就是威胁模型。Veil 将其交给您的浏览器,并打印到自己的控制台上。如果您的设置需要智能体中继该链接(例如远程或无头会话),请设置 VEIL_DISCLOSE_AUTHORIZATION_URL=true —— 并且要理解,这将允许被入侵的智能体自行授权其请求。

工具

用途

secret.store

创建凭证请求。返回非敏感元数据和请求 ID。

secret.status

轮询请求。从不返回凭证材料。

secret.cancel

取消待处理的请求;任何已输入的值都会被销毁。

secret.revise

使授权失效并开始一个新的授权。不会就地编辑任何内容。

secret.destinations

列出目的地址以及每个地址期望的目标字段。

人类看到什么

阶段 A 在输入值之前显示凭证名称、目的地提供商、项目/账户、资源、操作和风险。高风险操作(生产覆盖、明文存储、应用程序数据库、替换凭证)需要在阶段 B 进行第二次确认,即在输入之后、写入之前。该值永远不会被回显。

人类阅读的页面和执行器执行的操作是同一个不可变对象 —— 不存在单独的 "显示目的地"。对目的地、项目、秘密名称、操作、写入模式或适配器的任何更改都会使授权失效并需要新的授权。


支持的适配器

适配器

类

说明

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、webhook)尚未实现,适配器注册表拒绝注册此类适配器。


安全假设和限制

明确说明,因为一个过度推销自身的安全工具比没有更糟糕:

  • 代理进程能看到秘密。 这正是关键所在:如果不这样,存储就不可能。保证是只有最小的可信传输和目的地组件能看到。

  • CPython 无法可靠地擦除内存。 SecretBuffer 会擦除其拥有的可变缓冲区,但百分号解码、str/bytes 转换以及提供商 SDK 会创建解释器可能保留到垃圾回收的不可变副本。Veil 最小化这种保证,并且不制造这种保证。

  • UI 是 loopback HTTP。 您机器上以您的用户身份运行的任何进程都可以访问它,而且任何这样的进程也可以模仿它。每个 Veil 进程会打印一个随机的身份短语,其页面会显示该短语(防欺骗辅助手段,而不是密码学控制)。对智能体隐藏链接提高了门槛;但它无法阻止能够读取 Veil 的控制台输出、列出浏览器的 argv 或扫描 loopback 端口的进程。

  • 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

要将客户端指向您的检出版本,请使用 /pth/to/veil-mcp/.venv/bin/veil-mcp 作为命令,而不是 uvx。

配置

配置从 Veil 自己的环境读取 —— 从不从工具参数读取,因此智能体无法放宽策略:

变量

默认值

含义

VEIL_REQUEST_TTL_SECONDS

300

请求过期时间。

VEIL_ADAPTER_TIMEOUT_SECONDS

30

一次目的地写入的上限。

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 已完成,包括对抗性测试在内的全部测试套件均通过。在任何人将其投入实际使用之前,还需要进行:独立审查、确认界面的可用性测试(SPEC.md §35),以及签名的发布工件(§43)。

贡献指南

安全性是这里的产品,因此变更的门槛是具体而非官僚化的:

  • 涉及凭据处理、授权或 MCP 层面的变更,需要有一个 尝试破坏 其所影响的不变式的测试,而不仅仅是展示其正常工作的测试。

  • 切勿为了通过测试套件而削弱安全测试。如果测试揭示了架构缺陷,那么改变的是架构。

  • 核心中的新运行时依赖默认会被反对。代理是凭据材料的可信计算基;提供商 SDK 应属于可选的额外组件。

  • 在打开拉取请求之前,请运行 ruff check .、ruff format --check .、mypy 和 pytest。

发现漏洞?请通过 GitHub 的安全公告私下报告,而不是公开提交 issue。

许可证

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