npm pkgxraystdioMITupdated 20d ago
Inspect an npm package or MCP server before you install it or connect to it. You get a SAFE, REVIEW, or BLOCK verdict, decided by fixed rules and backed by cited evidence. The analysis is static, runs on your machine, and has no dependencies. Normal scans never execute package code.
What can you do with pkgxray?
pkgxray — pre-install security for npm packages, MCP servers, and AI agents
Inspect an npm package or MCP server before you install it or connect to it.
You get a SAFE, REVIEW, or BLOCK verdict, decided by fixed rules and backed
by cited evidence. The analysis is static, runs on your machine, and has no
dependencies. Normal scans never execute package code.
Website · Documentation · Calibration · Report a bug
Real runs: guard clears express@4.21.0, then blocks a sample modeled on the 2024 @solana/web3.js compromise.
Highlights
- No runtime dependencies — pure Node, and it all runs on your machine (~25 ms static pass).
- Normal scans never execute package code — the tarball is read as bytes in quarantine.
- Cited verdicts from fixed rules — every finding names the file and the evidence. No model decides the verdict, so text planted in a package cannot steer it.
- Built for the agent era — check MCP servers before you connect, gate the installs an agent runs, and re-audit live MCP traffic.
- Calibrated, with a CI gate against regressions — zero heuristic false blocks on the top-1000 most-downloaded packages.
1. Quick start · 2. What it scans & detects · 3. Verdicts · 4. Usage · 5. Integrations · 6. How it compares · 7. Documentation
Why
AI coding assistants install packages and connect to MCP servers quickly, and
often no person reads the code first. Sonatype counted more than 454,600 new
malicious open-source packages across monitored ecosystems in 2025, over 99% of
them on npm
(Sonatype).
npm audit asks whether a package has a known CVE. pkgxray also asks what the
code does, before anything installs.
Quick start
1. Scan a known-benign package (no install of pkgxray needed):
npx --yes pkgxray@1.0.5 guard npm:express@4.21.0
It stages the tarball in quarantine and runs the static and supply-chain checks.
There is no npm install, no lifecycle script, and no package code executed.
Decision: SAFE Grade: A+ (99/100)
No high- or medium-risk indicators were found in the provided evidence.
Notes:
- INFO npm-vs-github-clean — npm tarball matches the linked GitHub repo at the
published version. (15/16 files match GitHub @4.21.0)
2. Read the verdict:
| Verdict | Exit | Meaning |
|---|---|---|
SAFE |
0 |
No high- or medium-risk indicators; default policy permits promotion. |
REVIEW |
3 |
Evidence is incomplete or a privileged capability needs human review. |
BLOCK |
2 |
High-severity cited evidence — reject or investigate. |
SAFE is not a proof that a package is harmless; static analysis cannot see a
payload downloaded only at runtime. See the threat model.
3. See a BLOCK on the supplied inert fixture:
npx --yes pkgxray@1.0.5 --file examples/onboarding-malicious.json --format markdown
The fixture is inert source text that models a split-string SSH-key read and
exfiltration. It is never executed. It returns BLOCK (exit 2) with the
cited file and evidence.
4. Add it to your workflow — rechecks & CI, MCP, Hookshot install gate.
Two execution models. Default
guardandauditscans are static, so package code is never executed. Three surfaces are different: listing an MCP server's tools may spawn it,mcp-proxyruns it behind a gate, and the opt-incanaryexecutes the package in a sandbox to confirm what it does. The canary can confirm that a package is malicious, but it can never prove one is safe. Full boundary: SECURITY.md.
What it scans & detects
Scans — pkgxray guard npm:name@version or pypi:name@version,
github:owner/repo, a local directory, whole lockfiles across two ecosystems
(npm: package-lock.json, yarn.lock, pnpm-lock.yaml, package.json; PyPI:
requirements.txt, poetry.lock, Pipfile.lock, pyproject.toml), MCP
servers, and AI-agent extensions.
Detects — credential theft (incl. split-fragment paths), cloud
instance-metadata and secret-store harvesting, prompt injection, Unicode
smuggling, base64 payloads and stage-2 loaders, exfiltration, persistence
(shell profile, OS scheduler, and injected CI/CD workflows), self-deleting
droppers, registry worm replication (install-time npm publish), npm
install-hook and PyPI setup.py install-time execution, obfuscated computed-arg
execution, hallucinated / slopsquat names (a lockfile pin the registry never
published), known CVEs (via OSV, before download), npm↔GitHub artifact
divergence, trojaned updates (recheck), and MCP
capability-surface abuse.
The full coverage matrix is in the threat model, along with the known blind spot: a package that downloads its payload later. A side-by-side comparison table is on the website.
Verdicts
| Verdict | You should |
|---|---|
SAFE |
Install. Only safe promotes out of quarantine by default. |
REVIEW |
Inspect the quarantined copy before promoting. |
BLOCK |
Do not install. Every finding names the file and evidence. |
Exit codes are stable and CI-friendly: 0 safe/allow · 2 block ·
3 review.
Usage
pkgxray guard npm:some-package@1.2.3 [--format json] # vet a package before install
pkgxray guard pypi:some-package@1.2.3 # same, for a PyPI package (sdist staged + scanned)
pkgxray mcp --package npm:some-mcp-server@1.4.2 npx some-mcp-server # vet an MCP server; --recheck catches the rug-pull
pkgxray audit package-lock.json [--deep] # also: yarn.lock, pnpm-lock.yaml, package.json
pkgxray audit requirements.txt [--deep] # PyPI: also poetry.lock, Pipfile.lock, pyproject.toml
pkgxray recheck package-lock.json # scheduled: non-zero only on a regression
One optional .pkgxray.json tunes policy, and every surface reads it. No config
means the strictest settings. Config can never allow a CVE away, every loosening
is printed, and a scan that errors fails closed to review. Schema and rules:
configuration.md · .pkgxray.example.json.
Integrations
One engine behind every entry point. "Works with" means a documented setup guide, not a vendor-endorsed integration.
| Where | What it does | Guide |
|---|---|---|
| Coding agents — Codex, Claude Code, Cursor, Windsurf | Gate installs and expose the audit tools to the agent | coding-agents.md |
| MCP clients | Vet a server before connect; run pkgxray itself as an MCP server | mcp.md |
| GitHub Actions / CI | Fail a build when a dependency crosses policy | github-actions.md |
| Install gate — Hookshot | Run guard on every package an agent tries to install |
examples/hookshot/ |
| Runtime MCP gate | Proxy a live MCP server and gate every tool call | mcp-proxy |
| Dependency monitoring | Re-vet installed deps and pre-vet upgrades on a schedule | recheck |
How it compares
npm audit and OSV-Scanner check for published CVEs, and pkgxray does not
replace them. Run it alongside them. The tools in the same lane are Socket.dev,
OpenSSF Package Analysis, and Cisco MCP Scanner, which also analyze what package
code does. The full capability comparison is in
docs/comparison.md and on the
website.
Evidence
pkgxray records zero heuristic false blocks on the top-1000 most-downloaded packages, and CI gates against a regression (scope and methodology). The published runs live at pkgxray.ca/stats. The claim covers the most-installed set only. It is not a claim of zero false blocks on every package.
Documentation
| Doc | What it covers |
|---|---|
| architecture.md · design.md | Pipeline, surfaces, principles |
| threat-model.md | Scope, blind spots, prompt-injection stance |
| mcp.md · mcp-registry.md | MCP vetting, runtime proxy, registry entry |
| canary-threat-model.md | The opt-in behavioral canary |
| configuration.md · reference.md | .pkgxray.json, severity policy, recheck, cache server |
| benchmark.md · comparison.md | Calibration and how it compares |
| compatibility.md · json-schema.md | 1.0 contract, --format json schema |
Start at the documentation index.
Contributing
npm test # zero-dep node --test suite
npm run benchmark # calibration corpus: precision/recall + 0-false-block gate
npm run validate:website # regenerate + validate the calibration pages
Pull requests are welcome. Read CONTRIBUTING.md and the Code of Conduct first. Report vulnerabilities privately, as SECURITY.md describes. Releases publish to npm with provenance (SLSA attestation), and each one is gated on the tests, the calibration benchmark, and pkgxray's own supply-chain guard.
Install
Add pkgxray to your client. Pick the one you use.
claude mcp add pkgxray -- npx -y pkgxraycodex mcp add pkgxray -- npx -y pkgxrayamp mcp add pkgxray -- npx -y pkgxray{
"mcpServers": {
"pkgxray": {
"command": "npx",
"args": [
"-y",
"pkgxray"
]
}
}
}Add to `claude_desktop_config.json`, then restart Claude Desktop.
{
"mcpServers": {
"pkgxray": {
"command": "npx",
"args": [
"-y",
"pkgxray"
]
}
}
}Add to `~/.cursor/mcp.json`, or `.cursor/mcp.json` for a single project.
code --add-mcp '{"name":"pkgxray","command":"npx","args":["-y","pkgxray"]}'Or add the block manually to `.vscode/mcp.json` under `servers`.
{
"mcpServers": {
"pkgxray": {
"command": "npx",
"args": [
"-y",
"pkgxray"
]
}
}
}Add to `~/.codeium/windsurf/mcp_config.json`.
{
"mcpServers": {
"pkgxray": {
"command": "npx",
"args": [
"-y",
"pkgxray"
]
}
}
}Add to `cline_mcp_settings.json` via the MCP Servers panel.
{
"mcpServers": {
"pkgxray": {
"command": "npx",
"args": [
"-y",
"pkgxray"
]
}
}
}Add to `~/.gemini/settings.json`.
{
"mcpServers": {
"pkgxray": {
"type": "local",
"command": "npx",
"args": [
"-y",
"pkgxray"
],
"tools": [
"*"
]
}
}
}Add to `~/.copilot/mcp-config.json`, or run `/mcp add` inside the CLI.
{
"context_servers": {
"pkgxray": {
"command": {
"path": "npx",
"args": [
"-y",
"pkgxray"
]
}
}
}
}Add to your Zed `settings.json`.
npx -y pkgxrayRun `goose configure`, choose **Add Extension → Command-line Extension**, and paste this command.
Score
39 / 100
Incomplete
- Documentation25/25
- Maintenance19/25
- Trust13/20
- Capability0/15
- Install experience12/15
- Documents what it does and how to connect
- Has a resolvable package or endpoint
- Exposes at least one tool, prompt or resource
- README has substantive content
- Includes a code example
- Documents its configuration
- Mentions credentials or security posture
- Last commit 12 days ago
- Has a release history
- Repository is not archived
- Licensed MIT
- Namespace verified in the official MCP registry
- Claimed by its owner
- Published under an organisation
- 0 tool(s) documented
- Provides prompt templates
- Provides resources
- 12 documented install method(s)
- Published to a package registry
- Offers a hosted endpoint — no local install
Version history
| Versions | Published |
|---|---|
| 1.0.5Latest | Jul 29, 2026 |