Skip to main content
Glama
si-essence

pkgintel-mcp

by si-essence

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

get_package

ecosystem, name. Optional version.

Versions (capped), latest, licences, links, deprecation, and per-source status.

get_version

ecosystem, name, exact version.

Licences, advisory ids, links, SLSA and attestations when present.

get_dependencies

Same as version, optional depth 1-4 (default 2).

Depth-limited resolved graph from deps.dev.

check_vulnerabilities

One ecosystem+name+version, or packages (1-50).

OSV advisories. A single package uses /v1/query. A batch uses /v1/querybatch.

audit_lockfile

text or local path. Optional format.

Parsed packages, OSV hits, licence counts from the lockfile. Caps apply.

compare_packages

packages array of 2-5.

Side-by-side latest, licences, deprecation. One miss is reported.

get_scorecard

project as github.com/org/repo, or ecosystem+name.

OpenSSF Scorecard aggregate and checks.

search_packages

ecosystem, query. Optional limit 1-25.

npm and crates search hits. PyPI has no search API and is skipped with a reason.

license_check

SPDX expression and allow list.

allowed, matching, blocked, unknown identifiers.

list_sources

None.

Sources, rates, terms links, and whether PKGINTEL_CONTACT is set. Values are never returned.

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-mcp

The 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

PKGINTEL_CONTACT

contact@example.com

User-Agent mailto. Must look like an email. Never a personal address in the repo.

PKGINTEL_PER_MINUTE

60

Inbound sliding window. Cache hits do not spend it.

PKGINTEL_CACHE_TTL_SEC

60

TTL for a successful redacted upstream body. 0 disables the cache.

PKGINTEL_TIMEOUT_MS

20000

Per-attempt upstream timeout.

MCP_TRANSPORT

stdio

stdio or http. --http forces HTTP.

PORT

3000

HTTP port. The listener is 127.0.0.1.

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.

https://docs.deps.dev/api/v3/

OSV.dev

POST /v1/query, POST /v1/querybatch, GET /v1/vulns/{id}.

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.

https://google.github.io/osv.dev/api/

npm registry

Package document and /-/v1/search.

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.

https://docs.npmjs.com/policies/open-source-terms

PyPI JSON API

GET /pypi/<name>/json.

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.

https://policies.python.org/pypi.org/Terms-of-Service/

crates.io API

Crate search /api/v1/crates.

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.

https://crates.io/data-access

OpenSSF Scorecard

GET /projects/github.com/{org}/{repo}.

API data is CDLA Permissive 2.0. Code is Apache-2.0.

2 requests/s.

None.

Treat a score as a security guarantee.

https://github.com/ossf/scorecard

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/querybatch returns ids. This connector hydrates at most 25 full advisory records per call.

  • audit_lockfile licence counts come from fields present in the lockfile. It does not fetch a licence for every package from deps.dev.

  • requirements.txt lines must be pinned with ==. Ranges, VCS urls, and -r includes 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-After is 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.com is a placeholder. Set PKGINTEL_CONTACT to 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 build

At 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 tools
audit_lockfileB
Read-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.

NameRequiredDescriptionDefault
pathNo
textNo
formatNo

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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_vulnerabilitiesB
Read-onlyIdempotent

Query OSV.dev for one package@version or a batch of packages. Partial source failure is reported per source.

NameRequiredDescriptionDefault
nameNo
versionNo
packagesNo
ecosystemNo

TDQS

B3.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_packagesA
Read-onlyIdempotent

Compare 2 to 5 packages side by side. One failed package does not drop the others.

NameRequiredDescriptionDefault
packagesYes

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_dependenciesB
Read-onlyIdempotent

Return a depth-limited resolved dependency graph from deps.dev. Default depth is 2, max 4.

NameRequiredDescriptionDefault
nameYes
depthNo
versionYes
ecosystemYes

TDQS

B3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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_packageA
Read-onlyIdempotent

Look up a package across npm, PyPI, Cargo, Go, Maven, NuGet, or RubyGems via deps.dev. Returns versions, latest, licences, links, and deprecation.

NameRequiredDescriptionDefault
nameYes
versionNo
ecosystemYes

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_scorecardA
Read-onlyIdempotent

Fetch an OpenSSF Scorecard report for a GitHub repo, or resolve the repo from a package via deps.dev.

NameRequiredDescriptionDefault
nameNo
projectNo
versionNo
ecosystemNo

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_versionA
Read-onlyIdempotent

Look up one exact package version on deps.dev. Returns licences, advisories, links, and SLSA or provenance when present.

NameRequiredDescriptionDefault
nameYes
versionYes
ecosystemYes

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_checkB
Read-onlyIdempotent

Evaluate an SPDX 2.x expression against an allow-list of SPDX identifiers. AND requires every branch. OR requires one.

NameRequiredDescriptionDefault
allowYes
expressionYes

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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_sourcesA
Read-onlyIdempotent

List upstream sources, enforced rates, terms links, and whether PKGINTEL_CONTACT is set. Values are never returned.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_packagesA
Read-onlyIdempotent

Search npm or crates.io. PyPI has no search API. Other ecosystems need an exact name via get_package.

NameRequiredDescriptionDefault
limitNo
queryYes
ecosystemYes

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 10 tool updatesv0.1.0
    • First observedaudit_lockfile
    • First observedcheck_vulnerabilities
    • First observedcompare_packages
    • First observedget_dependencies
    • First observedget_package
    • First observedget_scorecard
    • First observedget_version
    • First observedlicense_check
    • First observedlist_sources
    • First observedsearch_packages

TDQS

A3.7/5.0

Scored across 10 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Enables 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.
    10
    16 npm
    9
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables 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.
    4
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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
  • A
    license
    Not graded
    quality
    F
    maintenance
    Enables 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 npm
    MIT