Technical Briefing: cve-mcp-server

The Problem

Triaging a single CVE requires querying multiple disparate sources—NVD for CVSS scores, EPSS for exploitation probability, CISA KEV for active exploitation status—then mentally correlating the results. For a security team handling dozens of vulnerabilities, this manual process consumes entire workdays.

What This Does

The CVE MCP Server provides 28 security tools across 24 APIs fronted by a triage_cve orchestrator (defined in src/cve_mcp/server.py). It allows a single prompt to fan out to NVD, EPSS, CISA KEV, Shodan, and VirusTotal in parallel, calculate a composite risk score, and return a prioritized remediation recommendation with evidence. The system is built on Python, FastMCP, httpx, aiosqlite, and Pydantic v2.

How It Is Wired

Execution begins at src/cve_mcp/server.py, which initializes the FastMCP server via stdio for Claude integration. The triage_cve function acts as the primary entry point for analysts. It routes the request through utils/risk_scorer.py and utils/source_trust.py, executing API calls via httpx to clients such as nvd_client.py, epss_client.py, and kev_client.py concurrently. Results are persisted to the sqlite_cache (src/cve_mcp/cache/sqlite_cache.py). The control flow fans out to 24 data sources; the widest blast radius resides in the orchestration logic within server.py, which coordinates the parallel queries and score aggregation.

How To Use It

Setup requires Python 3.10+ and environment configuration. Consult the .env.example file for required variables, then install dependencies declared in pyproject.toml. The repository provides a Dockerfile for containerized deployment. To start the server, invoke the entry point via uv run or Docker, referencing src/cve_mcp/server.py.

Real-World Use

An analyst queries: "Should we patch CVE-2024-3400?" Claude fans out to every relevant source in parallel via triage_cve. The orchestrator calculates a composite risk score with a CISA KEV hard override and delivers a prioritized recommendation with evidence in seconds, eliminating the need to toggle between 15 browser tabs.

Code Health & Issues

  • Low/Risk - Dependencies declared without a lockfile - non-reproducible builds - pyproject.toml. Note: uv.lock exists in the file structure, which may mitigate this for tooling, but the runtime dependency declaration in pyproject.toml lacks a matching lockfile commitment.

The Bottom Line

This repo effectively consolidates 24 security APIs behind a single MCP interface, significantly reducing the operational overhead of CVE triage. The primary consideration is the dependency management setup; teams requiring strict reproducibility should verify the lockfile strategy. It is well-suited for security teams already invested in the Model Context Protocol workflow.