MCPVault
Documentation menu

Trust

Security scan

Stars measure popularity. Grades measure repository signals. Verification proves the server answers a real MCP handshake. The security scan answers the fourth question: what does this code do once it runs on your machine. Every claimed and verified server is scanned weekly and gets a public score card on its listing.

The scanner is NVIDIA SkillSpector, an open source (Apache 2.0) security scanner for agent skills and MCP servers, run in static mode. Nothing is executed: the scan reads a fresh snapshot of the repository, walks the code and asks OSV.dev about the dependencies. It is separate from verification, which does run the server, inside a kernel sandbox.

What it checks

01

Known-vulnerable dependencies

Lockfiles and manifests are checked against OSV.dev, so every CVE and GHSA advisory that applies to a pinned version shows up with its identifier. This is the most common finding and the easiest to fix.

02

Data exfiltration

Bulk reads of the whole environment, conversation context sent to third parties, and taint flows where an environment variable or a file's contents reach a network or shell sink.

03

Credentials and privilege

Reads of SSH keys or cloud credential files, Docker socket access, privileged containers and sudo inside shipped code. Reading a local .env is treated as configuration, not theft.

04

Hidden instructions

Prompt injection, anti-refusal text and snooping on other agents' config folders, checked in the files an agent actually reads: AGENTS.md, CLAUDE.md, SKILL.md and the .claude, .cursor and .codex folders.

05

Dangerous execution and obfuscation

eval, dynamic imports, subprocess calls, encoded payloads, mixed-script text and malware signatures matched with YARA rules.

How the score works

SkillSpector was built for small skill folders. Pointed at a whole MCP server repository, its own score saturates: an HTML comment in a README counts as a hidden instruction, every outbound API call counts as exfiltration, and a dozen medium findings add up to 100. Microsoft's Playwright MCP scores 100 CRITICAL that way. So MCPVault keeps every SkillSpector finding but applies its own MCP-server policy.

  1. Findings are classified by the file they sit in. Shipped code and agent-facing instruction files are scored. README, other docs, configuration, CI and test files become notes.
  2. Each rule gets a weight that reflects what it means for someone installing an MCP server. A subprocess call is often the whole point of the tool; harvesting the entire environment is not.
  3. Per-rule diminishing returns: the first occurrence counts in full, the second half, the third a quarter, and later ones not at all. A pattern repeated a hundred times cannot drown one serious finding.
  4. Known-vulnerable dependencies score per package (12 critical, 8 high, 4 medium, 2 low) and are capped at 30 points, so an old lockfile reads as "update these" rather than "do not install".

Points add up to a 0 to 100 score, lower is better: 0 to 20 low risk, 21 to 50 caution, 51 to 80 high risk, 81 and up critical. The raw SkillSpector score is stored alongside for transparency. Some example weights:

Environment harvesting (E2)20
Conversation context sent out (E4)15
SSH or cloud credential file read (PE3)15
Taint flow env to shell or network (TT2)10
Concealed executable artifact (SC9)8
subprocess or dynamic import (AST3, AST4)6
Reads a local .env (PE3, soft)3
Outbound API request (E1)0, listed under Talks to
README HTML comment (P2 in docs)0, note

What is not scored

Before the scan runs, the snapshot is pruned to what a user actually installs: tests, CI workflows, docs folders, examples, build output and vendored dependencies are removed. Pattern matches that remain in documentation or configuration are recorded as notes with a one-line reason and left out of the score.

Outbound requests are not scored either, because an MCP server that wraps an API has to call that API. Instead the card lists the hosts the code talks to, so you can see where data goes before you grant the server anything.

Reading the card

The score box shows the number and a label. Below it: how many scored findings, vulnerable dependencies, external hosts and notes. Vulnerable dependencies list the package, the version and the advisory identifiers. Findings show the rule, the pattern, the file and line, and what it means. The public card shows the top findings; the owner dashboard shows all of them with fixes.

A low score means the scanner found nothing that looks like credential theft, exfiltration or hidden instructions in the shipped code. It does not mean the server is safe to give root. Read the Talks to line and the tool list, and keep the client-side permission prompts on.

For server owners

Your dashboard shows every scored finding with the snippet that matched and a remediation, plus the notes that were excluded. Fix what is real, and the next weekly run picks up the new commit automatically. Updating a vulnerable dependency is usually the fastest way to move a score.

A false positive you cannot change, such as a safety notice that trips the harmful-content rule, is worth a note in your README so users understand it. If the card says unavailable, the repository URL on the listing is private, renamed or too large to snapshot. Fix the URL from your listing editor and the next run retries.

Limits

This is static, pattern-based analysis. It finds things that look like known problems; it does not prove the absence of unknown ones and it is not a penetration test. A string that looks like a credential path can be a comment; a subprocess call can be the feature. That is why every finding shows its file and line, so you can check it yourself.

The scan complements verification. Verification proves the server runs and answers. The scan tells you what the code reaches for while it does. Neither replaces reading the source before you give a server access to your files, keys or shell.

Browse scanned servers