Skip to main content
Glama

Veil

CI License: Apache 2.0 Python 3.11+

Ein KI-Agent kann die Platzierung einer Berechtigung orchestrieren, ohne jemals den Wert der Berechtigung zu erhalten, während eine vertrauenswürdige, vom Menschen kontrollierte Schnittstelle unabhängig autorisiert, wohin diese Berechtigung gelangen darf.

Dieser Satz ist das gesamte Versprechen. Veil ist ein MCP-Server plus ein sicherer Eingabe-Broker: Der Agent sagt „Lege einen Stripe-Produktionsschlüssel in Google Secret Manager ab“, der Mensch sieht genau, welches Projekt und welches Geheimnis geschrieben werden, und gibt den Wert in Veils eigenem Fenster ein – und der Wert geht direkt zum Ziel. Das Modell hat ihn nie.

Implementiert nach SPEC.md.


Installation

Veil ist ein stdio MCP-Server, daher führen Sie ihn nicht selbst aus – Ihr MCP-Client startet ihn. Das übliche Python-MCP-Muster gilt: uvx holt und führt ihn in einer Wegwerfumgebung aus, genau wie npx -y es für TypeScript-Server tut. Erfordert uv und 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

Fügen Sie -s project hinzu, um es im .mcp.json des Repositorys statt in Ihrer eigenen Konfiguration zu speichern.

Jeder andere Client (Claude Desktop, Cursor, Windsurf, VS Code, Zed…)

Fügen Sie dies in die MCP-Konfigurationsdatei des Clients ein – der Block mcpServers hat überall die gleiche Form:

{
  "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"
      }
    }
  }
}

Sobald Veil auf PyPI ist, verschwindet das Paar --from git+… und der Aufruf wird zu uvx veil-mcp serve. Cloud-Ziele benötigen ihre Extras – veil-mcp[gcp], veil-mcp[firestore] oder beide – angehängt an die verwendete Spezifikation.

Bevorzugen Sie eine dauerhafte Installation gegenüber einer flüchtigen:

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

Setzen Sie VEIL_ENV_ALLOWED_ROOTS. Der .env-Adapter weigert sich, außerhalb dieser Verzeichnisse zu schreiben, und standardmäßig ist nur das Arbeitsverzeichnis des Servers erlaubt. Alles andere ist optional – siehe Konfiguration.

Erster Start

Fragen Sie Ihren Agenten nach etwas wie „speichere meinen Stripe-Testschlüssel in .env“. Was passiert:

  1. Der Agent ruft secret.store auf und beschreibt wo die Berechtigung hingeht. Er sendet keinen Wert, da das Tool kein Feld hat, das einen tragen könnte.

  2. Veil öffnet ein eigenes Fenster auf Ihrem Rechner, das den Namen der Berechtigung, das Ziel, Projekt, Umgebung, Operation und Risiko anzeigt. Der Agent erhält diesen Link nicht.

  3. Sie geben den Wert in ein maskiertes Feld ein. Bei mittleren und hohen Risiken wird eine zweite Bestätigung verlangt, nach der Eingabe und vor dem Schreiben.

  4. Veil schreibt ihn und meldet dem Agenten STORED plus eine Zielreferenz – niemals den Wert.

Veils eigener stderr enthält strukturiertes Audit-JSON. Es wird nichts weiter von Ihnen im Terminal erwartet.


Related MCP server: Janee

Was Veil löst

Es beseitigt eine ganze Klasse von Fehlern, die dadurch entstehen, dass der Agent das Geheimnis kennt. Mit Veil im Kreislauf durchläuft eine Berechtigung nicht:

  • LLM-Prompts oder Gesprächsverlauf

  • MCP-Tool-Argumente oder Tool-Ergebnisse

  • Agentengedächtnis oder generierten Code

  • Shell-Befehlsargumente oder Prozess-argv

  • Protokolle, Debug-Spuren oder Telemetrie

  • URLs

  • Modell-sichtbare Befehlsausgaben

Was Veil nicht löst

Veil macht einen KI-Agenten nicht vertrauenswürdig und ist keine „sichere KI“. Es garantiert nicht, dass der Agent das richtige Ziel ausgewählt hat, dass er Sie verstanden hat, dass er frei von Prompt-Injection ist, dass das Ziel selbst sicher ist, dass Ihr Rechner nicht kompromittiert ist oder dass eine Berechtigung später nicht von Software missbraucht werden kann, die sie legitimerweise erhält.

Hier gibt es zwei separate Probleme:

Frage

Veils Antwort

Sollte der Agent das Geheimnis kennen?

Nein.

Sollte der Agent allein entscheiden, wohin das Geheimnis geht?

Nicht ohne menschliche Autorisierung.

Veil beantwortet diese beiden. Es behauptet nicht, den Rest zu beantworten.


Vertrauensmodell

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

Dieses Diagramm behauptet nicht, dass die vertrauenswürdigen Komponenten unverwundbar sind. Es zeigt, wo die Berechtigung existieren darf. Veil ist sicherheitskritische Software: Wenn Veil selbst bösartig oder kompromittiert ist, ist die Grenze weg. Seine Quelle, Abhängigkeiten und Releases verdienen die gleiche Prüfung, die Sie jedem Werkzeug zur Handhabung von Berechtigungen zukommen lassen würden.


Die zwei Abläufe

Der Geheimnis-Ablauf – der Pfad des Menschen, den das Modell nicht beobachten kann:

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

Der Agenten-Ablauf – alles, was das Modell sieht:

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

Das MCP-Tool-Schema hat keine Eigenschaft, die eine Berechtigung tragen könnte. Das ist strukturell, kein Prompt-Befehl: Es gibt kein value, secret_value, password, token, content oder raw_secret-Feld zum Missbrauchen, geschlossene Schemas lehnen unbekannte Eigenschaften ab, und Argumente werden vor dem Parsen auf berechtigungsförmige Werte geprüft.

Was der Agent aufruft

{
  "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 antwortet mit einer request_id, einer Risikoklassifizierung und dem normalisierten Ziel – und öffnet auf Ihrem Rechner ein eigenes Autorisierungsfenster. Der Agent fragt secret.status ab.

Der Agent erhält den Autorisierungslink nicht. Dieser Link ist eine Fähigkeit: Alles, was ihn hält, kann die Hälfte des Ablaufs durchführen, und ein Agent mit einer Shell oder einem HTTP-Tool ist genau das Bedrohungsmodell. Veil übergibt ihn an Ihren Browser und gibt ihn stattdessen auf seiner eigenen Konsole aus. Setzen Sie VEIL_DISCLOSE_AUTHORIZATION_URL=true, wenn Ihre Einrichtung benötigt, dass der Agent den Link weiterleitet (z. B. bei einer entfernten oder bildschirmlosen Sitzung) – und verstehen Sie, dass dies einem kompromittierten Agenten erlaubt, seine eigene Anfrage zu autorisieren.

Tool

Zweck

secret.store

Erstellt eine Berechtigungsanfrage. Gibt nicht-sensitive Metadaten und eine Anfrage-ID zurück.

secret.status

Fragt eine Anfrage ab. Gibt niemals Berechtigungsmaterial zurück.

secret.cancel

Bricht eine ausstehende Anfrage ab; jeder eingegebene Wert wird zerstört.

secret.revise

Macht eine Autorisierung ungültig und startet eine neue. Nichts wird direkt bearbeitet.

secret.destinations

Listet Ziele und die Zielfelder auf, die jedes erwartet.

Was der Mensch sieht

Stufe A zeigt den Berechtigungsnamen, Zielanbieter, Projekt/Konto, Ressource, Operation und Risiko bevor der Wert eingegeben wird. Hochrisiko-Operationen (Produktionsüberschreibung, Klartextspeicherung, Anwendungsdatenbanken, Ersetzen einer Berechtigung) erfordern eine zweite Bestätigung in Stufe B, nach der Eingabe und vor dem Schreiben. Der Wert wird nie wieder angezeigt.

Die Seite, die der Mensch liest, und die Operation, die der Ausführer ausführt, sind dasselbe unveränderliche Objekt – es gibt kein separates „Anzeigeziel“. Jede Änderung an Ziel, Projekt, Geheimnisname, Operation, Schreibmodus oder Adapter macht die Autorisierung ungültig und erfordert eine neue.


Unterstützte Adapter

Adapter

Klasse

Hinweise

gcp-secret-manager

secret-store

Bevorzugt. Benötigt veil-mcp[gcp]. create, new-version, replace (deaktiviert vorherige Versionen).

env-file

local-plaintext

Pfadbeschränkt, symlink-verweigernd, atomarer 0600-Schreibvorgang. Git-verfolgte Dateien standardmäßig blockiert.

firestore

remote-application-storage

Benötigt veil-mcp[firestore]. Warnt immer; erfordert immer Stufe B.

arbitrary-network-Ziele (generisches HTTP POST, Webhooks) sind nicht implementiert und die Adapter-Registrierung weigert sich, eines zu registrieren.


Sicherheitsannahmen und -einschränkungen

Klar ausgedrückt, weil ein Sicherheitswerkzeug, das sich selbst überhöht, schlimmer ist als keines:

  • Der Broker-Prozess sieht das Geheimnis. Das ist der Sinn: Etwas muss es sehen, sonst ist Speicherung unmöglich. Die Garantie ist, dass nur die minimalen vertrauenswürdigen Transport- und Zielkomponenten dies tun.

  • CPython kann Speicher nicht zuverlässig löschen. SecretBuffer löscht den von ihm besessenen veränderlichen Puffer, aber Prozent-Dekodierung, str/bytes-Umwandlungen und Anbieter-SDKs erzeugen unveränderliche Kopien, die der Interpreter bis zur GC behalten kann. Veil minimiert und erfindet diese Garantie nicht.

  • Die UI ist Loopback-HTTP. Jeder Prozess, der als Ihr Benutzer auf Ihrem Rechner läuft, kann sie erreichen, und jeder solche Prozess könnte sie auch imitieren. Jeder Veil-Prozess gibt einen zufälligen Identitätssatz aus, den seine Seiten anzeigen (Anti-Spoofing-Hilfe, kein kryptografischer Kontrollmechanismus). Das Vorenthalten des Links gegenüber dem Agenten erhöht die Hürde; es stoppt keinen Prozess, der Veils Konsolenausgabe lesen, das browser-argv auflisten oder Loopback-Ports scannen kann.

  • Veil prüft das Ziel nicht. Wenn Sie eine Berechtigung für ein Firestore-Dokument autorisieren, schreibt Veil sie dorthin und sagt Ihnen, dass es eine schlechte Idee ist; es hält Sie nicht auf.

  • Zeitüberschreitungen sind anbieterabhängig. Veil kann einen blockierenden SDK-Aufruf nicht von außen abbrechen, daher übergibt jeder Adapter eine explizite Zeitüberschreitung an den Anbieter. Ein Ziel-SDK, das seine eigene Zeitüberschreitung ignoriert, kann eine Anfrage – und ihr Geheimnis – offen halten.

  • Vorabprüfung nach bestem Wissen. Ein Anbieter, der bei der Vorabprüfung nicht erreichbar ist, wird als nicht verfügbar gemeldet, nicht erraten.

  • Absturzsemantik. Ein Absturz zwischen dem Schreiben des Anbieters und der Antwort kann dazu führen, dass eine Berechtigung geschrieben wird, ohne dass ein lokaler Erfolgsnachweis vorliegt. Veil meldet die Anfrage als fehlgeschlagen; das Ziel ist die Quelle der Wahrheit.


Lokale Entwicklung

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

Um einen Client auf Ihr Arbeitsverzeichnis zu verweisen, verwenden Sie /path/to/veil-mcp/.venv/bin/veil-mcp als Befehl statt uvx.

Konfiguration

Die Konfiguration wird aus Veils eigener Umgebung gelesen – niemals aus Tool-Argumenten, damit ein Agent keine Richtlinie lockern kann:

Variable

Standard

Bedeutung

VEIL_REQUEST_TTL_SECONDS

300

Ablaufzeit der Anfrage.

VEIL_ADAPTER_TIMEOUT_SECONDS

30

Obergrenze für einen einzelnen Ziel-Schreibvorgang.

VEIL_STAGE_B_FOR_MEDIUM

true

Bestätigung für mittlere Risiken erforderlich.

VEIL_UI_HOST / VEIL_UI_PORT

127.0.0.1 / flüchtig

Sichere UI-Bindeadresse.

VEIL_OPEN_BROWSER

true

Öffnet das Autorisierungsfenster automatisch.

VEIL_DISCLOSE_AUTHORIZATION_URL

false

Gibt den Autorisierungslink an den Agenten zurück.

VEIL_ENV_ALLOWED_ROOTS

aktuelles Verzeichnis

Verzeichnisse, in die der .env-Adapter schreiben darf.

VEIL_ALLOW_GIT_TRACKED_ENV

false

Schreiben in eine git-verfolgte env-Datei erlauben.

VEIL_ENABLED_ADAPTERS

alle

Komma-getrennte Whitelist.

Tests

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

Die Sicherheitssuite ist eine Produktanforderung, keine Nettigkeit. Sie enthält Kanarien-Leckerkennung über jeden beobachtbaren Kanal, bösartige Agententests, Prompt-Injection-Fixtures, TOCTOU- und Replay-Tests, 100-Wege-Konkurrenzstress, Wettlaufbedingungen, Absturzpfade, Anbieterfehlersimulation, UI-Prüfungen und Fuzzing. Eine Veröffentlichung ist blockiert, wenn eine Kanarie leckt, eine Autorisierungsumgehung gelingt, eine Mutation nach Genehmigung gelingt, eine abgeschlossene Anfrage wiederholbar ist, ein Geheimnis eine Anforderungsgrenze überschreitet, ein roher Anbieterfehler MCP erreicht oder eine Hochrisikooperation die Bestätigung überspringt.

Siehe docs/SECURITY_MODEL.md für die Invarianten-zu-Test-Zuordnung.

Projektstatus

Version 0.1.0, erstellt gemäß SPEC.md, die im Repository als maßgebliche Beschreibung des beabsichtigten Verhaltens verbleibt. Jedes wesentliche Modul und jeder Test zitiert den Abschnitt, den es implementiert, sodass ein Prüfer den Code gegen die Anforderung prüfen kann, anstatt gegen eine Zusammenfassung davon.

Das MVP ist abgeschlossen und die gesamte Suite – einschließlich der adversariellen – besteht. Was bleibt, bevor jemand sich im Ernst darauf verlassen sollte: unabhängige Überprüfung, Benutzerfaktortests der Bestätigungs-Benutzeroberfläche (SPEC.md §35) und signierte Release-Artefakte (§43).

Mitwirken

Sicherheit ist hier das Produkt, daher ist die Hürde für Änderungen spezifisch statt bürokratisch:

  • Eine Änderung, die die Handhabung von Anmeldeinformationen, die Autorisierung oder die MCP-Oberfläche betrifft, benötigt einen Test, der versucht, die Invariante zu brechen, die sie betrifft, nicht nur einen, der zeigt, dass sie funktioniert.

  • Schwächen Sie niemals einen Sicherheitstest, um eine Suite bestehen zu lassen. Wenn ein Test einen architektonischen Fehler aufdeckt, ist es die Architektur, die geändert wird.

  • Neue Laufzeitabhängigkeiten im Kern werden standardmäßig abgelehnt. Der Broker ist die vertrauenswürdige Rechenbasis für Anmeldeinformationen; Provider-SDKs gehören hinter eine optionale Erweiterung.

  • Führen Sie ruff check ., ruff format --check ., mypy und pytest aus, bevor Sie einen Pull-Request öffnen.

Eine Schwachstelle gefunden? Bitte melden Sie diese privat über die GitHub-Sicherheitshinweise, anstatt ein öffentliches Issue zu eröffnen.

Lizenz

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