mcpField
M
mcp-scan

mcp-scan

Local
github.comSecurity0Updated 16w ago

About mcp-scan

mcp-scan is a passive security scanner for MCP servers, intended for developers and teams reviewing server risk. It applies static checks to advertised capabilities, grades findings A–F, and can output console, JSON, or SARIF reports.

Key features

  1. 0112 OWASP MCP Top 10 checks
  2. 02Static review of tools, prompts, and resources
  3. 03Cross-tool toxic-flow analysis
  4. 04A–F grades and 0–100 scores
  5. 05Console, JSON, and SARIF reports
  6. 06CLI and MCP server modes

Use cases

  1. 01Review a server before adding it to a client
  2. 02Scan an HTTP or stdio MCP endpoint
  3. 03Gate CI with SARIF findings

MCP support

Scans MCP servers by enumerating advertised tools, prompts, and resources without invoking tools. In server mode, it exposes `scan_mcp_server` and `list_checks` to MCP clients.

Configuration

Local server config is the same for every client. Copy it into your client’s MCP config file.

mcp.json · Universal config
{
"mcpServers": {
"codingselim-mcp-scan": {
"command": "npx",
"args": [
"-y",
"owasp-mcp-scan"
]
}
}
}
Run commandnpx -y owasp-mcp-scan

Local servers need a runtime on your machine (e.g. Node.js 18+). Config file locations differ by client; see your client’s docs.

Packages
npmowasp-mcp-scan0.2.1

Tools

2

Saved tool list · updated 2w ago

ParameterTypeRequiredDescription
envobjectNoEnvironment variables for the stdio child process.
urlstringNoURL of a remote Streamable-HTTP or SSE MCP server. Provide this or 'command'.
argsarrayNoArguments for the stdio command, e.g. ['-y', '@modelcontextprotocol/server-filesystem', '/tmp'].
formatenumNoReport format. 'summary' (default) is a readable digest; 'json' and 'sarif' are machine formats.summary | json | sarif
commandstringNoExecutable for a stdio MCP server, e.g. 'npx'. Provide this or 'url'.
headersobjectNoHTTP headers for a url target, e.g. { "Authorization": "Bearer ..." }.

Details

From the project README

🛡️ mcp-scan

Passive security scanner for Model Context Protocol servers. Point it at any running MCP server; it audits the live server against the OWASP MCP Top 10 and grades it A–F. Read-only, so it is safe to run against production.

npm License: MIT Node CI Tests OWASP MCP Top 10

npx owasp-mcp-scan --stdio "npx -y @modelcontextprotocol/server-filesystem /tmp"
mcp-scan console report: firecrawl-mcp graded F with critical findings

I ran it against the 12 most-installed MCP servers. 9 of them failed. No install, no config, no exploiting anything.


Why

MCP tool descriptions are fed straight into your model's context, and most public servers were never security-reviewed. A bad one can hide instructions in a description, expose a raw-shell tool, or leak a key; and your agent acts on it. Endor Labs found 82% of servers prone to path traversal, 34% to command injection.

mcp-scan is the gut-check before you wire a server in. It's passive: it reads advertised capabilities and analyzes them statically, never invoking tools, so it's safe against production servers.

How it works

  1. Connects to the server over stdio or Streamable HTTP and enumerates every advertised tool, prompt, and resource.
  2. Runs 12 static checks across that surface: secrets, injection, SSRF, path traversal, tool poisoning, excessive scope, and more.
  3. toxic-flow reasons across the whole toolset for the lethal trifecta (reads private data + ingests untrusted content + can exfiltrate), the shape single-tool scanners miss.
  4. Scores 0-100 and grades A-F (any critical forces F). Emits console, JSON, or SARIF.

It never calls a tool, never fuzzes, and never sends an exploit. The worst it does is read what the server already tells everyone.

Real findings on real servers

12 popular npm servers, actual output (snapshot 2026-07-11, full benchmark):

ServerToolsGrade🔴🟠🟡Notable
firecrawl-mcp26F2111lethal trifecta (MCP10) + code exec (MCP05)
@modelcontextprotocol/server-filesystem14F0111unconstrained path params (MCP01)
@modelcontextprotocol/server-puppeteer7F120script param executes JS (MCP05)
tavily-mcp5F031untrusted-input + exfiltration (MCP10)
@modelcontextprotocol/server-memory9F030delete_* tools, no confirmation (MCP02)
@modelcontextprotocol/server-github26D002state-changing tools (MCP02)
@modelcontextprotocol/server-slack8C010reads + posts = data + exfil (MCP10)
@modelcontextprotocol/server-everything13A000clean ✓
@kazuph/mcp-fetch1A000clean ✓

9 of 12 flagged, 3 clean, every row audited finding-by-finding, false positives stripped rather than padded. Reproduce any row yourself:

npx owasp-mcp-scan --stdio "npx -y firecrawl-mcp"     # F: lethal trifecta + code exec
npx owasp-mcp-scan --stdio "npx -y @modelcontextprotocol/server-everything"   # A: clean

Use it

CLI

npx owasp-mcp-scan --stdio "<command>"                                  # local stdio server
npx owasp-mcp-scan --url https://host/mcp --header "Authorization: Bearer $TOKEN"
npx owasp-mcp-scan --config ~/.cursor/mcp.json --format sarif --output mcp.sarif

As an MCP server, let your agent scan servers on demand ("scan this MCP server before I add it"). Add to any client; this mcpServers shape works in Claude Code, Claude Desktop, Cursor, Windsurf, VS Code, and Gemini CLI:

{ "mcpServers": { "mcp-scan": { "command": "npx", "args": ["-y", "owasp-mcp-scan", "--serve"] } } }

OpenAI Codex (~/.codex/config.toml):

[mcp_servers.mcp-scan]
command = "npx"
args = ["-y", "owasp-mcp-scan", "--serve"]

Exposes two tools: scan_mcp_server (audit a stdio/HTTP target) and list_checks.

Claude Code plugin

/plugin marketplace add CodingSelim/mcp-scan
/plugin install mcp-scan@mcp-scan

Also on the official MCP registry as io.github.CodingSelim/mcp-scan. Publishing steps: PUBLISHING.md.

What it checks

Full OWASP MCP Top 10 (2025) coverage, 12 checks:

CheckOWASPCatches
secret-exposureMCP01AWS / OpenAI / Anthropic / GitHub / GitLab / Stripe / SendGrid / npm / HF / DB URIs / JWT / private keys in advertised text
transportMCP01Plaintext http:// to a non-loopback host
path-traversalMCP01file:///{path} templates and unconstrained path params
excessive-scopeMCP02Destructive tools (delete, drop, transfer) with no confirmation
tool-poisoningMCP03Instruction overrides, hidden exfiltration directives, zero-width / Unicode-tag smuggling
tool-shadowingMCP03 / MCP09Duplicate tool-name collisions and "call me first" precedence injection
supply-chainMCP04 / MCP09Unpinned/placeholder versions and homoglyph server names
command-injectionMCP05Unconstrained command / shell / code params, raw SQL, advertised execution
ssrfMCP05Arbitrary url / host params with no allowlist
tool-poisoning (dynamic)MCP06Injection in resource contents and server instructions
authnMCP07HTTP servers that complete an unauthenticated handshake
telemetryMCP08High-impact tools with no audit trail (advisory, unscored)
toxic-flowMCP10Lethal trifecta: one server that reads private data, ingests untrusted content, and can exfiltrate

toxic-flow is the standout, it reasons across the whole toolset, catching the GitHub-MCP / email-agent injection shape that per-tool checks miss.

Output & CI

console (default) · json · sarif (GitHub Code Scanning). Exit code is non-zero at/above --fail-on (default high), so it gates CI:

- run: npx owasp-mcp-scan --url ${{ secrets.MCP_URL }} --format sarif --output mcp.sarif
- uses: github/codeql-action/upload-sarif@v3
  with: { sarif_file: mcp.sarif }

Limitations (read these)

  • Static analysis can't see runtime sandboxing, a server that safely confines paths still flags them. Verify against actual enforcement.
  • Auth and transport checks apply to HTTP targets only.
  • Heuristics favor recall, so triage findings in context. When a rule is tightened to kill a false positive, a test pins the intended behavior.
  • Scanning a stdio target spawns that command, so run it only on servers you trust.

Develop

npm install && npm run build && npm test   # 48 tests, incl. live end-to-end fixture scans

Checks are pure and isolated (src/checks/), reusing detectors in src/detectors/. See CONTRIBUTING.md.

References

OWASP MCP Top 10 · MCP Security Cheat Sheet · Vulnerable MCP Project · MCPTox

MIT © CodingSelim

Comments

Markdown supported

New to MCP?

From what the protocol is to installing your first server, these answers cover most first questions.

An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.