CVE Intel
Local security intelligence for vulnerability triage, written in native Rust.
Desktop app, CLI, MCP server and REST API in one executable. 32 tools, 25 data sources, private on-device AI.
Features · Install · Usage · Local AI · Data sources · Configuration · Citing
Overview
Security teams keep asking the same question about each new CVE: do we fix this now, or can it wait? Answering it usually means checking NVD, EPSS, CISA KEV, GitHub, Shodan and other sources by hand, one tab at a time.
CVE Intel queries every relevant public source in parallel and returns one prioritised, evidence-backed answer. Give it a CVE, IP address, file hash, domain or dependency list, and it tells you what the thing is, how risky it is, and whether to act now.
- Risk score from 0 to 100, combining severity, exploitation probability and active exploitation. Anything on the CISA KEV list is always CRITICAL.
- Private by default. A small llama.cpp model runs on your machine. OpenAI, Anthropic and Gemini are opt-in.
- Use it your way: desktop app, command line, REST API, or as an MCP server for AI agents in Claude Code, Cursor, VS Code, Claude Desktop, Windsurf and other clients. The desktop app can host the MCP server itself.
CVE Intel helps you decide what to patch. It does not scan your network or apply fixes, and results are only as current as the public sources.
Features
CVE Triage
One lookup across NVD, EPSS, CISA KEV and public exploit sources. The result includes the risk score, a plain recommendation and urgency, and the evidence behind it: CVSS, 30-day EPSS probability, KEV dates, public exploit repositories and the publish date. Deep triage also returns a CISA SSVC decision. The interface follows your system's light or dark theme.
Ask in plain language
Ask questions such as "Which is worse: CVE-2024-3400 or CVE-2023-44487?" CVE Intel runs the right lookups first, then the model explains the results. Each answer lists the tools it used, so you can check where the facts came from.
Compare and prioritise
Paste 2 to 10 CVE IDs to get a patch order based on score, KEV status and EPSS, not on CVSS alone.
Scan dependencies
Paste a requirements.txt, package.json, pom.xml or
name:ecosystem:version lines (for example from apk info -v or
dpkg -l). Each package is checked against OSV.dev, and known advisories
are listed per package.
Databases and data sources
See every upstream source: what it provides, whether it needs a key, whether your key is set, how long results are cached, and which tools use it. Press Check connectivity to probe all of them live. The view also shows the local cache, downloaded models and the llama.cpp runtime.
MCP server for AI agents
Give AI agents CVE Intel's 32 tools while they work. Start the server from the app, choose your agent, and copy setup steps with the correct address and executable path already filled in. Guides are included for Claude Code, Cursor, VS Code, Claude Desktop, Windsurf and any other MCP client.
- Two ways to connect. The agent can connect over HTTP to the server the app runs, or launch its own copy over stdio. The stdio option works even when the app is closed.
- Simple control. Start and stop the server, pick a port (8000 by default), and optionally start it whenever the app opens. The sidebar shows whether it is running.
- Local only. The server listens on
127.0.0.1and refuses requests from web pages, so websites and other computers cannot use it. - Uses your saved keys. Agents get the same data sources and API keys you configured in Settings.
Also included
- Quick Find (
⌘K): paste a CVE, IP, hash, domain, URL orpackage:ecosystem:versionand CVE Intel picks the right lookup. - IP, hash and domain intelligence from AbuseIPDB, GreyNoise, Shodan, VirusTotal, MalwareBazaar, crt.sh and more. Private and internal IPs are rejected before any lookup is made.
- Local Model view: install the runtime and download a model in one click.
- System view: health and version information.
Common uses
| Situation | What to do |
|---|---|
| A new CVE is in the news. Do we drop everything? | Ask "Should we patch CVE-2024-3400 this weekend?" or run cve-intel triage CVE-2024-3400 --depth deep. |
| A scanner reported 40 findings. Which come first? | Paste the IDs into Compare CVEs, or run cve-intel compare CVE-… CVE-…. |
| An unknown IP appears in firewall or login logs. | Use Quick Find, or run cve-intel ip 185.220.101.34. |
| EDR flags an unknown file. | cve-intel hash <sha256> checks MalwareBazaar, VirusTotal and CIRCL hashlookup. |
| Checking dependencies before a release. | Use Scan Dependencies, or run it in CI (see below). |
| You work in an AI coding tool. | Open MCP Server in the app, start the server and copy the setup steps for your agent. |
| You are new to vulnerability management. | Ask "Explain EPSS and CISA KEV like I'm new." |
Fail a CI build when a dependency has a known vulnerability:
cve-intel scan-deps requirements.txt | jq -e '.vulnerable_count == 0'
Get a machine-readable verdict for a ticket or dashboard:
cve-intel triage CVE-2024-3400 --depth deep --json | jq '.risk | {risk_score, risk_label, urgency}'
Install
Download a release
Download the file for your OS from the latest release. The desktop app, CLI, MCP server and REST API are all one executable, with nothing else to install.
| OS | File | How to run |
|---|---|---|
| Windows | CVE-Intel_<version>_windows-x64-setup.exe (or …-portable.exe) |
Run the installer, then open CVE Intel |
| macOS (Apple Silicon and Intel) | CVE-Intel_<version>_macos-universal.dmg |
Drag CVE Intel to Applications |
| Linux | CVE-Intel_<version>_linux-x64.AppImage (or .deb) |
chmod +x the file and run it |
Each file has a .sha256 checksum next to it. Builds are not code-signed
yet, so Windows SmartScreen and macOS Gatekeeper warn on first launch. On
macOS, right-click the app and choose Open.
Build from source
# Desktop app (debug) cargo build -p cve-intel-desktop ./target/debug/cve-intel-desktop # Installable bundle (.dmg / .exe / .AppImage) cargo install tauri-cli --version "^2" --locked cd apps/desktop/src-tauri && cargo tauri build # Headless binary only (servers, Docker) cargo build --release -p cve-server
Docker
Runs the headless MCP server over HTTP, plus the REST API:
docker build -t cve-intel .
docker run --rm -p 127.0.0.1:8000:8000 --env-file .env cve-intelUsage
Double-clicking the executable opens the desktop app. If you pass any argument, it runs as the CLI, MCP server or REST server instead.
# macOS "/Applications/CVE Intel.app/Contents/MacOS/cve-intel" triage CVE-2024-3400 # Linux ./CVE-Intel_<version>_linux-x64.AppImage triage CVE-2024-3400 # Windows (default per-user install) "%LOCALAPPDATA%\CVE Intel\cve-intel.exe" triage CVE-2024-3400
On Windows the executable is a windowed program, so the terminal does not wait for it. To see the output in order, use
start /wait "" "…\cve-intel.exe" triage CVE-2024-3400, or in PowerShell& "…\cve-intel.exe" … | Out-Host. MCP clients start it directly and are not affected.
CLI
cve-intel ask "Should we patch CVE-2021-44228?" --model qwen2.5-3b cve-intel triage CVE-2024-3400 --depth deep cve-intel quick-find 185.220.101.34 cve-intel scan-deps requirements.txt cve-intel compare CVE-2024-3400 CVE-2023-44487 cve-intel sources --probe # every data source, with live status
From a source checkout, replace cve-intel with cargo run -p cve-server --.
MCP server
MCP is an open protocol and works with many clients, not only Claude. The easiest setup is the MCP Server view in the desktop app (see MCP server for AI agents). To configure it by hand:
# HTTP: connect to the server started from the app, or from `cve-intel serve` claude mcp add --transport http cve-intel http://127.0.0.1:8000/mcp # stdio: the agent launches its own copy (macOS app path shown) claude mcp add cve-intel -- "/Applications/CVE Intel.app/Contents/MacOS/cve-intel" mcp # stdio, using the headless binary claude mcp add cve-intel -- /absolute/path/to/target/release/cve-intel mcp # Headless HTTP server: MCP at /mcp and REST at /api/v1 on 127.0.0.1:8000 cve-intel serve
Ready-made configs for Claude Code, Claude Desktop, Cursor and VS Code are in
examples/mcp/.
The server exposes 32 tools, resources (kev://catalog,
epss://scores/{cve_id}, manifest://tool-hash) and prompts
(patch_decision, compare_and_prioritize, dependency_triage). It never
registers a sampling handler or issues sampling/createMessage.
The server started from the app always binds to 127.0.0.1 and checks the
Host, Origin and Sec-Fetch-Site headers to refuse cross-site browser
requests, which protects against DNS rebinding. It has no sign-in, so any
program on the same computer can use it with your saved keys. Stop it when
you don't need it. cve-intel serve has no built-in authentication either:
keep it on loopback or behind your own authenticated reverse proxy.
Local AI
Small models are poor at calling tools on their own, so Ask works in three layers:
- Pre-routing. Before the model runs, CVE Intel detects the CVE IDs, IPs, hashes and domains in your question, runs the matching tools, and passes the results to the model as context it must rely on.
- Grounded generation. The model explains the evidence and can request more tools. It uses native llama.cpp tool calls, with a JSON-in-text fallback for very small models. If grammar-constrained output fails, the request is retried as plain grounded chat.
- No-model fallback. If no model is running, Ask returns the structured tool results, so the app is useful before any download finishes.
One-click setup, from the Local Model view or the CLI, installs the
official llama.cpp runtime into ~/.cve-intel/bin/ and downloads a GGUF
model into ~/.cve-intel/models/. The model server runs on 127.0.0.1 only.
| Model | Download | Min RAM | Notes |
|---|---|---|---|
| Qwen 2.5 1.5B Instruct (Q4_K_M) | ~1.0 GB | 4 GB | Fastest |
| Qwen 2.5 3B Instruct (Q4_K_M) | ~1.9 GB | 6 GB | Recommended default |
| Llama 3.2 1B Instruct (Q4_K_M) | ~0.8 GB | 4 GB | Smallest |
| Llama 3.2 3B Instruct (Q4_K_M) | ~2.0 GB | 6 GB | Strong chat |
| Qwen 2.5 7B Instruct (Q4_K_M) | ~4.7 GB | 10 GB | Optional upgrade |
Already running Ollama, LM Studio or your own llama-server? Set
CVE_LLM_BASE_URL to any OpenAI-compatible endpoint.
Cloud providers (opt-in)
For stronger answers, open Settings → AI provider, choose OpenAI, Anthropic or Google Gemini, pick a model and paste your API key. Save & use enables the provider and tests the key. You can switch back to the local model at any time.
| Provider | Default model | Environment variable |
|---|---|---|
| OpenAI | gpt-4o |
OPENAI_API_KEY |
| Anthropic | claude-sonnet-4-5 |
ANTHROPIC_API_KEY |
| Google Gemini | gemini-2.5-flash |
GEMINI_API_KEY |
The model field accepts any model ID your account can use. From the CLI:
cve-intel ask "Should we patch CVE-2024-3400?" --provider anthropic.
- Off by default. When a cloud provider is selected, each question and the lookup results gathered for it are sent to that vendor under their terms. The Ask view shows a banner while this is on.
- Keys stay local. Keys are stored in
~/.cve-intel/settings.dbwith owner-only permissions. They are never shown again in the UI and never logged. You can use environment variables instead. See SECURITY.md. - No vendor SDK. All three vendors offer an OpenAI-compatible chat API with tool calling. Anthropic describes its compatible endpoint as intended mainly for evaluation; for Claude-specific features, use CVE Intel through MCP in a Claude client.
- The REST
/api/v1/askendpoint uses only the local model (orCVE_LLM_BASE_URL), so a web page cannot spend your cloud key.
Data sources
The Databases view, cve-intel sources --probe, GET /api/v1/sources
and the MCP tool get_data_sources all describe the same 25 sources.
| Category | Sources |
|---|---|
| Vulnerability intelligence | NVD, EPSS (FIRST), CISA KEV, VulnCheck NVD++, MSRC, Red Hat, Ubuntu |
| Exploit intelligence | GitHub PoC search, Exploit-DB, Nuclei templates |
| Network intelligence | AbuseIPDB, GreyNoise, Shodan, crt.sh, CIRCL Passive DNS |
| Threat intelligence | VirusTotal, MalwareBazaar, ThreatFox, URLScan, Ransomwhere, CIRCL hashlookup |
| DevSecOps and reference | OSV.dev, GitHub Advisories, MITRE ATT&CK (STIX), HIBP Pwned Passwords |
Many tools need no API key at all: EPSS, KEV, OSV, CVSS, ATT&CK, crt.sh, Ransomwhere, hashlookup, Pwned Passwords, and NVD at a lower rate limit.
Risk score
Risk = CVSS×0.20 + EPSS×0.35 + KEV×0.30 + PoC×0.15 (boosters up to ×1.27, capped at 100)
- KEV override: a CVE in CISA KEV is confirmed exploited, so it is always CRITICAL with a score of at least 76.
- EPSS measures the probability of exploitation. CVSS is treated as severity, not likelihood.
--depth deepalso returns the SSVC v2 CISA Deployer decision:Act,Attend,Track*orTrack.- Bands: 0–25 LOW, 26–50 MEDIUM, 51–75 HIGH, 76–100 CRITICAL.
Configuration
API keys
Keys are optional. Each one unlocks more data or raises a rate limit. In the app, open Settings → Data source API keys, press Get a key to open the sign-up page, paste the key and press Save. The key is used on the next lookup, with no restart needed.
| Key | What it unlocks | Get it |
|---|---|---|
| NVD API key | 10× faster CVE lookups | nvd.nist.gov |
| GitHub token (no scopes) | Exploit search and advisories (5,000 instead of 60 requests/hour) | github.com/settings/tokens |
| VulnCheck token | Backup CVE data if NVD is down | vulncheck.com |
| AbuseIPDB key | IP abuse score | abuseipdb.com |
| GreyNoise key | Whether an IP is harmless background noise | docs.greynoise.io |
| Shodan key | Open ports and services on an IP | account.shodan.io |
| VirusTotal key | 70+ antivirus verdicts for a file hash | virustotal.com |
| URLScan key | Higher limits for URL checks | urlscan.io |
| abuse.ch Auth-Key | MalwareBazaar and ThreatFox lookups | auth.abuse.ch |
| CIRCL passive DNS login | Historical DNS records (access by request) | circl.lu |
From the command line:
cve-intel keys list # which keys are set and where from (never prints values) cve-intel keys links # where to get each key cve-intel keys set SHODAN_KEY # hidden prompt, keeps the key out of shell history echo "$KEY" | cve-intel keys set SHODAN_KEY # or pipe it in from a script cve-intel keys remove SHODAN_KEY
Keys are stored in ~/.cve-intel/settings.db with owner-only permissions
and shared by the app, CLI, MCP server and REST API on the same machine. A
key saved in the app takes precedence over an environment variable. Free
tiers and sign-up steps are set by each vendor, so check their pages.
Environment variables
For headless use, copy .env.example to .env. Everything
works without keys, with fewer results.
| Purpose | Variables |
|---|---|
| Data sources | NVD_API_KEY, GITHUB_TOKEN, VULNCHECK_TOKEN, ABUSEIPDB_KEY, VIRUSTOTAL_KEY, SHODAN_KEY, GREYNOISE_API_KEY, URLSCAN_KEY, CIRCL_PDNS_USER, CIRCL_PDNS_PASS, ABUSECH_AUTH_KEY |
| Cloud AI | OPENAI_API_KEY, ANTHROPIC_API_KEY, GEMINI_API_KEY |
| Local AI | CVE_LLM_BASE_URL, LLAMA_SERVER_BIN |
| Storage and server | CACHE_DB_PATH, CVE_INTEL_HOME, HOST, PORT |
Architecture
crates/cve-core Harness-agnostic engine: 25 source clients, risk scorer,
SSVC, CVSS, validators, SQLite cache, settings DB and
activity log, source catalog, llama.cpp manager,
cloud-provider settings and the Ask agent. No MCP,
Tauri or CLI types.
crates/cve-server The cve-intel binary: MCP (stdio and streamable HTTP),
REST (/api/v1) and the CLI, as thin adapters over cve-core.
apps/desktop Tauri app linking cve-core and cve-server natively. The
same executable runs the GUI, the CLI and the MCP server,
and can host MCP over HTTP in-process. llama-server is
the only child process.
examples/mcp Client configs for common MCP clients.
Privacy and security
- All network traffic is outbound HTTPS to the data sources, plus model downloads you start and the cloud AI provider you opt in to.
- API keys are never logged, cached, shown in the UI or returned by any tool.
- Private and reserved IPs are rejected before any network lookup.
- The local model server and the app's MCP server bind to loopback only.
- SQLite files are created on first use:
cache.db, a disposable lookup cache, and~/.cve-intel/settings.db, which holds keys and provider settings. Clearing the cache never touches your settings. - The desktop app keeps an activity log in
~/.cve-intel/activity.db(owner-only). It records what you look up and ask, the answers, setting and model changes, the tools agents call through the app's MCP server, and which hosts each action contacted. API keys are never recorded, only key names. Upstream requests are stored as host and path, without query strings. Open Activity to search it, pause it or clear it. It keeps the latest 20,000 entries. The CLI andcve-intel mcprecord nothing.
Development
cargo test -p cve-core -p cve-server # scorer, SSVC, CVSS, validators, cache, parsers, agent routing, source catalog cargo build --release # cve-intel and the desktop binary
Citing and attribution
Citing results in a report or ticket
CVE Intel gathers facts from public sources; it is not the source. When you record a decision, cite the primary source and the retrieval date, not the app or the AI's wording:
Example (illustrative values): CVE-2021-44228: CVSS 10.0 (NVD); listed in CISA KEV, added 2021-12-10 (CISA); EPSS 0.94 as of 2026-10-18 (FIRST). Retrieved 2026-10-18 with CVE Intel 0.3.0, scoring v1.0.
- Scores change. EPSS updates daily, KEV grows and NVD entries are revised. Results are cached for minutes to hours, and up to a day for some feeds. The Databases view shows each source's cache time.
- The risk score is CVE Intel's own. Cite it as "CVE Intel risk score
(scoring v1.0)" alongside the underlying CVSS, EPSS and KEV values.
cve-intel healthand the System view show the version. - An AI answer is not evidence. Local or cloud, a model can be wrong. Cite the data shown beside the answer and verify it against the source.
Citing this software
@software{cve_intel, title = {CVE Intel: local security intelligence for CVE triage}, author = {{CVE Intel contributors}}, year = {2026}, version = {0.3.0}, url = {https://github.com/Fazmin/cve-intel}, license = {MIT}, note = {Native Rust desktop app, CLI, MCP server and REST API} }
Use the version you ran (cve-intel --version).
Data source terms
CVE Intel only queries these services. It does not own or republish their data, and their terms apply to anything you copy out of the app. Check each provider's current terms, especially before commercial use. This is not legal advice.
| Source | Credit and terms |
|---|---|
| NVD (NIST) | Products using the NVD API should state: "This product uses data from the NVD API but is not endorsed or certified by the NVD." See the terms of use. |
| EPSS (FIRST) | Attribute FIRST and link first.org/epss. |
| CVSS (FIRST) | first.org/cvss |
| CISA KEV | Credit CISA: Known Exploited Vulnerabilities Catalog. |
| SSVC | CERT/CC and CISA: github.com/CERTCC/SSVC |
| MITRE ATT&CK® | Registered trademark of The MITRE Corporation. See the terms of use. |
| OSV.dev, GitHub Advisory Database | Attribution varies by database; the GitHub Advisory Database is CC BY 4.0. See osv.dev and github.com/advisories. |
| abuse.ch (MalwareBazaar, ThreatFox) | Community data; see abuse.ch. |
| Others | VirusTotal, Shodan, AbuseIPDB, GreyNoise, URLScan, VulnCheck, CIRCL, Red Hat, Ubuntu, Microsoft MSRC, crt.sh, Exploit-DB, Ransomwhere and HIBP each have their own terms and rate limits. Free tiers are often limited to non-commercial use. |
Local AI models are not part of this project and carry their own
licences, such as the Llama 3.2 Community License and size-dependent Qwen
licences. Read the model's page before commercial use. Model files come from
the official Hugging Face repositories listed in
crates/cve-core/src/llm.rs. The runtime is
llama.cpp (MIT).
Community
- CONTRIBUTING.md: development setup and pull request guidelines
- CODE_OF_CONDUCT.md: community standards
- SECURITY.md: reporting a vulnerability privately
License
MIT. See LICENSE.






