Mcp-Warden
Provides a Cloudflare DNS preset template for performing DNS-related API operations while keeping the API credential in the OS keychain.
Provides a Gitea read preset template for interacting with Gitea APIs through the credential broker without exposing tokens to the agent.
Allows agents to call the GitHub API through presets such as github-read and github-write, with server-side PAT injection, method/path allow-listing, and approval controls.
Enables named-query execution against MySQL via db_query; the SQL is fixed at preset definition and the agent supplies only the query name and positional parameters.
Provides a Notion read preset template for accessing Notion API resources through proxy_http with scoped credentials.
Provides an OpenAI chat preset template for calling the OpenAI API through proxy_http while keeping the API key out of the agent context.
Enables named-query execution against PostgreSQL via db_query; the SQL is fixed at preset definition and the agent supplies only the query name and positional parameters.
Enables named-command execution against Redis via db_query; the command is fixed at preset definition and the agent supplies only the query name and positional parameters.
Provides a Stripe read preset template for querying Stripe API data through approved HTTP requests without exposing the secret key.
Sends approval prompts to a Telegram chat with inline Approve, Deny, and approve-for-window buttons, using a bot token stored in the OS keychain.
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.

How it works
You store a credential once in the OS keychain via the
mcp-wardenCLI.You define presets — named, scoped actions (e.g.
github-read,stripe-charges).The AI agent connects to
mcp-wardenas an MCP server (stdio).When the agent wants to act, it calls
proxy_httpwith a preset name and a path/method.mcp-wardenvalidates the request against the preset's allow-list, injects the credential, executes, and returns only the response.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.
Every action lands in a local SQLite audit log — including a
windoweddecision 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 clonePre-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-autoWire 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 didCLI reference
Command | Description |
| Create the config directory and a template config |
| Store a secret (value read from stdin, never argv) |
| List secret names (never values) |
| Delete a secret from the keychain |
| Define a preset ( |
| Show all presets |
| Validate a preset against the current keychain |
| Generate a preset from a built-in template ( |
| Bootstrap a preset from an OpenAPI 3.x spec (URL or file) |
| Set approval policy; |
| Read-only view of the audit log (append-only by design) |
| Diagnostic summary; |
| Local read-only web UI (binds 127.0.0.1 only) |
| 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'ssftp_allowed_paths, local path under$HOMEor/tmp.db_query(v0.2.0) — run a NAMED QUERY against PostgreSQL / MySQL / Redis. SQL/command is fixed at preset definition; agent supplies onlyquery_name+ positional params.get_secret_for_env— last-resort tool when a child process must read a secret fromenv. 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-wardenRestart 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) andmcp-warden(binary — CLI, MCP server, executor, web UI, concrete approval transports). Alternate implementations ofKeychainStore,ApprovalTransport,AuditSink, orPresetSourcenow depend only onmcp-warden-coreand 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 doctorprints 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 # optionalthen
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 (seedocs/approval-transports.md). Override at runtime withMCP_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 derivesbase_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. Skipsprompt-policy presets unless--include-promptis passed.web— a small local-only web UI (binds127.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
ApprovalTransportimpl 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 usesprotect_content: true. The wiring (selecting Telegram over Desktop / TUI incli/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;autorequires--confirm-autoat preset creation.Audit log is append-only — the trait surface itself contains no
delete/clearmethod.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 toolsdb_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.
| Name | Required | Description | Default |
|---|---|---|---|
| params | No | Positional parameters; types must match the named query's `param_types`. | |
| query_name | Yes | Must match one of the preset's declared `queries[].name`. | |
| preset_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | Yes | |
| rows_affected | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the secret to reveal. |
Output Schema
| Name | Required | Description |
|---|---|---|
| value | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| presets | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Optional JSON body. | |
| path | Yes | Path relative to the preset's `base_url`. Must start with `/`. | |
| query | No | Optional query string parameters. | |
| method | Yes | HTTP method. Must be in the preset's `allowed_methods`. | |
| preset_name | Yes | Name of the preset to use (must exist in `list_presets`). |
Output Schema
| Name | Required | Description |
|---|---|---|
| body | Yes | Response body parsed as JSON; `null` if the upstream body is not JSON. |
| status | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| local | Yes | ||
| remote | Yes | ||
| direction | Yes | "get" (download) or "put" (upload). | |
| preset_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| bytes | Yes | |
| local | Yes | |
| remote | Yes | |
| direction | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| command | Yes | ||
| preset_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| stderr | Yes | |
| stdout | Yes | |
| exit_code | No |
TDQS
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.
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.
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.
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.
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.
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.
6 tool updates
v0.1.0- First observed
db_query - First observed
get_secret_for_env - First observed
list_presets - First observed
proxy_http - First observed
sftp_transfer - First observed
ssh_exec
TDQS
Scored across 6 tools
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.
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.
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.
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
Related MCP Connectors
- FullmaktOAuthai.fullmakt
Credential broker for AI agents: scoped, revocable API access with policy enforcement and audit.
Security gateway for AI agents: policy, approval, and audited execution, no secrets shared.
- TAPOAuthtech.human
Credential isolation for AI agents: placeholder secrets, policy checks, optional human approval.
Give your AI hands. Identity, credential vault, and API gateway for autonomous agents.
Related MCP Servers
- AlicenseAqualityAmaintenanceCredential 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.336 npm14Apache 2.0
- AlicenseNot gradedqualityCmaintenanceSelf-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 npmMIT
- AlicenseAqualityBmaintenanceLocal zero-trust permission gateway for AI agents. Enforces policy-based tool authorization, human approvals, scoped permissions, and cryptographically verifiable audit logs.474 PyPI5Apache 2.0
- AlicenseNot gradedqualityDmaintenanceAgent 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.4MIT