Skip to main content
Glama
Liohtml

CVE MCP Server

by Liohtml

Ask “Should we patch CVE-2024-3400?” — get a scored, evidence-backed verdict in seconds.

CI Version Rust 1.88+ MCP License: Apache-2.0 Docker

Quick start · Demos · Tools · Scoring · Configuration · Architecture

Real output of cve-mcp call triage_cve — exactly the text your MCP client receives.


CVE MCP Server is a Model Context Protocol server that turns Claude (or any MCP client) into a security analyst. Instead of juggling NVD, EPSS, CISA KEV, GitHub, Exploit-DB, Shodan and VirusTotal in fifteen browser tabs, you ask one question — the server fans out to every relevant source in parallel, correlates the evidence and answers with a prioritised recommendation.

It ships as one self-contained Rust binary: no Python, no Node, no runtime to install.

✨ Highlights

🎯 One-call triage triage_cve queries NVD, EPSS, CISA KEV and public exploit sources concurrently and returns a verdict — with a VulnCheck fallback when NVD is down.

🧮 Evidence over severity A transparent 0–100 score weights exploitation (EPSS + KEV) above raw CVSS. KEV-listed CVEs are always CRITICAL. Optional SSVC decision.

🔍 29 tools · 23 sources CVE intel, exploits & PoCs, ATT&CK, vendor advisories, IP / domain / hash / URL reputation, ransomware wallets, known-good files.

📦 Dependency scanning Paste a requirements.txt, package.json, pom.xml or OS package list — get the most severe CVEs per package with real severities.

🦀 Fast & lean Single ~11 MB binary, async Tokio core, SQLite cache, starts instantly. Runs over stdio or stateless streamable HTTP.

🔐 Secure by default Outbound host allowlist on every request and redirect, masked secrets, redacted audit log, private-IP blocking, XXE-safe XML.

Related MCP server: CVE Intelligence MCP Server

🚀 Quick start

1 — Install (needs Rust 1.88+ and a C compiler)

cargo install --git https://github.com/Liohtml/cve-mcp-server --locked
cve-mcp --version

Prefer a download? Tagged releases ship prebuilt binaries for Linux, macOS and Windows on the Releases page.

2 — Connect your MCP client

# Claude Code
claude mcp add cve-mcp -e NVD_API_KEY=your-key -- cve-mcp

Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "cve-mcp": {
      "command": "/absolute/path/to/cve-mcp",
      "env": {
        "NVD_API_KEY": "your-key",
        "GITHUB_TOKEN": "ghp_..."
      }
    }
  }
}

Use the absolute path (e.g. ~/.cargo/bin/cve-mcp, expanded) — Claude Desktop does not inherit your shell PATH. Fully quit and restart Claude Desktop afterwards.

Register a stdio server whose command is cve-mcp (no arguments), or point an HTTP-capable client at a running instance: http://localhost:8000/mcp (see Docker / HTTP). To poke at it interactively:

npx @modelcontextprotocol/inspector cve-mcp

3 — Ask

“Is CVE-2021-44228 actively exploited and how urgent is it?” “Scan this requirements.txt and tell me what to upgrade first.” “Compare CVE-2024-3400, CVE-2024-6387 and CVE-2023-38545 — what do we patch first?”

No API key is required to start. Adding a free NVD_API_KEY makes NVD lookups 10× faster.

🎬 See it in action

Every tool can also be run straight from the terminal with cve-mcp call <tool> key=value … — handy for scripting and CI. The recordings below are real output.

Scan dependencies — the five most severe vulnerabilities per package, with CVE aliases and severities computed from CVSS v2/v3/v4 vectors:

Prioritise a backlog — rank CVEs by composite risk to decide what gets patched first:

🧰 Tools

⭐ Start here

Tool

What it does

triage_cve

One-call verdict for a CVE: NVD (+ VulnCheck fallback), EPSS, CISA KEV and PoC discovery in parallel → risk score, urgency, recommendation; depth="deep" adds an SSVC decision. depth: quick · standard · deep

🛡️ Vulnerability intelligence

Tool

What it does

Key

lookup_cve

Full NVD record: status, dates, CVSS score & vector, CWEs, description, KEV status

NVD (optional)

search_cves

Keyword search of NVD with optional severity filter (1–50 results)

NVD (optional)

get_cve_summary

One-page summary: severity, EPSS, KEV, description, weaknesses, timeline

NVD (optional)

get_epss_score

EPSS exploitation probability & percentile for one or many CVEs

—

check_kev

CISA Known Exploited Vulnerabilities status, due date, ransomware use

—

parse_cvss

Score & explain CVSS v2, v3.0/3.1 (base, temporal, environmental) and v4.0 vectors

—

get_cve_timeline

Publication → EPSS → KEV timeline, patch lag, exploit window

—

get_vendor_advisory

Advisories from Microsoft MSRC, Red Hat and Ubuntu

—

get_attack_mapping

MITRE ATT&CK techniques referencing the CVE and the groups using them

—

check_package_vulns

Known vulnerabilities of one package/version via OSV.dev

—

💥 Exploits, risk & reporting

Tool

What it does

Key

check_poc_exists

PoC discovery across GitHub, Exploit-DB and Nuclei templates with a confidence ladder

GITHUB_TOKEN (optional)

check_exploit_availability

Public PoC repositories on GitHub, sorted by stars

GITHUB_TOKEN (optional)

calculate_risk_score

Composite 0–100 score with a per-component breakdown

NVD (optional)

compare_cves

Rank 2–10 CVEs into a patch-priority table

NVD (optional)

generate_vuln_report

Executive, technical or full report, optionally with remediation guidance

NVD (optional)

🌐 Network & threat intelligence

Tool

What it does

Key

check_ip_reputation

Abuse score, ISP, country, Tor flag + GreyNoise classification

ABUSEIPDB_KEY, GREYNOISE_API_KEY

shodan_host_lookup

Open ports, services, OS, hostnames and CVEs of a host

SHODAN_KEY

get_domain_intel

Certificate transparency (crt.sh), subdomains, passive DNS

CIRCL (optional)

passive_dns_lookup

Historical DNS resolutions of an IP or domain

CIRCL_PDNS_USER / _PASS

lookup_file_hash

MalwareBazaar + VirusTotal verdicts, family, tags, detection rate

ABUSECH_AUTH_KEY, VIRUSTOTAL_KEY

lookup_known_file

Known-good check via CIRCL hashlookup (NIST NSRL + distro packages)

—

check_url_safety

URLScan.io verdicts, score, categories, screenshot

URLSCAN_KEY (optional)

lookup_malware_family

ThreatFox malware attribution for an IP, domain, URL or hash

ABUSECH_AUTH_KEY

check_ransomware_intel

Ransomwhere lookup of a Bitcoin address

—

🧑‍💻 DevSecOps

Tool

What it does

Key

scan_dependencies

Bulk OSV scan of requirements.txt, package.json, pom.xml or name:ecosystem:version lines (≤ 1,000 packages)

—

scan_container_packages

Same for OS packages (Alpine, Debian, Ubuntu, …)

—

scan_repo_secrets

Search public GitHub code for potentially exposed secrets

GITHUB_TOKEN

health_check

Upstream connectivity, KEV catalog, cache, tool-manifest hash, configured keys (names only)

—

Kind

Name

Purpose

Resource

kev://catalog

Summary of the in-memory CISA KEV catalog

Resource template

epss://scores/{cve_id}

EPSS score of one CVE

Resource

manifest://tool-hash

SHA-256 over every tool's name, description and schema — pin and verify the tool surface

Prompt

patch_decision

Patch-now-or-schedule decision for one CVE via triage_cve (deep)

Prompt

compare_and_prioritize

Rank a list of CVEs for patching

Prompt

dependency_triage

Scan dependencies, then triage the CVEs found

🧮 How the verdict is made

  • Why these weights? EPSS is the best predictor of real-world exploitation, KEV is ground truth that exploitation happens, CVSS describes severity rather than likelihood (Allodi & Massacci, 2014), and a public PoC lowers the attacker's bar.

  • KEV hard override: a CISA KEV listing means confirmed in-the-wild exploitation — the label is always CRITICAL and the score at least 76, whatever CVSS and EPSS say.

  • PoC confidence ladder: WEAPONIZED 15 · PUBLIC_EXPLOIT_REMOTE 12 · PUBLIC_EXPLOIT 10 · PUBLIC_POC_HIGH_QUALITY 7 · PUBLIC_POC_LOW_QUALITY 3.

  • SSVC (deep mode): the CISA Deployer decision tree (Exploitation × Automatable × Technical Impact × Mission & Well-being) yields Act, Attend, Track* or Track — an explainable, non-numeric second opinion.

🏗️ Architecture

src/
├── main.rs            CLI: serve (stdio / HTTP), call, --list-tools, --healthcheck
├── mcp/               JSON-RPC dispatcher · stdio transport · streamable-HTTP transport
├── tools/             tool registry + handlers (core, threat, vuln, devsecops, risk, triage)
├── api/               one client per upstream (NVD, EPSS, KEV, OSV, VulnCheck, …)
├── utils/             risk scorer · SSVC · CVSS v2/v3/v4 · fan-out · retry · source trust
├── http.rs            reqwest + rustls, host allowlist, redirect checks, size limits
├── cache.rs           SQLite cache (WAL, per-source TTLs)
├── audit.rs           rotating JSON audit log
├── config.rs          environment config, Secret type
├── validators.rs      CVE / IP / hash validation, SSRF checks
├── resources.rs       kev://catalog · epss://scores/{cve_id} · manifest://tool-hash
└── prompts.rs         patch_decision · compare_and_prioritize · dependency_triage

⚙️ Configuration

Configuration comes from environment variables; a .env file in the working directory is loaded automatically (see .env.example). Every key is optional — tools say which key they are missing.

Variable

Enables

Get it

NVD_API_KEY

50 instead of 5 NVD requests / 30 s

nvd.nist.gov

GITHUB_TOKEN

PoC, Nuclei & secret search (5,000 instead of 60 req/h)

github.com/settings/tokens

VULNCHECK_TOKEN

NVD++ fallback inside triage_cve

vulncheck.com

ABUSECH_AUTH_KEY

MalwareBazaar + ThreatFox (required by abuse.ch since 2025)

auth.abuse.ch

ABUSEIPDB_KEY

IP abuse scores

abuseipdb.com

GREYNOISE_API_KEY

Internet-noise classification

greynoise.io

VIRUSTOTAL_KEY

Multi-engine detection stats

virustotal.com

SHODAN_KEY

Host exposure lookups

shodan.io

URLSCAN_KEY

Higher URLScan.io limits

urlscan.io

CIRCL_PDNS_USER / CIRCL_PDNS_PASS

Passive DNS

circl.lu

Variable

Default

Meaning

MCP_TRANSPORT

stdio

http serves stateless streamable HTTP

HOST / PORT

0.0.0.0 / 8000

HTTP bind address (endpoint /mcp)

MCP_ALLOWED_ORIGINS

—

Extra browser origins allowed to call the HTTP endpoint (* disables the check)

CACHE_DB_PATH

~/.cve-mcp/cache.db

SQLite response cache

AUDIT_LOG_PATH

~/.cve-mcp/audit.log

JSON-lines audit log (50 MB × 5 rotation)

REQUEST_TIMEOUT

30

Upstream HTTP timeout in seconds

MAX_RETRIES

3

Attempts for retrying clients (NVD, VulnCheck, HIBP)

RUST_LOG

info

Log filter — logs always go to stderr

🐳 Docker / HTTP

docker build -t cve-mcp-server .
docker run --rm -p 8000:8000 --env-file .env cve-mcp-server
claude mcp add --transport http cve-mcp http://localhost:8000/mcp

The HTTP transport is stateless (one JSON-RPC message per POST /mcp, JSON response) and accepts browser requests only from local origins unless MCP_ALLOWED_ORIGINS says otherwise. Put it behind your own TLS / auth proxy before exposing it beyond a trusted network.

⌨️ Command line

cve-mcp                                   # serve MCP (stdio, or HTTP with MCP_TRANSPORT=http)
cve-mcp call triage_cve cve_id=CVE-2024-3400 depth=deep
cve-mcp call scan_dependencies dependency_list=@requirements.txt   # @file / @- for stdin
cve-mcp call compare_cves '{"cve_ids": ["CVE-2024-3400", "CVE-2024-6387"]}'
cve-mcp --list-tools | --healthcheck | --version | --help

🔐 Security & privacy

  • Outbound only, allowlisted: every request and every redirect hop must target a known API host; no inbound ports with stdio.

  • No secrets in logs: keys live in a Secret type with masked output, error messages strip credentials from URLs, and the audit log redacts any parameter named *key* / *token*.

  • Input hardening: CVE / IP / hash validation, private & reserved IP ranges blocked (including IPv4-mapped IPv6), size-limited response bodies, pom.xml parsed with DTDs disabled.

  • No sampling: the server never sends sampling/createMessage back to the client — all model interaction is client-driven.

  • Local data: responses are cached in a local SQLite file; nothing is sent anywhere except the lookups themselves.

Found a vulnerability? Please follow SECURITY.md.

Source

Used for

Auth

NIST NVD 2.0

CVE records, CVSS, CWE, search

optional API key

VulnCheck NVD++

NVD fallback in triage_cve

token

FIRST EPSS

Exploitation probability

—

CISA KEV (+ GitHub mirror)

Known exploited vulnerabilities

—

OSV.dev

Package vulnerabilities, bulk scans, record details

—

MITRE ATT&CK (STIX)

Technique & group mapping

—

Microsoft MSRC · Red Hat · Ubuntu

Vendor advisories

—

GitHub search

PoC repositories, secret exposure

optional token

Exploit-DB

Public exploits

—

Nuclei templates

Detection templates

optional token

AbuseIPDB · GreyNoise

IP reputation

keys

Shodan

Host exposure

key

crt.sh · CIRCL Passive DNS

Certificates, subdomains, DNS history

CIRCL credentials

VirusTotal · MalwareBazaar · ThreatFox

Malware verdicts & attribution

keys

URLScan.io

URL verdicts

optional key

Ransomwhere

Ransomware wallets

—

CIRCL hashlookup

Known-good files (NSRL)

—

🧪 Development

cargo build                       # debug build
cargo test                        # unit + integration tests (offline, no API keys)
cargo fmt --all --check && cargo clippy --all-targets -- -D warnings

CI runs the tests on Linux, macOS and Windows, checks the MSRV (1.88), audits dependencies and builds the Docker image. See CONTRIBUTING.md for how to add a tool.

The banner and diagrams in assets/ are hand-written SVG. The terminal GIFs are rendered from real recordings in scripts/readme-assets/recordings with headless Chromium (Playwright) and Pillow:

cve-mcp call triage_cve cve_id=CVE-2021-44228 depth=deep > scripts/readme-assets/recordings/triage.txt
node scripts/readme-assets/render-terminal.cjs triage    # also: scan, compare
  • Client shows no tools — check the config JSON for trailing commas, use the absolute binary path, fully restart the client. RUST_LOG=debug cve-mcp prints diagnostics to stderr.

  • “NVD rate limit exceeded” — set NVD_API_KEY; triage_cve also falls back to VulnCheck when VULNCHECK_TOKEN is set.

  • MalwareBazaar / ThreatFox return nothing — abuse.ch requires ABUSECH_AUTH_KEY since 2025.

  • GitHub-based searches are empty — unauthenticated GitHub search allows only a handful of requests per minute; set GITHUB_TOKEN. Rate-limited results are never cached, so a retry works once the limit resets.

  • Corporate proxy / custom CA — HTTPS_PROXY / NO_PROXY are honoured and TLS uses the OS certificate store (plus SSL_CERT_FILE on Linux).

🙏 Credits & license

Originally created in Python by Mahipal Jangra (mukul975); this fork is a full Rust rewrite with the same tool surface. Licensed under the Apache License 2.0.

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    C
    maintenance
    This MCP server transforms Claude into a comprehensive security analyst by providing access to 27 security tools across 21 APIs for vulnerability intelligence. It enables users to query multiple sources like NVD, EPSS, CISA KEV, and threat intelligence platforms in parallel to get correlated security insights and risk assessments for CVEs.
    28
    1,622
    Apache 2.0
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI agents to search, correlate, and monitor real-time vulnerability intelligence from NVD, CISA KEV, EPSS, and MITRE ATT&CK, including CVE details, critical CVE tracking, known exploited vulnerabilities, and exploitation probability scores.
    5
    2
    MIT