npm audit for your AI agent's extensions: inventory installed MCP servers/skills and flag known-vulnerable (OSV), abandoned, and unpinned ones in CI.
Project description
agentlock
npm audit for your AI agent's extensions. Inventory the MCP servers (and skills)
your project has installed, resolve each to its npm/PyPI package, and flag the
known-vulnerable, abandoned, and unpinned ones — with a CI gate.
You wire up MCP servers with npx -y some-server and uvx some-server and never think
about them again. But they're third-party code with full tool access — and the supply
chain is real: mcp-remote shipped CVE-2025-6514 (CVSS 9.6, OS command injection)
with 437K+ weekly downloads. Generic SBOM scanners don't look at your agent layer. agentlock does.
pipx install mujin-agentlock
agentlock scan # audit this project's MCP servers / skills
agentlock scan --global # also include ~/.claude.json etc.
remote-proxy (mcp-server, .mcp.json)
npm:mcp-remote@0.0.5 · vulnerable [VULNERABLE]
! GHSA-6xpm-ggf7-wc3p (CVE-2025-6514) OS command injection via untrusted MCP server connections
everything (mcp-server, .mcp.json)
npm:@modelcontextprotocol/server-everything · ok [unpinned]
3 extension(s): 1 vulnerable, 0 stale, 1 unpinned
What it checks
For each MCP server it can resolve to a registry package:
- Known vulnerabilities — queried against OSV.dev (free, no key).
- Abandoned / stale — no release in
--stale-days(default 365), via the npm/PyPI registry. - Unpinned — launched with a floating version (
npx -y pkg), so you can't reproduce what runs.
Where it reads extensions from: .mcp.json, .cursor/mcp.json, .vscode/mcp.json,
.claude/settings.json, .claude/skills/, and (--global) ~/.claude.json.
Honest scope
There is no MCP-specific advisory feed yet, so agentlock maps an MCP server to its underlying npm/PyPI package and audits that. It catches dependency CVEs (like the one above) and abandonment — it does not detect MCP-specific tool-poisoning in an otherwise-clean package. Local-path and remote-URL servers have no registry to audit and are listed as skipped. (For content risks in a specific skill/server, pair it with agentaudit.)
CI gate
# .github/workflows/agent-supply-chain.yml
jobs:
agentlock:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: "3.11" }
- run: pipx install mujin-agentlock
- run: agentlock scan --fail-on vuln # fail the build on a known-vulnerable extension
--fail-on {vuln,stale,unpinned,none}, --json, --offline (inventory only). Zero dependencies.
Part of a set
- agentaudit — audit an extension's code for risky patterns.
- agentsync — keep agent config files in sync.
- skillbudget — budget always-loaded context tokens.
- mcpdrift — catch MCP server contract drift.
agentaudit audits one extension's code; agentlock audits your whole fleet of installed extensions.
Built by Mujin Labs — tooling for the autonomous-agent era. MIT.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mujin_agentlock-0.1.0.tar.gz.
File metadata
- Download URL: mujin_agentlock-0.1.0.tar.gz
- Upload date:
- Size: 10.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8ca54e0b69d0ddc07212542cf0210be77a9b2d983515722c9d35bd9d9a81f1e4
|
|
| MD5 |
9573d88fa70041ce3779ba58a759cd94
|
|
| BLAKE2b-256 |
65686174c5aae2b652cabbd242da2924b0fa4ce4fcefe1fa0d48251f18b45aa1
|
File details
Details for the file mujin_agentlock-0.1.0-py3-none-any.whl.
File metadata
- Download URL: mujin_agentlock-0.1.0-py3-none-any.whl
- Upload date:
- Size: 11.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9e2b7a618565e781215888209839f0100d564fafcab7200922a05b920d0f38e6
|
|
| MD5 |
b173051f5d423f341fa8175132cda880
|
|
| BLAKE2b-256 |
d5a481847a9128f9cd8fb9ac314e835ac330f9b13a0871e07d580d4663861005
|