cve-mcp-server
Production-grade MCP server giving Claude 27 security intelligence tools across 21 APIs — CVE lookup, EPSS scoring, CISA KEV, MITRE ATT&CK, Shodan, VirusTotal, and more.
Documentation
🛡️ CVE MCP Server

AI-powered security intelligence at your fingertips — 28 tools + a one-call `triage_cve` orchestrator, 24 data sources, one protocol.
A production-grade Model Context Protocol (MCP) server that turns Claude into a full-spectrum security analyst. Instead of juggling 15+ browser tabs across NVD, EPSS, CISA KEV, Shodan, VirusTotal, and GreyNoise, ask Claude one question and get correlated intelligence in seconds. Built with Python, FastMCP, httpx, aiosqlite, Pydantic v2, and defusedxml.
The problem: Triaging a single CVE means querying NVD for CVSS scores, EPSS for exploitation probability, CISA KEV for active exploitation status, GitHub for patches, and VirusTotal for malware associations — then mentally correlating everything. For 50 CVEs, that's an entire day lost.
The solution: CVE MCP Server gives Claude direct access to 28 security tools across 24 APIs — fronted by the `triage_cve` one-call orchestrator. Ask "Should we patch CVE-2024-3400?" and Claude fans out to every relevant source in parallel, calculates a composite risk score (with a CISA KEV hard override), and delivers a prioritized recommendation with evidence.
🌍 GARS-2026 — Global Agentic AI Readiness Survey
I'm running a global academic study measuring how ready security professionals,
developers, and enterprise teams actually are for agentic AI — MCP servers,
tool calling, governance, and human-in-the-loop workflows.
If you use this repo, your response would be a genuinely valuable data point.
📋 Take the survey (10 min):
- 60 questions · Anonymous · Supervised by SRH Berlin
- You get 50 Casky Tokens for early access to casky.ai
- Results published open access under CC-BY 4.0
📑 Table of contents
- Architecture
- Tool catalog
- Installation
- API keys setup
- Configuration
- Quick start
- Usage examples
- Risk score explained
- Data sources
- Running tests
- Architecture deep dive
- Security and privacy
- Troubleshooting
- Roadmap and known limitations
- Contributing
- License
🏗️ Architecture
┌─────────────────────────────────────────────────────────────────────┐
│ Claude Desktop / Claude Code │
│ (MCP Client via stdio) │
└──────────────────────────────┬──────────────────────────────────────┘
│ Model Context Protocol (stdio)
▼
┌─────────────────────────────────────────────────────────────────────┐
│ CVE MCP Server (Python) │
│ ┌─────────────┐ ┌──────────────┐ ┌───────────────┐ │
│ │ 27 MCP │ │ Composite │ │ SQLite Cache │ │
│ │ Tools │ │ Risk Engine │ │ + Audit Log │ │
│ └──────┬──────┘ └──────┬───────┘ └───────┬───────┘ │
│ │ │ │ │
│ ┌──────┴────────────────┴───────────────────┴──────┐ │
│ │ Async HTTP Client (httpx) │ │
│ │ Rate Limiter · Response Cache │ │
│ └──────────────────────┬───────────────────────────┘ │
└─────────────────────────┼───────────────────────────────────────────┘
│ HTTPS (outbound only)
┌───────────────┼───────────────────────────┐
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ VULNERABILITY│ │ NETWORK │ │ THREAT │
│ INTELLIGENCE │ │ INTELLIGENCE │ │ INTELLIGENCE │
├──────────────┤ ├──────────────┤ ├──────────────┤
│ NVD API 2.0 │ │ AbuseIPDB │ │ VirusTotal │
│ EPSS / FIRST │ │ GreyNoise v3 │ │ MalwareBazaar│
│ CISA KEV │ │ Shodan │ │ ThreatFox │
│ OSV.dev │ │ CIRCL PDNS │ │ Ransomwhere │
│ GitHub GHSA │ │ │ │ AlienVault │
│ MITRE ATT&CK │ │ │ │ URLScan.io │
└──────────────┘ └──────────────┘ └──────────────┘All traffic is outbound HTTPS only — no inbound ports are opened. API keys are loaded from environment variables and never logged. Private/internal IP addresses are blocked from all lookup tools.
🔍 Tool catalog (28 tools)
⭐ Orchestration (v0.2.0) — start here
| Tool | Description | API Key Required | Example Usage |
|---|---|---|---|
| `triage_cve` | One-call triage that fans out NVD + EPSS + CISA KEV (+ public PoC for `depth != "quick"`) concurrently, computes the composite risk score with a KEV hard override, falls back to VulnCheck NVD++ when NIST NVD is throttled, and on `depth="deep"` emits the SSVC v2 gated decision | Free / No key (key recommended) | `triage_cve("CVE-2021-44228", depth="deep")` |
> Also exposed via MCP primitives — Resources: `kev://catalog`, `epss://scores/{cve_id}`, `manifest://tool-hash` (SHA-256 over the registered tool surface, for tamper detection). Prompts: `patch_decision`, `compare_and_prioritize`, `dependency_triage`.
Core Vulnerability Intelligence (8 tools)
| Tool | Description | API Key Required | Example Usage |
|---|---|---|---|
| `lookup_cve` | Fetch detailed CVE record from NVD including CVSS scores, CWEs, affected products, references, and timeline | Free / No key (key recommended) | `lookup_cve("CVE-2024-3400")` |
| `search_cves` | Search NVD for CVEs by keyword, product name, severity, or date range | Free / No key (key recommended) | `search_cves(keyword="Apache Log4j", severity="CRITICAL")` |
| `get_epss_score` | Get EPSS exploitation probability (0–1) and percentile for one or more CVEs | Free / No key | `get_epss_score("CVE-2024-3400")` |
| `check_kev_status` | Check whether a CVE appears in CISA's Known Exploited Vulnerabilities catalog | Free / No key | `check_kev_status("CVE-2021-44228")` |
| `get_cvss_details` | Parse and explain a CVSS v3.1 vector string with per-metric breakdown | Free / No key | `get_cvss_details("CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H")` |
| `get_cwe_info` | Look up Common Weakness Enumeration details by CWE ID from embedded database | Free / No key | `get_cwe_info("CWE-79")` |
| `get_cve_references` | Extract and categorize all reference links for a CVE (patches, advisories, exploits) | Free / No key (key recommended) | `get_cve_references("CVE-2023-44487")` |
| `bulk_cve_lookup` | Batch-fetch details for up to 20 CVEs in a single call with parallel enrichment | Free / No key (key recommended) | `bulk_cve_lookup(["CVE-2024-3400", "CVE-2023-44487"])` |
Exploit & Attack Intelligence (4 tools)
| Tool | Description | API Key Required | Example Usage |
|---|---|---|---|
| `search_exploits` | Search GitHub for public proof-of-concept exploits and exploit code repositories | `GITHUB_TOKEN` (optional) | `search_exploits("CVE-2024-3400")` |
| `get_mitre_techniques` | Map a CVE or CWE to relevant MITRE ATT&CK techniques, tactics, and mitigations | Free / No key | `get_mitre_techniques("CVE-2021-44228")` |
| `check_poc_availability` | Determine if known proof-of-concept code exists for a CVE across multiple sources | `GITHUB_TOKEN` (optional) | `check_poc_availability("CVE-2024-3400")` |
| `get_attack_patterns` | Retrieve CAPEC attack pattern details associated with a CWE or CVE | Free / No key | `get_attack_patterns("CWE-89")` |
Phase 3: Advanced Risk & Reporting (4 tools)
| Tool | Description | API Key Required | Example Usage |
|---|---|---|---|
| `calculate_risk_score` | Compute composite 0–100 risk score using CVSS, EPSS, KEV status, and PoC availability | Free / No key (key recommended) | `calculate_risk_score("CVE-2024-3400")` |
| `generate_risk_report` | Generate a formatted executive security report for one or more CVEs with recommendations | Free / No key (key recommended) | `generate_risk_report(["CVE-2024-3400", "CVE-2023-44487"])` |
| `prioritize_cves` | Rank a list of CVEs by composite risk score for triage prioritization | Free / No key (key recommended) | `prioritize_cves(["CVE-2024-3400", "CVE-2023-4966", "CVE-2023-44487"])` |
| `get_trending_cves` | Retrieve trending CVEs based on high EPSS scores and recent KEV additions | Free / No key | `get_trending_cves(days=7, min_epss=0.5)` |
Network Intelligence (4 tools)
| Tool | Description | API Key Required | Example Usage |
|---|---|---|---|
| `lookup_ip_reputation` | Check IP address abuse history and confidence score via AbuseIPDB | `ABUSEIPDB_API_KEY` | `lookup_ip_reputation("185.220.101.34")` |
| `check_ip_noise` | Query GreyNoise for IP scan/attack activity, classification, and associated CVEs | `GREYNOISE_API_KEY` | `check_ip_noise("185.220.101.34")` |
| `shodan_host_lookup` | Get open ports, services, banners, and vulnerabilities for an IP via Shodan | `SHODAN_API_KEY` | `shodan_host_lookup("8.8.8.8")` |
| `passive_dns_lookup` | Retrieve historical DNS resolution data for a domain from CIRCL Passive DNS | `CIRCL_PDNS_USER` + `CIRCL_PDNS_PASSWORD` | `passive_dns_lookup("example.com")` |
Threat Intelligence (4 tools)
| Tool | Description | API Key Required | Example Usage |
|---|---|---|---|
| `virustotal_lookup` | Analyze file hashes, URLs, domains, or IPs against 70+ antivirus engines | `VIRUSTOTAL_API_KEY` | `virustotal_lookup(hash="44d88612fea8a8f36de82e1278abb02f")` |
| `search_malware` | Search MalwareBazaar for malware samples by hash, tag, or signature | `ABUSECH_AUTH_KEY` (optional) | `search_malware(tag="Emotet")` |
| `search_iocs` | Query ThreatFox for Indicators of Compromise linked to malware families | `ABUSECH_AUTH_KEY` (optional) | `search_iocs(malware="CobaltStrike")` |
| `check_ransomware` | Look up ransomware payment addresses and transaction data from Ransomwhere | Free / No key | `check_ransomware(address="bc1q...")` |
DevSecOps (3 tools)
| Tool | Description | API Key Required | Example Usage |
|---|---|---|---|
| `scan_dependencies` | Scan package names and versions against OSV.dev for known vulnerabilities | Free / No key | `scan_dependencies(ecosystem="PyPI", packages={"requests": "2.28.0"})` |
| `scan_github_advisories` | Search GitHub Security Advisories by ecosystem, package, or severity | `GITHUB_TOKEN` (optional) | `scan_github_advisories(ecosystem="pip", package="django")` |
| `urlscan_check` | Submit a URL for scanning or retrieve previous scan results from URLScan.io | `URLSCAN_API_KEY` | `urlscan_check("https://suspicious-site.com")` |
📦 Installation
Prerequisites
- Python 3.10+ (3.11 or 3.12 recommended)
- pip or uv package manager
- Git for cloning the repository
- A terminal with access to environment variables
Step-by-step setup
# 1. Clone the repository
git clone https://github.com/mukul975/cve-mcp-server.git
cd cve-mcp-server
# 2. Create and activate a virtual environment
python -m venv venv
# macOS / Linux:
source venv/bin/activate
# Windows (PowerShell):
.\venv\Scripts\Activate.ps1
# Windows (CMD):
venv\Scripts\activate.bat
# 3. Install dependencies
pip install -e .
# 4. Copy and configure environment variables
cp .env.example .env
# Edit .env with your API keys (see API Keys Setup section below)
# 5. Verify the server starts
python -m cve_mcp.serverUsing uv (faster alternative)
git clone https://github.com/mukul975/cve-mcp-server.git
cd cve-mcp-server
uv venv
source .venv/bin/activate # or .venv\Scripts\activate on Windows
uv pip install -e .
cp .env.example .envWith test dependencies
pip install -e ".[test]"🔑 API keys setup
API keys are organized by priority — get the Tier 1 keys first for maximum coverage with free tools, then progressively add Tier 2 and Tier 3 as needed.
Tier 1: High priority (free, instant access, maximum coverage)
| ENV Variable | Enables | How to Get | Free Tier Limits | Required? |
|---|---|---|---|---|
| `NVD_API_KEY` | 10× faster NVD lookups (50 req/30s vs 5) | Request at nvd.nist.gov | 50 requests per 30 seconds | Optional but strongly recommended |
| `GITHUB_TOKEN` | GitHub Advisory search + exploit PoC search | Create PAT at github.com/settings/tokens | 5,000 requests/hour | Optional (60/hr without) |
Tier 2: Recommended (free accounts, significant value)
| ENV Variable | Enables | How to Get | Free Tier Limits | Required? |
|---|---|---|---|---|
| `ABUSEIPDB_KEY` | IP reputation lookups | Register at abuseipdb.com | 1,000 checks/day | Required for IP tools |
| `VIRUSTOTAL_KEY` | File/URL/domain/IP malware scanning | Sign up at virustotal.com | 500 lookups/day, 4/min | Required for VT tools |
| `GREYNOISE_API_KEY` | IP noise/scan activity intelligence | Sign up at viz.greynoise.io | 50 queries/week (community) | Required for GreyNoise tools |
| `SHODAN_KEY` | Host/port/service reconnaissance | Register at account.shodan.io | Basic host lookups (free tier) | Required for Shodan tools |
Tier 3: Optional (extended intelligence)
| ENV Variable | Enables | How to Get | Free Tier Limits | Required? |
|---|---|---|---|---|
| `URLSCAN_KEY` | URL scanning and website analysis | Sign up at urlscan.io | 5,000 public scans/day | Optional |
| `CIRCL_PDNS_USER` | CIRCL Passive DNS lookups | Request access at circl.lu | Partner access only | Optional |
| `CIRCL_PDNS_PASS` | CIRCL Passive DNS authentication | Provided with CIRCL registration | Partner access only | Optional |
> ⚡ Zero-key start: Eight tools work without any API key — EPSS, CISA KEV, OSV.dev, MITRE ATT&CK, CWE lookups, CVSS parsing, Ransomwhere, and NVD (at reduced rate). You can start using the server immediately and add keys progressively.
⚙️ Configuration
Environment variables (.env.example)
# NVD API key — free at https://nvd.nist.gov/developers/request-an-api-key
# Without key: 5 req/30s | With key: 50 req/30s
NVD_API_KEY=
# GitHub token — increases rate limit from 60/hr to 5000/hr (no scopes needed)
GITHUB_TOKEN=
# Threat intelligence keys (all optional — tools degrade gracefully without them)
ABUSEIPDB_KEY= # https://www.abuseipdb.com/account/api
VIRUSTOTAL_KEY= # https://www.virustotal.com/gui/join-us
URLSCAN_KEY= # https://urlscan.io/user/signup
SHODAN_KEY= # https://account.shodan.io/register
# GreyNoise — uses /v3/ip/{ip} endpoint (NOT the deprecated /v3/community)
GREYNOISE_API_KEY= # https://viz.greynoise.io/signup
# CIRCL Passive DNS — requires partner registration
CIRCL_PDNS_USER=
CIRCL_PDNS_PASS=
# Optional overrides
CACHE_DB_PATH= # defaults to ~/.cve-mcp/cache.db
AUDIT_LOG_PATH= # defaults to ~/.cve-mcp/audit.log
REQUEST_TIMEOUT=30 # HTTP timeout in seconds
MAX_RETRIES=3 # retries on transient errorsClaude Desktop configuration
macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
Windows: `%APPDATA%\Claude\claude_desktop_config.json`
{
"mcpServers": {
"cve-mcp": {
"command": "python",
"args": ["-m", "cve_mcp.server"],
"cwd": "/absolute/path/to/cve-mcp-server",
"env": {
"NVD_API_KEY": "your-key-here",
"GITHUB_TOKEN": "ghp_xxxxxxxxxxxxxxxxxxxx",
"ABUSEIPDB_KEY": "your-abuseipdb-key",
"GREYNOISE_API_KEY": "your-greynoise-key",
"SHODAN_KEY": "your-shodan-key"
}
}
}
}> ⚠️ Important: Always use absolute paths. Fully quit Claude Desktop (Cmd+Q / Alt+F4) after changing the config — reloading is not enough.
Claude Code configuration
# Basic setup
claude mcp add cve-mcp -- python -m cve_mcp.server
# With environment variables (repeat -e for each key)
claude mcp add cve-mcp -e NVD_API_KEY=your_key -e VULNCHECK_TOKEN=your_token -- python -m cve_mcp.server
# Or just run from the project directory — python-dotenv auto-loads .env on startup
# Verify it's connected
claude mcp list🚀 Quick start
Step 1: Install (2 minutes)
git clone https://github.com/mukul975/cve-mcp-server.git
cd cve-mcp-server
python -m venv venv && source venv/bin/activate
pip install -e .Step 2: Test with free tools first
No `.env` file needed. Add the server to Claude Desktop or Claude Code and try:
> "What is CVE-2021-44228? Is it actively exploited?"
Claude will use `lookup_cve` (NVD), `get_epss_score` (EPSS), and `check_kev` (CISA KEV) — all free, no keys required.
> "Scan these Python packages for vulnerabilities: requests 2.28.0, flask 2.2.0, django 3.2.0"
Step 3: Add your first key for 10× performance
echo 'NVD_API_KEY=your-key-here' > .envRequest a free NVD key at nvd.nist.gov — instant via email, increases rate limit from 5 to 50 requests per 30 seconds.
Step 4: Full power mode
Once you've added Tier 1 and Tier 2 keys:
> "Calculate the risk score for CVE-2024-3400 and tell me if we should patch immediately."
💬 Usage examples
Scenario 1: "Should we patch Log4Shell immediately?"
> You: Analyze if CVE-2021-44228 (Log4Shell) needs immediate patching. Give me the risk score and your recommendation.
Claude orchestrates multiple tools behind the scenes:
→ lookup_cve("CVE-2021-44228")
CVSS 3.1: 10.0 (CRITICAL) | AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
→ get_epss_score("CVE-2021-44228")
EPSS: 0.97531 (97.5%) | Percentile: 99.99%
→ check_kev("CVE-2021-44228")
✅ IN CISA KEV — Added 2021-12-10 | Known ransomware use: Yes
→ check_poc_exists("CVE-2021-44228")
✅ WEAPONIZED — 300+ public PoC repositories found
→ calculate_risk_score("CVE-2021-44228")
Risk Score: 97/100 (CRITICAL) | Urgency: PATCH IMMEDIATELYClaude's response: "CVE-2021-44228 scores 97/100 (CRITICAL). Remote code execution in Apache Log4j, CVSS 10.0, 97.5% EPSS probability, confirmed active exploitation in CISA KEV including ransomware campaigns, 300+ public exploits. Patch immediately."
Scenario 2: "Scan my Python requirements.txt"
> You: Scan these dependencies: requests==2.28.0, flask==2.2.0, django==3.2.0, pillow==9.0.0, cryptography==37.0.0
→ scan_dependencies(ecosystem="PyPI", packages={...})
Found 12 vulnerabilities across 4 packagesClaude's response: "Found 12 vulnerabilities across your packages. Immediate action: Django 3.2.0 (3 critical CVEs including SQL injection), Pillow 9.0.0 (heap overflow), cryptography 37.0.0 (OpenSSL chain). Upgrade to: django>=4.2.16, pillow>=10.3.0, cryptography>=42.0.0."
Scenario 3: "Investigate a suspicious IP"
> You: Investigate suspicious IP 185.220.101.34 — is it malicious?
→ check_ip_reputation("185.220.101.34")
AbuseIPDB Confidence: 100% | Reports: 4,832 | ISP: Tor Exit Node
→ check_ip_noise("185.220.101.34")
GreyNoise: MALICIOUS | Tags: [Tor Exit Node, Web Scanner]
CVEs targeted: CVE-2024-3400, CVE-2023-46805
→ shodan_host_lookup("185.220.101.34")
Open ports: 22, 80, 443, 9001 | OS: LinuxClaude's response: "185.220.101.34 is a known Tor exit node rated 100% malicious by AbuseIPDB with 4,832 abuse reports. GreyNoise confirms active scanning for CVE-2024-3400 (Palo Alto) and CVE-2023-46805 (Ivanti). Recommendation: Block at firewall."
Scenario 4: "Generate an executive security report"
> You: Generate an executive security report for: CVE-2024-3400, CVE-2023-44487, CVE-2023-4966, CVE-2024-21887
→ compare_cves([...])
Compiles: NVD, EPSS, KEV, PoC availability, MITRE ATT&CK mapping
Generates: Ranked risk table, remediation timeline, executive summary📊 Risk score explained
The `calculate_risk_score` tool produces a composite risk score from 0 to 100 by weighting four independent signals.
The formula
Risk Score = (CVSS × 0.20) + (EPSS × 0.35) + (KEV × 0.30) + (PoC × 0.15)| Component | Weight | What It Captures |
|---|---|---|
| CVSS v3.1 Base Score | 20% | Theoretical worst-case severity |
| EPSS Probability | 35% | Statistical likelihood of exploitation in the next 30 days |
| CISA KEV Status | 30% | Confirmed active exploitation in the wild |
| PoC Availability | 15% | Public exploit code lowers the barrier for attackers |
Boost multipliers
- KEV + active PoC → ×1.15
- CVSS ≥ 9.0 + EPSS > 0.7 → ×1.10
- **Published str:
"""
One-line description for Claude to know when to use this tool.
Args:
param: Description of the parameter
"""
app = _get_app(ctx)
# validate → cache check → API call → cache write → audit → return
### Testing requirements
- All new tools must have at least one offline test with mocked responses
- Risk score changes must include formula verification test cases
- Network tools must include a test verifying private IP blocking
- All tests must pass: `pytest tests/ -v`
---
## 📄 License
MIT License — see [LICENSE](LICENSE) for details.Copyright (c) 2025-2026 Mahipal Jangra (mukul975)
---
Built with 🔐 by · Berlin, Germany
Turning security intelligence into conversation.Frequently asked questions
What is cve-mcp-server?
cve-mcp-server is Production-grade MCP server giving Claude 27 security intelligence tools across 21 APIs — CVE lookup, EPSS scoring, CISA KEV, MITRE ATT&CK, Shodan, VirusTotal, and more.
How do I install cve-mcp-server?
Open the GitHub repository and follow its README. Most MCP servers are added to your client's MCP config, then called by your agent.
Is cve-mcp-server open source?
Yes — it is hosted on GitHub at https://github.com/mukul975/cve-mcp-server and has 1,383 stars.
Related MCP tools
AI-powered OSINT agent with interactive REPL, MCP server, and CLI. 19 tools. Works with Claude, GPT-4, or local models. For authorized security research only.
Open-source coding agent memory. Records issues, attempts, fixes and decisions, then warns your agent before it repeats an approach that already failed. Native MCP server for Claude Code, Cursor, Antigravity and Codex. 100% local, no cloud, no telemetry. MIT.
🚀 The fast, Pythonic way to build MCP servers and clients Trusted by 19900+ developers. Trusted by 19900+ developers. Trusted by 19900+ developers.
An AI Gateway, registry, and proxy that sits in front of any MCP, A2A, or REST/gRPC APIs, exposing a unified endpoint with centralized discovery, guardrails and management. Optimizes Agent & Tool calling, and supports plugins.
A super light-weight embedded code search engine CLI (AST based) that just works - improves speed and efficiency for coding agent 🌟 Star if you like it!
Cut AI token costs 95%+ on code exploration. The leading MCP server for precise, symbol-level GitHub code retrieval via tree-sitter AST. Works with Claude Code, Cursor & any MCP client. 313B+ tokens saved.
Run your own MCP server? See who uses it and what to fix.
Measure it with TrackMCP