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-mcpcheck 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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| text | No | ||
| format | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and open-world, so safety is covered. The description usefully discloses that a remote OSV querybatch is executed (consistent with openWorldHint) and that licence summarisation happens, but it is silent on precedence when both path and text are supplied, network failure behavior, size limits, and what the response contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler, front-loading the accepted inputs before the processing behavior. Slightly dense in the format list, but every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no parameter descriptions, the description should say more about what comes back (vulnerability findings plus licence summary, and in what shape). It covers inputs well but leaves the return contract and the path/text interaction implicit, which is a meaningful gap for a 3-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries real burden and it does add value: it maps the four enum values to concrete lockfile formats and notes constraints such as package-lock v2/v3 and pinned requirements.txt. It also glosses 'text or a local path' for the two string inputs, but never states mutual exclusivity, precedence, or that all three parameters are optional.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verbs and resources: parses named lockfile formats from text or a local path, then runs an OSV querybatch and summarises licences. That is far more specific than a restatement of the name, but it does not differentiate itself from siblings like check_vulnerabilities or license_check, which appear to cover overlapping ground.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance and no mention of the obvious alternatives. An agent cannot tell from the description whether to call audit_lockfile or to call check_vulnerabilities and license_check separately, nor when a whole-lockfile audit is preferred over those narrower tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_vulnerabilitiesBRead-onlyIdempotent
Query OSV.dev for one package@version or a batch of packages. Partial source failure is reported per source.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| version | No | ||
| packages | No | ||
| ecosystem | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already cover read-only, open-world, idempotent, and non-destructive behavior. The description adds useful context that partial source failures are reported per source, which is meaningful behavior beyond the annotations, though it does not mention rate limits or output structure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no wasted wording, and the primary usage mode is front-loaded before the partial-failure note.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should explain what a vulnerability query returns, but it only mentions per-source partial failures. It also omits details about the ecosystem parameter and batch constraints, leaving significant gaps for an open-world query tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter semantics. It distinguishes the name/version path from the packages batch path but says nothing about the ecosystem parameter, enum values, batch limits, or the fact that top-level parameters are technically not required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: query OSV.dev for a single package@version or a batch. It clearly distinguishes the single-package and batch modes, though it does not explicitly differentiate itself from siblings like audit_lockfile or get_package.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies when to use the tool by naming OSV.dev and the two supported input modes, but it gives no explicit guidance about when to choose this over audit_lockfile, license_check, or get_package.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_packagesARead-onlyIdempotent
Compare 2 to 5 packages side by side. One failed package does not drop the others.
| Name | Required | Description | Default |
|---|---|---|---|
| packages | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive, so the safety profile is covered. The description adds a genuinely useful trait beyond the annotations: partial-failure isolation, meaning one bad package won't drop the rest. It stops short of describing output structure or rate/limit behaviors, so it is good but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the core action and cardinality, with the failure-tolerance note second. Every sentence earns its place; nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description should convey what a comparison returns and which attributes are contrasted; it says nothing about that. Combined with 0% parameter description coverage, an agent knows what the tool does but not what it will get back or how to shape the input beyond the schema's structural hints.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden for a nested parameter object with name, version, and ecosystem. The phrase '2 to 5 packages' mirrors minItems/maxItems from the schema rather than adding new meaning, and it does not clarify that version is optional or what ecosystem values mean. Baseline adequacy, but a real gap given zero schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (compare) and resource (packages) with a clear cardinality constraint of 2 to 5, which distinguishes it from single-package siblings like get_package. However, it never says what dimensions are actually compared (versions, vulnerabilities, licenses, scores), leaving the resource's scope partly underspecified.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 2-to-5 range implies usage constraints, and naming partial-failure tolerance gives some context. But there is no explicit guidance on when to use this versus calling get_package or get_scorecard individually, and no exclusions or prerequisites are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dependenciesBRead-onlyIdempotent
Return a depth-limited resolved dependency graph from deps.dev. Default depth is 2, max 4.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| depth | No | ||
| version | Yes | ||
| ecosystem | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, and non-destructive, so safety is covered. The description adds genuinely new facts: the graph is depth-limited, the default is 2, and the data comes from an external service (consistent with openWorldHint). It says nothing about what 'resolved' entails, pagination, or failure modes when a package is unknown.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and resource, and the depth constraint is packed into the same breath. No filler, no restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and zero parameter coverage, an agent still cannot tell what the graph looks like (node/edge shape, how resolution conflicts are reported) or what the version/ecosystem parameters require. For a four-parameter, network-backed tool, the definition is too thin to call reliably without guessing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning, but it only explains depth (default 2, cap 4) — the one piece of information the schema does not already give. The three required parameters (ecosystem, name, version) and their expected formats/relationship are left entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return a ... resolved dependency graph') plus the data source (deps.dev), which clearly separates it from metadata siblings like get_package and get_version. It stops short of naming a sibling or contrasting behavior, so it is clear but not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance at all: nothing says to reach for this over get_package, compare_packages, or audit_lockfile when the agent needs transitive dependency information. Only the name and purpose imply usage, and there are no exclusions or prerequisites stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| version | No | ||
| ecosystem | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, open-world), so the bar is lower. The description adds genuinely useful context beyond them: the upstream data source (deps.dev) and an enumeration of returned fields, which matters because no output schema exists. It omits not-found/error behavior for unknown packages, keeping it at 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler: the verb, ecosystem coverage and source come first, the payload second. Every clause carries information an agent cannot get from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only lookup with no output schema, describing the returned fields is the key compensation, and it does that. The remaining shortfall is the optionality and semantics of the version parameter, which is undocumented in both schema and description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden, and it partially does: the ecosystem list mirrors the enum values and "versions, latest" gestures at the version parameter. But it never says version is optional or that omitting it yields the latest, nor how name is scoped per ecosystem — a notable gap given zero schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Look up a package") plus the backing source (deps.dev) and enumerates all seven supported ecosystems, so scope is unambiguous. It also lists what comes back (versions, latest, licences, links, deprecation). It stops short of naming the nearest siblings (get_version, search_packages) to draw the boundary, so a 4 rather than a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the returned-fields list hints that you call this when you need package metadata rather than dependency graphs or vulnerabilities. With nine siblings including get_version, search_packages and license_check, no explicit when-to-use-this-vs-that guidance is given, leaving real ambiguity for an agent choosing between them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_scorecardARead-onlyIdempotent
Fetch an OpenSSF Scorecard report for a GitHub repo, or resolve the repo from a package via deps.dev.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| project | No | ||
| version | No | ||
| ecosystem | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds that external resolution goes through deps.dev, which is useful context beyond annotations, but it says nothing about failure behavior when a package can't be resolved, or about data freshness/caching.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler; both operating modes are stated compactly and nothing is repeated from structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given rich annotations and no output schema, the description covers what is fetched and the two input routes, which is close to sufficient. The remaining gap is the parameter-to-mode mapping, which matters for a tool where all four parameters are optional and mutually dependent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the schema provides four opaque strings and an ecosystem enum with no meaning attached. The description partially compensates by revealing two input shapes (repo name vs. package identity), but it never maps 'name', 'project', 'version' or 'ecosystem' to those shapes, and leaves requiredness (0 required params) ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch an OpenSSF Scorecard report') and adds the scope: either a GitHub repo directly or a package resolved via deps.dev. This is clearly distinguishable from siblings like get_package or get_dependencies, though it doesn't name a sibling to route against.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The two operating modes are implied by 'for a GitHub repo, or resolve the repo from a package via deps.dev', which hints at when each input shape applies. However, it never states which parameters select which mode, nor any exclusions or prerequisites (e.g., must supply name OR project+ecosystem).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_versionARead-onlyIdempotent
Look up one exact package version on deps.dev. Returns licences, advisories, links, and SLSA or provenance when present.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| version | Yes | ||
| ecosystem | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/non-destructive, so the safety profile is covered; the description adds valuable payload disclosure (licences, advisories, links, SLSA/provenance) and the conditional "when present". It does not state what happens on a missing version or an unsupported ecosystem.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero waste, with the identifying constraint front-loaded and the value proposition second.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 3-param read-only lookup with no output schema, the description covers what is returned and that some fields are conditional. The remaining gap is miss/error behavior and parameter formatting.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden, yet it only hints that the version must be exact rather than a range or "latest". It says nothing about ecosystem enum values, the name format, or how the three required fields combine.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb ("Look up") and a precise resource scope ("one exact package version on deps.dev"), and enumerates the payload (licences, advisories, links, SLSA/provenance). This implicitly separates it from search_packages and get_package, but no sibling is named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase "one exact package version" implies you must already know a pinned version, which hints at when to use it versus a package-level or search tool. However, no explicit when-to-use/when-not or alternative tool is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
license_checkBRead-onlyIdempotent
Evaluate an SPDX 2.x expression against an allow-list of SPDX identifiers. AND requires every branch. OR requires one.
| Name | Required | Description | Default |
|---|---|---|---|
| allow | Yes | ||
| expression | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, open-world, so the safety profile is covered. The description adds real value by disclosing the evaluation rule (AND requires every branch, OR requires one), but says nothing about the result shape, how failures are reported, or how operators like WITH/+ are handled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with zero padding, and the purpose is front-loaded before the evaluation rule. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (2 required params, no output schema) and annotations carry the safety profile, but with no output schema the description should say what 'evaluate' returns (boolean pass/fail, list of failing identifiers?). That omission is the main remaining gap for correct invocation and interpretation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does partly: 'expression' is scoped to SPDX 2.x and 'allow' to SPDX identifiers, which rules out free-form or regex matching. But it gives no format examples, case-sensitivity, or whether 'allow' may itself contain expressions, leaving gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (evaluate) and resource (SPDX 2.x expression against an allow-list of SPDX identifiers), which is clearly distinct from the package/dependency-oriented siblings. It doesn't explicitly name a sibling or boundary, which keeps it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence explains AND/OR evaluation semantics, not when to reach for this tool versus e.g. get_package or audit_lockfile. There is no stated context, prerequisite, or exclusion; an agent must infer that this is the license-compliance gate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sourcesARead-onlyIdempotent
List upstream sources, enforced rates, terms links, and whether PKGINTEL_CONTACT is set. Values are never returned.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the bar is lower. The description adds genuinely new behavior: it discloses which fields are surfaced and that sensitive values are never returned, which is important for an agent deciding whether it can inspect config safely.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the resource and returned fields front-loaded, followed by a single crucial non-disclosure caveat. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and no output schema, the description carries the burden of describing the return shape, which it does by enumerating the four kinds of information. It could note the container/format (e.g. a list of source objects), but an agent has enough to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so there is nothing for the description to disambiguate; baseline applies. The description correctly implies a parameterless, whole-set listing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb 'List' plus the resource and the exact fields enumerated (sources, enforced rates, terms links, PKGINTEL_CONTACT status). It reads clearly as a configuration/metadata enumeration tool and is distinguishable from data-fetching siblings like get_package or get_version.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: an agent would call this to discover upstream registries, rate limits, and whether contact info is configured. There is no explicit when-to-use/when-not or reference to an alternative tool, so the agent must infer the trigger condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_packagesARead-onlyIdempotent
Search npm or crates.io. PyPI has no search API. Other ecosystems need an exact name via get_package.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| ecosystem | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so safety is covered. The description usefully adds that only two of the seven enum ecosystems are searchable, but it does not say what actually happens if ecosystem='pypi' is passed (error vs. empty result), which is the one behavioral question an agent will have.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero waste, and the applicability constraint is front-loaded before the fallback instruction. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description says nothing about the return shape (list of results, ranking, fields per result), which would help an agent plan next steps. Otherwise complete for a read-only search tool whose safety profile is carried by annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It clarifies the most important parameter, ecosystem (only npm/cargo are valid despite the seven-value enum), but says nothing about query semantics or the limit cap of 25, leaving half the params unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Search) with the resources it applies to (npm / crates.io) and immediately bounds the scope by naming the sibling that handles everything else. An agent can distinguish it from get_package without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says where search works (npm, crates.io), where it does not (PyPI), and what to do instead for other ecosystems (exact name via get_package). This is a full when/when-not/alternative routing statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v0.1.0- First observed
audit_lockfile - First observed
check_vulnerabilities - First observed
compare_packages - First observed
get_dependencies - First observed
get_package - First observed
get_scorecard - First observed
get_version - First observed
license_check - First observed
list_sources - First observed
search_packages
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.
Check npm, PyPI, Go and Maven packages or lockfiles against OSV.dev: CVEs, CVSS, fixed versions.
Package intelligence for AI agents across npm, PyPI, crates.io and deps.dev. No API keys.
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.1016 npm9MIT
- AlicenseNot gradedqualityCmaintenanceEnables 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 gradedqualityBmaintenanceEnables 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.130 npmMIT