pkgintel-mcp
Provides package intelligence for the npm ecosystem by reading the public npm registry: package metadata (versions, latest/default version, licences, links, deprecation, provenance) plus registry search hits, alongside dependency resolution, vulnerability checks, lockfile auditing of package-lock.json, and package comparison.
Provides package intelligence for NuGet packages through deps.dev, covering versions, licences, links, deprecation, advisories, and dependency graphs for .NET packages.
Provides package intelligence for PyPI packages via the PyPI JSON API: normalized names (PEP 503), versions, licences, links, deprecation status, dependency graphs, and OSV vulnerability checks. PyPI search is explicitly unsupported and reported as skipped.
Provides package intelligence for RubyGems packages through deps.dev, returning versions, licences, links, deprecation, advisories, and dependency resolution for Ruby gems.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@pkgintel-mcp check npm lodash 4.17.21 for vulnerabilities"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
pkgintel-mcp
pkgintel-mcp is a keyless, read-only Model Context Protocol connector for package intelligence across npm, PyPI, Cargo, Go, Maven, NuGet, and RubyGems. It reads public metadata from deps.dev v3, OSV.dev, the npm registry, the PyPI JSON API, the crates.io API, and the OpenSSF Scorecard API. Every tool is read-only. The server speaks stdio, and it can serve stateless Streamable HTTP on 127.0.0.1 only.
A package record carries a normalized ecosystem and name, versions, latest and default version, SPDX licence strings, links, deprecation, advisories, and SLSA or provenance when deps.dev provides them. Names are normalized per ecosystem (PyPI follows PEP 503). One failed upstream does not drop the others. Each source has a waiting scheduler so this process keeps the published gap instead of bursting.
Connects to: public package data services (deps.dev, OSV.dev, the npm registry, PyPI, crates.io, and OpenSSF Scorecard). No API key is needed.
By Issah Abubakari (@si-essence). Also listed on Bot Essentials.
Requirements
Node.js 20 or newer (CI uses Node.js 22)
npm
Related MCP server: mcp-dependency-version
Tools
Tool | Input | Output |
|
| Versions (capped), latest, licences, links, deprecation, and per-source status. |
|
| Licences, advisory ids, links, SLSA and attestations when present. |
| Same as version, optional | Depth-limited resolved graph from deps.dev. |
| One | OSV advisories. A single package uses |
|
| Parsed packages, OSV hits, licence counts from the lockfile. Caps apply. |
|
| Side-by-side latest, licences, deprecation. One miss is reported. |
|
| OpenSSF Scorecard aggregate and checks. |
|
| npm and crates search hits. PyPI has no search API and is skipped with a reason. |
| SPDX |
|
| None. | Sources, rates, terms links, and whether |
Lockfile formats: package-lock.json v2/v3, pinned requirements.txt (name==version only), Cargo.lock, go.sum. Text cap 2,000,000 characters. Package cap 1,500.
Tool errors use these prefixes and name the source: [invalid-input], [not-found], [rate-limited], [upstream], [timeout], [config]. Messages do not include stack traces or secret values.
Setup
From a clone of this repository:
npm ci
npm run ci # typecheck, lint, test, build
npm start # stdio
npm run start:http # http://127.0.0.1:3000/mcp and /health
node scripts/live-check.mjs # optional, calls the real public APIs{
"mcpServers": {
"pkgintel-mcp": {
"command": "node",
"args": ["/path/to/pkgintel-mcp/dist/index.js"],
"env": {
"PKGINTEL_CONTACT": "contact@example.com"
}
}
}
}Docker binds HTTP with no authentication. Keep the port on localhost.
docker build -t pkgintel-mcp .
docker run -p 3000:3000 -e PKGINTEL_CONTACT=contact@example.com pkgintel-mcpThe image sets PKGINTEL_CONTACT=contact@example.com. Override it with an address you control. Do not bake a personal address into the image.
Environment
Variable | Default | Role |
|
| User-Agent mailto. Must look like an email. Never a personal address in the repo. |
|
| Inbound sliding window. Cache hits do not spend it. |
|
| TTL for a successful redacted upstream body. |
|
| Per-attempt upstream timeout. |
|
|
|
|
| HTTP port. The listener is |
Invalid values are reported by field name and issue code. The rejected value is not included in the error.
The User-Agent is pkgintel-mcp/0.1.0 (mailto:<PKGINTEL_CONTACT>).
Sources and terms
Checked on 2026-10-20. The rate column is what this process enforces. A source is included only when its terms allow a commercially distributable wrapper that returns metadata.
Source | What we use | Data licence | Rate we enforce | Auth | What we never do | Terms |
deps.dev API v3 | GetPackage, GetVersion, GetDependencies. Ecosystems GO, RUBYGEMS, NPM, CARGO, MAVEN, PYPI, NUGET. | Generated data is CC-BY 4.0. Aggregated package, project, and advisory fields follow their upstream licences. Caching is expressly permitted. | 5 requests/s, one at a time. | None. Google API Terms of Service. | Treat licence strings as legal advice. Omit CC-BY attribution. | |
OSV.dev | POST | Varies per upstream database. GitHub Advisory Database is CC-BY 4.0. NVD is public domain. Other feeds keep their own terms. OSV publishes no API rate cap. | 5 requests/s, one at a time. | None. | Claim one licence covers every advisory. | |
npm registry | Package document and | npm Open Source Terms (updated 2022-03-10). Public APIs may search and replicate registry metadata. Package tarballs keep the publisher's licence. | 2 requests/s against registry.npmjs.org. | None for public metadata. | Crawl npmjs.com (website crawl is 1 rps and is the wrong channel). Imply npm endorsement. | |
PyPI JSON API |
| PyPI Terms of Service and Acceptable Use. API use is a sanctioned channel. No spam. | 1 request/s. | None. | Call a search endpoint. PyPI has none. | |
crates.io API | Crate search | crates.io data-access / crawler policy. Descriptive User-Agent required. Max 1 request/s. | 1 request/s, one at a time. | None. User-Agent identifies this process. | Send a generic HTTP-library User-Agent. Exceed 1 rps. | |
OpenSSF Scorecard |
| API data is CDLA Permissive 2.0. Code is Apache-2.0. | 2 requests/s. | None. | Treat a score as a security guarantee. |
Excluded sources
npms.io is not used. This connector does not depend on that service.
RubyGems.org's own API is unused. RubyGems data comes through deps.dev, which indexes RubyGems.
Maven Central, NuGet.org, and proxy.golang.org are unused as direct HTTP sources. Those ecosystems are served through deps.dev.
Attribution
Package intelligence includes data from Open Source Insights (deps.dev). Generated deps.dev data is licensed under CC-BY 4.0. Advisory records come from OSV.dev and the upstream databases it aggregates, including the GitHub Advisory Database (CC-BY 4.0). npm public registry metadata is used under the npm Open Source Terms. PyPI JSON metadata is used under the PyPI Terms of Service. crates.io API metadata is used under the crates.io crawler policy. OpenSSF Scorecard data is used under CDLA Permissive 2.0. None of these providers endorse this project.
Limits and caveats
deps.dev licence strings are SPDX 2.1 expressions when known, or
non-standard. They are not legal advice.OSV
/v1/querybatchreturns ids. This connector hydrates at most 25 full advisory records per call.audit_lockfilelicence counts come from fields present in the lockfile. It does not fetch a licence for every package from deps.dev.requirements.txtlines must be pinned with==. Ranges, VCS urls, and-rincludes are skipped.PyPI search is skipped with an explicit reason. Look up an exact name with
get_package.Scorecard currently resolves
github.com/org/repo. GitLab and Bitbucket project ids from deps.dev are returned as links, not Scorecard reports.Retries run on 429, 5xx, timeout, and network errors, with bounded backoff and jitter, up to 3 attempts.
Retry-Afteris honoured. Other 4xx responses, HTML bodies, and redirects are not retried.The cache and the inbound window live in the process. They disappear on exit.
contact@example.comis a placeholder. SetPKGINTEL_CONTACTto an address you control.
Running the tests
The tests use mocked upstream responses. They need no API key and make no network calls to the package services.
npm ci
npm test # unit and tool tests (vitest)
npm run ci # typecheck, lint, tests, and buildAt the time of this commit, npm test reports 51 passing tests.
The live check writes its table to live-check-report.txt in the current folder, or to the path in PKGINTEL_LIVE_CHECK_REPORT. That file is ignored by git.
Author
Issah Abubakari (@si-essence).
This connector is also listed on Bot Essentials.
Licence
MIT. See LICENSE. The data licences above are separate from the MIT licence on this code.
Available Tools
10 toolsaudit_lockfileBRead-onlyIdempotent
Parse package-lock.json v2/v3, pinned requirements.txt, Cargo.lock, or go.sum from text or a local path. Runs OSV querybatch and summarises licences found in the lockfile.
Inputs: path, text, format.
check_vulnerabilitiesBRead-onlyIdempotent
Query OSV.dev for one package@version or a batch of packages. Partial source failure is reported per source.
Inputs: name, version, packages, ecosystem.
compare_packagesARead-onlyIdempotent
Compare 2 to 5 packages side by side. One failed package does not drop the others.
Inputs: packages (required).
get_dependenciesBRead-onlyIdempotent
Return a depth-limited resolved dependency graph from deps.dev. Default depth is 2, max 4.
Inputs: name (required), version (required), ecosystem (required), depth.
get_packageARead-onlyIdempotent
Look up a package across npm, PyPI, Cargo, Go, Maven, NuGet, or RubyGems via deps.dev. Returns versions, latest, licences, links, and deprecation.
Inputs: name (required), ecosystem (required), version.
get_scorecardARead-onlyIdempotent
Fetch an OpenSSF Scorecard report for a GitHub repo, or resolve the repo from a package via deps.dev.
Inputs: name, project, version, ecosystem.
get_versionARead-onlyIdempotent
Look up one exact package version on deps.dev. Returns licences, advisories, links, and SLSA or provenance when present.
Inputs: name (required), version (required), ecosystem (required).
license_checkBRead-onlyIdempotent
Evaluate an SPDX 2.x expression against an allow-list of SPDX identifiers. AND requires every branch. OR requires one.
Inputs: allow (required), expression (required).
list_sourcesARead-onlyIdempotent
List upstream sources, enforced rates, terms links, and whether PKGINTEL_CONTACT is set. Values are never returned.
Inputs: no named parameters.
search_packagesARead-onlyIdempotent
Search npm or crates.io. PyPI has no search API. Other ecosystems need an exact name via get_package.
Inputs: query (required), ecosystem (required), limit.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 10 tools
Tools mostly target distinct resource+action pairs: get_package (package-level metadata), get_version (exact version), search_packages (discovery), and get_dependencies (graph) are clearly separable. The only soft overlaps are check_vulnerabilities vs audit_lockfile (both hit OSV) and license_check vs audit_lockfile's license summary, but the descriptions make the boundary between 'single/batch package query' and 'lockfile-level audit' clear enough.
Nine of ten tools follow a clean verb_noun snake_case pattern (get_*, check_*, audit_*, compare_*, search_*, list_*). The lone exception is license_check, which inverts to noun_verb, a minor but noticeable deviation in an otherwise uniform set.
Ten tools is well within the ideal 3-15 range and every tool maps to a distinct capability of a package-intelligence service (lookup, deps, vulns, lockfile audit, comparison, scorecard, search, license, sources). No filler tools are present.
The surface covers the core lifecycle: discovery (search_packages), identity (get_package/get_version), dependency resolution, vulnerability scanning, lockfile auditing, comparison, scorecard health, and license policy. Minor gaps remain — no SBOM/export output, no version-range resolution or upgrade-path suggestion, and no direct advisory detail lookup by ID — but agents can work around these via the existing tools.
Maintenance
Related MCP Connectors
Scan packages and lockfiles (npm, PyPI, Go, Maven, Cargo, NuGet) for vulnerabilities and malware.
Generate SBOMs, scan vulnerabilities, and analyze dependencies from local projects or Git repos.
Package versions, licences and known vulnerabilities for npm, PyPI, crates, Go, Maven, NuGet
Check npm, PyPI, Go and Maven packages or lockfiles against OSV.dev: CVEs, CVSS, fixed versions.
Related MCP Servers
- AlicenseAqualityBmaintenanceEnables querying package ecosystem data from ecosyste.ms, including package metadata, versions, security advisories, dependencies, and repository information across 40+ package registries with fast local SQLite lookups and API fallback.1021 npm9MIT
- AlicenseNot gradedqualityBmaintenanceEnables users to look up package versions, scan for vulnerabilities, and analyze dependencies across multiple registries (npm, Maven, PyPI, etc.) using exact version recommendations for security.4MIT
- AlicenseNot gradedqualityCmaintenanceEnables checking whether software packages are deprecated, archived, stale, active, or unknown with supporting evidence, auditing dependency manifests, and looking up runtime support and end-of-life dates.MIT

@guardbee/mcp-dependencyofficial
AlicenseNot gradedqualityFmaintenanceEnables auditing npm, pip, and other package dependencies for known CVEs via the OSV database, with tools to scan manifests, query individual packages, and integrate into CI/CD workflows.570 npmMIT