Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, email [email protected] and we’ll put it right.

Commit a lockfile for your MCP server package

What we checked

We looked in your package’s source repository for a committed lockfile: the file that pins every dependency (direct and transitive) to an exact version and hash. If no lockfile is committed, the supply-chain score is reduced. If we couldn’t read the repository at all, the signal is unverifiable and scores 0; fix the repository link first in that case.

Why it matters

Without a lockfile, install resolves dependencies fresh every time, so two installs of the same version of your package can pull different transitive code. That:

  • makes builds non-reproducible, so a compromised transitive dependency can slip in without any change to your own code;
  • defeats auditing: there’s no canonical record of exactly what shipped, so a scan for known vulnerabilities may not reflect what a user actually installs;
  • removes the integrity hashes that let a client detect tampering.

A committed lockfile is one of the cheapest, highest-signal trust improvements a package can make.

How to fix it

Generate the lockfile locally and commit it to your repository (don’t .gitignore it). Pick your ecosystem:

# Generates package-lock.json
npm install

git add package-lock.json
git commit -m "Add lockfile for reproducible installs"

How we re-check

We re-scan the repository on our next crawl of your package. Once the lockfile is on the default branch at the repository root, the signal records the lockfile as present on the following score refresh.

Give this to your AI

Paste this into Claude Code (or any coding agent) from inside your server's repository. It states the failing signal, the outcome we re-check for, and the format the fix has to take.

Prompt
Context: this repository publishes an MCP server. VerifyMCP's lockfile
check failed, which means we read your source repository but found no
committed lockfile pinning every dependency, direct and transitive, to
an exact version and hash.

Goal: a lockfile matching your manifest is committed to the default
branch at the repository root, so the next crawl records the lockfile
as present.

Do this:
1. Identify the package ecosystem (npm, Python, .NET, Go, or Rust).
2. Generate the lockfile locally:
   - npm: `npm install` produces `package-lock.json`.
   - Python: `uv lock` produces `uv.lock`, or
     `pip-compile --generate-hashes -o requirements.txt requirements.in`
     for a pinned, hashed `requirements.txt`.
   - .NET: `dotnet restore --use-lock-file` produces
     `packages.lock.json` (or set `<RestorePackagesWithLockFile>true`
     in the `.csproj`).
   - Go: `go mod tidy` maintains `go.sum`.
   - Rust: `cargo generate-lockfile` produces `Cargo.lock`.
3. Commit the lockfile to the repository, do not `.gitignore` it.
4. Add a CI step that fails on drift between the lockfile and the
   manifest (`npm ci`, `uv sync --locked`, `dotnet restore
   --locked-mode`), so it can't go stale silently.

Rules:
- Never commit a lockfile that doesn't match the current manifest just to
  have a file present; a stale lockfile misrepresents what actually
  installs and is worse than none.
- If the check instead reported that it couldn't read the repository at
  all, fix the repository link first; that is a separate signal, not
  this one.

Report back: the ecosystem, the lockfile file committed, and confirmation
the CI step now fails on drift.

Reference: https://verifymcp.io/docs/packages/lockfile

Written by Stuart Blackler · Last reviewed 30 June 2026.