Your MCP servers run real code. When was the last time you checked it for CVEs?
Every MCP server on your machine is a running program — npm packages, PyPI
packages, daemons with network access. I install them with npx -y or uvx,
they work, and I never look at them again. That's exactly the problem: a
vulnerability in one of those dependencies is a vulnerability in everything
that server can touch, and CVE disclosures against MCP-ecosystem packages keep
climbing.
I built mcp-cve-watch to close that gap: a stdlib-only Python CLI that
subscribes your MCP servers' runtime dependencies to a CVE feed. Point it at
the manifests your servers run on; it checks
OSV.dev (which aggregates CVE + GitHub Advisory data across
PyPI, npm, and more) for every pinned dependency. The first run records a
baseline. Every run after that alerts only on new CVEs — quiet enough for
a daily cron job, strict enough for a CI gate.
- GitHub: https://github.com/hahahahahahahahah6/mcp-cve-watch
- PyPI:
pip install mcp-cve-watch(https://pypi.org/project/mcp-cve-watch/)
What it does
# Check the manifests your MCP servers run on
mcp-cve-watch watch ./mcp-servers/requirements.txt ./mcp-servers/package.json
# checked 14 pinned dependencies at 2026-10-11 08:52 UTC
#
# *** 2 NEW CVE(s) since last check ***
#
# SEVERITY SCORE ID PACKAGE VERSION SUMMARY
# -------- ----- ------------- --------- ------- --------------------------------
# CRITICAL 9.8 CVE-2024-0001 some-lib 1.2.3 Remote code execution via crafted...
# HIGH 7.5 CVE-2024-0002 other-lib 4.5.6 Denial of service in parser...
Run it again tomorrow and it just says no new CVEs since last check —
unless something actually changed, in which case you want to know.
# CI gate: exit 3 when a new HIGH-or-worse CVE appears
mcp-cve-watch watch requirements.txt --fail-on high
# Full report of everything the last run found
mcp-cve-watch report --format markdown
The useful flags: --severity high to only record serious findings,
--include-dev to scan devDependencies too, --format json for
machine-readable output, and --min-severity on report to filter. State
lives in ~/.config/mcp-cve-watch/state.json.
A daily check that only bothers you when something is new:
0 9 * * * mcp-cve-watch watch ~/mcp-servers/requirements.txt --fail-on high --severity medium
Why not just use the existing tools?
- vs mcp-audit — that's a point-in-time runtime audit: handshake each server once, report what it sees right now. mcp-cve-watch is a continuous vulnerability-intelligence subscription: it keeps a baseline of every known CVE on your servers' dependencies and alerts only on what's new. Audit when you install a server; watch every day after.
-
vs Dependabot / Renovate — those watch the dependencies of a GitHub
repository. This watches the dependencies of your MCP servers at
runtime — the pinned
npx/uvxpackages actually executing on your machine, which often don't live in any repo Dependabot can see.
The details that matter
Only pinned versions can be checked. A CVE feed matches
(package, version) pairs — requests>=2.0 tells the feed nothing. Unpinned
lines are skipped with a warning. Pin your MCP server deps (==, exact npm
versions), then watch them.
One batched query, no API key. Everything goes through a single OSV.dev
querybatch call — no auth, no per-package round trips. Severity comes from
CVSS scores (v4 preferred, then v3, then v2): ≥9.0 critical, ≥7.0 high,
≥4.0 medium, and unknown when the feed has no score yet.
New-only alerting is the whole point. A raw CVE dump for 14 dependencies
is noise you'll ignore by week two. Diffing against the last run turns the
feed into something you can actually leave running.
Zero dependencies — Python standard library only, 14 smoke tests, network
fully mocked. MIT licensed. If you run MCP servers you installed six months
ago and forgot about (we all do), point this at them and see what comes back.
Top comments (0)