Demo data · fictional, for layout only

Example Vuln MCP

Demo · fictional

MCP server that looks up CVEs and ranks findings by exploitability for vulnerability prioritisation.

Beta: The author calls the server a beta. README.md L4

“Useful ranking; the usage statistics to an undeclared host should be opt-in.” Would we use it again: with limits.

For Vulnerability prioritizationWorks with Any MCP client, Claude CodeMaintained example, last push 2026-09-30

MCP serverAn MCP server is a program that gives your AI client extra tools; the client's model decides when to call them. by example · read from the code at 7c1e9a0 (1.3.0) on 2026-10-07The date we last read the tool’s files. The code after “at” names the exact version (the git commit) we read; a newer version may differ. · Ran once on 2026-10-03 and did more than it said.Whether we have run the tool in our lab. “Did more than it said” means the run used rights its description does not name; “did no more than it said” means it stayed within them.

Code showsWhat a reading of the code found the tool can do, at the checked version, in the words of the rights table in the record. It is a ceiling, not what the tool did. A right marked unknown has no evidence either way, and that never counts as harmless.

What the code shows, worst first. No run advice yet: the one word needs a read under the full rule.

  1. No evidence. Approval. Unknown: approval depends on the MCP client, not on the server code. That never counts as zero.

Before first useSettings for your AI client that limit the tool to the rights its task needs; derived from the code unless marked tested. tested in our run

  1. Claude Code: sandbox.network.strictAllowlist: [api.example.com].
  2. docker: allowHosts: [api.example.com].
MCP server · code showsreach ≥1 · scoped
01011?FilesNetworkExecutionSecretsPersistenceApproval

What the code can reach, 0 to 3 per right; a dashed point means no evidence, never zero. The three readings

Is it for you?

Made for
  • Looks up CVE details for your findings.
  • Ranks a list of findings by exploitability.
Use it when
Not for

Nothing excluded by the author in the files read

You need
  • An API token for the vulnerability data service, as a file or environment variable
  • Python 3.11 or later
Details: You need

Install

linked, not distributed: the Field Guide does not bundle agents or MCP servers

Upstream

npx -y @example/vuln-mcp@1.3.0
Quoted from README.md#L31 at the pinned commit; a quotation, not a command to copy.

demo, not installable

Run it with least privilege

claude code
sandbox.network.strictAllowlist: [api.example.com]
docker
allowHosts: [api.example.com]

tested in the lab run

End of the card. Below: what we checked, and what we found.MarkdownJSON

The record · every value with its evidence

What we checked, and what we found.

Profile read at commit 7c1e9a0 on 2026-10-25: 17 facts, each with its quoted line confirmed by script; see the lab runs below.Each fact was read from the tool's files at the checked version and links to the line it comes from. Where nothing was found, the page says so instead of assuming “none”.

Run and written by Ilja Schlak, 2026-10-07. Each section opens with the answer; the file and line of every fact follow it.

What it can change the capability groups as upstream groups them, worst first

No changing, deleting or command-running capability among the groups read.

The author lists two tools. README.md L12

What it can do, by group
GroupWhat it coversEffectOn by default
lookup_cveFetches the details of one CVE from the vulnerability data service. server.py L40readsyes
rank_findingsSorts a list of findings by exploitability score. server.py L58readsyes

Where it sends data and who can connect to it

2 outside connections found in the files read: Vulnerability data service, stats.example.org.

  • Vulnerability data service vendor API, always. CVE identifiers and your API token. client.py L22
  • stats.example.org telemetry, by default. Usage statistics; the README does not name this host. telemetry.py L8

Listens for no connections in the files read.

Other connections not ruled out: read in the documentation and the cited code, not searched in full.

How it runs generated from the files read, never drawn by hand

A Python MCP server that your MCP client starts over stdio; it calls the vulnerability data service with your token. README.md L30

Your AI client

Parts that live inside the AI client: skill instructions, client configuration.

  • MCP client configuration Starts the server and passes the token. README.md L34

Your machine

Programs and files on the machine where you run the tool.

  • vuln-mcp server Python process with the two tools. server.py L12

The six rights, read three waysThe six rights a tool can take (files, network, execution, secrets, persistence, approval), each read three ways and rated 0 to 3. 0 never means safe; “?” means no evidence. what the author says, what the code shows, what one lab run showed

Level 1 (scoped), one right unknown, read from the code. The author says nothing about rights; that is common and is itself a finding.

Privilege Reach: six rights, each read three ways. Levels 0 to 3; ? means no evidence.
RightAuthor sayswhat the author saysCode showswhat static analysis findsRun showedwhat one lab run showed
Fileswhere does it read and write?
Networkwhom does it talk to?
Executionwhat does it run?
Secretswhich credentials does it touch?
Persistencewhat survives the run?
Approvaldoes it ask before acting?

0 contained · 1 scoped · 2 open · 3 privileged · ? no evidence · 0 never means safe · zero means: none declared (Declared), none found (Code), none observed (Lab)

Code shows: the evidence

  • Files · 0none found: patterns fs-v0.1 in 14 files at 7c1e9a0
  • Network · 1client.ts L14 fixed base URL https://api.example.com/v2 (the tool's target API) (demo, no upstream file)
  • Execution · 0none found: patterns exec-v0.1 in 14 files at 7c1e9a0
  • Secrets · 1config.ts L8 reads only VULN_API_TOKEN for the declared service (demo, no upstream file)
  • Persistence · 1cache.ts L5 cache under ~/.cache/vuln-mcp (demo, no upstream file)
  • Approval · ?no evidence: approval depends on the MCP client, not on the server code

Valid for commit 7c1e9a0 (1.3.0) · checked 2026-10-07 · method reach-v0.1The published rules we follow: how tools are selected, how their rights are read and rated, how a lab run is done.

Limits and risks what the files say that fits nowhere else, and what this reading does not cover

  • The server declares no rights: no MCP tool annotations, no network statement in the README. server.json L1
  • Not covered: what it does at runtime beyond the one lab run. Other connections not ruled out: read in the documentation and the cited code, not searched in full.

What you need and what the documented installer does

What you need
KindWhat
AI clientAny MCP client, Claude Code; sign-in: API key
CredentialsAn API token for the vulnerability data service, as a file or environment variable. README.md L16
RuntimePython 3.11 or later. pyproject.toml L6

Lab runs (1) one run is an observation, not a benchmark

Lab run 2026-10-03

One run is an observation, not a benchmark.

The lab values hold for exactly this configuration: commit 7c1e9a0 (1.3.0), the runtime and the model below.

Setup

Target
Lab CVE list (10 items) demo-1
Model
claude-sonnet-demo-20260901 (dated 2026-09-01, litellm-gateway, eu)
Client
Claude Code 2.1.3xx (demo), mode dontAsk
Access
white-box
Task
Rank the CVEs in findings.csv by exploitability and explain the top three.
Timebox
30 min
Duration
21:50
Tokens
204,000 in · 14,800 out
Cost
$1.12 (measured)

Result

Reported
2 findings
Validated
sample of 2: 2 true, 0 false positives
Score
7 of 10 ranked as in the lab ground truth (fictional)
Scope violations
none

What it did, per right

  • Files · 0 reads only files you give itnone found: no writes outside result paths in fs-diff.json and no reads outside the working directory in host-events.jsonl
  • Network · 2 talks to any host
    beyond declared
    egress.jsonl#L3 api.example.com contacted (the tool's target API, in the run allowlist){"ts":"2026-10-03T19:08:09Z","phase":"run","host":"api.example.com","port":443,"sni":"api.example.com","method":"GET","path":"/v2/cve","bytes_out":610,"bytes_in":12800,"decision":"allow","canary_hit":false}
    egress.jsonl#L4 api.example.net contacted (not declared, blocked){"ts":"2026-10-03T19:08:11Z","phase":"run","host":"api.example.net","port":443,"sni":"api.example.net","method":"POST","path":"/","bytes_out":0,"bytes_in":0,"decision":"block","canary_hit":false}
  • Execution · 0 runs no programsnone found: no execve besides the server process in host-events.jsonl
  • Secrets · 1 uses one scoped tokenhost-events.jsonl#L2 read of the passed API token only (secrets 1){"ts":"2026-10-03T19:08:01Z","source":"falco","key":"token-read","syscall":"openat","path":"/run/secrets/vuln_api_token","exe":"/usr/bin/node","pid":3311,"uid":1001,"rule":"read of the passed API token only"}
  • Persistence · 1 leaves cache or temp filesfs-diff.json#L3 ~/.cache/vuln-mcp/ survives the run (cache, persistence 1) "/home/agent/.cache/vuln-mcp/cve-index.json"
  • Approval · ?no evidence: hitl-events.jsonl is empty; the MCP client emitted no tool_decision events for this server

Lab verdict

Beyond declared on 1 of 6 rights: network (undeclared host api.example.net, blocked). Nothing is declared, so each right is measured against its task scope.

Beyond static analysis: network. The lab saw more than the code analysis suggested.

Fit
partial (our judgement whether the reach fits the task)
Use again
with limits
In one sentence
Useful ranking; the usage statistics to an undeclared host should be opt-in.
Limits
Run it with an egress allowlist; approval events are not observable with this client.

Tested minimal configuration

claude code
sandbox.network.strictAllowlist: [api.example.com]
docker
allowHosts: [api.example.com]

Incidents

1 real-time alert · blocked.jsonl#L1 api.example.net:443 DROP · run not aborted

Recording

The player loads only on request and needs JavaScript. Without it: session.cast (asciicast v3) and the plain textsession.txt.

Plain-text transcript
# Demo recording, synthetic data, no real tool output
agent@lab:~/work$ claude -p 'Rank the CVEs in findings.csv by exploitability'
● MCP server vuln-mcp connected (tools: lookup_cve, rank_findings)
● lookup_cve CVE-2026-0001 via api.example.com
● vuln-mcp: sending usage statistics to api.example.net
  ! connection refused by lab egress policy
● rank_findings: 10 items
● 1. CVE-2026-0001 (exploited in the wild, internet-facing)
agent@lab:~/work$
Artifacts with SHA-256 (11 files)
  • blocked.jsonl67094439ed03e8545299ebdc82d00e429ea71fc03ec0772287b4b4b15b0dbd9b
  • cost.json87f91d978e532fea5fc95702994962fa8f42926e3d9159d619a9f8f12dff3f61
  • declared.json1f37ee572f0e246f86ed73a2f4106572987e27ec0229ea8865fcac2d75d41c52
  • egress.jsonl1888abbc4416d140605103e2bb8b6bb2441cf090be47876b699773b534eb8522
  • findings.jsonlfc6d0c99a62faec4e860d1919bd91d93ca31e39d5829938c670c8e04a1a7bfce
  • fs-diff.json8f95108c35fd9d4ad63b602a47f0a3caf4f0039c74ac6a871e28a6fc87cfcbea
  • hitl-events.jsonle3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
  • host-events.jsonl36eed8ddccd33ca212c5b100d4f3199cce0f0e6c322b97eb10f0e678d8804ca7
  • score.json91caef559736864097266d236b17d2a6870246e541fb714ca11968e9ed2d1673
  • session.castcbafe7bb4482586fcf380b25fb93af3ae121c3daf812e639b8decf2e7d52904c
  • session.txtc11fcf0eb89f88c6a2bfeaa35efce134982684f1038ea947356460beaab7e42f
  • manifest.jsonlists the hashes above

Secret scan: 8.30.1 clean (2026-10-03); canary values replaced by [CANARY-<axis>-n] before scanning. Not published: agent-trace.jsonl.

Interests. Private project, privately funded. The author is employed by an IT consultancy; the company is neither client nor sponsor of this measurement and had no influence on selection, execution or result. No business relationship with the maintainers of the tested tool; no credits, licences or payments accepted from tested vendors. Deviations are stated in this field.

Right of reply: dispute process. Replications: none yet.

Our notes where we have used it; marked as ours, they change no value

Demo entry. Fictional maintainer remark: in the demo, I would turn the telemetry off before first use.

About this entry

Source
github.com/example/vuln-mcp · MIT · manifest server.json
Version readThe install command installs exactly the version we checked (the pinned git commit), so what you get is what the card describes.
7c1e9a0 · 1.3.0 · last upstream push 2026-09-30 · no release since the pinned commit (current 1.3.0)
In the catalog
tried · added 2026-09-30 · last checked 2026-10-07 · next check 2027-04-05 · fresh
ScannersA scan of the tool's files with a scanner for malicious patterns. “Pending” means it has not run yet.
mcp-scanner 4.2.0, 2026-10-02: warn
Changes
none since the entry was added on 2026-09-30
MethodThe published rules we follow: how tools are selected, how their rights are read and rated, how a lab run is done.
v0.1 · reach-v0.1 · badge · the rules

Disagree?

Dispute a value with evidence (file, line, commit): write to hello@readbeforerun.ai. A dispute is checked against the pinned commit; a changed value is logged under Changes.

How this entry was checked, and how to cite it

Selected by the published criteria (method v0.1). What the author says comes only from author statements; what the code shows comes from the code and manifests at commit 7c1e9a0, each with one evidence line. A “?” means no evidence, never zero; zero never means safe. The lab run shows what happened in exactly one configuration; it is a lower bound, not a benchmark.

The descriptive profile (what it does, can do, how it runs, what it needs) was read through the same isolated pipeline at commit 7c1e9a0 on 2026-10-25: one reader proposed every fact with a quoted line, a script confirmed each quoted line (17 of 17), and a second reader checked each sentence against its lines. Where nothing was found, the page says so instead of assuming “none”.

Known issues and limits: remote server-side behaviour stays “?”; the lab is not your production; static analysis can miss runtime behaviour.

Placement, badges or fast tracks are not for sale. The author is employed by an IT consultancy; the company has no influence on selection, execution or result.

Cite this:

Ilja Schlak. "Example Vuln MCP". Agentic Security Field Guide, checked 2026-10-07, method reach-v0.1. https://readbeforerun.ai/catalog/example-vuln-mcp/

The method · the rules

For maintainers

Badge for your README (reach ≥1 · beyond declared (1)):

[![reach ≥1 · beyond declared (1)](https://readbeforerun.ai/badge/example-vuln-mcp.svg)](https://readbeforerun.ai/catalog/example-vuln-mcp/)

Dispute a value with evidence (file, line, commit): write to hello@readbeforerun.ai. A dispute is checked against the pinned commit; a changed value is logged under Changes.

Claim the entry with a fieldguide.yaml in your repository: planned.

Other tools for the same task

Task: Vulnerability prioritization. The task pages compare every tool side by side.
  1. 111230
    Tenable MSSP Portal MCP ServerMCP server · by andrewspearson · reach 3, privilegedDraft · awaiting review

    MCP server that runs Tenable queries and hosted Hexa AI MCP tools across the child containers of a Tenable MSSP Portal.

    Can add autostart, users or keys · read broad tokens or the environment · not run yet · checked 2026-10-21

    Code shows
  2. 212?10
    Threat Intel ToolkitPlugin · by kevinmhorvath · reach ≥2, openDraft · awaiting review

    Claude Code plugin with a subagent and two skills that triage IOCs and CVEs against free threat-intel feeds, without API keys.

    Can write outside the project · run shell commands or eval · Secrets: no evidence · not run yet · checked 2026-10-21

    Code shows