mcp-audit GitHub

What mcp-audit checks

mcp-audit can report 126 finding IDs, plus 5 families of IDs generated at scan time. They come from 8 built-in analyzers, 35 community rules that run by default and 91 Semgrep rules for MCP server source code.

Severities come from the severity framework and the rule files; OWASP codes from the mapping file.

Repository files that run code 5 checks

Files a cloned repository can use to start programs when you open or trust it in an AI editor: project MCP configs, VS Code tasks that run when the folder opens, and symlinks that point somewhere else.

Runs with mcp-audit scan --project .

IDWhat it flagsSeverityOWASP MCP
TRUST-001MCP server defined in project-level config (TrustFall risk)HIGHMCP09
TRUST-002Project-scoped config path is a symlinkHIGH, MEDIUM or INFOMCP09 MCP05
TRUST-003Repo-planted IDE auto-execution fileCRITICAL or HIGHMCP05 MCP09
TRUST-004Config path is a symlink (user-global / explicit)INFOMCP09
TRUST-005Symlinked directory was not scannedLOWMCP09

Coding-agent settings 9 checks

Claude Code settings that skip permission prompts, approve every project server, pre-approve commands that can write or reach the network, or run hook commands that reach the network or touch agent config files.

Runs with mcp-audit check mcp-audit scan --project .

IDWhat it flagsSeverityOWASP MCP
CFHYG-005Claude Code hooks section detected in configMEDIUMMCP01 MCP07
HARNESS-001Claude Code sessions start with permission prompts skippedHIGHMCP02 MCP07
HARNESS-002Every project .mcp.json server is approved without a promptHIGHMCP09 MCP07
HARNESS-003Confirmation before bypass mode is switched offMEDIUMMCP02 MCP07
HARNESS-004Every shell command is pre-approvedHIGHMCP02 MCP05
HARNESS-005Allow rules pre-approve commands that can write or reach the networkMEDIUMMCP02 MCP05
HARNESS-006Approval is off and nothing guards recursive deletesMEDIUMMCP02 MCP05
HOOK-001Hook command contains network-egress instructionHIGHMCP05 MCP07
HOOK-002Hook command references agent config file pathHIGHMCP05 MCP07

Agent instruction files 6 checks

Text the agent reads as instructions: Claude Code commands, skills and CLAUDE.md, Cursor rules, and Copilot instruction and prompt files. mcp-audit looks for injected orders, hidden characters, outside links and bundled scripts.

Runs with mcp-audit scan --project . --include-agent-files mcp-audit agent-files scan

IDWhat it flagsSeverityOWASP MCP
MEM-001Imperative override instruction in memory fileMEDIUMMCP03
MEM-002Injection pattern in memory fileMEDIUMMCP03
SKILL-001Injection/exfiltration instruction in skill fileHIGHMCP03 MCP01
SKILL-002Obfuscated or oversized block in skill/command fileMEDIUMMCP03
SKILL-003Skill file references external URLMEDIUMMCP03 MCP04
SKILL-004Skill bundles executable scriptsINFOMCP03

Claude Code plugins and mods 8 checks

Installed plugins whose recorded version does not match their marketplace pin or that follow an unpinned branch, and mods that can approve tool calls, read secrets and send data out, change what Claude reads, or start programs. Mods are read, never run.

Runs with mcp-audit check mcp-audit plugins scan

IDWhat it flagsSeverityOWASP MCP
MOD-001Mod can approve tool calls before the permission promptHIGHMCP07 MCP04
MOD-002Mod can read secrets or files and send data outHIGH or MEDIUMMCP01 MCP04
MOD-003Mod can change what Claude readsMEDIUMMCP03 MCP06
MOD-004Mod starts programs or changes their environmentMEDIUMMCP05 MCP04
MOD-005Claude Code mod installedINFOMCP04
MOD-006Plugin directories load in every Claude Code sessionMEDIUMMCP04
PLUGIN-001Installed plugin does not match its marketplace pinMEDIUMMCP04
PLUGIN-002Plugin source is not pinned to a commitLOWMCP04

MCP server configs 14 checks

How each configured server is launched and reached: secrets written into the config, plain-HTTP endpoints, sudo launches, unpinned package fetches, remote servers with no authentication, and config files other users can read or write.

Runs with mcp-audit check

IDWhat it flagsSeverityOWASP MCP
AUTH-001Remote MCP server configured without authenticationHIGH or MEDIUMMCP06
AUTH-002OAuth-configured server missing audience/resource bindingMEDIUMMCP06
CFHYG-001MCP config file is world-readableHIGHMCP01
CFHYG-002MCP config file resides in world-writable directoryHIGHMCP01 MCP09
CFHYG-003Config file stores inline plaintext secretHIGHMCP01
CFHYG-004Config uses environment variable references for credentialsINFOMCP01
CFHYG-006ANTHROPIC_BASE_URL overrides Anthropic API endpointMEDIUMMCP01 MCP08
CRED-001API key or secret in environment variable valueHIGHMCP01
CRED-002API key or secret in command argumentsHIGHMCP01
CRED-003Literal secret in authentication headerHIGH or INFOMCP01
TRANSPORT-001Unencrypted remote endpoint (HTTP)MEDIUMMCP07
TRANSPORT-002Elevated privilege execution (sudo/root)HIGHMCP02 MCP05
TRANSPORT-003Runtime package fetching without version pinMEDIUM or LOWMCP04
TRANSPORT-004Server binds to wildcard network interface (0.0.0.0)HIGHMCP07

Tool descriptions 15 checks

Orders hidden in the descriptions an agent reads: exfiltration instructions, prompt-format injection, behaviour overrides, invisible Unicode and lookalike characters. With --connect it reads live tool lists and flags a tool name claimed by two servers.

Runs with mcp-audit check mcp-audit scan --connect

IDWhat it flagsSeverityOWASP MCP
COLLIDE-001Tool name collision: tool claimed by multiple serversHIGH or MEDIUMMCP01 MCP09
POISON-001Tool description contains SSH/credentials exfiltration instructionsCRITICALMCP03 MCP01
POISON-002Tool description contains cloud credentials exfiltration instructionsCRITICALMCP03 MCP01
POISON-003Tool description contains .env file exfiltration instructionsCRITICALMCP03 MCP01
POISON-010Tool description contains XML instruction injectionHIGHMCP03 MCP06
POISON-011Tool description contains LLM prompt format injection markersHIGHMCP03 MCP06
POISON-012Tool description contains behavioral override instructionHIGHMCP03 MCP06
POISON-020Tool description contains data exfiltration via encoding or side channelHIGHMCP03 MCP10
POISON-021Tool description contains hidden parameter exfiltrationHIGHMCP03 MCP10
POISON-030Tool description contains cross-tool manipulation instructionMEDIUMMCP03 MCP06
POISON-040Tool description contains zero-width Unicode charactersMEDIUMMCP03
POISON-041Concealed instruction via concealment channelHIGHMCP03 MCP01
POISON-042Concealment channel present, no matched payloadLOWMCP03
POISON-050Excessive tool description lengthLOWMCP03
POISON-060Tool description contains Unicode homoglyph charactersMEDIUMMCP03

Dangerous combinations of servers 8 checks

Servers that are harmless alone but together let an injected prompt read data and send it out, or write a file another server can run. killchain ranks the changes that break the most paths.

Runs with mcp-audit check mcp-audit killchain

IDWhat it flagsSeverityOWASP MCP
INTEG-001Dangerous capability combination: file write + shell execution (plant-then-execute)HIGHMCP05
TOXIC-001Dangerous capability combination: file read + network exfiltrationHIGHMCP05 MCP10
TOXIC-002Dangerous capability combination: file read + email exfiltrationHIGHMCP05 MCP10
TOXIC-003Dangerous capability combination: secrets store + network accessCRITICALMCP01 MCP10
TOXIC-004Dangerous capability combination: file read + shell executionHIGHMCP10
TOXIC-005Dangerous capability combination: database + networkHIGHMCP05 MCP10
TOXIC-006Dangerous capability combination: shell execution + networkCRITICALMCP05 MCP10
TOXIC-007Capability combination: git access + networkMEDIUMMCP10

Packages and supply chain 12 checks

Lookalike package names, recorded advisories for a package, deprecated versions, and missing or mismatched Sigstore provenance. Provenance and hash checks use the network, so they are opt-in.

Runs with mcp-audit vet <package> mcp-audit scan --verify-signatures

IDWhat it flagsSeverityOWASP MCP
ATTEST-010Sigstore provenance verified (valid match)INFOnone
ATTEST-011Sigstore attestation from unexpected publisherHIGHMCP04
ATTEST-012Invalid Sigstore signature (tampered or forged)CRITICALMCP04
ATTEST-013Expected Sigstore attestation missing for known-provenance packageMEDIUMMCP04
ATTEST-014No Sigstore attestation foundMEDIUM or INFOMCP04
ATTEST-015Sigstore attestation verification errorINFOnone
SC-001Package name is one edit distance from a known-good package (typosquat)CRITICALMCP04
SC-002Package name is two edits from a known-good packageHIGHMCP04
SC-003Package name is three edits from a known-good packageMEDIUMMCP04
SC-004Known CVE advisory recorded for this packageHIGH or MEDIUMMCP04
SC-005Deprecated package resolved at lock timeMEDIUMMCP04
ATT-…Hash attestation finding (Layer 1 --verify-hashes). (ID generated at scan time)variesMCP04

Approved servers and drift 15 checks

What changed since you approved a setup: servers added, removed or launched differently, a hand-edited lock file, and, with --connect, tools added or changed since approval.

Runs with mcp-audit lock --verify mcp-audit check

IDWhat it flagsSeverityOWASP MCP
BL-001Baseline file could not be parsednot ratednone
LOCK-001Server drifted from lockHIGHMCP04
LOCK-002Server not in lockHIGHMCP04
LOCK-003Locked server missingMEDIUMMCP04
LOCK-004Resolution driftedCRITICAL or HIGHMCP04
LOCK-005Lock file tampered or hand-editedCRITICALMCP04
LOCK-006Tool added since lockHIGHMCP02 MCP04
LOCK-007Tool contract changed since lockHIGHMCP03 MCP04
LOCK-008Tool description changed since lockMEDIUMMCP03 MCP04
LOCK-009Tool removed since lockLOWMCP04
RUGPULL-000First scan — baseline recorded for serverINFOnone
RUGPULL-001Server configuration changed since last scanHIGHMCP03 MCP04
RUGPULL-002New MCP server detected since last scanINFOMCP09
RUGPULL-003Previously tracked server no longer configuredINFOnone
DRIFT-…Baseline drift finding. (ID generated at scan time)variesMCP09

Community rules 36 checks

YAML rules in an open format that run on every scan: risky launch commands, inline code, shell metacharacters, sensitive variable names, sampling, and more.

Run on every scan. mcp-audit rule list shows the rules that are loaded.

35 of 36 community rules run by default; STDIO-001 ships disabled. The rule format is Apache 2.0 and open to contributions.

IDWhat it flagsSeverityOWASP MCP
COMM-001Prohibited network binary used as MCP serverHIGHMCP05
COMM-002curl used as MCP server binaryMEDIUMMCP05
COMM-003Browser sandbox disabledMEDIUMMCP05 MCP10
COMM-004Unrecognized stdio server binaryLOWMCP05 MCP09
COMM-005/tmp referenced in server argsMEDIUMMCP05
COMM-006Inline code execution via -c flagHIGHMCP05
COMM-007eval or exec passed in server argsHIGHMCP05
COMM-008SSH agent socket exposed to MCP serverMEDIUMMCP01
COMM-009AWS session token exposed to MCP serverHIGHMCP01
COMM-010npx used without pinned versionLOWMCP04
COMM-011Broad Deno permission flags in useMEDIUMMCP02
COMM-012Server binds to all interfaces (0.0.0.0)HIGHMCP07
COMM-013npx auto-confirm flag (silent execution)HIGHMCP04 MCP05
COMM-014MCP Sampling capability declaredLOWMCP04 MCP06
COMM-015Shell metacharacters in server argsCRITICALMCP05
COMM-016Role-claim poisoning in server argsHIGHMCP01
COMM-017Authority-claim poisoning — AI identity impersonationCRITICALMCP01
COMM-018Output-format hijack in server argsMEDIUMMCP01
COMM-019Side-channel data exfiltration instruction in server argsHIGHMCP01 MCP02
COMM-020Confabulation trigger in server argsHIGHMCP01
COMM-021Env key name suggests private or secret keyHIGHMCP02
COMM-022Env key name suggests access tokenMEDIUMMCP02
COMM-023Env key name suggests passwordHIGHMCP02
COMM-024HTTP endpoint on sensitive or production portMEDIUMMCP06
COMM-025Localhost endpoint with explicit SSE/HTTP transport URLLOWMCP06 MCP05
COMM-026Unencrypted WebSocket URL in server argsMEDIUMMCP06
COMM-027Generic or unnamed server keyLOWMCP07
COMM-028Command is an absolute pathMEDIUMMCP04
COMM-029Command references a temp or volatile directoryHIGHMCP04
COMM-030Generic-named server with network transport URLLOWMCP09 MCP07
COMM-031Remote MCP server configured without authenticationLOWMCP06
COMM-033Project-level MCP config file present in repositoryLOWMCP09
COMM-034Overprivileged MCP server credential (potential god key)MEDIUMMCP06
STDIO-001Launcher binary not in allowlist (ships disabled)MEDIUMMCP04 MCP09
STDIO-002aHidden (dotfile) launcher binaryHIGHMCP04 MCP05
STDIO-002bInline script launcherHIGHMCP05

More surfaces 3 checks

IDs generated at scan time for IDE extensions, MCP server source code, hash pins, baselines and your own governance policy.

Runs with mcp-audit extensions scan mcp-audit sast <path>

IDWhat it flagsSeverityOWASP MCP
EXT-…IDE extension security finding. (ID generated at scan time)variesMCP04
SAST-…SAST finding from Semgrep rule execution. (ID generated at scan time)variesMCP01 MCP05 MCP07
GOV-…Governance policy finding. (ID generated at scan time)variesnone

OWASP MCP Top 10

Findings carry their OWASP MCP Top 10 codes in terminal, JSON and SARIF output. The mapping is machine-readable (OWASP 2025-beta).

MCP01 Token Mismanagement and Secret Exposure 24 checks

CFHYG-001, CFHYG-002, CFHYG-003, CFHYG-004, CFHYG-005, CFHYG-006, COLLIDE-001, COMM-008, COMM-009, COMM-016, COMM-017, COMM-018, COMM-019, COMM-020, CRED-001, CRED-002, CRED-003, MOD-002, POISON-001, POISON-002, POISON-003, POISON-041, SKILL-001, TOXIC-003

MCP02 Privilege Escalation via Scope Creep 12 checks

COMM-011, COMM-019, COMM-021, COMM-022, COMM-023, HARNESS-001, HARNESS-003, HARNESS-004, HARNESS-005, HARNESS-006, LOCK-006, TRANSPORT-002

MCP03 Tool Poisoning 24 checks

LOCK-007, LOCK-008, MEM-001, MEM-002, MOD-003, POISON-001, POISON-002, POISON-003, POISON-010, POISON-011, POISON-012, POISON-020, POISON-021, POISON-030, POISON-040, POISON-041, POISON-042, POISON-050, POISON-060, RUGPULL-001, SKILL-001, SKILL-002, SKILL-003, SKILL-004

MCP04 Software Supply Chain Attacks 35 checks

ATTEST-011, ATTEST-012, ATTEST-013, ATTEST-014, COMM-010, COMM-013, COMM-014, COMM-028, COMM-029, LOCK-001, LOCK-002, LOCK-003, LOCK-004, LOCK-005, LOCK-006, LOCK-007, LOCK-008, LOCK-009, MOD-001, MOD-002, MOD-004, MOD-005, MOD-006, PLUGIN-001, PLUGIN-002, RUGPULL-001, SC-001, SC-002, SC-003, SC-004, SC-005, SKILL-003, STDIO-001, STDIO-002a, TRANSPORT-003

MCP05 Command Injection and Execution 26 checks

COMM-001, COMM-002, COMM-003, COMM-004, COMM-005, COMM-006, COMM-007, COMM-013, COMM-015, COMM-025, HARNESS-004, HARNESS-005, HARNESS-006, HOOK-001, HOOK-002, INTEG-001, MOD-004, STDIO-002a, STDIO-002b, TOXIC-001, TOXIC-002, TOXIC-005, TOXIC-006, TRANSPORT-002, TRUST-002, TRUST-003

MCP06 Intent Flow Subversion 13 checks

AUTH-001, AUTH-002, COMM-014, COMM-024, COMM-025, COMM-026, COMM-031, COMM-034, MOD-003, POISON-010, POISON-011, POISON-012, POISON-030

MCP07 Insufficient Authentication and Authorization 12 checks

CFHYG-005, COMM-012, COMM-027, COMM-030, HARNESS-001, HARNESS-002, HARNESS-003, HOOK-001, HOOK-002, MOD-001, TRANSPORT-001, TRANSPORT-004

MCP08 Lack of Audit and Telemetry 1 check

CFHYG-006

MCP09 Shadow MCP Servers 13 checks

CFHYG-002, COLLIDE-001, COMM-004, COMM-030, COMM-033, HARNESS-002, RUGPULL-002, STDIO-001, TRUST-001, TRUST-002, TRUST-003, TRUST-004, TRUST-005

MCP10 Context Injection and Over-sharing 10 checks

COMM-003, POISON-020, POISON-021, TOXIC-001, TOXIC-002, TOXIC-003, TOXIC-004, TOXIC-005, TOXIC-006, TOXIC-007

Supported clients 9 clients

mcp-audit finds these MCP config files on its own. Pass --path to scan any other file or folder.

ClientConfig file
Claude Desktop~/Library/Application Support/Claude/claude_desktop_config.json
Cursor~/.cursor/mcp.json
VS Code.vscode/mcp.json (workspace)
Windsurf~/.codeium/windsurf/mcp_config.json
Claude Code (user)~/.claude.json
Claude Code (project).mcp.json (project root)
GitHub Copilot CLI~/.copilot/mcp-config.json
Augment Code~/.augment/settings.json
Amazon Q Developer (project).amazonq/mcp.json (project root; scan --project only)

Files read in a repository 17 paths

mcp-audit scan --project <dir> walks the tree for these paths; instruction files need --include-agent-files. Symlinked directories are reported, never followed.

PathWhat it isClient
.mcp.jsonMCP config or agent settings (servers start from it)claude-code
.claude/settings.jsonMCP config or agent settings (servers start from it)claude-code
.claude/settings.local.jsonMCP config or agent settings (servers start from it)claude-code
.cursor/mcp.jsonMCP config or agent settings (servers start from it)cursor
.cursor/settings.jsonMCP config or agent settings (servers start from it)cursor
.vscode/mcp.jsonMCP config or agent settings (servers start from it)vscode
.amazonq/mcp.jsonMCP config or agent settings (servers start from it)amazon-q
.vscode/tasks.jsonEditor file that can run a command when the folder opensvscode-tasks
.vscode/settings.jsonEditor file that can run a command when the folder opensvscode-settings
.claude/commands/*.mdRead by the agent as instructionsclaude-code
.claude/skills/**/SKILL.mdRead by the agent as instructionsclaude-code
.claude/CLAUDE.mdRead by the agent as instructionsclaude-code
CLAUDE.mdRead by the agent as instructionsclaude-code
.cursor/rules/*.mdcRead by the agent as instructionscursor
.github/copilot-instructions.mdRead by the agent as instructionscopilot
.github/instructions/*.instructions.mdRead by the agent as instructionscopilot
.github/prompts/*.prompt.mdRead by the agent as instructionscopilot