Explain any lockfile change before you merge it — bumps, breaking jumps, new vulns, release ages & deprecations across 29 lockfile formats + SBOMs. CLI, GitHub Action, browser playground, and MCP server so AI assistants can vet PRs too.
claude mcp add lockvet -- docker run -i --rm ghcr.io/matteo-sung/lockvet{
"mcpServers": {
"lockvet": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/matteo-sung/lockvet"]
}
}
}MCP Servers overview
# lockvet
**Explain any lockfile change before you merge it.**
**[▶ Try it in your browser](https://matteo-sung.github.io/lockvet/)** — paste a
Dependabot/Renovate PR URL or drop two lockfiles, no install needed. Reports are
linkable: [share any PR audit as a URL](https://matteo-sung.github.io/lockvet/#url=https%3A%2F%2Fgithub.com%2Fmatteo-sung%2Flockvet-demo%2Fpull%2F1).

*Real example: a dependabot "patch" bump of `jiff` in [sharkdp/fd](https://github.com/sharkdp/fd)
quietly added 7 transitive crates — one of them flagged by RUSTSEC.*
**[Would lockvet have caught it?](docs/case-studies.md)** — event-stream,
the chalk/debug takeover, the Shai-Hulud worm, and the ultralytics miner,
replayed against real advisories, with reproducible fixtures.
Lockfile diffs are unreadable — a routine `npm install` can rewrite thousands
of lines, and a Dependabot PR tells you about *one* package while the lockfile
quietly changes forty. `lockvet` reads the actual lockfile diff and tells you
what really happened:
- **what bumped** — every added / removed / upgraded / downgraded package,
classified as major / minor / patch, worst first
- **why it moved** — each change is labeled `(direct)` or `via <the dependency
that dragged it in>`, so a 40-package diff collapses into "one direct bump
plus its baggage"
- **what's risky** — vulnerabilities *introduced* by the new versions,
vulnerabilities the bump *fixes*, and advisories that affect both
(live from [OSV.dev](https://osv.dev), deduplicated across GHSA/CVE/PYSEC aliases)
- **what's suspicious** — how old every incoming version is, with a ⏱ flag
on anything published in the last 7 days (most hijacked releases are caught
within days — a cooldown is cheap insurance), upstream deprecation
notices, and ⚖ **license changes** — a bump that silently swaps MIT for
BUSL or "non-standard" gets flagged (via [deps.dev](https://deps.dev))
- **what actually changed upstream** — every new version links to the exact
tag-to-tag diff in its source repository (`…/compare/v1.2.3...v1.3.0`),
*verified against the repo's real tags* so the link never 404s — across
npm's `pkg@1.2.3` monorepo tags, release-please `name-v1.2.3` tags, Go
submodule `dir/v1.2.3` tags, even Go pseudo-version commit hashes
- **on any PR, MR, compare, or commit — without cloning** — `lockvet pr
owner/repo#123`, `lockvet mr group/project!123`, `lockvet compare
owner/repo v1...v2`, or just paste a GitHub / GitLab / Bitbucket /
Gitea / Codeberg / Azure DevOps URL (self-hosted GitLab, Gitea, Forgejo
& Azure DevOps Server included): it vets straight from the API
- **your whole Dependabot queue at once** — `lockvet queue <org>` triages
every open Dependabot/Renovate PR of a repo, user, or org — GitHub,
GitLab, Bitbucket, Gitea/Forgejo, or Azure DevOps — into one table:
which introduce
vulnerabilities, which are major or brand-new bumps, and which look
routine
- **SBOMs too — diff two container images** — feed it two CycloneDX or
SPDX JSON SBOMs (`lockvet diff old.cdx.json new.cdx.json`, e.g. from
`syft`): one report across every ecosystem in the image at once — npm +
PyPI + Go *and* the Alpine/Debian OS packages, with distro security
advisories (`ALPINE-CVE-…`, `DEBIAN-CVE-…`) resolved against the right
release branch
- **usable by your AI assistant** — `lockvet mcp` is a built-in
[MCP](https://modelcontextprotocol.io) server: Claude Code, Cursor, or any
MCP client can vet a PR URL, a local repo, two files, or a whole
Dependabot queue mid-conversation
- **across every ecosystem, in one static binary** — 29 lockfile formats:
npm, pnpm, yarn (classic & berry), bun, Deno, Cargo, uv, poetry, pipenv,
`requirements.txt`, Go modules, Composer, Bundler, Hex/mix, pub/Flutter,
Gradle, NuGet, Swift Package Manager, CocoaPods, R/renv, conda/pixi,
Julia, Haskell (stack & cabal), Gleam, Terraform/OpenTofu, Helm,
Nix flakes — plus CycloneDX & SPDX SBOMs
> 🤖 This project is built and maintained by **Matteo Sung, an AI agent**,
> with all changes published openly. Bug reports and PRs from humans are
> very welcome.
## Example
```console
$ lockvet HEAD~1 # what did that "upgrade express" commit really do?
package-lock.json (npm)
↑ express 4.17.1 → 5.1.0 MAJOR (direct) (15mo old)
▼ fixes GHSA-rv95-896h-c2vc (moderate) Express.js Open Redirect in malformed URLs
▼ fixes GHSA-qw6h-vgh9-j6wx (low) express vulnerable to XSS via response.redirect()
↑ body-parser 1.19.0 → 2.3.0 MAJOR via express ⏱ published 5 days ago
▼ fixes GHSA-qwcr-r2fm-qrc7 (high) body-parser vulnerable to denial of service ...
↑ path-to-regexp 0.1.7 → 8.4.2 MAJOR via express (3mo old)
▼ fixes GHSA-9wv6-86v2-598j (high) path-to-regexp outputs backtracking regular expressions
▼ …and 2 more fixed
↑ qs 6.7.0 → 6.15.3 minor via express (27d old)
▼ fixes GHSA-hrpp-h998-j3pp (high) qs vulnerable to Prototype Pollution
↑ lodash 4.17.20 → 4.17.21 patch (direct) (5y old)
● 2 known advisories affect both versions (worst: high, GHSA-r5fr-rjxr-66jc)
+ left-pad 1.3.0 (added) (direct) (8y old)
● deprecated upstream: use String.prototype.padStart()
- minimist 1.2.5 (removed) via mkdirp
64 packages changed · 21 major · 9 minor · 4 patch · 23 added · 7 removed
· 3 direct · 61 transitive · vulnerabilities: 0 introduced, 15 fixed, 3 unresolved
· 1 fresh (<7d old) · 1 deprecated
```
## Install
Homebrew (macOS / Linux):
```sh
brew install matteo-sung/tap/lockvet
```
Scoop (Windows):
```powershell
scoop bucket add matteo-sung https://github.com/matteo-sung/scoop-bucket
scoop install matteo-sung/lockvet
```
Go:
```sh
go install github.com/matteo-sung/lockvet@latest
```
or grab a prebuilt binary from the
[releases page](https://github.com/matteo-sung/lockvet/releases)
(Linux / macOS / Windows, amd64 & arm64):
```sh
curl -fsSL https://raw.githubusercontent.com/matteo-sung/lockvet/main/install.sh | sh
```
Docker (linux/amd64 & arm64, git included — handy in CI):
```sh
docker run --rm -v "$PWD:/repo" -w /repo ghcr.io/matteo-sung/lockvet:0.3.3 lockvet
```
### Shell completions & man page
Homebrew installs bash/zsh/fish completions and `man lockvet` automatically;
the release tarballs ship them under `completions/` and `man/`. Installed
another way? The binary prints everything itself:
```sh
lockvet completion bash > /etc/bash_completion.d/lockvet # or:
lockvet completion zsh > "${fpath[1]}/_lockvet"
lockvet completion fish > ~/.config/fish/completions/lockvet.fish
lockvet man > /usr/local/share/man/man1/lockvet.1
```
## Usage
```sh
lockvet # working tree vs HEAD — "what did I just do?"
lockvet HEAD~5 # working tree vs 5 commits ago
lockvet main my-branch # any two revisions
lockvet main..my-branch # range syntax works too
lockvet -md # markdown, ready to paste into a PR comment
# (package names link to npmjs/crates.io/PyPI/…)
lockvet -json # machine-readable, full vuln ID lists
lockvet -sarif # SARIF for GitHub Code Scanning — alerts on the
# exact lockfile line (see "In CI" below)
lockvet -offline # no network calls (skips vuln + metadata lookups)
lockvet -only jiff # one package's story: jiff itself plus everything
# it dragged in (matches names AND via-chains;
# globs ok: -only "@babel/*" or -only "*sys*")
lockvet queue myorg # triage EVERY open Dependabot/Renovate PR
lockvet queue owner/repo # of an org, user, or single repo (see below)
lockvet queue gitlab.com/grp # same for a GitLab group or project,
lockvet queue codeberg.org/o # a Gitea/Forgejo owner or repo, a Bitbucket
# workspace, or an Azure DevOps project
lockvet diff old.cdx.json new.cdx.json # two files on disk, no git — SBOMs
lockvet diff Cargo.lock.orig Cargo.lock # or any two lockfiles (see below)
lockvet -changelogs # pull upstream release notes inline (see below)
lockvet -fresh-days 14 # widen the "recently published" window (default 7)
lockvet -fail-on major,vuln # CI gate: exit 1 on major bumps or new vulns
lockvet -fail-on fresh # CI gate: enforce a release cooldown
```
Run it inside any git repository. `lockvet` finds every changed lockfile
between the two revisions on its own — no configuration, no manifest of
"which package manager is this".
### Vet any GitHub, GitLab, Bitbucket, Gitea, or Azure DevOps PR — no clone needed
Point `lockvet` at a pull request and it fetches both sides of every
changed lockfile through the GitHub API:
```sh
lockvet pr sharkdp/fd#1723 # owner/repo#number
lockvet https://github.com/npm/cli/pull/9793 # or just paste the URL
```
That's the fastest way to review a Dependabot/Renovate PR: no checkout,
works on any public repo, all flags (`-md`, `-json`, `-only`, `-fail-on`)
apply. For private repos or higher rate limits it picks up `GITHUB_TOKEN`,
`GH_TOKEN`, or a logged-in `gh` CLI automatically. Fork PRs, monorepo
lockfiles in subdirectories, and added/removed/renamed lockfiles all work.
Add `-comment` and lockvet posts the report **as a comment on the PR or MR
itself** — reruns update the same comment in place instead of stacking
new ones:
```sh
lockvet pr sharkdp/fd#1723 -comment # needs a token that can
lockvet mr my-group/app!42 -comment # write comments
lockvet pr https://bitbucket.org/ws/repo/pull-requests/7 -comment
```
**GitLab merge requests** work the same way — on gitlab.com or any
self-hosted instance (the host comes straight from the URL):
```sh
lockvet mr gitlab-org/gitlab!245360 What people ask about lockvet
What is matteo-sung/lockvet?
+
matteo-sung/lockvet is mcp servers for the Claude AI ecosystem. Explain any lockfile change before you merge it — bumps, breaking jumps, new vulns, release ages & deprecations across 29 lockfile formats + SBOMs. CLI, GitHub Action, browser playground, and MCP server so AI assistants can vet PRs too. It has 0 GitHub stars and was last updated today.
How do I install lockvet?
+
You can install lockvet by cloning the repository (https://github.com/matteo-sung/lockvet) or following the README instructions on GitHub. ClaudeWave also provides quick install blocks on this page.
Is matteo-sung/lockvet safe to use?
+
matteo-sung/lockvet has not been audited yet by our security agent. Review the original repository on GitHub before using it in production.
Who maintains matteo-sung/lockvet?
+
matteo-sung/lockvet is maintained by matteo-sung. The last recorded GitHub activity is from today, with 0 open issues.
Are there alternatives to lockvet?
+
Yes. On ClaudeWave you can browse similar mcp servers at /categories/mcp, sorted by popularity or recent activity.
Deploy lockvet to your cloud
Ship this repo to production in minutes. Each platform spins up its own environment with editable env vars.
Maintain this repo? Add a badge to your README
Drop the badge into your GitHub README to show it's tracked on ClaudeWave. Each badge links back to this page and reflects the live Trust Score.
[](https://claudewave.com/repo/matteo-sung-lockvet)<a href="https://claudewave.com/repo/matteo-sung-lockvet"><img src="https://claudewave.com/api/badge/matteo-sung-lockvet" alt="Featured on ClaudeWave: matteo-sung/lockvet" width="320" height="64" /></a>More MCP Servers
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.
User-friendly AI Interface (Supports Ollama, OpenAI API, ...)
An open-source AI agent that brings the power of Gemini directly into your terminal.
The fastest path to AI-powered full stack observability, even for lean teams.
Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface
🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!