On this page
Scanning

Rules and Coverage

Every rule Aevrin runs, what it detects, and how a server is graded.

Aevrin scans MCP servers and the agents that install them. It is not a general-purpose source-code scanner: there are no findings about Dockerfile style, CI configuration, branch protection, repository badges, or fuzzing status. If your MCP server's repository also has an unrelated bug in its web handler, Aevrin will not tell you about it.

Every finding comes from one engine, run against a live server. Aevrin starts the server, completes the MCP handshake, reads what it offers, and analyses that. A repository is only ever a way of finding out which server to start - it is not itself the thing being assessed.

A finding is usually about one tool, but it does not have to be. It can also be about a prompt, the server as a whole, the way it is configured and launched, its code, or one of its dependencies. Those findings name no tool.

Rule groups

The engine has 75 rules. Each rule id reads MCP-<GROUP>-NNN, and the group says what kind of problem it is.

GroupRulesWhat it covers
MCP-AUTH3A remote server's transport, login and credentials in its URL
MCP-CFG5How the server is configured, installed and launched
MCP-DEP4The packages it depends on: malicious, typosquatted, install scripts, loose versions
MCP-DYN7What the server does while it runs. Not run today: see Deliberate limits
MCP-EXEC4Running commands or code, and unsafe deserialization
MCP-FS4Reading, changing and deleting files, and file paths
MCP-INJ5Hidden or instruction-shaped text aimed at the agent
MCP-NET3Network requests and where they go
MCP-PERM3Broad or dangerous combinations of capabilities
MCP-POISON7Tool metadata that tries to steer, hide from, or take data from the agent
MCP-PRIV2Asking for, or running with, elevated rights
MCP-PROTO5How the server speaks the MCP protocol
MCP-QUALITY5Missing, loose or misleading tool definitions
MCP-SCOPE2A tool doing more than it says it does
MCP-SECRET6Secrets exposed, hardcoded, requested or read from the environment
MCP-SHADOW4One tool or server standing in for another
MCP-SQL2Raw SQL and SQL built from tool input
MCP-SRC4Hidden or hostile code in the server itself

A rule has no fixed severity. The engine sets the severity of each finding when it reports it, so the same rule can produce findings of different severities. The OWASP column below is the OWASP MCP Top 10 category Aevrin files each rule under.

Every rule

Authentication

RuleTitleOWASP
MCP-AUTH-001Remote server uses plain HTTPMCP06
MCP-AUTH-002Remote server with powerful tools needs no loginMCP06
MCP-AUTH-003Credentials in the server URLMCP01

Configuration

RuleTitleOWASP
MCP-CFG-001Server package version is not pinnedMCP07
MCP-CFG-002Server is launched through a shellMCP05
MCP-CFG-003Server is installed from a URL or git repositoryMCP07
MCP-CFG-004Docker image is not pinnedMCP07
MCP-CFG-005Config sets environment variables that change how programs runMCP05

Dependencies

RuleTitleOWASP
MCP-DEP-001Known malicious packageMCP07
MCP-DEP-002Package name looks like a typo of a popular packageMCP07
MCP-DEP-003Package runs a script when installedMCP07
MCP-DEP-004Dependency from a URL or with any versionMCP07

Runtime behaviour (not run today)

RuleTitleOWASP
MCP-DYN-001Server leaked a planted secretMCP01
MCP-DYN-002Tools changed during the sessionMCP04
MCP-DYN-003Tools changed since the last scanMCP04
MCP-DYN-004Server started a shell or network programMCP05
MCP-DYN-005Server made outside network connectionsMCP09
MCP-DYN-006Server wrote to sensitive filesMCP05
MCP-DYN-007Server hit a sandbox limitMCP09

Execution

RuleTitleOWASP
MCP-EXEC-001Tool can run any command or codeMCP05
MCP-EXEC-002Tool input reaches a system commandMCP05
MCP-EXEC-003Tool input reaches eval or execMCP05
MCP-EXEC-004Unsafe deserializationMCP05

Files

RuleTitleOWASP
MCP-FS-001Tool can change or delete filesMCP09
MCP-FS-002Tool can read files at any pathMCP05
MCP-FS-003Tool input is used as a file path without a folder checkMCP05
MCP-FS-004Code touches secret filesMCP01

Injection

RuleTitleOWASP
MCP-INJ-001Text tries to override the agent's instructionsMCP02
MCP-INJ-002Invisible characters hide textMCP02
MCP-INJ-003Encoded text hidden in metadataMCP02
MCP-INJ-004Runtime content contains instructions for the agent (not run today)MCP08
MCP-INJ-005Terminal control characters in metadataMCP02

Network

RuleTitleOWASP
MCP-NET-001Tool can request any URLMCP05
MCP-NET-002Code sends data to a data collection serviceMCP09
MCP-NET-003Tool input decides where a network request goesMCP05

Permissions

RuleTitleOWASP
MCP-PERM-001Server can both read private data and send data outMCP09
MCP-PERM-002Server offers many kinds of high risk actionsMCP09
MCP-PERM-003Tool sends messages to any recipientMCP09

Tool poisoning

RuleTitleOWASP
MCP-POISON-001Hidden order tags in metadataMCP02
MCP-POISON-002Metadata tells the agent to hide things from the userMCP02
MCP-POISON-003Metadata asks for sensitive filesMCP02
MCP-POISON-004Metadata asks for conversation data or secretsMCP02
MCP-POISON-005Parameter collects the agent's private contextMCP02
MCP-POISON-006Metadata pushes the agent to call this toolMCP02
MCP-POISON-007Metadata describes sending data to an outside placeMCP02

Privilege

RuleTitleOWASP
MCP-PRIV-001Metadata asks for admin rights or to bypass securityMCP03
MCP-PRIV-002Server is launched with elevated rightsMCP09

Protocol

RuleTitleOWASP
MCP-PROTO-001Server asked the client for extra powersMCP03
MCP-PROTO-002Server writes non-protocol text to its outputMCP09
MCP-PROTO-003SSE server points the client to another hostMCP03
MCP-PROTO-004Server sent too much dataMCP09
MCP-PROTO-005Server uses an old protocol versionMCP09

Quality

RuleTitleOWASP
MCP-QUALITY-001Tool has no descriptionMCP02
MCP-QUALITY-002Tool input schema is looseMCP09
MCP-QUALITY-003Tool description is very longMCP02
MCP-QUALITY-004Server lists the same tool name twiceMCP03
MCP-QUALITY-005Risky tool has no safety annotationsMCP09

Scope

RuleTitleOWASP
MCP-SCOPE-001Tool code does something its description does not mentionMCP09
MCP-SCOPE-002Tool annotations do not match what the tool doesMCP09

Secrets

RuleTitleOWASP
MCP-SECRET-001Secret exposed to the agentMCP01
MCP-SECRET-002Plain text secret in the MCP client configMCP01
MCP-SECRET-003Hardcoded secret in source codeMCP01
MCP-SECRET-004Tool asks the agent for a secretMCP01
MCP-SECRET-005Code reads the whole environmentMCP01
MCP-SECRET-006Tool hands environment variables to the agentMCP01

Shadowing

RuleTitleOWASP
MCP-SHADOW-001Metadata gives orders about another toolMCP03
MCP-SHADOW-002Metadata redirects messages to a fixed addressMCP03
MCP-SHADOW-003Tool name is also used by another serverMCP03
MCP-SHADOW-004Tool name uses lookalike charactersMCP03

SQL

RuleTitleOWASP
MCP-SQL-001Tool runs raw SQLMCP05
MCP-SQL-002SQL built from tool inputMCP05

Source code

RuleTitleOWASP
MCP-SRC-001Code runs hidden, decoded codeMCP07
MCP-SRC-002Code opens a reverse shellMCP07
MCP-SRC-003Code touches startup filesMCP07
MCP-SRC-004Tool input is used as a templateMCP05

What Aevrin no longer reports

Repository security is not MCP security, and mixing the two buried the findings that matter. Aevrin does not report on a repository as a whole: no dependency CVEs across its whole tree, and nothing about Dockerfiles, CI configuration, branch protection or repository badges. Where a rule reads code or packages, it asks an MCP question about the server being scanned, such as whether tool input reaches a system command (MCP-EXEC-002).

Supply-chain coverage comes from the MCP-DEP rules (a known malicious package, a typosquatted name, an install script, a loose dependency) and the MCP-CFG rules about how the server is installed (an unpinned package or Docker image, an install from a URL or git repository). None of the 75 rules looks up published vulnerabilities (CVEs) in dependencies.

Evidence

Every finding carries the specific facts that made its rule fire: where it was found and what matched. It also explains itself: why it matters, how it could be used against you, and how to fix it.

The engine checks its own findings. A finding it marks as a likely false positive, or suppresses, adds nothing to its score, and Aevrin drops it from the report.

Identical verdicts from one rule across several tools are shown as one finding with every affected tool listed. A server with twenty-four tools that all lack safety annotations has one problem, not twenty-four. Critical findings are never grouped: a critical is read individually, by name. A finding about several tools at once, or about no tool, is shown as it is. Grouping changes how the report reads, never the grade.

Stages

A scan has five stages, and each one is a real step:

  1. Resolving - work out the command that starts this server.
  2. Launching - start it, in an isolated container.
  3. Enumerating - complete the MCP handshake and read its tools.
  4. Analyzing - run the rules over what was read.
  5. Grading - the engine grades the whole server, and Aevrin writes the summary.

A scan that stops at any of them is incomplete and receives no grade at all, with the reason attached. A server that will not start, or that returns no tools, has not been shown to be safe: it has not been assessed. See Concepts.

The grade is for the whole server, not for each tool, because you install the whole server. The engine works out a risk score from 0 to 100, where higher is worse, and turns it into a letter: A at 0, B below 15, C below 35, D below 60, F at 60 or more. An F also needs at least one validated high or critical finding; a high score alone is not enough. See Risk score and grade.

Deliberate limits

  • Only servers that can actually be started can be graded. A server needing API keys, a browser, or a private registry is reported as unassessed rather than guessed at.
  • Dynamic checks are off today. The engine does not call a server's tools, so nothing is tested at run time: the MCP-DYN rules and MCP-INJ-004 never fire. A tool whose description and code look unremarkable but which misbehaves when called is outside what this scan can see.
  • That includes prompt injection in live tool responses (MCP08). Aevrin does not test it, and every report says so explicitly.
  • A grade describes one version at one moment. Reinstalling later can get different code.

Aevrin records these as limitations; it does not manufacture coverage for tests that did not run.