Skip to main content
Glama

mcp-security-guard

A Claude Code plugin that audits the MCP servers you have installed. Your code is covered by other tools. This one checks the servers that inject text into Claude's context.

Check

What it catches

Tool poisoning

Instruction overrides, "don't tell the user", <IMPORTANT> tags, directives to read secrets (~/.ssh, .env), conversation harvesting, exfiltration via URLs, parameters and Markdown images, HTML comments, encoded payloads

Full-schema poisoning

The same checks on parameter names, descriptions, defaults, enums, required, plus non-schema text in type

Hidden text

Zero-width, bidi-control and Unicode-tag characters, ANSI terminal escapes, homoglyph tool names

Tool shadowing

A server whose descriptions reference another server's tools, and tool-name collisions between servers

Rug pulls

Tool definitions or launch commands that changed after you pinned them (SHA-256 per tool). Re-checked automatically at every session start

Capabilities & score

Per-tool classification (execute, delete, write, egress), unauthenticated remote write access, 0–100 score and A–F grade per server, recommended permission rules

Supply chain

OSV vulnerabilities and malicious versions, typosquats, missing or brand-new packages, install scripts, publisher changes (opt-in network check)

Runtime

Hooks on every MCP call: ask before credentials are sent, warn on injected instructions or credentials in outputs, content-free audit log

Policy

.mcp-security.json approved/blocked servers and hosts, enforced in audits, CI and at session start

Configuration

Plaintext secrets in env/headers/args/URLs, plain-HTTP remotes, unpinned npx/uvx packages, privileged or unpinned Docker images, pipe-to-shell launches, duplicate names across scopes

It discovers servers from every place Claude Code and Claude Desktop load them: user, local and project scope, servers shipped inside installed plugins and plugins synced from your claude.ai account (named <plugin>:<server>), claude_desktop_config.json and Claude Desktop extensions, the organisation-managed managed-mcp.json, other clients on the machine (Cursor, VS Code, Windsurf, user and project configs), and the claude.ai connectors you have used (names only: their configuration lives in your account).

It scans everything a server puts into Claude's context, not only tools: server instructions, prompts, resources and resource templates go through the same poisoning checks and are pinned for rug-pull detection.

Everything runs locally. Nothing is sent anywhere.

OWASP MCP Top 10 coverage

Every finding is tagged with its OWASP MCP Top 10 id, in reports and in SARIF.

ID

Risk

Covered by

MCP01

Token Mismanagement & Secret Exposure

✅ Plaintext secrets in env, headers, args and URLs. At runtime, asks before a credential is sent to an MCP server and warns when one comes back.

MCP02

Privilege Escalation via Scope Creep

✅ Capability inventory (execute, delete, write, egress), ready-to-paste permissions.ask rules, privileged or broadly mounted containers

MCP03

Tool Poisoning

✅ 26/27 published techniques detected, including full-schema poisoning, shadowing and name collisions, plus rug-pull pinning

MCP04

Supply Chain Attacks

✅ Unpinned packages, images and git sources; OSV vulnerabilities and malicious versions; typosquats; new packages; install scripts; publisher changes

MCP05

Command Injection & Execution

✅ Flags tools that can execute commands; adversarial_test finds injectable parameters in servers you own

MCP06

Prompt Injection via Contextual Payloads

✅ In tool metadata and, at runtime, in tool outputs (English patterns)

MCP07

Insufficient AuthN/AuthZ

✅ Plain-HTTP remotes; remote servers exposing write or exec tools without authentication; OAuth detection

MCP08

Lack of Audit and Telemetry

✅ Local, content-free audit log of every MCP call, with query_audit_log

MCP09

Shadow MCP Servers

✅ Discovery across user, project, local, plugin and Claude Desktop configs; approved-server policy enforced in audits, CI and at session start

MCP10

Context Injection & Over-Sharing

✅ Conversation and system-prompt harvesting, Markdown-image exfiltration, credentials in outputs, network-egress inventory

What a local tool cannot do (planned for a hosted Team plan): org-wide discovery and audit aggregation, and OAuth scope review.

Measured: detects 26/27 attacks from a corpus of publicly documented techniques, with 0 false positives on 13 hard benign samples and on 17 real servers (83 tools). See bench/RESULTS.md.

Related MCP server: agentscore-mcp-server

Install

/plugin marketplace add petrovicistefan/mcp-security-guard
/plugin install mcp-security-guard@mcp-security-guard

Then run /mcp-audit, or ask Claude "are my MCP servers safe?".

Other MCP clients (Cursor, VS Code, Windsurf, Claude Desktop, Cline, ...)

The same server is published on npm and runs with no install step:

{ "mcpServers": { "mcp-security-guard": { "command": "npx", "args": ["-y", "mcp-security-guard"] } } }

The command line tool is the same package: npx mcp-security-guard audit --project-only. It is also listed in the official MCP Registry as io.github.petrovicistefan/mcp-security-guard.

Tools

Tool

Launches servers?

list_mcp_servers

No

audit_mcp_config

No

audit_server_tools

Yes, after explicit confirm_launch: true. Sends only initialize and list requests (tools, prompts, resources); never calls a tool, renders a prompt or reads a resource

pin_tools

Yes (same as above). Writes ~/.claude/mcp-security/pins.json

analyze_tool_definitions

No. Offline analysis of a tools/list payload, for MCP server authors

check_supply_chain

No. Sends package names and versions to npm, PyPI and OSV after confirm_network: true

apply_fixes

Only for the permissions fix. Dry run by default; with write: true it edits the project's .mcp.json / .claude/settings.json after a backup to ~/.claude/mcp-security/backups/

security_dashboard

Only with scan: "full" and confirm_launch: true. Interactive dashboard (MCP App)

generate_policy

No. Returns a .mcp-security.json approving the current servers

query_audit_log

No. Summarises the runtime audit log

adversarial_test

Yes, and calls tools with injection payloads. Only for servers you own; needs i_own_this_server and confirm_launch; skips destructive tools

Session-start check

A SessionStart hook re-verifies only the servers you have pinned (pinning is your consent to launch them) and stays silent unless something changed. Control it with MCP_SECURITY_SESSION_CHECK:

  • full (default): compare launch configs and re-list tools

  • config: compare launch configs only, launch nothing

  • off: disable the check

CI / GitHub Action

Fail pull requests that add risky MCP servers to .mcp.json, and show the findings in GitHub code scanning:

name: MCP security
on: [pull_request]
permissions:
  contents: read
  security-events: write
jobs:
  audit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: petrovicistefan/mcp-security-guard@main
        id: mcp
        with:
          fail-on: high          # critical | high | medium | low | info | none
      - uses: github/codeql-action/upload-sarif@v3
        if: always()
        with:
          sarif_file: ${{ steps.mcp.outputs.sarif-file }}

The same checks run locally without Claude:

node plugin/dist/cli.mjs audit --project-only --format sarif --output mcp.sarif
node plugin/dist/cli.mjs analyze-tools tools.json --name my-server   # for MCP server authors: a saved tools/list result

Check a server before installing it (launches it, sends only initialize and tools/list):

node plugin/dist/cli.mjs scan some-server.mcp.json --confirm-launch

Test your own server for command injection and path traversal (it calls the tools; run a test instance, ideally in a container):

node plugin/dist/cli.mjs adversarial my-server.mcp.json --server my-server --i-own-this-server --confirm-launch

Fix what the audit found (dry run first, then --write):

node plugin/dist/cli.mjs fix --pin-versions            # npx pkg → pkg@x.y.z, uvx pkg → pkg==x.y.z (looks up npm/PyPI)
node plugin/dist/cli.mjs fix --env-refs --write        # literal secrets in .mcp.json → ${VAR} references
node plugin/dist/cli.mjs fix --permissions --confirm-launch --write   # permissions.ask rules for risky tools

Start a team policy from the servers configured today:

node plugin/dist/cli.mjs policy-init && git add .mcp-security.json

Any command takes --format markdown|json|sarif|html. The HTML report is a single self-contained file you can open in a browser or attach to a ticket.

Exit codes: 0 clean, 1 findings at or above --fail-on, 2 usage error.

Limitations

Remote servers that require OAuth (most hosted MCP servers) cannot be scanned at the tool level: the scanner cannot reuse Claude Code's tokens. Their configuration is still audited.

Interactive dashboard (MCP App)

security_dashboard is an MCP App: hosts that support MCP Apps (Claude Desktop, claude.ai, VS Code Copilot…) render it inline. It shows every server with its score and grade, findings filterable by severity and server, the OWASP MCP Top 10 breakdown, recommended permission rules, and Full scan and Pin buttons. Selecting a server tells Claude what you are looking at, so follow-up questions have context. Claude Code in a terminal gets the text summary instead.

To use it in Claude Desktop, add the server to claude_desktop_config.json and ask Claude to "open the MCP security dashboard":

{ "mcpServers": { "mcp-security-guard": { "command": "node", "args": ["/path/to/mcp-security-guard/plugin/dist/index.mjs"] } } }

The UI is a single self-contained HTML file. Server-supplied text reaches the page only as text (never as HTML), and the host's sandbox applies. Develop it with a local host that drives the real server: npm run dashboard:dev -- /path/to/project.

Runtime hooks

Hook

What it does

Setting

PreToolUse on mcp__*

Asks for confirmation when a call's arguments contain a credential

MCP_SECURITY_SECRET_GUARD=ask (default), deny or off

PostToolUse on mcp__*

Warns Claude and you when an output contains injected instructions, hidden characters, exfiltration markup or a credential

always on

Audit log

~/.claude/mcp-security/audit.jsonl: server, tool, time, input hash and sizes. Never arguments or outputs. Rotates at 10 MB.

MCP_SECURITY_AUDIT_LOG=off

The hooks add about 40 ms per MCP call.

Trust model

  • Read-only, apart from the pin file, the audit log, and policy-init (which writes a file you asked for).

  • Network only when you opt in: check_supply_chain / --supply-chain send package names and versions to npm, PyPI and OSV. The adversarial_test tool is the only one that calls tools.

  • Evidence from scanned servers is sanitised (invisible characters revealed, length capped) and labelled as untrusted data.

  • Secrets are masked in all output.

  • Static checks reduce risk. They do not prove a server safe: malicious behaviour in tool responses or server code is out of scope.

Development

npm install
npm run build      # bundles to plugin/dist/ (committed, so the plugin runs without npm install)
npm test
npm run bench      # false-positive gate on real servers (network; Docker images optional, see bench/RESULTS.md)

test/fixtures/poisoned-server.mjs is a deliberately malicious server used by the end-to-end test.

Pro & Team (early access)

Everything above is free and stays free: it runs locally and needs no account. Paid plans add what needs a server: a daily threat feed of known malicious MCP servers and packages, alerts when a server you use ships changed tool descriptions, history, and team policies and dashboards. They are opt-in through MCP_SECURITY_API_KEY; see PRIVACY.md for exactly what is sent.

Interested? Join the early access list. Early sign-ups get launch pricing, including a limited lifetime license.

Security, privacy, license

About the author

I'm Stefan Petrovici: passionate about IT, a husband and a father. I built mcp-security-guard on my own. I'm looking for a job.

I build web applications end to end, frontend, backend, APIs and deployment, and I'm happy to work on anything else that needs building. This repository shows how I work: tests, CI, careful documentation and attention to security.

I also build WordPress and WooCommerce plugins, available at pluginsforstores.com.

If your team is hiring, write to me at hello@petrovicistefan.ro.

Available Tools

11 tools
adversarial_testAdversarial test of your own MCP serverA

CALLS every non-destructive tool of one configured server with command-injection payloads (each would only create an empty canary file) and path-traversal payloads, then reports which parameters reach a shell or the file system unchecked. Only for servers the user develops or operates, ideally a test instance in a container. Destructive tools are skipped unless include_destructive is true.

ParametersJSON Schema
NameRequiredDescriptionDefault
serverYesServer name, optionally "scope:name".
canary_dirNoWritable directory as seen by the server (default: the OS temp directory). For a container, mount a host directory and pass host_canary_dir too.
project_dirNo
confirm_launchYesMust be true: the user agreed that the server is started and its tools are called.
host_canary_dirNo
i_own_this_serverYesMust be true: the user confirmed they own or operate this server.
include_destructiveNo

TDQS

A4.5/5.0
Behavior5/5

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

Goes well beyond the annotations (readOnlyHint=false, openWorldHint=true, destructiveHint=false) by disclosing side effects (each payload would only create an empty canary file), the default safety scope (non-destructive tools only), and the ownership/consent prerequisite. This is exactly the behavioral context an agent needs before invoking a tool that launches a server and executes its tools.

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?

Two dense sentences with zero filler: the action and payload types come first, followed by the safety constraint and exception. Every clause carries information the agent needs.

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 7-parameter, no-output-schema tool with real blast radius, the description covers the mechanism, side effects, scope limits, and consent prerequisites, and even summarizes what the run reports ('which parameters reach a shell or the file system unchecked'). Nothing essential to safe invocation is missing.

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 coverage is moderate (57%) and the description adds rationale for canary_dir (the canary file the payloads attempt to create) and for include_destructive. However, project_dir and host_canary_dir are left unexplained in both description and schema, so the description does not fully compensate for the coverage gap. Baseline 3 for moderate coverage.

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 (calls every non-destructive tool of one configured server with injection/traversal payloads) plus the outcome reported (which parameters reach a shell or file system unchecked). This is clearly distinguishable from siblings like audit_server_tools or analyze_tool_definitions, which inspect definitions rather than actively probe them.

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?

Gives explicit gating conditions: 'Only for servers the user develops or operates, ideally a test instance in a container,' and states destructive tools are skipped unless include_destructive is true. It does not name a sibling alternative for the safer static-analysis case, but the when/when-not context is clear.

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

analyze_tool_definitionsAnalyze tool definitions (offline)A
Read-only

Runs the tool-poisoning checks on tool definitions you pass in (e.g. the output of tools/list from a server you are developing), without connecting to anything. Useful in CI or before publishing an MCP server.

ParametersJSON Schema
NameRequiredDescriptionDefault
toolsYes
server_nameYesLabel used in the report.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description corroborates this with 'without connecting to anything', which is helpful but largely restates the annotation. It does not describe what checks are run, what happens on a poisoned definition, or the report/output shape, so it adds only modest value beyond the structured hints.

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?

Two tight sentences with the core action front-loaded and no filler. The offline/CI context follows immediately and every clause carries information.

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?

For a two-parameter analysis tool with no output schema, the description explains input sourcing and usage context but says nothing about what the analysis returns or how results are surfaced (even though server_name mentions 'the report'). The return contract is left unspecified, which is a moderate gap.

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 50%: server_name is documented in the schema but the tools array is not. The description compensates by explaining that tools is the raw tool definitions passed in, e.g. the output of tools/list, which is genuinely useful format guidance beyond the schema. It still leaves the item-level shape unaddressed.

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?

The description gives a specific verb and resource ('Runs the tool-poisoning checks on tool definitions you pass in') and clarifies the input source is tools/list output from a server under development. It implicitly separates itself from live-connection siblings like audit_server_tools via 'without connecting to anything', though it never names a sibling explicitly.

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 states clear usage contexts ('Useful in CI or before publishing an MCP server'), which tells an agent when this tool is the right choice. It stops short of naming alternatives or stating when not to use it, so it does not reach a 5.

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

apply_fixesApply recommended fixesA
Idempotent

Fixes findings in the project's own files. permissions: adds the recommended permissions.ask rules for tools that execute code, delete data or write files to .claude/settings.json (needs confirm_launch, because the servers are listed to classify their tools). pin-versions: pins unpinned npx/uvx packages in .mcp.json to the registry's current version (needs confirm_network). env-refs: replaces literal secrets in .mcp.json env/headers with ${VAR} references. Without write=true it only shows the planned edits. Every written file is backed up under ~/.claude/mcp-security/backups/ first; ~/.claude.json is never modified.

ParametersJSON Schema
NameRequiredDescriptionDefault
fixesYes
writeNofalse = dry run. Show the plan to the user first, then call again with write=true after they agree.
serversNoServers considered for the permissions fix.
project_dirNo
confirm_launchNo
confirm_networkNo

TDQS

A4.5/5.0
Behavior5/5

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

Despite annotations already covering safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true), the description adds substantial non-obvious behavior: exactly which files are touched (.claude/settings.json, .mcp.json), that every written file is backed up, and crucially that ~/.claude.json is never modified. This is high-value disclosure beyond structured data.

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?

Dense but well front-loaded: the core purpose leads, followed by per-fix behavior and the dry-run/backup safety notes. Almost every sentence earns its place, though the parenthetical explanations add slight length.

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 mutating, open-world tool with no output schema, the description covers the files modified, the dry-run default, prerequisites, and backup behavior. Only project_dir lacks an explanation, a minor gap given the overall thoroughness.

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?

With schema coverage at only 33%, the description compensates well: it explains each value of the fixes enum and their effects, the write=true semantics, confirm_launch and confirm_network meanings, and the servers param's role in the permissions fix. Only project_dir is left undocumented.

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 (fixes) and resource (findings in the project's own files), then enumerates the three concrete fix categories it applies. This cleanly distinguishes it from sibling tools like audit_mcp_config and generate_policy, which diagnose or produce recommendations rather than mutate files.

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?

Gives explicit conditions per fix type (permissions needs confirm_launch; pin-versions needs confirm_network) and a clear dry-run workflow: call without write=true first, then confirm. It doesn't name specific sibling alternatives to use before/after, but the prerequisites are unusually well specified.

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

audit_mcp_configAudit MCP configurationA
Read-only

Static audit of MCP server configuration: plaintext secrets in env/headers/args/URLs, plain-HTTP remote servers, unpinned npx/uvx packages, unpinned or privileged Docker containers, pipe-to-shell launch commands, and duplicate server names across scopes. Read-only; launches nothing.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_dirNoProject directory. Defaults to the current project.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description reinforces this while adding genuinely new information: 'launches nothing' tells the agent that pipe-to-shell commands and npx/uvx packages are inspected but never executed, which is a meaningful safety guarantee beyond the annotations. It stops short of describing finding severity, output volume, or how results are ordered.

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?

Purpose is front-loaded in the first clause, followed by a compact checklist of detection categories and a one-clause safety note. The enumeration is long but every item is load-bearing for distinguishing this tool's coverage; no filler sentences.

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 zero-required-parameter, read-only scan with no output schema, the description supplies enough to call it correctly: it states the input domain (config), the static/non-executing nature, and the categories of findings an agent should expect back. It does not sketch the return shape, but the finding enumeration is a reasonable proxy.

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?

Single optional parameter with 100% schema description coverage, so the schema already documents project_dir and its default. The description adds no further meaning about path resolution, relative vs absolute paths, or multi-scope behavior, so baseline 3 applies.

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?

Specific verb (audit) plus a precisely scoped resource (MCP server configuration) that is explicitly static and config-file-only. The enumeration of seven detection categories (plaintext secrets, plain-HTTP remotes, unpinned npx/uvx, privileged Docker, pipe-to-shell, duplicate names) cleanly separates it from audit_server_tools, check_supply_chain, and adversarial_test without the agent needing to open any schema.

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 scope of the check implies when the tool applies, and 'Static audit' plus 'launches nothing' signals a pre-execution/configuration-review context. However, no sibling is named and there is no explicit when-to-use or when-not-to-use statement relative to audit_server_tools, check_supply_chain, or adversarial_test, so the agent must infer routing.

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

audit_server_toolsAudit MCP tool definitionsA
Read-only

Connects to the selected MCP servers, lists their tools, and checks every name, description and schema string for tool poisoning (instruction overrides, concealment requests, hidden tags, invisible Unicode, sensitive file paths, exfiltration wording, encoded payloads), cross-server tool shadowing, and changes since the tools were last pinned (rug pulls). Never calls the scanned tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
serversYesServer names to scan, optionally as "scope:name" (e.g. "project:github"). Use ["*"] for all.
project_dirNo
confirm_launchYesMust be true. Scanning starts each server process (stdio) or connects to it (HTTP); only initialize and tools/list are sent and no tool is called. Ask the user first.
timeout_secondsNo

TDQS

A4.1/5.0
Behavior5/5

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

Beyond readOnlyHint=true and openWorldHint=true, the description discloses that scanning launches server processes or opens HTTP connections, that only initialize and tools/list are sent, and that no scanned tool is ever invoked. This is exactly the extra operational context annotations cannot carry.

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-loads the action and the threat list, then closes with the key safety guarantee. The parenthetical threat enumeration is dense but each item earns its keeping; two sentences, no 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?

With no output schema, the description should ideally hint at what the audit returns (findings, severity, report shape). It covers invocation behavior thoroughly, but the result format is left unspecified for a tool whose output is the whole point.

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 coverage is only 50%, and the description adds nothing about the servers list format, project_dir, or timeout beyond what the schema already says. The confirm_launch semantics it implies (requires user consent) are already documented in the schema, so compensation for the coverage gap is marginal.

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 specific verbs and resource: connects to MCP servers, lists tools, and checks names/descriptions/schemas for poisoning, shadowing, and rug pulls. The enumerated threat categories make it clearly distinct from siblings like audit_mcp_config or analyze_tool_definitions.

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?

Provides context (scan servers for poisoning/rug pulls) and a hard behavioral rule (never calls the scanned tools), which implies when to reach for it. However, it never explicitly contrasts with the overlapping siblings analyze_tool_definitions or audit_mcp_config, so the agent must infer which audit tool applies.

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

check_supply_chainCheck MCP server packages (npm/PyPI)A
Read-only

For servers launched with npx/uvx and similar, checks the package on its registry and in the OSV database: known vulnerabilities, known malicious versions, typosquats of popular MCP packages, non-existent names, very new packages or releases, install scripts, deprecation and npm publisher changes. Sends package names and versions to registry.npmjs.org, pypi.org and api.osv.dev; nothing else leaves the machine.

ParametersJSON Schema
NameRequiredDescriptionDefault
serversNoServer names, or ["*"] for all.
project_dirNo
scan_imagesNoAlso scan container images of Docker-based servers with Trivy or Grype if installed (may pull images and the scanner database).
confirm_networkYesMust be true: package names and versions are sent to the registries and OSV.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare readOnlyHint and openWorldHint; the description goes far beyond by enumerating the checks (vulnerabilities, malicious versions, typosquats, non-existent names, freshness, install scripts, deprecation, publisher changes) and explicitly disclosing the external endpoints contacted (registry.npmjs.org, pypi.org, api.osv.dev) and that nothing else leaves the machine. That is exactly the exfiltration/consent context an agent needs before invoking a network 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?

Two sentences, front-loaded with the applicability condition, then a compact but complete enumeration of behavior. No filler and the privacy statement is placed at the end where it has the most impact.

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?

With no output schema, the description covers what is checked and the network/consent implications well, which is the critical information for this tool. It stops short of describing result shape or what happens when confirm_network is false, leaving a small gap.

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 75%, so the schema carries most parameter meaning, but the description adds the concrete destination domains behind confirm_network and reiterates that only names and versions are transmitted, which the schema's terse 'must be true' note does not. It also contextualizes scan_images indirectly via the image-pull note in 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?

States a specific verb ('checks the package on its registry and in the OSV database') plus the precise resource and scope ('for servers launched with npx/uvx and similar'), and then enumerates exactly what checks are performed. This clearly separates it from siblings like audit_mcp_config or audit_server_tools.

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 opening clause gives a clear trigger condition ('For servers launched with npx/uvx and similar'), which tells the agent when this tool applies, and the confirm_network requirement is surfaced. However, it never names an alternative sibling or states when not to use it (e.g., vs. audit_mcp_config for non-npx servers).

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

generate_policyGenerate an approved-server policyA
Read-only

Returns a .mcp-security.json policy that approves exactly the MCP servers configured now (and their remote hosts) and requires pinned versions. Commit it to the repository so CI, session checks and audits flag any server added later that is not on the list (shadow MCP servers). Read-only: returns the JSON, does not write it.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_dirNo

TDQS

A4.1/5.0
Behavior4/5

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

The readOnlyHint annotation is confirmed and reinforced ('Read-only: returns the JSON, does not write it'), and the description adds substantive behavior: exactly what the policy approves, that it pins versions, and its downstream enforcement role. It stops short of 5 only because it says nothing about the returned JSON's shape or any size/limit caveats.

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?

Three sentences, each doing distinct work: what is returned, how to use it, and the read-only guarantee. The most important information (the artifact produced) is front-loaded with no 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?

With no output schema, the description correctly specifies that it returns JSON rather than writing it, and explains the policy's enforceability downstream. The only meaningful omission is the undocumented project_dir parameter and whether it defaults to the current working directory.

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?

There is one parameter (project_dir) with 0% schema description coverage, and the description never mentions it or explains what directory it should point at or what the default is. Since the schema does no work here, the description needed to compensate and does not.

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 precise verb and artifact: it returns a .mcp-security.json policy approving the currently configured MCP servers and their remote hosts, with pinned versions. This is clearly distinguishable from siblings like list_mcp_servers or pin_tools, which read or mutate state rather than emit a policy file.

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 gives a clear operative context: commit the returned file to the repository so CI, session checks and audits flag later-added shadow servers. It does not explicitly name an alternative or state a when-not condition, so it stops short of a 5, but the intended workflow is unambiguous.

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

list_mcp_serversList configured MCP serversA
Read-only

Lists every MCP server configured for this project (user, local and project scope in Claude Code, plus Claude Desktop) with its transport. Reads config files only; launches nothing.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_dirNoProject directory. Defaults to the current project.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuine extra context beyond that: it reads config files only and launches no processes, which tells the agent this is a passive filesystem read rather than a live connection attempt.

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?

Two tight sentences with zero filler, and the scope of what gets listed is front-loaded ahead of the behavioral caveat. Every clause 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?

There is no output schema, but the description gestures at the return shape ('with its transport') and the scopes covered. For a simple one-optional-param read tool with annotations carrying the safety profile, this is nearly complete, with only the exact result fields left unspecified.

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% for the single project_dir parameter, so the schema already carries the semantics. The description adds no defaulting or format guidance beyond what the schema states, so the baseline 3 applies.

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?

States a specific verb and resource ('Lists every MCP server configured for this project') and enumerates the exact scopes covered (user, local, project in Claude Code, plus Claude Desktop). It does not explicitly name a sibling such as audit_mcp_config to differentiate the inventory use case from an audit use case, so it stops short of a 5.

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 clause 'Reads config files only; launches nothing' implies the tool is for static inventory rather than live probing, which is useful context. However, it never says when to prefer this over siblings like audit_mcp_config or audit_server_tools, leaving the routing decision to inference.

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

pin_toolsPin MCP tool definitionsA
Idempotent

Records a SHA-256 hash of every tool definition of the selected servers in ~/.claude/mcp-security/pins.json, so later audits can detect rug pulls. Pin only after the user has reviewed an audit_server_tools report for these servers. Launches the servers like audit_server_tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
serversYesServer names to scan, optionally as "scope:name" (e.g. "project:github"). Use ["*"] for all.
project_dirNo
confirm_launchYesMust be true. Scanning starts each server process (stdio) or connects to it (HTTP); only initialize and tools/list are sent and no tool is called. Ask the user first.
timeout_secondsNo

TDQS

A4/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false, destructiveHint=false, idempotentHint=true, openWorldHint=true; the description explains *why* it is a non-read operation — it launches/connects to each server and writes a hash file — plus a user-consent precondition. It stops short of describing failure modes (unreachable server, existing pin mismatch) or whether a prior pin is overwritten.

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?

Three tight sentences: what gets written and where, the rug-pull rationale, the ordering prerequisite, and the launch behavior. The critical gating instruction is front-loaded and nothing is padded.

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?

For a state-mutating, process-launching tool with no output schema and half its parameters undocumented, the description covers intent and precondition adequately but omits return/results reporting and error behavior. An agent would need to guess what it gets back after pinning.

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?

Schema description coverage is only 50%, with project_dir and timeout_seconds carrying no schema description, and the tool description says nothing about these or about the servers wildcard syntax. The description therefore adds no parameter meaning and does not compensate for the coverage gap.

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?

Names a specific verb and resource ('Records a SHA-256 hash of every tool definition of the selected servers') and states the artifact written (~/.claude/mcp-security/pins.json) plus the rationale ('so later audits can detect rug pulls'). It also positions itself relative to the sibling audit_server_tools, so an agent can distinguish it from audit/report tools.

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?

Explicit prerequisite: 'Pin only after the user has reviewed an audit_server_tools report for these servers,' which names the alternative tool and the condition that gates use. It does not spell out when *not* to use it (e.g. re-pinning after config changes) or how it differs in scope from apply_fixes, but the routing signal is clear.

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

query_audit_logQuery the MCP call audit logA
Read-only

Summarises the local audit log written by the plugin's hooks: MCP tool calls per server and tool, and every call where a credential was sent, a credential came back, or the output contained injected instructions. The log stores hashes and sizes only, never arguments or outputs.

ParametersJSON Schema
NameRequiredDescriptionDefault
since_hoursNoLook-back window in hours.

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=false), so the description's real value-add is the data-handling disclosure: the log stores only hashes and sizes, never arguments or outputs. That tells the agent what evidence it can and cannot retrieve, which is meaningful context beyond the annotations. It stops short of describing output format or result volume.

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?

A single dense sentence that front-loads what the tool summarises and then appends the privacy constraint. No filler, though the 2160-hour cap interaction is left implicit.

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?

With no output schema, the description does the work of explaining what the response contains (per-server/tool counts plus credential and injection flags) and what the underlying log does not retain. That is close to complete for a read-only, one-parameter query tool; only ordering/aggregation detail is missing.

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% for the single since_hours parameter with its default, maximum and exclusiveMinimum, so the schema carries the semantics. The description adds nothing about the time window or defaults, making 3 the correct baseline.

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?

The description gives a specific verb (summarises) and resource (the local audit log written by the plugin's hooks), then enumerates exactly what the summary contains: per-server/per-tool call counts and flagged calls. That distinguishes it from config-oriented siblings like audit_mcp_config or audit_server_tools, though it never names an alternative explicitly.

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

Usage Guidelines2/5

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

There is no statement of when to reach for this tool versus the other audit/security siblings, no prerequisites, and no exclusions. An agent can infer it is for reviewing historical call activity, but must guess the routing itself.

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

security_dashboardSecurity dashboardA
Read-only

Opens the interactive mcp-security-guard dashboard: every configured MCP server with its score and grade, findings filterable by severity and server, the OWASP MCP Top 10 breakdown, recommended permission rules, and pin buttons. scan='config' reads files only. scan='full' starts the servers to list their tools, prompts and resources (no tool is called) and needs confirm_launch=true; ask the user first.

ParametersJSON Schema
NameRequiredDescriptionDefault
scanNoconfig
project_dirNo
confirm_launchNo

TDQS

A3.9/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true and openWorldHint=true, but the description adds the non-obvious behavioral fact that scan='full' actually launches the configured servers, that no tool is invoked during that process, and that a confirmation flag plus user consent is required. This is meaningful context beyond the annotations, though it does not describe latency, failure handling, or what happens to already-running servers.

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-loads the core action and then packs the mode semantics into short, dense sentences with no filler. The long enumeration in the opening sentence is justified by the many dashboard sections, though it does make the first sentence heavy.

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 an interactive, open-world tool with no output schema, the description covers what the dashboard shows, the two scan modes, and the safety gate. The remaining gap is project_dir, which is undocumented anywhere, leaving the agent unable to know whether it must supply a working directory.

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 0%, so the description must carry the parameter burden. It explains scan='config' vs scan='full' and the confirm_launch=true requirement well, which compensates for two of three parameters, but project_dir is never mentioned and its purpose is left entirely to inference.

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?

States a specific verb and resource ('Opens the interactive mcp-security-guard dashboard') and then enumerates exactly what the surface contains: scores/grades per server, severity-filterable findings, OWASP MCP Top 10 breakdown, permission rules, pin buttons. An agent knows precisely what it gets. It does not explicitly contrast itself with text-only siblings such as audit_mcp_config, so it lands just short of a 5.

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?

Gives clear mode-selection guidance: scan='config' reads files only, scan='full' starts servers and requires confirm_launch=true, with an explicit 'ask the user first' instruction. What is missing is routing guidance against sibling tools (e.g., when to use audit_mcp_config or list_mcp_servers instead of opening the dashboard).

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. 11 tool updatesv0.7.0
    • First observedadversarial_test
    • First observedanalyze_tool_definitions
    • First observedapply_fixes
    • First observedaudit_mcp_config
    • First observedaudit_server_tools
    • First observedcheck_supply_chain
    • First observedgenerate_policy
    • First observedlist_mcp_servers
    • First observedpin_tools
    • First observedquery_audit_log
    • First observedsecurity_dashboard

TDQS

A4/5.0

Scored across 11 tools

Disambiguation4/5

Most tools target clearly different objects: config files (audit_mcp_config), live server tools (audit_server_tools), passed-in definitions (analyze_tool_definitions), packages (check_supply_chain), and active probing (adversarial_test). The mild overlap between audit_server_tools and analyze_tool_definitions (both run poisoning checks) and between security_dashboard and query_audit_log is well clarified by descriptions. An agent can reliably pick the right tool.

Naming Consistency4/5

Strong verb_noun convention throughout (audit_mcp_config, list_mcp_servers, apply_fixes, generate_policy, pin_tools, check_supply_chain, query_audit_log). A couple of noun-only names (security_dashboard, adversarial_test) break the pattern slightly but remain readable and unambiguous.

Tool Count5/5

11 tools is well within the ideal 3-15 range and each maps to a distinct security function (audit, fix, policy, pin, log, supply chain, adversarial, dashboard). No obvious redundancy or padding.

Completeness4/5

Covers the full security lifecycle: discovery, static/live auditing, remediation, policy generation, pinning, supply-chain checks, adversarial probing, and reporting. Minor gaps exist (no unpin/remove-server operation and no exportable report artifact), but agents can work around these.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Scans MCP servers for prompt injection, supply chain attacks, excessive permissions, and code execution risks. Includes an offline blacklist that catches known-compromised packages like LiteLLM 1.82.7/1.82.8 and Trivy with zero latency.
    19
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    MCP security trust layer. Continuously monitors 800+ MCP packages on npm for install scripts, command injection, hardcoded secrets, capability drift, and publisher posture. Ships a GitHub Action policy gate for PR-level allow/warn/block decisions. 5 MCP tools, no API key required.
    8
    77 npm
    1
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    MCP security server for AI coding agents. 12 tools: pre-install guardian, vulnerability audit, supply-chain attack detection via static code analysis, and CycloneDX 1.6 SBOM generation. Zero runtime dependencies.
    14
    56 npm
    15
    Apache 2.0
  • A
    license
    A
    quality
    C
    maintenance
    Security scanning for MCP servers from the inside out. Provides runtime inspection, AST-based static analysis, config audit, dependency analysis, and OWASP MCP Top 10 compliance in a single MCP server.
    55
    160 npm
    6
    MIT