# cve.now > A free, public vulnerability feed. It merges the CVE List, GitHub Advisory Database, OSV, NVD, ENISA EUVD, CISA KEV, EPSS and Exploit-DB into one deduplicated entry per vulnerability. Summaries are written by a model and labeled as such. No login, no API key. ## Feeds One feed URL, /feed, narrowed with filters that combine freely. RSS by default; add format=atom or format=json. Each of filter, tech and ecosystem takes one value or several, as a comma list (tech=nextjs,react) or repeated (tech=nextjs&tech=react). An entry must match any listed value of a field and every field given. A feed combines at most 16 combinations of values (for example 4 technologies x 4 ecosystems). - /feed: every entry - /feed?filter=critical: KEV, CERT-rated critical, or CVSS 9+ in widely used software - /feed?filter=kev: new CISA Known Exploited Vulnerabilities - /feed?tech=: one technology, for example /feed?tech=php - /feed?ecosystem=: one package ecosystem (npm, pypi, go, maven, crates.io, packagist, rubygems, hex, nuget) - Combined: /feed?filter=critical&tech=nextjs&format=json - Several values: /feed?tech=nextjs,react&ecosystem=npm,pypi ## Entries - /: human-readable page for a CVE, GHSA or OSV id, or for an early warning or breach (SZB- and 10 hex characters, for example /SZB-49acf98068) - /.md: the same page as Markdown, for agents. / sent with Accept: text/markdown returns it too. A vulnerability's copy gives severity, affected versions, fixes, references and links to related entries; an early warning's or breach's gives its status, summary, what to do, timeline, what was taken, evidence linked to each source, corrections and FAQ - /api/v1/entries/: the same entry as JSON, with CISA SSVC decision points (exploitation, automatable, technicalImpact) when CISA published them. A recently synced entry can answer with a redirect to a static copy of the same JSON on cve.now's CDN, so follow redirects (curl -L) - /api/v1/entries: all published entries, newest first, with an opaque nextCursor; filter=critical,kev lists entries that match either - /api/v1/entries?name= or ?filter=&tech=&ecosystem=, with limit (1 to 200, default 20): the newest items of a stored feed, the same JSON as the MCP list_feed tool. Any of name, tech, ecosystem or limit switches to this answer; it has no cursor - POST /api/v1/check: a one-time check of exact package versions, the same JSON as the MCP check_stack tool. Send {"packages":[{"ecosystem":"npm","name":"lodash","version":"4.17.20"}]} (at most 10,000), or {"lockfile_name":"bun.lock","lockfile_content":"..."}, or {"stack_id":"..."}. Nothing is stored - /api/v1/status: latest polling checks and the independently verified historical snapshot coverage - /api/stats: public aggregate counts behind the homepage numbers (vulnerabilities tracked, critical alerts flagged, stacks and packages checked, feed readers, API and MCP calls), refreshed every five minutes. Counts only; no uploads or visitors are identifiable Historical CVEs come from a complete official cvelistV5 snapshot. New deltas and record edits overlay that snapshot. Snapshot coverage does not include vendor announcements whose CVE records have not been published yet. Package matching requires supported ecosystem and affected-version data; CVE presence alone does not establish complete package matching coverage. ## Leaderboard - /leaderboard: the cve.now Index, the worst CVEs published or escalated this week (?window=month or ?window=year for longer windows), scored 0 to 100 and filterable by ?tech= and ?ecosystem= - /leaderboard/: an archived week's board as it closed, e.g. /leaderboard/2026-W44, with movement against the week before - /api/v1/leaderboard: the Index as JSON (?window=week|month|year, ?tech=, ?ecosystem=, ?filter=critical|kev, ?limit=, or ?week=YYYY-Www; ?view=worst-case|trending for the other views); MCP clients can call get_leaderboard - /leaderboard/methodology: how the score is built (exploitation 40, exposure 25, reach 20, severity 10, no patch 5), its inputs, calibration set, limitations and version history. Each entry page shows its own score breakdown ## Search One search over every entry and early warning, for people, scripts and agents. - /api/v1/search?q=: one page of JSON results. q takes free text, "quoted phrases", ids and keys such as vendor:, package:, affects:lodash@4.17.20, severity:, cvss:>=9, kev:true, exploit:, published:<30d, type:cve|early_warning, tech: and sort:relevance|published|modified|cvss. Terms are ANDed, commas OR values, a leading - excludes - Structured parameters, each ANDed with q (q is optional when one is given): severity, tech, ecosystem, vendor and package (comma lists or repeated), kev and exploited (true or false; exploited means public exploit code), published (one bound each, e.g. published=>=2026-10-01&published=<2026-10-08) and type (cve, early_warning, all). With no words, results are newest first - Each entry's match says why it matched: the fields each word hit (title, description, identifiers) and the key terms it meets. facets counts every match by kind, severity, ecosystem and KEV (facets=false leaves it out and answers faster). query echoes what ran - With no matches, suggestions lists broader queries that do match. An empty answer is not evidence that no vulnerability exists - limit (1 to 100) and cursor (the next_cursor of the last page) page through at most 1,000 results - The MCP search tool takes the same q and parameters and answers the same way ## Browse Markdown indexes to walk the catalog without the API. Each line gives an entry's id, title and CVSS and links its .md page; paged lists end with a Next page link. - /latest.md: every published entry, newest first, 100 per page - /critical.md: entries rated critical (CVSS 9.0 or higher, or a critical rating from the source), 100 per page - /kev.md: CISA Known Exploited Vulnerabilities, 100 per page - /tech/.md: the newest entries for one technology, for example /tech/nextjs.md - /ecosystem/.md: the newest entries for one package ecosystem, for example /ecosystem/npm.md - /daily/.md: every entry published that UTC day, with its counts, from 1999-01-01 to yesterday, for example /daily/2026-10-30.md - /daily/feed.xml: RSS of the last 30 day pages, with each finalized day's short intro - /tech.md: every valid tech slug and ecosystem. Other names (such as curl) are not slugs - /early-warnings.md: early warnings (breaches, ransomware, malicious packages and vulnerabilities reported before or without a CVE), newest first, each linking its /SZB-.md page - /breaches.md: breaches and ransomware attacks, newest first, each linking its /SZB-.md page Every other page has a Markdown copy too, at .md and at the page's own URL sent with Accept: text/markdown: /index.md (the homepage, with the latest entries), /about.md, /developers.md, /daily.md (the last 30 days), /epss.md, /kev/this-week.md, /leaderboard.md and /live.md. /vulnerabilities.md is /latest.md. ## MCP Streamable HTTP MCP server for coding agents: https://mcp.cve.now/mcp Tools: search (the Search section's query and parameters), get_vulnerability, list_feed (a stored feed by name, or filter, tech and ecosystem lists with the same rules as /feed), check_stack, get_leaderboard and send_feedback (a private note to the cve.now team about wrong or missing data). Every tool has a REST twin that takes the same inputs and returns the same JSON: get_vulnerability is /api/v1/entries/, list_feed is /api/v1/entries?name= (or filter, tech, ecosystem and limit), check_stack is POST /api/v1/check, get_leaderboard is /api/v1/leaderboard, search is /api/v1/search and send_feedback is POST /api/v1/feedback ({"message":"...","page":"CVE-...","contact":"optional email"}; rate limited, never shown publicly). Tool results carry the JSON twice: as the first text block and as structuredContent, described by each tool's outputSchema. check_stack takes lockfile_content, a packages list, or the stack_id of an uploaded lockfile. To keep a large lockfile out of the tool call, upload it with curl --data-binary @ -H 'X-Lockfile-Name: ' https://cve.now/api/stack and pass the returned id. Paste into any coding agent to set it up: Add the cve.now MCP server to your MCP configuration: name "cve-now", remote Streamable HTTP server at https://mcp.cve.now/mcp, no authentication. Then confirm the tools get_vulnerability, list_feed and check_stack are available, and run check_stack on this project's lockfile to list any known vulnerabilities in my dependencies. ## Docs for agents - /developers: MCP setup, the REST reference and feeds on one page - /llms-full.txt: this file plus every MCP tool's full description, input schema and output schema - /openapi.json: OpenAPI 3.1 for the REST twins - /agent.json: what cve.now offers, in one JSON document - /.well-known/mcp.json: the MCP server card - /.well-known/agent-skills/cve-now/SKILL.md: an agent skill for looking up CVEs and checking dependencies (index at /.well-known/agent-skills/index.json) ## Stack feed /stack builds a feed of only the entries that affect your exact package versions. Upload a lockfile from the homepage to get a short /stack?s= feed URL. Uploaded files are deleted as soon as they are parsed; only the package names and versions are kept, in private storage, to build the feed. Anyone with a feed URL can view its vulnerability matches. The MCP check_stack tool stores nothing; with a stack_id it reads the saved package list. Supported lockfiles: package-lock.json, npm-shrinkwrap.json, bun.lock, pnpm-lock.yaml, yarn.lock, poetry.lock, uv.lock, requirements.txt, Cargo.lock, go.sum, Gemfile.lock, mix.lock, flake.lock, composer.lock, Pipfile.lock, packages.lock.json (NuGet), gradle.lockfile. A flake.lock pins source trees, not packages. Its git commits are looked up in OSV (the commit hashes are sent to OSV), which only knows the projects it tracks; nixpkgs package CVEs are not checked. For small package lists, /stack?p=npm:lodash@4.17.20 remains available. Add format=json for JSON. ## About cve.now is built and run by Sazabi (AI-native observability and security): https://sazabi.com/?utm_source=cve-now&utm_medium=llms ## Licensing Summaries are CC-BY 4.0. Uses NVD data; not endorsed by NVD. ## REST twins of the MCP tools - GET https://cve.now/api/v1/entries/: Get vulnerability (MCP tool `get_vulnerability`, same JSON) - GET https://cve.now/api/v1/entries?name= (or tech, ecosystem, limit): List feed (MCP tool `list_feed`, same JSON) - POST https://cve.now/api/v1/check: Check dependencies (MCP tool `check_stack`, same JSON) - POST https://cve.now/api/v1/feedback: Send feedback (MCP tool `send_feedback`, same JSON) - GET https://cve.now/api/v1/leaderboard: Get leaderboard (MCP tool `get_leaderboard`, same JSON) - GET https://cve.now/api/v1/search: Search vulnerabilities (MCP tool `search`, same JSON) - OpenAPI: https://cve.now/openapi.json ## MCP tools in full ### get_vulnerability Get one vulnerability entry by CVE, GHSA or OSV id, as JSON. Includes CISA SSVC decision points (exploitation, automatable, technicalImpact) when CISA published them, and, when cve.now has read the vendor advisory, context (a plain sentence, sourced conditions, vendor severity, fix, FAQ) with exposure: Actively exploited, Default setups, Specific setups only or Unclear. fixedIn lists the fixed versions cve.now leads with: the vendor's own, without distro package builds or another product's versions. fixedInByProduct lists each affected product's fixed versions (product, versions), the entry's own product first, then products that ship the bug, such as Node.js on a Brotli CVE. REST: GET https://cve.now/api/v1/entries/ Input schema: ```json { "type": "object", "properties": { "id": { "type": "string", "description": "CVE, GHSA or OSV id, e.g. CVE-2026-12345" } }, "required": [ "id" ], "additionalProperties": false } ``` Output (structuredContent) schema: ```json { "type": "object", "description": "One vulnerability entry", "properties": { "id": { "description": "The entry id (CVE, GHSA or OSV)" }, "title": { "description": "Short title" }, "severity": { "description": "Severity rating" }, "exposure": { "description": "Actively exploited, Default setups, Specific setups only or Unclear" }, "fixedIn": { "description": "Fixed versions cve.now leads with" }, "fixedInByProduct": { "description": "Fixed versions per affected product" } }, "additionalProperties": true } ``` ### list_feed List the newest items in a cve.now feed. Pass name for one stored feed (critical, all, kev, tech/, ecosystem/; critical when nothing is passed), or any of filter, tech and ecosystem to narrow it. Each of those takes one value or a list: an item must match any listed value of a field, and every field passed. Up to 16 combinations of values. REST: GET https://cve.now/api/v1/entries?name= (or tech, ecosystem, limit). Send at least one of name, tech, ecosystem or limit (limit=20 is enough): without them, or with filter alone, GET /api/v1/entries lists the whole catalog instead, as { entries, nextCursor }. Input schema: ```json { "type": "object", "properties": { "name": { "type": "string" }, "filter": { "type": "array", "items": { "type": "string", "enum": [ "critical", "kev" ] }, "description": "critical and/or kev" }, "tech": { "type": "array", "items": { "type": "string" }, "description": "Technology slugs, e.g. nextjs, react" }, "ecosystem": { "type": "array", "items": { "type": "string" }, "description": "Package ecosystems, e.g. npm, pypi" }, "limit": { "type": "integer", "minimum": 1, "maximum": 200, "default": 20 } }, "additionalProperties": false } ``` Output (structuredContent) schema: ```json { "type": "object", "description": "The newest items of a feed", "properties": { "name": { "description": "The feed's name" }, "title": { "description": "The feed's title" }, "updatedAt": { "description": "When the feed last changed (ISO 8601)" }, "items": { "description": "Feed items, newest first" } }, "additionalProperties": true } ``` ### check_stack Check exact package versions against cve.now's synced vulnerability catalog. Pass a lockfile, a package list, or the stack_id of a lockfile uploaded to cve.now. For a large lockfile, upload it instead of passing its contents: curl --data-binary @ -H 'X-Lockfile-Name: ' https://cve.now/api/stack returns its id. A flake.lock is checked by the git commit each input pins, through OSV, and its nixpkgs package CVEs are not checked. No matches means none found, not a guarantee of safety. REST: POST https://cve.now/api/v1/check Input schema: ```json { "type": "object", "properties": { "lockfile_name": { "type": "string", "description": "Optional. The file type is detected from the content; the name only breaks ties (e.g. poetry.lock vs Cargo.lock). Supported: package-lock.json, npm-shrinkwrap.json, bun.lock, pnpm-lock.yaml, yarn.lock, poetry.lock, uv.lock, requirements.txt, Cargo.lock, go.sum, Gemfile.lock, mix.lock, flake.lock, composer.lock, Pipfile.lock, packages.lock.json (NuGet), gradle.lockfile." }, "lockfile_content": { "type": "string" }, "stack_id": { "type": "string", "description": "The id returned by POST https://cve.now/api/stack for an uploaded lockfile." }, "packages": { "type": "array", "items": { "type": "object", "properties": { "ecosystem": { "type": "string" }, "name": { "type": "string" }, "version": { "type": "string" } }, "required": [ "ecosystem", "name", "version" ], "additionalProperties": false } } }, "additionalProperties": false } ``` Output (structuredContent) schema: ```json { "type": "object", "description": "Known vulnerabilities in the packages checked", "properties": { "coverage": { "description": "What the check covers" }, "checked": { "description": "Number of packages checked" }, "notes": { "description": "Gaps in the check, when there are any" }, "affected": { "description": "Every affected package version, with the entry and its fixes" } }, "additionalProperties": true } ``` ### send_feedback Send a private note to the cve.now team: a wrong summary, severity or affected version, a missing vulnerability or technology, a broken feed, or a feature request. Stored for a person to read, never shown publicly, and rate limited per caller. Include the entry id or page in page when the note is about one. contact is optional and only used to reply. REST: POST https://cve.now/api/v1/feedback Input schema: ```json { "type": "object", "properties": { "message": { "type": "string", "maxLength": 4000, "description": "What is wrong or missing, in plain words" }, "page": { "type": "string", "description": "The entry id or cve.now URL the note is about, e.g. CVE-2026-12345" }, "contact": { "type": "string", "description": "An email address for a reply (optional)" } }, "required": [ "message" ], "additionalProperties": false } ``` Output (structuredContent) schema: ```json { "type": "object", "description": "Whether the note was stored", "properties": { "ok": { "description": "true when it was stored" }, "message": { "description": "A line to show the user" } }, "additionalProperties": true } ``` ### get_leaderboard Get the cve.now Index: the worst CVEs published or escalated this week, month or year, or of all time (window all: every CVE ever in KEV or with a Metasploit module, plus the past year), ranked by a 0-100 score (exploitation 40, exposure 25, reach 20, severity 10, no patch 5; methodology at https://cve.now/leaderboard/methodology). Narrow with tech, ecosystem and filter (critical, kev); a row matches any listed value of a field and every field passed. Pass week (YYYY-Www) instead, without tech, ecosystem or filter, for an archived week's top 25. Week rows carry movement since the previous week. view picks the board: exploited (default, the Index), worst-case (ranked by a 0-100 worst case score from severity, reach, exposure and exploit maturity, with no CISA confirmation needed; rows add worstCase) or trending (window week or month only; ranked by new PoC repos, new references and EPSS rise, with the Index unchanged; rows add trend). REST: GET https://cve.now/api/v1/leaderboard Input schema: ```json { "type": "object", "properties": { "view": { "type": "string", "enum": [ "exploited", "worst-case", "trending" ], "default": "exploited" }, "window": { "type": "string", "enum": [ "week", "month", "year", "all" ], "default": "week" }, "week": { "type": "string", "description": "An archived ISO week, e.g. 2026-W44" }, "tech": { "type": "array", "items": { "type": "string" } }, "ecosystem": { "type": "array", "items": { "type": "string" } }, "filter": { "type": "array", "items": { "type": "string", "enum": [ "critical", "kev" ] } }, "limit": { "type": "integer", "minimum": 1, "maximum": 100, "default": 25 } }, "additionalProperties": false } ``` Output (structuredContent) schema: ```json { "type": "object", "description": "The cve.now Index", "properties": { "methodology": { "description": "How the score is built" }, "window": { "description": "week, month, year or all" }, "week": { "description": "The archived ISO week, when one was asked for" }, "url": { "description": "The board's page on cve.now" }, "rows": { "description": "Ranked entries" } }, "additionalProperties": true } ``` ### search Search cve.now's whole catalog of vulnerabilities and early warnings: the one tool for finding entries, by words or by fields. Pass q (free text, "quoted phrases" and ids, plus advisory.dev's query keys such as vendor:, package:, affects:lodash@4.17.20, severity:, cvss:>=9, kev:true, exploit:, epss:, published:<30d, type:cve|early_warning, tech:, confidence:, category: and sort:relevance|published|modified|cvss; terms are ANDed, commas OR values, a leading - excludes), the structured parameters, or both: each parameter is ANDed with q as its key term. With no words, results are newest first, so severity: ["critical"] lists the newest entries rated critical and kev: true the newest KEV entries. cve.now's stored feeds (critical, kev, tech/, ecosystem/) pick entries by their own rules, so read those with list_feed. Each entry's match says why it matched: the fields each word hit (title, description, identifiers) and the key terms it meets. query echoes what ran. With no matches, suggestions lists broader queries that do match; an empty answer is not evidence that no vulnerability exists. Unverified early warnings appear only with confidence:unverified. Pass next_cursor back as cursor for the next page. REST: GET https://cve.now/api/v1/search Input schema: ```json { "type": "object", "properties": { "q": { "type": "string", "description": "Free text and query keys. Optional when a structured parameter is passed." }, "severity": { "type": "array", "items": { "type": "string", "enum": [ "critical", "high", "medium", "low" ] }, "description": "Any of these severities (CVSS band, else the stated one)" }, "kev": { "type": "boolean", "description": "true: on CISA's Known Exploited Vulnerabilities list (exploited in the wild); false: not on it" }, "exploited": { "type": "boolean", "description": "true: public exploit code exists (Exploit-DB, Metasploit or a GitHub proof of concept), the same as exploit:true; false: none known" }, "tech": { "type": "array", "items": { "type": "string" }, "description": "Technology slugs, e.g. nextjs, postgres (any of them)" }, "ecosystem": { "type": "array", "items": { "type": "string" }, "description": "Package ecosystems, e.g. npm, pypi (any of them)" }, "vendor": { "type": "array", "items": { "type": "string" }, "description": "Vendors, e.g. microsoft, fortinet (any of them)" }, "package": { "type": "array", "items": { "type": "string" }, "description": "Package names, e.g. lodash (any of them); narrowed to the ecosystems passed" }, "published": { "type": "array", "items": { "type": "string" }, "description": "Publication bounds, all applied: an age (<30d) or a date (>=2026-10-01); two bounds make a window, e.g. [\">=2026-10-01\", \"<2026-10-08\"]" }, "type": { "type": "string", "enum": [ "cve", "early_warning", "all" ], "description": "Entry type; both when omitted" }, "limit": { "type": "integer", "minimum": 1, "maximum": 100, "default": 20 }, "cursor": { "type": "string", "description": "next_cursor of the last page" } }, "additionalProperties": false } ``` Output (structuredContent) schema: ```json { "type": "object", "description": "One page of search results", "properties": { "entries": { "description": "Matching entries, each with why it matched" }, "query": { "description": "The query that ran" }, "total": { "description": "Number of matches" }, "facets": { "description": "Counts of every match by kind, severity, ecosystem and KEV" }, "suggestions": { "description": "Broader queries that match, when nothing did" }, "next_cursor": { "description": "Pass back as cursor for the next page" } }, "additionalProperties": true } ```