Check what you actually ship
Paste a lockfile. Every package is resolved at its exact installed version against OSV.dev, then ordered by whether an exploit for it actually exists — so what comes back is a short worklist rather than a wall of advisories.
Why this is not the search box
Free-text search matches words in advisory text. That is the wrong shape of question for
installed software, in three ways that better ranking would not fix. It has no ecosystem, so
the npm package zip and the crates.io crate zip look like the same
thing when they are unrelated software by unrelated authors. It has no versions, so 4.17.15
and 4.17.21 are indistinguishable when only one of them is vulnerable. And it only knows the
advisories in this feed’s window, where a dependency check needs every advisory ever
published against that package.
This resolves coordinates instead — an ecosystem, a name, a version — through OSV.dev, the database the ecosystems themselves publish into and which records affected version ranges.
And why not just npm audit
npm audit tells you which advisories apply. It cannot tell you which of them
anyone could act on, so it sorts by a severity label and leaves you forty rows that all look
equally urgent. Every finding here also carries whether exploit code exists and how reachable
it is — a Metasploit module, an archived Exploit-DB entry, published proof-of-concept
code, a Nuclei template — and the list is ordered by that first.
Which reorders the work: a moderate with a working module is a worse afternoon than a critical nobody has written anything for. Patch first at the top of the result is that ordering, with the version to upgrade to.
Formats it reads
package.jsonnpm ranges onlypackage-lock.jsonnpmnpm-shrinkwrap.jsonnpmyarn.locknpmrequirements.txtPyPIpoetry.lockPyPIPipfile.lockPyPIgo.modGoCargo.lockcrates.ioGemfile.lockRubyGemscomposer.lockPackagist
A lockfile is much better than a manifest. A lockfile states the version that
is installed; package.json states a range, which has to be coerced to its lowest
version to be queryable at all — so findings from one are flagged as approximate.
From a script, or an agent
The same check over HTTP, with no key:
curl -X POST https://cve.zerocrew.in/api/dependencies/check \
-H 'Content-Type: application/json' \
--data "{\"manifest\": $(jq -Rs . < package-lock.json)}"
Or as a tool your agent can call itself — check_dependencies over
MCP, which parses the lockfile for you.
What a clean result means
No advisory is known for that exact version, in the databases consulted. It is not a statement that the package is safe, that your configuration is safe, or that nothing will be published tomorrow.
Exploit maturity says whether exploit code exists publicly — not whether you are reachable or affected in practice. Confirm against the upstream advisory before you act.