Skip to content

Back to the catalog

cyanheads/osv-advisory-mcp-server
github.comrepo

cyanheads/osv-advisory-mcp-server

osv-advisory-mcp-server is an MCP server that queries the OSV.dev vulnerability database, offering single-package version checks, batch audits of up to 1000 {name, ecosystem, version} tuples for SBOM/lockfile triage, and full advisory record fetch by OSV ID (GHSA/PYSEC/RUSTSEC/GO/DSA/DLA/CVE prefixes). It surfaces CVE aliases, CVSS vectors, derived severity labels, and CWE IDs, and is designed to chain into a companion nist-nvd-mcp-server for CVSS base scores, EPSS probability, and CISA KEV status. It ships as a keyless, no-API-key tool runnable via STDIO or Streamable HTTP, with a public hosted instance and Bun/npx/Docker install paths.

TL;DR MCP server for querying OSV.dev — single/batch package vulnerability lookups and full advisory fetch, chainable to CVSS/EPSS/CISA KEV data.
Document

What it is

An MCP server wrapping the OSV.dev vulnerability database, distributed as an npm package (@cyanheads/osv-advisory-mcp-server) and also running as a public hosted instance at https://osv-advisory.caseyjhand.com/mcp — usable with no installation by pointing an MCP client at it over Streamable HTTP. It exposes four tools: osv_query_package, osv_query_batch, an advisory-fetch-by-ID tool, and osv_list_ecosystems. No API key is required; OSV.dev is keyless with no published rate limit.

How it works

The detail worth knowing: osv_query_batch does not use OSV.dev's native batch endpoint. It fans out parallel single-package queries because the upstream batch endpoint omits aliases (the CVE IDs) — and those CVE IDs are the whole point, since they're the join key for chaining to nist-nvd-mcp-server for CVSS base scores, EPSS, and CISA KEV. Per-package queries also isolate failures: one bad ecosystem string or upstream error surfaces as that row's error field rather than failing the whole batch. severityLabel is derived from GHSA database_specific.severity or the highest CVSS base score, and returns null rather than a fabricated value when neither exists.

Preconditions / Affected

  • Batch calls accept 1–1000 {name, ecosystem, version} tuples per call.
  • Ecosystem strings are case-sensitive exact matches — "pypi" is not "PyPI". Call osv_list_ecosystems first to validate strings pulled from lockfiles or user input.
  • Self-hosting requires Bun v1.3.0+ or Node.js v24+.

What to do

Use the public instance with no install:

{
  "mcpServers": {
    "osv-advisory-mcp-server": {
      "type": "streamable-http",
      "url": "https://osv-advisory.caseyjhand.com/mcp"
    }
  }
}

Or run locally via npx (no Bun required):

{
  "mcpServers": {
    "osv-advisory-mcp-server": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@cyanheads/osv-advisory-mcp-server@latest"],
      "env": { "MCP_TRANSPORT_TYPE": "stdio", "MCP_LOG_LEVEL": "info" }
    }
  }
}

Docker image is ghcr.io/cyanheads/osv-advisory-mcp-server:latest. For HTTP self-host: MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http (listens at /mcp).

Caveats

  • The public hosted endpoint is a third-party domain — sending a batch means sending your dependency/version inventory off-host. Self-host (STDIO or your own HTTP) if that's a concern.
  • osv_list_ecosystems is sourced statically from the OSV schema spec and "may occasionally lag newly added ecosystems," so a valid-but-new ecosystem can fail validation.
  • Underlying framework (@cyanheads/mcp-ts-core) supports jwt/oauth auth and Supabase/Cloudflare storage backends, but the page states no required env vars — the default deployment is unauthenticated.

Organisations named here

  • EPSS

Technologies named here

  • osv-advisory-mcp-server
  • OSV.dev
  • nist-nvd-mcp-server
  • @cyanheads/mcp-ts-core
  • Docker
  • Vitest
  • Model Context Protocol
  • OSV
  • Bun
  • Node.js
  • CVSS
  • CISA KEV