VDB
KO
Continuously updated

Changelog

Everything we've added or improved on VDB, recorded right after the deploy that ships it.

July 2026

feature

Remote MCP endpoint — https://vdb.ai.kr/mcp (no install)

Opened a remote MCP endpoint so you can connect to VDB with just a URL — no install. Any streamable-HTTP MCP client (Claude Desktop, Cursor, …) takes { "vdb": { "url": "https://vdb.ai.kr/mcp" } } and gets all 6 tools (package/bulk check, lookup, search, MCP-server trust, slop list). Anonymous sessions share the per-IP free trial; users pass their own API key via session config for per-account metering. The local uvx vdb-mcp path still works too.

feature

vdb-mcp 0.1.1 — published to PyPI + listed in the official MCP registry (kr.ai.vdb/vdb)

vdb-mcp is now on PyPI — any MCP client connects to VDB with a single "uvx vdb-mcp" line. Also listed in the official MCP registry (registry.modelcontextprotocol.io) under the kr.ai.vdb/vdb namespace, verified via vdb.ai.kr DNS (ed25519) — directories that crawl the registry (PulseMCP, Glama, …) pick it up automatically. License: Elastic License 2.0 — free to use, including commercially; only reselling it as a hosted/managed service is prohibited.

seo

Added llms.txt + a citable “Quick fix” block on advisory pages

AI crawlers already index our advisory pages at hundreds of IPs per day. To make answer engines (ChatGPT/Claude/Perplexity) cite VDB precisely, we added /llms.txt (site guide + agent-facing API summary + citation guidance) and a “Quick fix” block at the top of every advisory page carrying the advisory id, package, and exact upgrade command in one liftable sentence.

feature

vdb-mcp installable via uvx + SBOM-scan GitHub Action

Repackaged the MCP server as an installable vdb-mcp package — one line in your client config ("uvx vdb-mcp"), zero configuration, hosted vdb.ai.kr by default (6 tools: package/bulk check, lookup, search, MCP-server trust, slop list). Also added a CI GitHub Action: one step (uses: 0pstech/vdb-scan-action@v1) scans your lockfile, gates the build on a fail-on severity threshold, and writes a job-summary table with advisory links and upgrade commands. A free API key is recommended in CI — anonymous calls share the runner IP pool's small lifetime trial.

ui/ux

Trial-exhausted responses are now AI-agent-actionable

Reworked the trial-exhausted bodies on /v1/ai/check-packages (429) and /v1/sbom/scan (401). They now always carry error: free_trial_exhausted plus signup_url, request_key_url, docs_url, and a bilingual message. The key addition is request_key_url — the passwordless path where a browserless AI agent just asks its human for an email, POSTs it, and a free key arrives by mail. The old body only said "sign up", which agents answered by retrying the same call hundreds of times and then giving up.

fix

SBOM Watch email language now defaults to your signup language

The language you sign up in (ko/en) is now stored on the account (users.lang). When an SBOM Watch registration carries no language signal, alerts follow it. Priority: explicit lang field at registration → the request's X-VDB-Lang/Accept-Language → signup language → ko. Previously, watches registered via the JSON API always received Korean mail — accounts that signed up in English now get English alerts.

feature

SBOM Watch — email alerts when a dependency in your registered SBOM gets an advisory (members)

/v1/sbom/scan was a point-in-time snapshot. Members can now register an SBOM (or lockfile) at /sbom-watch; a worker re-checks the stored components against the vulnerability DB every hour and emails you only when a NEW advisory matches. Each mail carries the facts (package, version, severity, KEV status) and the fix (fixed versions, per-ecosystem upgrade command, package-wide safe upgrade target). Every (SBOM, vulnerability, package) triple is notified exactly once — no repeat spam. Limits: 5 watches per account, 20,000 components per file. API: POST/GET/DELETE /v1/sbom/watches.

fix

Removed scan false positives caused by version-resolver failures

When scanning range specs rather than pinned versions (e.g. >=0.115, ^0.21.0 in requirements.txt / package.json), a failed registry lookup (offline, blocked, or rate-limited) left the spec unresolved, so the finding was kept to err safe — over-reporting (e.g. FastAPI's CSRF, fixed in 0.65.2, still flagged high at >=0.115). A finding is now excluded only when it is provably true, without any network call, that the spec's entire satisfiable version set lies outside every affected interval. The check is one-directional: it can remove a false positive but never hides a real vulnerability.

fix

False-positive fix for advisories with bad upstream data (uvicorn CVE-2020-7694)

GHSA-33c7-2mpw-hg34 (uvicorn log injection) is recorded upstream as "all versions affected, no patch" even though maintainers fixed it in 0.11.7 — flagging every uvicorn release as high. A serving-time correction layer now suppresses provably-fixed versions and attaches an override_note explaining any divergence from raw OSV.

June 2026

feature

VS Code & Cursor extension launched — inline slopsquatting / CVE / registry checks as you edit

Open or save package.json / requirements.txt / Cargo.toml / go.mod / SBOM and the extension extracts every dependency, scores it via POST /v1/ai/check-packages, and draws the verdict inline. Slopsquatted (non-existent) names flag as errors; known CVEs get a one-click upgrade to a safe version. Works with no account. Published to Marketplace and Open VSX.

security

SBOM upload — five-layer hardening for malformed / huge / deeply-nested files

Concentric defenses on the /v1/sbom/scan upload path. (1) Content-Length pre-check rejects oversized uploads before the read. (2) The read itself is capped to SBOM_MAX_BYTES+1 so a lying body can't sneak past. (3) Filename is sanitised — basename only, ../, NUL, and control bytes stripped, 255-char cap, so nothing weird flows into the format detector or audit log. (4) Parser failures broaden to catch RecursionError (deeply-nested adversarial JSON), MemoryError (billion-laughs-style blowups), and stray decode errors — all map to 400/413 instead of 500. (5) Post-parse filter drops purls / versions over 1024 chars or carrying control bytes, then caps total component count per call (5k anonymous, 20k authenticated). A new components_truncated field in the response tells the caller how many rows were dropped so they can decide whether to split the SBOM. 14 unit tests cover both helpers.

ui/ux

SBOM scan — 3 free anonymous scans per IP + helpful 401 with signup info

/v1/sbom/scan previously required an API key on the first call, returning a terse "missing bearer token" 401 with no hint at the fix. Anonymous callers now get 3 lifetime scans per IP (check-packages is 50), and the response carries a trial { used, limit, remaining } block. After exhaustion the 401 body becomes { error: "free_trial_exhausted", message, signup_url, docs_url } so callers know exactly what to do. The cap is tighter than check-packages because SBOM parse + bulk vuln JOIN is materially more expensive per call. /api docs updated with the new behaviour + sample response.

docs

About page — CISA KEV / FIRST EPSS added to the data-sources table

The "data sources" table at the bottom of /about now lists CISA Known Exploited Vulnerabilities and FIRST EPSS, with their daily cadence and upstream links. Visitors can audit where the kev / epss fields in our responses come from. The sample-response JSON on the same page also now shows both fields.

data

CISA KEV + FIRST EPSS signals on check-packages / SBOM responses

The new daily kev-epss collector pulls CISA Known Exploited Vulnerabilities (~1.1k entries) and FIRST EPSS scores (~250k CVEs) into ai_signals. /v1/ai/check-packages and /v1/ai/sbom-scan now return kev (boolean) and epss (0..1) per advisory. KEV=true or EPSS≥0.5 escalates the verdict to high regardless of base CVSS — Standard-tier consumers automatically catch "low CVSS but already being exploited" advisories. Sort order also changes to KEV → EPSS → CVSS so truncated clients (read only vulns[0]) get the right top hit.

data

Data milestone — crossed 500k AI datasets

Total collected AI datasets crossed 500,000 for the first time. Auto-emitted by the scheduler.

data

Data milestone — crossed 500k AI models

Total collected AI models crossed 500,000 for the first time. Auto-emitted by the scheduler.

data

Data milestone — crossed 250k vulnerabilities

Total collected vulnerabilities crossed 250,000 for the first time. Auto-emitted by the scheduler.

ui/ux

Footer — partnership & service contact line added

A third slot alongside copyright and bug-report. mailto: link in font-mono; wraps cleanly on narrow viewports.

i18n

Comprehensive ko/en drift fix across account, auth, connect, api, admin pages

About twenty pages where /en/* mirrors leaked Korean strings are now fully bilingual. 90+ new i18n keys; ko/en check is now a standing rule for every page edit.

fix

Package matching — auto-normalise crates.io / RubyGems / Go user input to purl-spec canonical types

User input like pkg:crates.io/tokio now resolves against pkg:cargo/tokio internally. Closes a silent false-negative gap.

May 2026

feature

Reachability prompt split — members-only Standard + Reachability (§11)

Even with a CVE present, downgrade to advisory when the user's code path doesn't reach the affected function.

feature

MCP servers — scope drift detection + pkg:mcp/ identifier support

Silent capability elevation in minor releases is surfaced via the new mcp.scope_drift response field.

feature

AI dataset gating — pkg:data// covers license + PII signals in the unified gate

Full Hugging Face dataset catalogue mirrored. License + PII alongside model weights_format in one gate.

feature

SBOM merge gate — coverage_ratio in response + self-SBOM at /sbom.cdx.json

Coverage ratio surfaced on lockfile scan responses; VDB's own SBOM published for external verification.