vulns / docs
Use it from anywhere
Quick start
The same entries as a feed, a JSON API, an MCP server and a lockfile check. No account and no API key.
curl -s "https://vulns.fencer.dev/feed?filter=critical"
<rss version="2.0"> <channel><title>Fencer Vulns — Critical</title> # one <item> per critical entry, newest first
curl -s https://vulns.fencer.dev/api/v1/entries/CVE-2021-44228
# the merged entry: severity, CVSS, CISA KEV, EPSS, exploits
claude mcp add --transport http fencer-vulns https://vulns.fencer.dev/mcp
# tools: search, get_vulnerability, list_feed, check_stack # your agent checks a package before it installs it
curl -s -F lockfile=@package-lock.json https://vulns.fencer.dev/api/v1/stack
# every advisory for the versions you pin, exploited first # the report has its own feed for new matches
Feeds
https://vulns.fencer.dev/feed returns RSS. Add format=atom or format=json (JSON Feed 1.1) for
the other formats. Each feed holds the 50 newest matching entries.
In Slack, /feed subscribe https://vulns.fencer.dev/feed?filter=critical posts each new entry to the channel (Slack's
built-in RSS app). Any feed URL works, including the one on a stack report.
- filter
-
criticalorkev. An entry is critical when it is in CISA KEV, when CISA SSVC says exploitation is active, when it scores CVSS 9+ in a listed technology (a WordPress plugin or theme does not count, only WordPress itself), or when it scores CVSS 7+ with EPSS ≥ 0.1. A KEV-only feed is ordered by the date CISA added the entry. - tech
- A technology slug from the list below.
- ecosystem
npm,pypi,go,maven,crates.io,packagist,rubygems,hex,nuget,github-actions,pub,swift,hackage,ghc,cran,opam,julia,bitnami- vendor
-
A vendor or product name, matched as a substring of the CNA, CISA and NVD vendor and product names, e.g.
vendor=fortinetorvendor=exchange server. One value, 2–60 characters.
Combining filters. filter, tech and ecosystem each take a comma list or repeat; vendor takes one value. An entry must
match any value of a field, and every field you give. A feed allows at most 16
combinations (the product of the value counts).
Examples
- /feed Everything, newest first
- /feed?filter=critical Only critical entries
- /feed?filter=kev Added to CISA KEV, by date added
- /feed?filter=critical,kev Critical or KEV
- /feed?tech=nextjs,react Next.js or React
- /feed?filter=critical&tech=nextjs,react Critical, and Next.js or React
- /feed?ecosystem=npm&filter=critical&format=json Critical npm entries as JSON Feed
- /feed?tech=fortinet&filter=kev&format=atom Exploited Fortinet bugs as Atom
Every filter view on the front page shows its own feed URL. For your dependencies, use Check your stack.
JSON API
Every endpoint sends Access-Control-Allow-Origin: *. Errors come back as
{"error": "…"} with a 4xx status, or 500 on an internal error.
- GET /api/v1/entries/<id>
- One entry. Aliases redirect (302) to the canonical id, so follow redirects.
- GET /api/v1/entries
-
filter,tech,ecosystemandvendoras for feeds, pluslimit(1–200) andcursor. Newest first; passnext_cursorback ascursor. - GET /api/v1/search
-
q,severity,kev,exploited,tech,ecosystem,vendor,package,published,type(cve|ghsa|osv),limit,offset(up to 1000).qis at most 200 characters. Results carrymatchedreasons and facet counts; when nothing matches,broadersuggests looser queries.publishedtakes2024,2024-05,2024-01-01..2024-03-31,>=2024-01-01,<2024-01-01or30d.exploitedmeans in CISA KEV or with an Exploit-DB or Metasploit exploit. - POST /api/v1/stack
-
JSON
{"filename": "package-lock.json", "content": "…"}or{"packages": "npm:lodash@4.17.20,pypi:django@4.2.0"}, or a multipart upload in alockfilefield (lockfiles 5 MB, SBOMs 10 MB, 5,000 packages max).packagesmay also be an array of{ecosystem, name, version}. Returnsfindings,eol(versions out of support),other,unchecked,packageCountandchecked, flattened, plusid,urlandfeed. GitHub Actions workflows work as lockfiles: eachuses: owner/repo@refis matched against the advisory ranges, a floating tag (v4) as the newest release of its line. Actions pinned to a commit SHA (without a# v1.2.3comment) or a branch can't be compared and come back inunchecked, with the advisories on file for them. An SBOM (CycloneDX JSON, SPDX 2 JSON or Syft JSON, e.g.syft <image> -o cyclonedx-json, or Trivy's CycloneDX or SPDX) works inlockfileorcontent, as text or, for a large one, as the SBOM's JSON object itself: its language packages are checked as above, its deb, apk, rpm and Arch (alpm) packages against the distro advisories for their release, returned inos(releases, each withuncheckedset todistro,release,version(the SBOM gives no release) orderivative(withbasedOn: Manjaro, EndeavourOS and other Arch-based distros; only Arch Linux itself is checked) where they can't be checked;findingswith the fixed version and advisories per package, andpossible: trueon a finding or package line from Arch Linux, whose tracker gives a fix but no introduced version, so the package may predate the bug (such findings are not counted as known exploited or critical);other; andlicenses, the CC BY-SA terms that travel with Ubuntu and Alpine data). - GET /api/v1/stack/<id>
-
A stored report:
{id, name, created, packages, osPackages, result}, with the POST fields underresult. It is re-checked when older than 6 hours. Reports nobody opens (page, API or feed) for 90 days are deleted. - GET /stack/<id>/feed
- RSS (or
format=atom|json) of a stored report's findings: thefeedURL that POST returns. - GET /stack?p=…
- RSS (or
format=atom|json) of entries affecting exactly those versions. Nothing is stored. - GET /api/v1/status
- Source sync health and catalog counts.
curl -sL https://vulns.fencer.dev/api/v1/entries/CVE-2021-44228
curl -s 'https://vulns.fencer.dev/api/v1/search?q=log4j&kev=1'
curl -s -F lockfile=@package-lock.json https://vulns.fencer.dev/api/v1/stack
Lockfiles: package-lock.json, bun.lock, pnpm-lock.yaml, yarn.lock, requirements.txt, poetry.lock, uv.lock, Pipfile.lock, Cargo.lock, go.sum, Gemfile.lock, composer.lock, mix.lock, packages.lock.json, gradle.lockfile, .github/workflows/*.yml, action.yml, pubspec.lock, Package.resolved, renv.lock, Manifest.toml, cabal.project.freeze, *.opam.locked.
MCP server
Streamable HTTP, stateless, no authentication. Add it to your agent with one line:
claude mcp add --transport http fencer-vulns https://vulns.fencer.dev/mcp
codex mcp add fencer-vulns --url https://vulns.fencer.dev/mcp
{
"mcpServers": {
"fencer-vulns": {
"url": "https://vulns.fencer.dev/mcp"
}
}
}
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"fencer-vulns": {
"type": "remote",
"url": "https://vulns.fencer.dev/mcp",
"enabled": true
}
}
}
Tools
- search
- Search Fencer Vulns entries (CVE, GHSA and OSV advisories merged into one entry per vulnerability). Free text in `q` matches ids, titles, descriptions, vendors, products and package names; structured parameters narrow the result. Each result says why it matched; when nothing matches, `broader` lists relaxed queries that do return results.
- get_vulnerability
- Full entry for a CVE, GHSA or OSV id: description, CVSS, CISA KEV status and due date, EPSS score and the date it first reached 10%, public exploits (Exploit-DB, Metasploit) and Nuclei checks, affected packages with fixed versions, affected products, references and source records; where known, ATT&CK techniques (attack), ransomware groups (ransomware) and the Project Zero zero-day listing (zeroDay); vendorAdvisories holds vendor CSAF advisories and VEX statements (CISA, Red Hat): per product affected, fixed or not affected, with the remediation and a link (keep the credit of each with it); maintainerAdvisory links the advisory the maintainers published on their GitHub repository and says whether the entry is unreviewed (nothing but that advisory).
- list_feed
- Newest entries of a feed, the same as the /feed endpoint. `filter`: critical = in CISA KEV, or CISA SSVC exploitation "active", or CVSS 9+ in a listed technology (WordPress plugins and themes excepted; WordPress itself counts), or CVSS 7+ with EPSS ≥ 0.1; kev = in CISA KEV (ordered by date added). An entry must match any value of a field and every field given.
- check_stack
- Check exact package versions for known vulnerabilities. Pass a lockfile's contents (package-lock.json, bun.lock, pnpm-lock.yaml, yarn.lock, requirements.txt, poetry.lock, uv.lock, Pipfile.lock, Cargo.lock, go.sum, Gemfile.lock, composer.lock, mix.lock, packages.lock.json, gradle.lockfile, .github/workflows/*.yml, action.yml, pubspec.lock, Package.resolved, renv.lock, Manifest.toml, cabal.project.freeze, *.opam.locked) with its filename, an SBOM (CycloneDX JSON, SPDX 2 JSON, Syft JSON, e.g. from `syft <image> -o cyclonedx-json`; up to 10 MB) in the same field, or a package list. An SBOM's language packages are checked like a lockfile's; its OS packages (deb, apk, rpm and Arch alpm purls) are matched against the distro advisories for their release and come back in "os" (findings with the fixed version per package; releases with no advisories on file are marked unchecked, never guessed, and Arch-based distros such as Manjaro as unchecked "derivative"; a finding or package with possible: true comes from Arch's tracker, which gives no introduced version, so the version may predate the bug: say "may be affected"; keep the license objects of share-alike distro data with it). A GitHub Actions workflow or action.yml works too: each uses: owner/repo@ref is checked, a floating tag (v4) as the newest release of its line; refs pinned to a commit SHA (without a "# v1.2.3" comment) or a branch come back in "unchecked" with the advisories on file. Also lists versions endoflife.date marks as out of support (eol). No matches means none were found, not that the packages are safe.
AGENTS.md snippet
Paste this into your project's AGENTS.md or CLAUDE.md so your agent checks dependencies
before it adds them. The same facts, in plain text, are at /llms.txt.
## Dependencies and vulnerabilities
Use the Fencer Vulns MCP server (https://vulns.fencer.dev/mcp, no auth) or https://vulns.fencer.dev/llms.txt.
- Before adding or upgrading a dependency, call check_stack with the lockfile contents (or packages at exact versions).
- For any CVE, GHSA or OSV id, call get_vulnerability: it says whether the entry is in CISA KEV, its EPSS score and when it first reached 10%, public exploits and fixed versions.
- No matches means Fencer Vulns found none, not that the packages are safe.
Merge rules
- 01 One entry per vulnerability. Records that name each other as aliases are merged.
- 02 The entry id is the CVE id when there is one, then the GHSA id, then the record's own id (PYSEC-, GO-, RUSTSEC-…).
- 03 Two different CVEs never merge, even when an advisory lists both.
- 04 Every other id redirects to its entry: /GHSA-… leads to the CVE it belongs to.
- 05 KEV, EPSS, EUVD and exploits (Exploit-DB, Metasploit, Nuclei) attach by CVE id; /EUVD-… redirects to its CVE entry.
- 06 Distro advisories (Debian, Ubuntu, Red Hat, SUSE, openSUSE, AlmaLinux, Rocky Linux, Alpine, Azure Linux, Arch Linux) attach by the CVEs they fix and show as distro packages under Patch / fix. They are not entries of their own. Ubuntu and Alpine fixes are CC BY-SA 4.0 and Azure Linux fixes MIT: in the API their fixes.distros block carries a license object (name, url, attribution) to pass on with them.
- 07 Vendor CSAF advisories (CISA ICS and IT advisories, Red Hat VEX) attach by CVE as vendorAdvisories and show under Vendor advisories: per product affected, fixed or not affected, the remediation (vendor fix with the fixed version, workaround, mitigation, no fix available, no fix planned) and a link. They do not change critical. CISA's republications of vendor advisories are kept as facts and a link only; each advisory carries a credit object (name, url, attribution) to pass on with it.
- 08 GitHub repository advisories: for the repositories behind the tracked technologies (Next.js, React, Rails, PHP, Redis, WordPress and others), the maintainers' own advisories on GitHub are read too, including ones GitHub never reviews into its Advisory Database. They merge by GHSA id (and CVE, when they name one) and rank below every reviewed source: scores, packages and weaknesses come from them only where no reviewed record has that field. An entry with nothing else is labelled unreviewed: maintainerAdvisory.unreviewed in the API and MCP, unreviewed in lists, _fencer.unreviewed and the item text in feeds. They are the maintainers' content under GitHub's terms, so only facts, the headline and a link to the advisory are kept, never its description.
- 09 Where Anchore has corrected NVD's CPE configuration (anchore/nvd-data-overrides), the correction replaces NVD's CPEs and fixed versions.
- 10 Only Exploit-DB and Metasploit count as public exploits (exploitCount in API lists and search, exploit_count in MCP results); the search filter exploited=1 means in CISA KEV or with such an exploit; Nuclei templates are detection checks.
- 11 ATT&CK techniques (attack, from MITRE CTID's KEV mappings), ransomware groups (ransomware, from BushidoUK's Ransomware Vulnerability Matrix, CC BY 4.0) and Project Zero's zero-day listing (zeroDay: dates and a link) attach by CVE id. attack and ransomware carry a credit object (name, url, attribution) to pass on with them. None of them changes critical.
- 12 Lockfile reports flag unsupported versions (eol) from endoflife.date, only where endoflife.date names the package itself and the version falls in one of its release cycles.
Technologies
An entry is filed under a technology through its CPEs, its CNA vendor and product strings, or its affected
packages. WordPress plugins and themes also match by the CNA that assigned the CVE (WPScan, Wordfence, Patchstack), by
advisory pages on wpscan.com, wordfence.com and patchstack.com or WordPress.org plugin and theme links, and by CPEs that target
WordPress. Those plugin and theme matches file the entry under tech=wordpress but do not count as a listed
technology for filter=critical: there are thousands of plugins, most with few installs. The matchers are
deliberately narrow.
-
Next.js
nextjsrss critical -
React
reactrss critical -
Node.js
noderss critical -
Express
expressrss critical -
Django
djangorss critical -
Flask
flaskrss critical -
Ruby on Rails
railsrss critical -
Spring
springrss critical -
Log4j
log4jrss critical -
Kubernetes
kubernetesrss critical -
Docker
dockerrss critical -
nginx
nginxrss critical -
Apache HTTP Server
apache-httpdrss critical -
OpenSSL
opensslrss critical -
PostgreSQL
postgresqlrss critical -
MySQL
mysqlrss critical -
Redis
redisrss critical -
Microsoft SQL Server
microsoft-sql-serverrss critical -
Oracle Database
oracle-databaserss critical -
MariaDB
mariadbrss critical -
IBM Db2
ibm-db2rss critical -
MongoDB
mongodbrss critical -
SAP ASE
sap-aserss critical -
PHP
phprss critical -
WordPress
wordpressrss critical -
Jenkins
jenkinsrss critical -
GitLab
gitlabrss critical -
Fortinet
fortinetrss critical -
Citrix
citrixrss critical -
Ivanti
ivantirss critical -
Cisco IOS
cisco-iosrss critical -
Palo Alto PAN-OS
palo-alto-panosrss critical -
VMware
vmwarerss critical -
Microsoft Exchange
microsoft-exchangerss critical -
Google Chrome
chromerss critical -
Linux kernel
linux-kernelrss critical
Where it comes from
The public sources below, merged into one entry per vulnerability and published four ways. Live sync health is on the status page; how they merge is under merge rules.
vulnerability records
- CVE List
- CVE records from every CNA: descriptions, affected products, CNA scores. CVE Program terms of use.
- GitHub Advisory Database
- Reviewed advisories with packages and vulnerable ranges, read through OSV. CC BY 4.0.
- OSV
- Ecosystem advisories (PyPI, Go, RustSec, …) and the distro feeds. Each database's own terms.
- NVD
- NIST scores, CPEs and weaknesses. This product uses data from the NVD API but is not endorsed or certified by the NVD.
- ENISA EUVD
- EU vulnerability ids and ENISA's exploited list. Under its own terms, credited.
- GitHub repository advisories
- Maintainers' own advisories for the tracked technologies, including ones GitHub never reviews. The maintainers' content on GitHub: facts and a link only.
- Anchore NVD overrides
- Corrected NVD CPEs and version ranges. CC0, credited anyway.
exploitation and context
- CISA KEV
- Known exploited vulnerabilities and the date each was added. Under its own terms, credited.
- FIRST EPSS
- Daily exploit prediction scores. Under its own terms, credited.
- Exploit-DB
- Public exploit code (OffSec). Under its own terms, credited.
- Metasploit
- Exploit modules (Rapid7). Under its own terms, credited.
- Nuclei templates
- Detection checks (ProjectDiscovery), not counted as exploits. Under its own terms, credited.
- MITRE CTID KEV to ATT&CK mappings
- ATT&CK techniques per KEV vulnerability. Apache-2.0; © 2026 The MITRE Corporation, reproduced and distributed with its permission; ATT&CK® is a registered trademark of The MITRE Corporation.
- Ransomware Vulnerability Matrix
- Ransomware groups known to use a vulnerability. BushidoUK, CC BY 4.0, reformatted per CVE.
- Project Zero 0day In-the-Wild
- Vulnerabilities exploited as zero-days. No licence stated: dates and a link only.
- endoflife.date
- Release cycles out of support, for lockfile reports. MIT.
distro advisories
- Debian security tracker
- Fixed packages per release. Public tracker data, credited.
- Ubuntu security notices
- Fixed packages per release, in their own block. Canonical, CC BY-SA 4.0.
- Red Hat security data
- Fixed packages per RHEL release. CC BY 4.0.
- SUSE and openSUSE security
- Fixed packages per SLES and openSUSE release. CC BY 4.0.
- AlmaLinux errata
- Fixed packages per release. MIT.
- Rocky Linux errata
- Fixed packages per release. BSD.
- Alpine secdb
- Fixed version per branch, in its own block. CC BY-SA 4.0.
- Azure Linux vulnerability data
- Fixed packages for Azure Linux and CBL-Mariner. Microsoft, MIT: the notice travels with the data.
- Arch Linux security tracker
- Fixed packages (AVG groups). No licence stated: facts and a link only.
vendor advisories
- CISA CSAF advisories
- ICS and IT advisories per product: affected, fixed or not affected, remediation, fixed version. U.S. Government work; advisories that republish a vendor's own advisory: facts and a link only.
- Red Hat VEX
- Per product and component: affected, fixed (with the erratum), not affected (with why), will not fix. CC BY 4.0, credited with a link to each document.
language ecosystems
- Haskell security advisories
- Hackage and GHC advisories, through OSV. Under its own terms, credited.
- R Consortium advisories
- CRAN advisories, through OSV. Under its own terms, credited.
- OCaml security advisories
- opam advisories, through OSV. Under its own terms, credited.
- Julia security advisories
- Julia package advisories, through OSV. Under its own terms, credited.
- Bitnami vulndb
- Bitnami image and chart advisories, through OSV. Under its own terms, credited.
Ubuntu, Alpine and Azure Linux fixes carry their licence in the API and MCP (fixes.distros[].license), and ATT&CK and ransomware data a
credit object, to pass on with them. The full credit line is in the footer of every page.