Vulnerability Exposure

io.github.MRFrazer25由 GitHub 帳號 MRFrazer25 發布v1.2.0更新於 Nov 3, 2026

Confirmed vulnerabilities and exposure for IPs, domains and software versions (NVD, CISA KEV, EPSS)

概覽

AI 產生的概覽

針對公網 IP、網域、CVE 與軟體版本,依據 NVD、CISA KEV、EPSS 及信譽資料來源查核已確認的漏洞與暴露面。

可以做什麼
  • 對 IP、網域、CVE 或軟體版本啟動有引導的調查,自動執行基線查詢並回傳調查 ID
  • 判斷特定產品版本、鎖定檔或 SBOM 是否受某個 CVE 影響,以及升級能修掉哪些問題
  • 查詢單筆 CVE 記錄、以關鍵字搜尋 NVD,並用 CVE 編號或產品名稱比對 CISA 已知遭利用漏洞清單
  • 解析網域的 DNS 記錄、從憑證日誌列出子網域、查出 IP 所屬網路的註冊單位
  • 取得 Shodan 的主機暴露資訊,以及 VirusTotal、AbuseIPDB、Spamhaus、GreyNoise 的信譽結果
  • 維護本機軟體關注清單並只回報變化,還能把草稿報告與已蒐集的資料核對
適用情境
適合需要依證據判斷某個軟體版本、IP 或網域是否有暴露風險,或決定修補優先順序的情境。可用於防禦性安全工作、修補排查,以及向非技術人員說明某個 CVE;CVE 與軟體檢查不需任何 API 金鑰即可使用。
執行需求
以 Python 套件形式透過 stdio 在本機執行(需 Python 3.11+),用 uvx 或 pip 啟動;僅支援桌面用戶端,因為並未提供託管服務。可選的免費金鑰透過環境變數 SHODAN_API_KEY、VIRUSTOTAL_API_KEY、ABUSEIPDB_API_KEY、NVD_API_KEY、GREYNOISE_API_KEY 提供,或存進作業系統的憑證儲存區。需要連線至公開資料來源的網路存取。
安裝前請注意
查詢目標會傳送給第三方資料提供者,對方可見被查詢的值與你的 IP 位址,且各家條款直接約束你的帳號。金鑰從環境變數或憑證儲存區讀取,應透過用戶端的 env 區塊傳入而非命令列。工具結果含不可信的第三方文字,建議使用會顯示工具呼叫的用戶端。它不會掃描或變更目標,自動結論可能有誤,行動前請先核實;僅評估你擁有或獲授權的系統。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Vulnerability Exposure,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

Vulnerability Exposure MCP

[Tests] [PyPI version] [Python versions] [License: MIT] [vulnerability-exposure-mcp MCP server – quality and maintenance score on Glama] [Add to Cursor] [Install in VS Code]

An MCP server that checks public IPs, domains, CVEs and software versions for confirmed vulnerabilities and exposure. A CVE only counts as affecting a version when NVD's version ranges confirm it; everything else is listed for review, so related or vendor-wide CVEs are never reported as yours.

It's the MCP version of Vulnerability Exposure Analyzer. The app needs a Cohere key to run its own agent; this one doesn't need any LLM key, because the model in your MCP client calls the tools and writes the report.

It runs locally over stdio, so it works with clients that launch local MCP servers: Claude Desktop, Claude Code, Codex, Cursor, Antigravity, Windsurf, VS Code, LM Studio and similar. Web-only clients such as ChatGPT on the web and claude.ai connectors only accept remote (HTTPS) servers; this server is not hosted, because a public deployment would need its own authentication to keep your API keys from being used by anyone.

Give it a public IP, a domain, a CVE ID (CVE-2026-111497), a product and version (PHP 8.3.10, OpenSSH 8.9p1 Ubuntu-3ubuntu0.6), or your project's lockfile or SBOM, and it pulls evidence from NVD, CISA KEV, FIRST EPSS, Exploit-DB, OSV.dev, Shodan, VirusTotal, AbuseIPDB, Spamhaus, GreyNoise, SANS ISC, the internet registries and certificate transparency logs.

[Claude running "Run a security assessment of PHP 8.3.10" with this server: 7 tool calls, a report that passed check_report, an executive summary and a key findings table]

[The same report's confirmed CVEs for PHP 8.3.10, highest EPSS first, with severity, CISA KEV status and fix versions]

Install

Requires Python 3.11+. Setup is three steps: install, optionally store your keys, connect your AI client.

The simplest way is uv, which runs the server straight from PyPI with nothing to set up:

bash
uvx vulnerability-exposure-mcp keys status

Or install it with pip (pip install vulnerability-exposure-mcp) and use the vulnerability-exposure-mcp command the same way. To run from source instead, see From source below.

Free keys: Shodan, VirusTotal, AbuseIPDB, NVD (optional, raises the rate limit), GreyNoise (optional; GreyNoise only gives keys to accounts made with a work email, not Gmail or similar. Without one it allows a limited number of lookups, and SANS ISC covers the rest). CVE and software checks work with no keys at all. IP and domain checks also run without keys, using Shodan's free InternetDB, the internet registries, Spamhaus DROP and GreyNoise; the report then lists VirusTotal and AbuseIPDB as not checked.

Then ask: "Run a security assessment of PHP 8.3.10" or use the security_assessment prompt. Examples has more to try.

Store your keys securely

Keys can live in your operating system's credential store (Windows Credential Manager, macOS Keychain, or the Secret Service on Linux) instead of a config file. Run this in your own terminal; the key is typed into a hidden prompt and goes straight to the store:

bash
uvx vulnerability-exposure-mcp keys set shodan

Do the same for virustotal, abuseipdb, nvd and greynoise as needed. keys status shows which are stored (never their values) and keys delete NAME removes one. With keys stored this way, leave the env block below empty. An environment variable, if set, takes precedence over a stored key.

Servers, Docker containers and other headless Linux systems usually have no credential store. There keys set says so, and keys go in the env block instead.

Connect a client

Pass keys through the client's env block, not the command line.

Claude Desktop

Download vulnerability-exposure-mcp-<version>.mcpb from the latest release and open it: Claude Desktop installs it and asks for your (optional) keys in a form. Or add the JSON config below. From 1.1.0 each bundle has a signed build provenance attestation, so you can check it was built by this repository's release workflow: gh attestation verify vulnerability-exposure-mcp-<version>.mcpb --repo MRFrazer25/Vulnerability-Exposure-MCP.

Claude Code

Store your keys first (see above), so none go on the command line, then run:

bash
claude mcp add vulnerability-exposure -- uvx vulnerability-exposure-mcp

Start a new Claude Code session afterwards: MCP servers load when a session starts.

Or install it as a plugin, which asks for each (optional) key in a masked prompt and keeps it in your credential store:

/plugin marketplace add MRFrazer25/Vulnerability-Exposure-MCP/plugin install vulnerability-exposure@vulnerability-exposure

Codex (CLI, IDE extension and ChatGPT desktop app)

Store your keys first (see above), so none go on the command line, then run:

bash
codex mcp add vulnerability-exposure -- uvx vulnerability-exposure-mcp

Or add it to ~/.codex/config.toml, which all three share:

toml
[mcp_servers.vulnerability-exposure]command = "uvx"args = ["vulnerability-exposure-mcp"]

Antigravity CLI

Store your keys first (see above), then install the plugin straight from this repo:

bash
agy plugin install https://github.com/MRFrazer25/Vulnerability-Exposure-MCP/tree/main/plugin

Cursor, Windsurf, VS Code, Claude Desktop and other JSON-configured clients

Add this to the client's MCP config (in Claude Desktop: Settings → Developer → Edit Config), then restart the client. With keys stored in the credential store, leave the env values empty or remove the block.

json
{  "mcpServers": {    "vulnerability-exposure": {      "command": "uvx",      "args": ["vulnerability-exposure-mcp"],      "env": {        "SHODAN_API_KEY": "",        "VIRUSTOTAL_API_KEY": "",        "ABUSEIPDB_API_KEY": "",        "NVD_API_KEY": "",        "GREYNOISE_API_KEY": ""      }    }  }}

(VS Code uses "servers" instead of "mcpServers" in .vscode/mcp.json.)

Docker

Build the image once with docker build -t vulnerability-exposure-mcp ., then point the client at it. Containers have no credential store, so keys go in env; listing them as bare -e names passes their values through without putting them on the command line:

json
{  "mcpServers": {    "vulnerability-exposure": {      "command": "docker",      "args": ["run", "-i", "--rm", "-e", "SHODAN_API_KEY", "-e", "VIRUSTOTAL_API_KEY", "-e", "ABUSEIPDB_API_KEY",               "-e", "NVD_API_KEY", "-e", "GREYNOISE_API_KEY", "vulnerability-exposure-mcp"],      "env": {        "SHODAN_API_KEY": "",        "VIRUSTOTAL_API_KEY": "",        "ABUSEIPDB_API_KEY": "",        "NVD_API_KEY": "",        "GREYNOISE_API_KEY": ""      }    }  }}

From source

bash
git clone https://github.com/MRFrazer25/Vulnerability-Exposure-MCP.gitcd Vulnerability-Exposure-MCPpython -m venv .venv.venv/Scripts/python -m pip install -e .   # macOS/Linux: .venv/bin/python

Then use .venv/Scripts/python -m vulnerability_exposure_mcp (on macOS or Linux, .venv/bin/python) wherever the steps above say uvx vulnerability-exposure-mcp, with the full path to that Python in client configs, for example "command": "C:/path/to/Vulnerability-Exposure-MCP/.venv/Scripts/python.exe", "args": ["-m", "vulnerability_exposure_mcp"].

It keeps everything that makes the original app's reports reliable:

  • The same analyst rules as the app's system prompt. The server's instructions are a short summary, since clients cut long ones short; investigate_target returns the full rules and report format as analyst_guide.
  • Baseline lookups run in code, so reputation and exposure checks never depend on the model remembering them.
  • Analysis depth (Quick Scan, Standard, Comprehensive, Expert) sets the tool-call budget, per-service caps and how much detail each result keeps. The model can't override these limits.
  • Key facts computed from the data, not the model, including the CISA KEV split into confirmed for this target and related, so the numbers are the same whichever model runs it.
  • Fresher and more accurate than NVD alone: Ubuntu and Debian packages are checked against the distro's own fix data, so backported fixes count; recent CVEs NVD hasn't analysed are listed for review; and for packages such as Next.js, React and Django, GitHub advisories fill gaps before NVD has them. Each CVE carries its patch status and whether exploit code is published.
  • One investigation per investigation_id: a random handle returned by investigate_target, so several chats sharing one server process never mix evidence.

How this differs

Most CVE servers search NVD by keyword or product and hand back every match, so a report on nginx 1.30.0 can list CVEs that were fixed years earlier. This one:

  • Checks the exact version. A CVE is confirmed only when NVD's version ranges include that version, and for an Ubuntu or Debian package, CVEs the distro fixed by backport are ruled out. Keyword and product-level matches are listed separately as related.
  • Sets aside what isn't the product's. Plugin CVEs (Jenkins plugins), other products that share the name (Nginx Proxy Manager, Grafana Alloy) and CVEs NVD confirms only on another OS (PHP on Windows, for a Linux build) are listed separately instead of being counted against it.
  • Combines the context a fix decision needs. One call returns CISA KEV status and ransomware use, EPSS and whether it's rising, the minimum safe version (and how far your current major version gets), end-of-life status, published exploits and patch status, instead of the model stitching together separate lookups.
  • Checks the report, not just the data. check_report flags a draft that cites a CVE, version or host name no tool returned, calls a related CVE confirmed, swaps an affected and an unaffected version, or gets a fix version, count, KEV, port, reputation or exploit claim wrong, before you see it.
  • Says what it didn't check. Every report lists the sources that weren't checked (a missing key, a failed lookup), so a missing result is never presented as a clean one.

What it doesn't do

  • No scanning. It never connects to the target. Everything comes from public databases and the target's DNS records, so it can't find services that Shodan hasn't seen or vulnerabilities in software it isn't told about.
  • Public targets only. Private, local and reserved IPs and local hostnames are refused.
  • No authenticated or internal checks. It can't see installed packages, configuration or anything behind a login. For that, use a scanner on the host.
  • No exploitation or remediation. It reports what's published about a target and what to upgrade to. It doesn't test exploits or change anything.
  • It's only as current as its sources. CVEs that NVD hasn't analysed yet can't be version-confirmed; they're listed for review instead.

Examples

Ask your AI client in plain words; it picks the tools. Some things to try:

AskWhat you get
"Does CVE-2024-6387 affect my server running OpenSSH_8.9p1 Ubuntu-3ubuntu0.6?"AFFECTED, NOT_AFFECTED or CAN'T CONFIRM, using Ubuntu's own fix data, and the exact package to update to
"Check C:\path\to\project\package-lock.json for vulnerable packages and tell me what to upgrade first."Every pinned package checked in one OSV.dev call, the most urgent first, with the version that fixes each, and any package that's published malware flagged to remove. Works with a pinned requirements.txt or a CycloneDX SBOM too
"I'm on nginx 1.24.0. What would upgrading to 1.27.3 fix, and what would still be open?"The CVEs the upgrade fixes, the ones it leaves, and any it adds
"My site returns Server: Apache/2.4.49 (Unix) OpenSSL/1.1.1k. Am I at risk?"Both products checked, exploited CVEs and ransomware use first
"What got added to CISA's exploited list this week? Does any of it touch Fortinet?"New CISA KEV entries with CISA's required action, ransomware use and EPSS
"Explain CVE-2021-44228 for my manager: how bad is it, and what does CISA say to do?"The CVSS score in plain words, CISA's SSVC values and its required action, quoted
"Run a security assessment of PHP 8.1.2."A full report with end-of-life status and a remediation checklist, checked by check_report
"Add nginx 1.24.0 and PHP 8.1.2 to my watchlist." Later: "Check my watchlist. What's new?"Only what changed since the last check: new CVEs, new KEV entries, EPSS jumps
"Am I affected? Windows 10 19045.4046." or "Exchange Server 2019 CU12"The build or cumulative update mapped to what NVD files it under, with end-of-life status and CISA KEV CVEs first
"Investigate 8.8.8.8."Open ports, network owner, reputation and threat lists, with what wasn't checked

Each answer says where every fact came from, and says "can't confirm" or "not checked" rather than calling something safe when the data doesn't show it.

Tools

ToolWhat it doesKey needed
investigate_targetStart here. Classifies the target, sets the depth, runs the baseline lookups, returns an investigation_id and next stepsdepends on target
am_i_affectedIs my software affected? Give the products and versions you run (typed, or pasted from a banner or Server header), a lockfile (pinned requirements.txt, package-lock.json) or a CycloneDX SBOM, optionally with one CVE ID. Each gets AFFECTED, NOT_AFFECTED or CAN'T CONFIRM with what decided it, uses Ubuntu and Debian backport data for package builds, and nginx 1.24.0 -> 1.26.2 shows what an upgrade fixesnone (NVD key optional)
watchlistKeep an eye on your software. Add the products and versions you run once; check reports only what changed since last time: newly confirmed CVEs, CVEs newly in CISA KEV, EPSS jumps. Kept in a file on your machinenone (NVD key optional)
newly_exploitedWhat got exploited this week? CVEs CISA added to its Known Exploited Vulnerabilities catalog in the last few days (up to 90), optionally only for products you name, with CISA's required action, known ransomware use and EPSSnone
version_specific_vulnerability_checkCVEs NVD confirms affect this exact version, ranked by KEV, EPSS and CVSS, with each one's patch status, any published exploit (Exploit-DB), the minimum safe version and whether the release line is end-of-life (endoflife.date). CVEs NVD hasn't analysed yet are confirmed from the vendor's own CVE record (CVE.org) when it covers this version. For packages such as Next.js, React, Express and Django it also adds GitHub advisories NVD doesn't have yetnone (NVD key optional)
distro_patch_checkWhether an Ubuntu or Debian package (e.g. openssh 8.9p1-3ubuntu0.6 from an SSH banner) already has each CVE fixed by a backport, from the distro's own datanone
nvd_lookupFull NVD record for one CVE, with KEV, EPSS, the CVSS vector in plain words and CISA's SSVC values (exploitation, automatable, technical impact)none
cisa_kev_checkCVE IDs or product names against CISA's Known Exploited Vulnerabilitiesnone
cve_searchKeyword search of recent NVD CVEsnone
resolve_domainDNS A/AAAA lookupnone
shodan_searchOpen ports, services, versions, hosting. Without a key: Shodan's free InternetDB (ports, software and CVEs, no banners)SHODAN_API_KEY for full results
ip_ownerWho an IP's network is registered to, from the regional internet registry (RDAP)none
threat_lists_checkSpamhaus DROP (hijacked or criminal networks) and GreyNoise (internet scanners), with SANS ISC as the fallback when GreyNoise can't answernone (GREYNOISE_API_KEY optional)
subdomainsHostnames under a domain from certificate transparency logs (crt.sh, or Cert Spotter as a fallback)none
virustotal_checkReputation from VirusTotal enginesVIRUSTOTAL_API_KEY
abuseipdb_checkAbuse reports and confidence scoreABUSEIPDB_API_KEY
get_key_factsFacts, the CISA KEV confirmed/related split, a remediation checklist in priority order and the sources used (with when each was queried), computed from this investigation's resultsnone
check_reportChecks a draft report against the investigation's data, with no model involved, and lists CVE IDs, versions, EPSS figures and claims (end-of-life, no patch, internet-facing) that no lookup supportsnone
check_api_keysWhich keys are set (never their values) and where to get the restnone

There's also a security_assessment prompt (target + depth) that loads the analyst rules and the workflow: investigate_target → pass its investigation_id to each lookup → get_key_facts → draft the report → check_report → fix what it flags. Lookups also work on their own without an id: they get Standard result sizes and the hourly cap below, but no tool-call budget, and they aren't counted in any investigation's key facts.

DepthTool callsCalls per Shodan/VirusTotal/AbuseIPDB
Quick Scan81
Standard Analysis (default)152
Comprehensive Investigation254
Expert Deep Dive406

Every tool is read-only except watchlist, which only writes its own file in your config folder. Private, reserved and cloud-metadata IPs are refused.

What each tool sends, and where

No tool ever contacts the target. Every lookup asks a public data source about the target, so the target's own servers never see a request from you. Those services do see what you looked up and your IP address (and your key, if you use one).

ToolWhat it sendsSent to
resolve_domainThe domainYour normal DNS resolver
shodan_searchThe IPShodan with a key, or Shodan InternetDB without one
virustotal_checkThe IP or domainVirusTotal
abuseipdb_checkThe IPAbuseIPDB
ip_ownerThe IPIANA, then the regional internet registry (RDAP)
threat_lists_checkThe IPGreyNoise, or SANS ISC when GreyNoise can't answer. Spamhaus DROP is downloaded whole, so the IP isn't sent to Spamhaus
subdomainsThe domaincrt.sh, or Cert Spotter when crt.sh is down
am_i_affectedEach product name and version, and the CVE ID if given. For a lockfile or SBOM, each pinned package's name and version (never the file)NVD for products; OSV.dev for packages, lockfiles, SBOMs and distro builds
watchlistcheck sends what am_i_affected does, for each entry; add, remove and list send nothingNVD, OSV.dev, as am_i_affected
newly_exploitedNothing (the KEV catalog is downloaded whole)CISA
version_specific_vulnerability_checkThe software name and version (plus the product name to endoflife.date, and CVE IDs to CVE.org for CVEs NVD hasn't analysed)NVD, plus OSV.dev for framework packages such as Next.js or Django
distro_patch_checkThe package name and versionOSV.dev
nvd_lookup, cve_searchA CVE ID or search termNVD (Shodan CVEDB if NVD is down), and the CVE ID to CVE.org for CISA's SSVC values
CVE enrichment inside the tools aboveCVE IDs onlyFIRST (EPSS). The CISA KEV catalog and the Exploit-DB index are downloaded whole, so nothing is sent to them
investigate_targetRuns the lookups that fit the target, as above
get_key_facts, check_report, check_api_keysNothingRun on your machine

Check your watchlist on a schedule

The watch command (1.2.0 and later; uvx fetches the newest release) checks the watchlist and prints what changed, so your operating system's scheduler can run it daily with no server. Add entries first, from your AI client ("add nginx 1.24.0 to my watchlist"). The list is a file in your config folder (%APPDATA%\vulnerability-exposure-mcp\watchlist.json on Windows, ~/Library/Application Support/... on macOS, ~/.config/... on Linux).

bash
uvx vulnerability-exposure-mcp watch          # check now and print what changeduvx vulnerability-exposure-mcp watch list     # show the entries
  • Windows (Task Scheduler): schtasks /Create /SC DAILY /ST 09:00 /TN "Vulnerability watchlist" /TR "cmd /c uvx vulnerability-exposure-mcp watch >> %USERPROFILE%\vuln-watch.log"
  • Linux (cron): 0 9 * * * uvx vulnerability-exposure-mcp watch >> ~/vuln-watch.log 2>&1
  • macOS: the same cron line, or a launchd agent that runs the same command.

With the disk cache on (VULN_EXPOSURE_CACHE=on), repeat checks are faster and use less of NVD's rate limit.

Settings

VariableDefaultMeaning
VULN_EXPOSURE_QUOTA_PER_HOUR20Max calls per hour to each of Shodan, VirusTotal and AbuseIPDB across all investigations, on top of the per-depth caps
VULN_EXPOSURE_LOG_LEVELWARNINGLog level (logs go to stderr)
VULN_EXPOSURE_CACHEoffon keeps public data-source responses (NVD, CISA KEV, EPSS, Exploit-DB, CVE.org, endoflife.date, OSV advisories) on disk for a few hours, so repeat checks are much faster (a Jenkins check: 4 s, then 0.7 s) and use less of NVD's rate limit. Never stores keys or results, and each file is signed with a key in your OS credential store, so an edited file is fetched again instead of trusted. vulnerability-exposure-mcp cache status and cache clear show and empty it
VULN_EXPOSURE_WATCHLISTyour user config folderWhere the watchlist file lives
VULN_EXPOSURE_CACHE_DIRyour user cache folderWhere the disk cache lives (default: %LOCALAPPDATA%\vulnerability-exposure-mcp on Windows, ~/Library/Caches/... on macOS, ~/.cache/... on Linux)

Repeating an identical call in the same investigation returns the earlier result without spending quota. Large results are trimmed to about 15,000 characters.

Security notes

  • Tool results contain third-party text (banners, hostnames, CVE descriptions). They're returned as data, the server's instructions tell the model never to follow instructions found in them, and instruction-like text in banners, hostnames and registry records is replaced with [instruction-like text removed] before the model sees it. Still, use a client that shows you tool calls.
  • check_report checks a draft report against the investigation's data in code, and lists IDs, versions, EPSS figures and claims no lookup supports.
  • To be alerted if any MCP server's tool descriptions change after you approve them (tool poisoning), you can run it behind Trail of Bits' mcp-context-protector.
  • Keys are read from the environment or the OS credential store on each call, never logged, and redacted from error messages. Targets are not logged either, and failures are logged without tracebacks.
  • Failed lookups are returned as tool errors (isError), and every tool is marked read-only.
  • The server speaks stdio only, so it runs on your machine and only your client can reach it.
  • Nothing is stored on disk unless you turn on the disk cache (VULN_EXPOSURE_CACHE=on), which keeps only public data-source responses, never keys or results. There's no telemetry. Targets are sent only to the data provider each lookup uses; see PRIVACY.md for what each one receives.
  • Lockfiles and SBOMs given to am_i_affected are untrusted input: files over 5 MB, JSON nested more than 64 levels and more than 5,000 packages are refused before parsing, a path is read only when it names a lockfile or SBOM, and only package names and versions are sent anywhere.
  • Every push and pull request runs the tests, pip-audit against known-vulnerable dependencies, and gitleaks over the whole history so no key is ever committed. Dependencies are pinned and updated by Dependabot. See SECURITY.md to report a problem.

Responsible use

For legitimate security research, defensive security and education only. Only investigate systems you own or are authorized to assess, and follow each data provider's terms of service. Automated findings can be wrong; verify before acting.

Data sources and terms

Lookups use your own accounts and keys, so each provider's terms apply to you directly.

SourceUsed forTerms to know
ShodanOpen ports, services, versionsUses your own Shodan account and key. Without one, InternetDB is free for non-commercial use
Regional internet registries (RDAP)Who an IP's network is registered toPublic registry data, found through IANA's RDAP bootstrap
Spamhaus DROPHijacked or criminal networksFree; credit Spamhaus when you use it. Downloaded at most once a day, as Spamhaus asks
GreyNoiseInternet scanners and known business servicesCommunity API: a limited number of lookups without a key (GreyNoise sets and changes the limit); keys need a work-email account
crt.sh, Cert SpotterSubdomains from certificate transparency logsFree public search; Cert Spotter allows a few keyless lookups an hour for personal use
Shodan CVEDBCVE details when NVD can't be reachedFree for non-commercial use
SANS ISC (DShield)Attack reports for an IP when GreyNoise can't answerFree and keyless; data is CC BY-NC-SA 4.0 (non-commercial), and SANS asks for contact details in the user agent
Exploit-DBWhether exploit code is published for a CVEIts index is downloaded at most once a day; GPL-2.0-or-later
GitHub Advisory Database and the PyPA Advisory Database via OSV.devAdvisories for npm, PyPI, Maven and RubyGems packages before NVD has themFree, no key; data is CC BY 4.0
VirusTotalReputation from security enginesThe free public API allows 4 lookups a minute and 500 a day, and must not be used in commercial products or services
AbuseIPDBAbuse reports for IPsFree plans are for non-commercial personal projects; don't republish its data
NVD (NIST)CVE details and affected versionsPublic data; free API key optional
CISA KEVKnown exploited vulnerabilitiesPublic US government data
FIRST EPSSExploitation probabilityPublished freely by FIRST's EPSS SIG
CVE.org (CVE Program)The vendor's own affected versions for CVEs NVD hasn't analysed, and CISA's SSVC valuesPublic CVE records; free, no key
endoflife.dateWhether a release line still gets fixesFree, no key; community-maintained, MIT licensed
OSV.devUbuntu and Debian fixes for installed packages, and every package in a lockfile or SBOM (npm, PyPI, Maven, Go, crates.io, NuGet and more)Free, no key. OSV.dev gathers advisories from each project's own database: the distros' security teams (Ubuntu's is CC BY-SA 4.0; Debian's security tracker), the GitHub, PyPA, Go and RustSec databases, and OpenSSF Malicious Packages for the malware flag

Several free tiers are for non-commercial use only: VirusTotal, AbuseIPDB, and Shodan's InternetDB and CVEDB. If you use this at work or in a paid product, get plans that allow commercial use.

This product uses data from the NVD API but is not endorsed or certified by the NVD.

Spamhaus DROP data is (c) The Spamhaus Project. Package advisories are from the GitHub Advisory Database (CC BY 4.0), the PyPA Advisory Database (CC BY 4.0), the Go Vulnerability Database (CC BY 4.0), the RustSec Advisory Database (CC0, with advisories adapted from GitHub's under CC BY 4.0), OpenSSF Malicious Packages (Apache-2.0), Debian's security tracker and Ubuntu's security notices (CC BY-SA 4.0, (c) Canonical), all via OSV.dev; SANS ISC data is CC BY-NC-SA 4.0. CVE® is a registered trademark of The MITRE Corporation.

Vulnerability Exposure MCP is an independent project. It is not affiliated with, endorsed by or sponsored by Shodan, VirusTotal (Google), AbuseIPDB, NIST, CISA, FIRST, MITRE, Spamhaus, GreyNoise, SANS, OffSec (Exploit-DB), GitHub, Google (OSV.dev and the Go team), the RustSec project, the OpenSSF, Debian, Canonical, endoflife.date, Sectigo (crt.sh), SSLMate (Cert Spotter) or the internet registries. Their names are used only to say which services it works with.

Tests

bash
.venv/Scripts/python -m pip install -e ".[dev]".venv/Scripts/python -m pytest -q

License

MIT

來源:README.md,提交 ee9f041

工具

19

investigate_target

Investigate target

Start here. Classifies the target (public IP, domain or URL, CVE ID, or "software version" such as "nginx 1.20.1") and runs the baseline lookups in code: Shodan, VirusTotal, AbuseIPDB, the registry owner and the keyless threat lists for an IP; DNS, VirusTotal, and the same IP checks for a domain's primary IP. Returns an investigation_id to pass to every other tool, the baseline results and next_steps. depth sets the tool-call budget and detail: "Quick Scan" (8 calls), "Standard Analysis" (15), "Comprehensive Investigation" (25), "Expert Deep Dive" (40). Private, reserved and cloud-metadata IPs are refused.

輸入參數depthtarget必填

resolve_domain

Resolve domain (DNS)

Resolve a domain to its public IPv4/IPv6 addresses. Already run for a domain target; use it for other domains you discover.

輸入參數domain必填investigation_id

virustotal_check

VirusTotal reputation

VirusTotal reputation: how many security engines flag the IP/domain as malicious or suspicious. Needs VIRUSTOTAL_API_KEY.

輸入參數target必填target_type必填investigation_id

abuseipdb_check

AbuseIPDB reports

AbuseIPDB abuse reports and confidence score for a public IP address (not domains). Needs ABUSEIPDB_API_KEY.

輸入參數ip_address必填investigation_id

version_specific_vulnerability_check

Version vulnerability check

Best tool for software risk. Finds CVEs whose NVD CPE data confirms they affect this exact product version, ranks them by CISA KEV status, EPSS and CVSS, gives each one's patch status and the minimum safe version, and reports CVEs ruled out. Use for every product with a known version (e.g. from Shodan). software_name e.g. 'nginx', 'Apache httpd', 'OpenSSH'; version e.g. '1.20.1' or '8.9p1' (omit only if unknown).

輸入參數versionsoftware_name必填investigation_id

am_i_affected

Am I affected?

Is my software affected? Give the products and versions you run (typed, or pasted from a banner or Server header), a lockfile (pinned requirements.txt, package-lock.json) or a CycloneDX SBOM. With cve_id, answers whether that one CVE (e.g. one in the news) affects each of them; without it, lists the confirmed CVEs for each. Every product gets AFFECTED, NOT_AFFECTED or CANT_CONFIRM with the NVD range, package advisory or distro fix that decided it. Lockfile and SBOM packages are checked in one OSV.dev batch call. 'nginx 1.24.0 -> 1.26.2' also shows what the upgrade fixes.

輸入參數pathsbomcve_idlockfilesoftwareinvestigation_id

watchlist

Watchlist

A saved list of the software the user runs, kept in a file on their own machine. 'check' runs am_i_affected on every entry and reports only what changed since the last check: newly confirmed CVEs, CVEs newly added to CISA KEV, EPSS jumps and changed verdicts. The same check runs from a scheduler with the 'vulnerability-exposure-mcp watch' command.

輸入參數action必填software

newly_exploited

Newly exploited CVEs

What got exploited recently? CVEs CISA added to its Known Exploited Vulnerabilities catalog in the last few days, newest first, with CISA's required action, the US federal due date, known ransomware use and EPSS. Give products to keep only those that name them (a product match is Related; confirm with am_i_affected). No key.

輸入參數daysproductsinvestigation_id

ip_owner

IP network owner

Who a public IP's network is registered to (organisation, range, country, abuse contact), from the regional internet registry over RDAP. Already run for an IP target; use it for other IPs you find. No key.

輸入參數ip_address必填investigation_id

threat_lists_check

Threat lists check

Keyless reputation for a public IP: Spamhaus DROP (networks hijacked or run by criminals) and GreyNoise (whether it scans the internet, or is a known business service). Already run for an IP target. GreyNoise allows a limited number of lookups without GREYNOISE_API_KEY.

輸入參數ip_address必填investigation_id

subdomains

Subdomains from certificate logs

Hostnames under a domain that have had TLS certificates, from public certificate transparency logs (crt.sh, or Cert Spotter if crt.sh is down). Use it to find other hosts a domain runs; they may no longer exist. No key needed.

輸入參數domain必填investigation_id

distro_patch_check

Distro patch check

Check an Ubuntu or Debian package version against the distro's own security data (via OSV.dev), which counts fixes the distro backports without changing the upstream version. Use it when Shodan lists distro_packages (e.g. OpenSSH_8.9p1 Ubuntu-3ubuntu0.6 gives package 'openssh', package_version '8.9p1-3ubuntu0.6'), or when the user gives an installed package version. Pass the version check's affected_cve_ids as cve_ids. release (e.g. '22.04', '12') is found automatically when possible. No key needed.

輸入參數distro必填cve_idspackage必填releasepackage_version必填investigation_id

nvd_lookup

NVD CVE lookup

Full NVD record for one CVE (e.g. 'CVE-2021-44228'): description, CVSS, CWE, affected product ranges, CISA KEV and EPSS. Not needed for CVEs a version check already returned (they carry severity, EPSS, KEV, exploit and fix): use it for a CVE you have no record of, or to read one's full description and references.

輸入參數cve_id必填investigation_id

cisa_kev_check

CISA KEV check

Check CVE IDs and/or product names against CISA's Known Exploited Vulnerabilities catalog. Product matches only show the product has been exploited before, not that a version is affected. Version checks and CVE lookups already give KEV status for their CVEs: use this once per product for its KEV history, or for CVE IDs from elsewhere.

輸入參數cve_idssoftware_listinvestigation_id

get_key_facts

Key facts

Facts computed directly from this investigation's tool results, with no model involved, so they are the same on every run: open ports, network, reputation, version check results, upgrade target, end-of-life, CISA's required action, and the CISA KEV split into "confirmed for this target" (NVD version match, or the CVE being analysed) and "related" (product family or vendor). Also a remediation checklist in priority order and the sources used, with when each was queried. Base the report's claims on these. Values contain third-party text.

輸入參數investigation_id必填

check_report

Check report

Run before giving the final report. Compares your draft with this investigation's tool results and key facts, with no model involved, and lists what they don't support: CVE or advisory IDs no lookup returned, version numbers and EPSS-style percentages that appear nowhere in the data, claims such as "end-of-life", "no patch available" or "internet-facing" that no source makes, unconfirmed CVEs filed as confirmed (and the reverse), misquoted fix versions, upgrade versions named when no version was given, and exploit claims the data doesn't back. Fix or remove each one.

輸入參數report_markdown必填investigation_id必填

check_api_keys

Check API keys

Shows which data-source API keys are configured (never their values) and where to get missing ones. Most lookups work without keys: NVD (just slower), CISA KEV, EPSS, OSV.dev, DNS, the registries, Spamhaus, GreyNoise, SANS ISC, certificate logs, and Shodan's free InternetDB in place of Shodan.

無需輸入參數。

版本歷史

4
  1. v1.2.0最新Nov 1, 2026
  2. v1.1.0Oct 31, 2026
  3. v1.0.1Oct 29, 2026
  4. v1.0.0Oct 25, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分
  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分