CVEstate
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MCP_TRANSPORT | No | Set to http to serve over streamable HTTP instead of stdio. | stdio |
| WATCHTOWER_DB_PATH | No | Override the persistent SQLite estate inventory path. | ~/.cve-mcp/estate.db |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| lookup_cveA | Look up a CVE by ID from NVD. Returns full details including CVSS scores, description, weaknesses, and CISA KEV status. Args: cve_id: CVE identifier (e.g. CVE-2021-44228) |
| search_cvesA | Search NVD for CVEs by keyword and optional severity filter. Args: query: Keyword to search (letters, numbers, spaces, hyphens, dots — max 200 chars) severity: Optional CVSS v3 severity filter: NONE, LOW, MEDIUM, HIGH, CRITICAL limit: Max results (1–50, default 10) |
| check_package_vulnsB | Check a package for known vulnerabilities via OSV.dev. Args: package: Package name (e.g. log4j-core, requests, lodash) ecosystem: Package ecosystem — PyPI, npm, Go, Maven, NuGet, crates.io, Packagist, Hex, RubyGems, Android, CocoaPods, GitHub Actions version: Optional specific version to check (e.g. 2.14.1) |
| get_epss_scoreB | Get EPSS (Exploit Prediction Scoring System) scores for one or more CVEs. Args: cve_ids: Comma-separated CVE IDs (e.g. CVE-2021-44228,CVE-2022-22965) |
| check_kevB | Check if a CVE is in the CISA Known Exploited Vulnerabilities (KEV) catalog. Args: cve_id: CVE identifier (e.g. CVE-2021-44228) |
| parse_cvssA | Parse and explain a CVSS vector string (v2, v3.x, or v4.0). Args: vector: CVSS vector string (e.g. CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| get_cve_summaryA | Get a comprehensive one-page summary of a CVE: severity, EPSS, KEV status, description, weaknesses, and timeline. Fetches NVD + EPSS concurrently. Args: cve_id: CVE identifier (e.g. CVE-2021-44228) |
| health_checkA | Check the health of the CVE MCP server: NVD connectivity, KEV catalog status, cache, risk scoring version, tool manifest hash, and which optional API keys are configured (names only — never the key values). Note: This tool pings NVD without rate limiting — do not call it in a loop. |
| check_ip_reputationA | Check an IP address reputation via AbuseIPDB and GreyNoise Community. Returns abuse confidence score, country, ISP, Tor status, and noise classification. Args: ip: IPv4 or IPv6 address to check (e.g. 1.2.3.4 or 2001:db8::1) |
| get_domain_intelC | Get domain intelligence: certificate transparency logs (crt.sh) and passive DNS records (CIRCL PDNS). Returns subdomains and certificate history. Args: domain: Domain name to investigate (e.g. example.com) |
| passive_dns_lookupA | Query CIRCL Passive DNS for historical DNS resolutions of an IP or domain. Shows what hostnames have resolved to this IP, or what IPs a domain has pointed to. Args: ip_or_domain: IPv4/IPv6 address or domain name to query |
| shodan_host_lookupA | Look up a host on Shodan: open ports, running services, OS, CVEs on the host. Requires SHODAN_KEY environment variable. Args: ip: IPv4 address to look up (e.g. 8.8.8.8) |
| lookup_file_hashB | Look up a file hash (MD5/SHA1/SHA256) against MalwareBazaar and VirusTotal. Returns malware family, detection stats, and file metadata. Args: hash_str: MD5 (32 hex), SHA1 (40 hex), or SHA256 (64 hex) hash |
| check_url_safetyA | Check a URL or domain for malicious activity via URLScan.io. Returns scan verdicts, malicious flag, score, and categories. Args: url_or_domain: URL (https://example.com/path) or bare domain (example.com) |
| lookup_malware_familyA | Look up an IOC (IP, domain, URL, or hash) against ThreatFox for malware family attribution. Returns confidence level, IOC type, and threat classification. Args: ioc: Indicator of Compromise — IP address, domain, URL, MD5/SHA256 hash |
| check_ransomware_intelA | Check if a Bitcoin address is associated with a known ransomware family using the Ransomwhere database. Args: bitcoin_address: Bitcoin wallet address to look up (P2PKH, P2SH, or bech32) |
| get_vendor_advisoryA | Fetch vendor security advisories for a CVE from Microsoft (MSRC), Red Hat, and Ubuntu. Shows patch availability and affected products. Args: cve_id: CVE identifier (e.g. CVE-2021-44228) |
| check_exploit_availabilityA | Search GitHub for public proof-of-concept (PoC) exploit repositories for a CVE. Results are sorted by star count to surface the most credible exploits first. Args: cve_id: CVE identifier (e.g. CVE-2021-44228) |
| get_attack_mappingA | Map a CVE to MITRE ATT&CK techniques and associated threat groups. Downloads the ATT&CK dataset lazily (cached 24h). Searches technique descriptions and references for the CVE ID. Args: cve_id: CVE identifier (e.g. CVE-2021-44228) |
| get_cve_timelineA | Build a complete CVE lifecycle timeline: NVD publication date, EPSS score history, CISA KEV addition date, patch lag, and exploit window estimation. Args: cve_id: CVE identifier (e.g. CVE-2021-44228) |
| scan_dependenciesA | Bulk scan application dependencies for known CVEs via OSV.dev. Supports requirements.txt (PyPI), package.json (npm), pom.xml (Maven), or generic 'name:ecosystem:version' lines. Returns only vulnerable packages. Args: dependency_list: Raw contents of requirements.txt, package.json, pom.xml, or newline-separated 'name:ecosystem:version' entries. Max 1000 packages per call. |
| scan_container_packagesA | Scan container image packages (Alpine, Debian, Ubuntu OS packages) for known CVEs via OSV.dev. Input should be 'name:ecosystem:version' lines, one package per line, e.g. from 'apk info -v' or 'dpkg -l' output. Supported ecosystems: Alpine, Debian, Ubuntu, and any OSV-supported ecosystem. Args: packages: Newline-separated 'name:ecosystem:version' entries. Example: openssl:Alpine:3.0.7-r0 musl:Alpine:1.2.4_r2 libssl3:Debian:3.0.7-1 |
| scan_repo_secretsA | Search GitHub public repositories for potential exposed credentials or secrets related to a search term (CVE ID, tool name, or keyword). Requires GITHUB_TOKEN for best results. For security research only. Args: search_term: CVE ID, tool name, or keyword to search for in public repo files (e.g. CVE-2024-1234, AWS_SECRET_ACCESS_KEY, log4j) |
| check_poc_existsB | Search for proof-of-concept exploits across GitHub, Exploit-DB, and Nuclei templates. |
| calculate_risk_scoreB | Calculate a composite 0-100 risk score using CVSS, EPSS, KEV, and PoC data. |
| generate_vuln_reportC | Generate a vulnerability report in executive, technical, or full format. |
| compare_cvesB | Compare multiple CVEs by risk score and generate a patch priority ranking. |
| triage_cveA | One-call CVE triage orchestrator (v0.2.0). Fans out the relevant upstream sources concurrently — NVD (with a transparent VulnCheck NVD++ fallback when NVD fails), EPSS, the CISA KEV catalog, and (for depth != "quick") public PoC/exploit discovery — then computes the composite risk score (KEV hard-override applies: a KEV-listed CVE is always CRITICAL with score >= 76). For depth == "deep" it additionally emits an SSVC v2 gated decision (Act / Attend / Track* / Track). Args: cve_id: CVE identifier (e.g. CVE-2021-44228). depth: "quick" — NVD + EPSS + KEV (no PoC search; fastest), "standard" — adds PoC/exploit discovery (default), "deep" — adds an SSVC v2 qualitative decision. |
| estate_addA | Add packages to your Watchtower estate from an SBOM or lockfile. Paste the file contents: CycloneDX JSON, SPDX JSON, requirements.txt, package-lock.json, or go.mod. Packages are remembered persistently (ecosystem, name, version, first-seen date) so later scans can diff your exposure over time. Args: source_text: The SBOM/lockfile file contents. source_name: Optional original filename (helps format detection). |
| estate_scanA | Snapshot your estate's current vulnerability exposure. Queries OSV for every installed package, joins the CISA KEV catalog and current EPSS scores, and persists the result as a snapshot that watch_diff / watch_brief can compare against earlier snapshots. Args: label: Optional label for this snapshot (e.g. "monday", "pre-release"). |
| watch_diffB | Show what changed between the two most recent estate snapshots. Reports new CISA KEV additions hitting your installed packages, EPSS spikes past the threshold, newly disclosed CVEs against installed versions, resolved findings, and estate membership changes. Args: epss_threshold: Minimum EPSS rise (0.0-1.0) counted as a spike. Default 0.10 (10 points). |
| watch_briefA | Prioritized patch brief for your estate, from the latest snapshots. KEV-listed changes first, EPSS spikes second, new exposure third — the patch order a SOC/GRC review actually works in. With only one snapshot on record, returns a current-state brief instead. Args: epss_threshold: Minimum EPSS rise (0.0-1.0) counted as a spike. Default 0.10 (10 points). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| patch_decision | Decide whether to patch a CVE now, using the triage_cve orchestrator. |
| compare_and_prioritize | Rank several CVEs for patch priority using triage_cve / compare_cves. |
| dependency_triage | Triage CVEs surfaced by a dependency/container scan via triage_cve. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| kev_catalog_resource | Summary of the pre-warmed CISA Known Exploited Vulnerabilities (KEV) catalog held in server memory: total entry count, ransomware-linked count, and the most recently added entries. |
| tool_manifest_resource | Stable SHA-256 over the canonical JSON of every registered tool's {name, description, inputSchema}, sorted by name. Lets a client pin and verify the server's tool surface (detects added/removed/renamed tools or changed argument schemas). |
TDQS
Scored across 32 tools
Several tools overlap substantially: get_cve_summary, lookup_cve, triage_cve, calculate_risk_score, and check_exploit_availability/check_poc_exists all retrieve or derive overlapping CVE intelligence. Descriptions help distinguish depth and orchestration level, but an agent still has multiple plausible choices for common tasks like 'tell me about this CVE' or 'find exploits'. Other areas, such as threat-intel lookups, are more clearly separated.
Most names use snake_case, but the verb conventions are mixed: check_*, get_*, lookup_*, scan_*, search_*, calculate_*, generate_*, compare_*, triage_*, estate_*, watch_*, and health_check. This is still readable, but the set does not follow a single predictable verb_noun pattern. The estate_* and watch_* prefixes are internally consistent but differ from the rest.
At 32 tools, the surface is heavy for a single MCP server and includes many overlapping CVE-enrichment and scanning entry points. While the security domain is broad, several tools could reasonably be consolidated or exposed as options on fewer tools. The count exceeds the typical well-scoped range and increases selection burden.
The server covers a strong CVE lifecycle: lookup, search, summary, triage, timeline, risk scoring, comparison, exploit discovery, advisories, EPSS, KEV, ATT&CK mapping, and estate scanning. Minor gaps exist around estate management, such as listing or removing watched packages and more explicit snapshot management, but core workflows are covered.