Skip to main content
Glama

mcp-warden

A local-first credential broker for the Model Context Protocol — lets any AI coding agent (Claude Code, Cursor, Cline, Codex, Continue, Zed) take real actions without ever seeing your secrets.

The agent calls high-level tools (proxy_http); mcp-warden injects the secret server-side, executes the action, and returns only the result. Your context window stays clean. A leaked transcript leaks nothing useful.

ci crates.io License: Apache-2.0

mcp-warden demo: the agent calls the GitHub API through a preset without seeing the token, a prompt-injected DELETE is refused before any request is sent, and an SSH deploy runs after approval in Telegram

How it works

  1. You store a credential once in the OS keychain via the mcp-warden CLI.

  2. You define presets — named, scoped actions (e.g. github-read, stripe-charges).

  3. The AI agent connects to mcp-warden as an MCP server (stdio).

  4. When the agent wants to act, it calls proxy_http with a preset name and a path/method.

  5. mcp-warden validates the request against the preset's allow-list, injects the credential, executes, and returns only the response.

  6. Sensitive presets trigger an approval prompt (desktop notification on Linux, TUI prompt on macOS/Windows). Opt in to time-boxed approvals per preset so one OK can cover a short burst of follow-up calls without re-prompt spam.

  7. Every action lands in a local SQLite audit log — including a windowed decision for calls authorised by an active approval window.

The agent's context window contains zero secrets.

Related MCP server: Access

Install

cargo install mcp-warden          # from crates.io
cargo install --path .            # or from a clone

Pre-built binaries for macOS (x86_64, aarch64) and Linux (x86_64), each with a SHA-256 checksum, are attached to every GitHub release.

90-second quickstart

mcp-warden init
mcp-warden secret add gh_pat                  # paste your GitHub PAT when prompted
mcp-warden preset add github-read \
  --type http \
  --base-url https://api.github.com \
  --auth-bearer gh_pat \
  --allowed-methods GET \
  --approval auto --confirm-auto

Wire mcp-warden into your agent — see docs/claude-code-setup.md or docs/cursor-setup.md.

In your agent: ask "list my GitHub repos via mcp-warden". Watch the agent call list_presets, then proxy_http — and watch your PAT stay out of the prompt.

mcp-warden audit --last 5                     # see what the agent did

CLI reference

Command

Description

mcp-warden init

Create the config directory and a template config

mcp-warden secret add <name>

Store a secret (value read from stdin, never argv)

mcp-warden secret list

List secret names (never values)

mcp-warden secret remove <name>

Delete a secret from the keychain

mcp-warden preset add <name> ...

Define a preset (--confirm-auto required for auto)

mcp-warden preset list

Show all presets

mcp-warden preset test <name>

Validate a preset against the current keychain

mcp-warden preset scaffold <template> (v0.3.0)

Generate a preset from a built-in template (--list to discover)

mcp-warden preset from-openapi <src> (v0.3.0)

Bootstrap a preset from an OpenAPI 3.x spec (URL or file)

mcp-warden approval <preset> <policy> [--window N]

Set approval policy; --window N (sec) enables time-boxed approvals for prompt

mcp-warden audit [--last N | --since T]

Read-only view of the audit log (append-only by design)

mcp-warden doctor [--deep] (v0.3.0 for --deep)

Diagnostic summary; --deep runs safe read-only HTTP probes per preset

mcp-warden web [--port N] (v0.3.0)

Local read-only web UI (binds 127.0.0.1 only)

mcp-warden mcp

Run the MCP server over stdio (consumed by the AI agent)

MCP tools exposed

  • list_presets — read-only catalogue of available actions.

  • proxy_http — execute an HTTP request through a preset; allow-list validation runs before credential injection.

  • ssh_exec (v0.2.0) — run a shell command on an SSH host; command must match preset's anchored regex allow-list; key-based auth + host-key verification.

  • sftp_transfer (v0.2.0) — get/put a file over SFTP; remote path matches preset's sftp_allowed_paths, local path under $HOME or /tmp.

  • db_query (v0.2.0) — run a NAMED QUERY against PostgreSQL / MySQL / Redis. SQL/command is fixed at preset definition; agent supplies only query_name + positional params.

  • get_secret_for_env — last-resort tool when a child process must read a secret from env. Always prompts for approval, regardless of preset policy.

Claude Code plugin

For Claude Code there is a plugin that bundles the MCP server config, a skill that teaches Claude to use mcp-warden correctly (discover presets first, never ask for tokens, respect approvals, treat get_secret_for_env as a last resort) and a guided /mcp-warden:setup command. Install the binary first, then in Claude Code:

/plugin marketplace add ermoluk/mcp-warden
/plugin install mcp-warden@mcp-warden

Restart Claude Code and run /mcp-warden:setup. If you previously added the server with claude mcp add, remove that entry so it isn't registered twice. Details: plugins/mcp-warden/.

Other MCP clients: see docs/claude-code-setup.md and docs/cursor-setup.md for manual setup.

What's new in v0.4.0

  • Workspace split. The project is now two crates: mcp-warden-core (library — trait surfaces + shared types) and mcp-warden (binary — CLI, MCP server, executor, web UI, concrete approval transports). Alternate implementations of KeychainStore, ApprovalTransport, AuditSink, or PresetSource now depend only on mcp-warden-core and don't drag the binary's GUI/runtime stack.

  • Telegram approval transport wired in. The impl already existed in v0.3.0; v0.4.0 makes it actually selectable. Add to your config file (mcp-warden doctor prints its path: ~/.config/mcp-warden/ on Linux, ~/Library/Application Support/io.mcp-warden.mcp-warden/ on macOS):

    [approval.telegram]
    bot_token_secret = "tg_bot_token"   # name of the keychain entry, not the token value
    chat_id = 123456789                  # your numeric Telegram chat id
    timeout_seconds = 120                # optional

    then mcp-warden secret add tg_bot_token (pastes the bot token into the keychain). prompt-policy presets now send Approve / Deny inline-button messages to that chat; TUI is the fallback if the Telegram prompt times out (see docs/approval-transports.md). Override at runtime with MCP_WARDEN_APPROVAL_TRANSPORT={telegram|desktop|tui}.

What's new in v0.3.0

  • preset scaffold — 8 built-in templates for the most common APIs (github-read, github-write, notion-read, stripe-read, openai-chat, anthropic-messages, gitea-read, cloudflare-dns). Generate a working preset in one command instead of copy-pasting from the cookbook.

  • preset from-openapi <url-or-file> — point it at an OpenAPI 3.0/3.1 JSON or YAML spec and it derives base_url, allowed_paths, allowed_methods, and the auth scheme (Bearer or APIKey-Header). Filter by HTTP method or tag.

  • doctor --deep — for each HTTP preset, runs a safe read-only probe (GET against base URL or first literal allowed path), reports ok / auth_failed / auth_ok_404 / network_error / tls_error / skipped, with elapsed time and a redacted body snippet. Skips prompt-policy presets unless --include-prompt is passed.

  • web — a small local-only web UI (binds 127.0.0.1, hardcoded) for browsing presets and the audit log without spawning a TUI. Read-only in this release; approval over WebSocket is on the roadmap.

  • Telegram approval transport — new ApprovalTransport impl that sends approval prompts to a Telegram chat with inline Approve / Deny / Approve-for-window buttons. Bot token lives in the OS keychain. Foreign-chat callbacks are rejected. Message uses protect_content: true. The wiring (selecting Telegram over Desktop / TUI in cli/mcp.rs) is a small follow-up; the impl + tests are merged.

See docs/web-ui.md for the web UI design notes.

Security model

mcp-warden's threat model and security invariants live in docs/threat-model.md. At a glance:

  • Secrets in the OS keychain only — never on disk in plaintext, never in logs.

  • Allow-list validation runs before credential injection.

  • Default approval policy is prompt; auto requires --confirm-auto at preset creation.

  • Audit log is append-only — the trait surface itself contains no delete / clear method.

  • Stdout is the MCP protocol channel; all logs go to stderr.

License

Apache-2.0 — permanent commitment for the OSS core. See LICENSE.

mcp-warden stays fully functional for free, forever — see our open-core commitment.

Available Tools

6 tools
db_queryA

Run a NAMED QUERY against a database preset (PostgreSQL, MySQL, or Redis). You supply query_name (must match one declared in the preset) and params (positional). The SQL / command is FIXED at preset definition time — you cannot send arbitrary SQL. Returns rows as JSON. Approval prompt fires per the preset's policy. If the user previously approved a time-boxed window for this preset+action, the call proceeds without a new prompt and is recorded as 'windowed' in the audit log.

NameRequiredDescriptionDefault
paramsNoPositional parameters; types must match the named query's `param_types`.
query_nameYesMust match one of the preset's declared `queries[].name`.
preset_nameYes

Output Schema

NameRequiredDescription
rowsYes
rows_affectedYes

TDQS

A4.5/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: it discloses that the SQL is fixed at preset definition time, that an approval prompt fires per policy, that a previously approved time-boxed window bypasses the prompt and is logged as 'windowed', and that results come back as JSON rows. These are non-obvious side effects an agent must know before calling.

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

Conciseness4/5

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

The critical constraint (named query only, no arbitrary SQL) is front-loaded and the return format follows. The closing sentence on the pre-approved window is longer than needed but conveys a real behavioral difference rather than filler.

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?

Return values are covered by the output schema and the approval/audit behavior is explained in prose, so the main gaps are covered. The one omission is a definition of preset_name and where presets come from, which matters for a three-parameter tool.

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?

Schema coverage is only 67%, and the description compensates by explaining that query_name must match a preset-declared name and that params are positional with types matching the named query's param_types. The remaining undocumented parameter, preset_name, is left implicit — the agent can infer it but it is never defined.

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?

States a specific verb and resource ('Run a NAMED QUERY against a database preset') and immediately bounds the scope with 'you cannot send arbitrary SQL'. This distinguishes it from a generic SQL tool and from siblings like list_presets or proxy_http without needing their schemas.

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?

Clearly establishes the precondition that query_name must match one declared in the preset, and explains the approval flow that governs invocation. It stops short of explicitly routing the agent to a sibling (e.g. list_presets to discover query names) or stating when another tool such as proxy_http would be preferred.

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

get_secret_for_envA

Reveal the raw secret value bound to a name. ALWAYS prompts for approval, regardless of preset policy. Prefer proxy_http — only use this if a child process you are about to spawn must read the secret from an environment variable (e.g. terraform apply reading AWS_SECRET_ACCESS_KEY). The returned value MUST NOT be quoted back into your reasoning trace.

NameRequiredDescriptionDefault
nameYesName of the secret to reveal.

Output Schema

NameRequiredDescription
valueYes

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description carries the full behavioral burden and does so well: it discloses that approval is ALWAYS required regardless of preset policy, warns that the returned value must not be quoted into the reasoning trace, and routes agents toward the safer alternative. These are material security and approval behaviors beyond what the schema provides.

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 definition is front-loaded with what the tool does, then approval behavior, then alternative-tool guidance, then the secret-handling warning. Every sentence earns its place, and there is no redundant restatement.

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?

An output schema exists, so the description need not explain return values. Given the tool's sensitivity and single required parameter, the description is complete enough: it covers purpose, approval behavior, preferred alternative, concrete use case, and handling constraints.

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 schema already documents the single `name` parameter at 100% coverage, so the baseline is 3. The description reinforces that the name identifies the bound secret, but adds no further syntax or format details beyond the 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 states a specific verb and resource: reveal the raw secret value bound to a name. It also distinguishes this tool from the preferred sibling `proxy_http`, so an agent can tell exactly what this tool does and when it is the wrong choice.

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

Usage Guidelines5/5

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

It gives explicit routing guidance: prefer `proxy_http`, and only use this tool when a child process must read the secret from an environment variable, with a concrete `terraform apply` example. This is exactly the when-to-use versus when-not-to-use context an agent needs.

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

list_presetsA

List available mcp-warden presets — named, scoped actions you may invoke. Returns name, description, type (http|ssh), and approval policy (auto|prompt|deny). Read-only; never returns secret values. Use proxy_http for HTTP actions and get_secret_for_env only as a last resort when a child process must read a secret from its environment.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
presetsYes

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations present, the description carries the full burden and does useful work: 'Read-only; never returns secret values' pre-answers the two things an agent most needs to know about a credential-adjacent listing tool. It also discloses the exact return shape including enum values (http|ssh, auto|prompt|deny). It stops short of stating auth requirements, ordering, or pagination behavior for large preset sets.

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

Conciseness4/5

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

Front-loaded with the verb and resource in the first clause, then the return fields, then the safety note, then routing. Four tight clauses with no filler. The final sentence about get_secret_for_env earns its place as routing guidance but is the weakest link — it is about a sibling's usage more than this tool's.

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?

A zero-parameter, read-only discovery tool with an output schema and no annotations: everything an agent needs is present. Purpose, return fields, safety profile, and sibling routing are all covered, and the output schema handles the return structure so no further detail is owed.

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?

Zero parameters, so there is no semantic gap for the description to fill and the baseline of 4 applies. The description correctly spends no words on arguments and instead explains the return shape, which is the only remaining surface for a parameterless tool.

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?

States a specific verb and resource ('List available mcp-warden presets') and goes further by defining what a preset is: 'named, scoped actions you may invoke.' That definition plus the enumerated return fields (name, description, type, approval policy) makes it unmistakably distinct from the execution siblings like proxy_http and ssh_exec.

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 routes the agent away from this tool when action is needed: 'Use `proxy_http` for HTTP actions and `get_secret_for_env` only as a last resort.' That is explicit guidance on alternatives. What it never states outright is the inverse trigger — 'call this first to discover which preset to invoke' — so the when-to-use side is inferred from the word 'List' rather than declared.

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

proxy_httpA

Make an HTTP request through a preset. The preset selects the base URL and authentication; you supply path, method, and optional body / query. Allow-listed methods and paths are validated server-side BEFORE any credential is injected. Sensitive presets trigger a desktop / TUI approval prompt; you cannot bypass approval. If the user previously approved a time-boxed window for this preset+action, the call proceeds without a new prompt and is recorded as 'windowed' in the audit log. Every call is recorded to a local audit log.

NameRequiredDescriptionDefault
bodyNoOptional JSON body.
pathYesPath relative to the preset's `base_url`. Must start with `/`.
queryNoOptional query string parameters.
methodYesHTTP method. Must be in the preset's `allowed_methods`.
preset_nameYesName of the preset to use (must exist in `list_presets`).

Output Schema

NameRequiredDescription
bodyYesResponse body parsed as JSON; `null` if the upstream body is not JSON.
statusYes

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 discloses important behavior: server-side allow-list validation before credential injection, approval prompts for sensitive presets, non-bypassable approval, time-boxed approval windows, and audit logging. This is unusually complete for a security-sensitive proxy tool.

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

Conciseness4/5

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

The description is front-loaded with the core action and then adds relevant security and audit details. It is generally efficient, though the audit-log point is slightly repeated across sentences.

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?

The tool has no annotations, five parameters, and an output schema; the description covers purpose, validation, authentication flow, approval behavior, and audit logging. An agent has enough context to invoke it correctly without needing return-value details.

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 100%, so the schema already explains all five parameters. The description reinforces the preset/path/method/body/query roles but does not add syntax or semantic detail beyond what the input schema provides.

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?

States a specific verb and resource: making an HTTP request through a preset. It also explains the preset's role and the caller-supplied fields, which clearly distinguishes it from sibling tools like ssh_exec, sftp_transfer, or db_query.

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?

Provides clear operational context: the preset supplies base URL and authentication, while the caller supplies path, method, and optional body/query. It does not explicitly compare this tool against alternatives or state when not to use it, so it falls short of a 5.

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

sftp_transferA

Transfer a file between the preset's SSH host and the local machine. direction must be "get" (download) or "put" (upload). The remote path must match the preset's sftp_allowed_paths prefixes; the local path must be under $HOME or /tmp. Always key-based auth, host-key verified. If the user previously approved a time-boxed window for this preset+action, the call proceeds without a new prompt and is recorded as 'windowed' in the audit log.

NameRequiredDescriptionDefault
localYes
remoteYes
directionYes"get" (download) or "put" (upload).
preset_nameYes

Output Schema

NameRequiredDescription
bytesYes
localYes
remoteYes
directionYes

TDQS

A3.8/5.0
Behavior4/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 well: it discloses always-on key-based auth, host-key verification, path sandboxing, and the approval/audit behavior where a pre-approved window lets the call proceed without a prompt and be logged as 'windowed'. It omits what happens to an existing local file (overwrite/abort) and any size limits, which keeps it from a 5.

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

Conciseness4/5

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

Four sentences, front-loaded with the core action, then constraints, then auth, then approval behavior — a sensible information order. The direction sentence duplicates the schema's own enum wording, which is mild waste.

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?

An output schema exists, so return values need not be explained, and the description covers the security-relevant behavior an agent needs before calling: auth model, path sandbox, and the no-prompt audit-window case. Destination overwrite semantics and error behavior on path rejection are the main gaps.

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?

Schema coverage is only 25% (only direction is documented in the schema, and the description merely restates it), so the description must compensate — and it does, supplying the constraint semantics for remote (sftp_allowed_paths prefixes) and local ($HOME or /tmp) that the schema lacks entirely. Only preset_name is left implicit.

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

Purpose4/5

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

Opens with a specific verb and resource: 'Transfer a file between the preset's SSH host and the local machine.' An agent immediately knows this is file movement, distinct from ssh_exec (command execution) or db_query. It stops short of naming a sibling to contrast with explicitly, so it stays at 4.

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?

Gives concrete hard constraints on when a call is valid: direction must be get or put, remote must match the preset's sftp_allowed_paths prefixes, local must be under $HOME or /tmp. It never says when to prefer this over ssh_exec or what to do if a path is rejected, so usage context is implied rather than stated.

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

ssh_execA

Run a shell command on the preset's SSH host. The command must match one of the preset's allowed_commands regexes (anchored ^...$). Returns stdout, stderr, and exit_code. Key-based auth only; host key is verified against the user's known_hosts file. Sensitive presets trigger the approval prompt. If the user previously approved a time-boxed window for this preset+action, the call proceeds without a new prompt and is recorded as 'windowed' in the audit log. Every call is recorded to the audit log.

NameRequiredDescriptionDefault
commandYes
preset_nameYes

Output Schema

NameRequiredDescription
stderrYes
stdoutYes
exit_codeNo

TDQS

A4.4/5.0
Behavior5/5

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

With no annotations provided, the description carries the full behavioral burden and does so well: it discloses key-based auth only, known_hosts verification, approval prompts for sensitive presets, time-boxed approval windows, and audit logging. It also specifies return fields (stdout, stderr, exit_code), making the tool's behavior very clear.

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 front-loaded with the core action and then layers constraints, return values, auth, approval, and audit behavior without wasted wording. Every sentence adds operational information an agent needs.

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 complex remote command execution tool with no annotations and 0% schema description coverage, the description is quite complete: it covers auth, host verification, approval, audit logging, command restrictions, and return values. It still lacks details such as command timeout behavior or how presets are discovered, but the core invocation context is well covered.

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?

Schema description coverage is 0%, so the description must compensate for both parameters. It meaningfully defines `command` as a shell command subject to anchored `allowed_commands` regexes and establishes that `preset_name` selects the SSH host, allowed commands, and approval context, though it does not explain how to discover preset names.

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 gives a specific verb and resource: 'Run a shell command on the preset's SSH host.' It clearly distinguishes this tool from siblings such as db_query, sftp_transfer, and proxy_http by naming shell execution over SSH as the action.

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 gives preconditions such as the command matching `allowed_commands` regexes and key-based auth, which implies when the tool can run. However, it does not explicitly compare this tool with siblings like sftp_transfer or proxy_http or state when to choose an alternative.

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. 6 tool updatesv0.1.0
    • First observeddb_query
    • First observedget_secret_for_env
    • First observedlist_presets
    • First observedproxy_http
    • First observedsftp_transfer
    • First observedssh_exec

TDQS

A4.1/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a distinct channel or resource: preset discovery (list_presets), HTTP (proxy_http), SSH command exec (ssh_exec), file transfer (sftp_transfer), named DB queries (db_query), and raw secret exposure (get_secret_for_env). The descriptions even explicitly steer callers (e.g., prefer proxy_http over get_secret_for_env), leaving little room for misselection despite shared 'preset' framing.

Naming Consistency3/5

All names are snake_case and readable, but conventions are mixed: two verb-first names (get_secret_for_env, list_presets) versus four resource/channel-first names (proxy_http, db_query, ssh_exec, sftp_transfer). The inconsistency is mild but predictable patterns are absent.

Tool Count5/5

Six tools map cleanly onto the server's scope: one discovery tool, four execution channels (HTTP, SSH, SFTP, DB), and one escape-hatch secret reader. Nothing feels padded or missing at the count level.

Completeness3/5

The execution surface is solid, but several referenced concepts have no corresponding tools: the audit log is written to on every call yet unreadable, and time-boxed approval windows are described but cannot be requested or inspected. Preset creation/editing is arguably omitted by design, but the observability gaps are notable dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Credential isolation proxy for AI agents. Injects API keys at the network boundary so your agent never sees the raw credential. Supports domain allowlists, agent auth, policy enforcement, and audit logging.
    3
    36 npm
    14
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Self-hosted credential store and API proxy for AI agents. One Bearer token, all your services. Handles OAuth refresh, encrypted storage, audit logging, and per-agent permissioning.
    39 npm
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Local zero-trust permission gateway for AI agents. Enforces policy-based tool authorization, human approvals, scoped permissions, and cryptographically verifiable audit logs.
    4
    74 PyPI
    5
    Apache 2.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    Agent Vault is a local credential vault for AI agents. It enables agents to use secrets by name without ever seeing their values, with host allowlists, output scrubbing, and audit logging.
    4
    MIT