Pinright
OfficialSupports Composer/PHP package dependencies in version checks, advisory verdicts, version-specific docs, and manifest/lockfile audits.
Uses GitHub repositories at release tags as a source for version-specific library documentation and sends package metadata to GitHub as part of docs lookup.
Treats GitHub Actions as a dependency ecosystem, checking action versions for advisories, lookalikes, nonexistent versions, and policy issues.
Supports Gradle/Maven dependencies in package checks, version-specific docs, and whole-tree dependency audits.
Uses jsDelivr as a source for published package files when retrieving documentation for a specific package version.
Checks npm package versions for advisories, malware/lookalike names, deprecations, licenses, and policy issues, returns version-accurate docs, and audits npm manifests/lockfiles.
Supports NuGet package dependencies in version checks, advisory verdicts, docs retrieval, and manifest/lockfile audits.
Supports PyPI/Python package dependencies in version checks, advisory verdicts, docs retrieval, and manifest/lockfile audits.
Supports RubyGems package dependencies in version checks, advisory verdicts, docs retrieval, and manifest/lockfile audits.
pinright
Version-accurate docs and a dependency check for coding agents. Your agent gets library versions from one of two places: its memory, where about 40% of the pins it wrote in our benchmark carried a known advisory, or a docs MCP server, which returns documentation and does not check the version against advisories. pinright gives it the docs for the exact version it installs and a verdict on every dependency it adds, before the install runs. MCP server, pre-install hook, CLI and GitHub Action, all local.
Install
Node 20.9 or newer. One line, then restart the agent:
npm i -g pinright && pinright init --user # just you, every project; the hook starts in about 0.2 s
npx -y pinright init # your team: writes project files you commitinit wires the MCP server, the pre-install hook where the client has one, and a starter
.pinright.json. 16 clients; six have a hook: Claude Code, Cursor, VS Code (GitHub Copilot),
OpenAI Codex, Gemini CLI and Windsurf. The Cursor and VS Code buttons above add the MCP server
only. Every client, scopes and pinright doctor.
Related MCP server: lockdocs
Without pinright, with pinright
Without. The agent runs npm install lodash@4.17.20. It installs. The lockfile now carries
five advisories, two of them high, and nobody is told.
With. The hook answers before the command runs, and the agent reads this:
pinright blocked this dependency change:
- lodash@4.17.20 (npm) has 5 known advisories (CVE-2021-23337, CVE-2026-4800, CVE-2020-28500, HIGH). Use 4.x release 4.18.1: npm install lodash@4.18.1
Change the version (or the name) and try again. check-package and get-docs from the pinright MCP server explain each case.The agent retries with 4.18.1, on the same release line. When it asks first, check-package
and get-docs give it the same verdict with the full advisory list, the version to pin, and the
docs for that version. Real output of pinright hook claude, 2026-11-01.
Why pinright
Docs MCP servers return documentation for a library. They do not check the version the agent pins,
and they do not see the install. To measure that kind of server we ran pinright's own server with its
security layer off (PINRIGHT_ABLATION=docs-only): docs for the version asked, no verdict. It is not
another product. Claude Code with Sonnet 5.5, Haiku 5.5 and Opus 5.5, 2 runs per cell, on the 1.0.0
code; each cell gives the range over the three models.
No docs | Docs-only context server | pinright | |
Direct dependencies pinned with a known advisory | 40% to 42% | 0% to 2% | 0% |
Whole-tree alerts per project ( | 29.8 to 31.9 | 0.3 to 3.5 | 0.3 |
Docs tasks that used the current API | 9 to 14 of 16 | 15 or 16 of 16 | 16 of 16 |
Tokens per agent task | 15k to 21k | 56k to 94k | 42k to 74k |
Tokens per docs task | 17k to 23k | 94k to 135k | 63k to 95k |
Agent turns per agent task | 4.0 to 4.3 | 9.3 to 11.1 | 5.9 to 7.5 |
MCP tool text read per agent task | none | 25k to 45k characters | 5k to 17k characters |
Verdict on the version the agent pins | no | no | advisories, malware, lookalikes, versions that do not exist |
Check when the install runs | no | no | pre-install hook in 6 clients |
Whole-tree lockfile audit | no | no |
|
Current docs alone removed most alerts; the verdict removed the rest. Per model, pinright used 21% to 26% fewer tokens than the docs-only server on the 12 agent tasks and 26% to 33% fewer on the 8 docs tasks. Every paired interval stays above zero; the lowest bound is 2%. Tokens count everything the model processed, cache reads included. No tools at all costs less than either.
Why fewer tokens. With docs only, the agent looked versions up through the docs: it called
get-docs once per package, 5.2 to 5.7 times per agent task, before writing a file. 87% of those calls
named no version, so they returned the docs of the latest release, and 75% asked for "version" or
"latest" in the query. With pinright, every agent-task run opened with check-packages for the whole
list, about 600 characters of verdicts and versions to pin, then called get-docs 0.7 to 1.7 times per
task, with a version in 86 of 87 calls.
Limits. The 0.3 left is nuxt, whose current release pulls packages with no fix published;
installing with no version gets the same 0.3, and the docs-only and pinright alert intervals overlap.
One vendor's models, tasks we wrote, no shell, two days of advisory data, small n. In a second run
with a shell, the agents looked versions up with npm view or pip index before pinning, and every
arm ended at the same 6 alerts per model: there pinright made no measurable difference to the pins.
On APIs released after August 2026, 2 of 48 runs got the current API without docs, 45 of 48 with docs
only and 46 of 48 with pinright. On 12 tasks taken from public GitHub issues, 25% to 29% of direct
pins carried an advisory without docs and none with pinright. The hook blocked or asked on 1.46% of 25,077 public commands and
misread 10 of 154,402 tool calls from a month of our own agent sessions.
Per-model tables ·
results and caveats ·
technical report ·
reproduce it
Ask your agent
"Add zod and pin a version with no known advisories."
"Show me the docs for the version of next this project has installed."
"Audit package-lock.json and tell me what to upgrade, on the same release lines."
"What changed between express 4 and 5 before I move?"
Tools
Tool | What it does |
| The verdict for up to 50 packages in one call: version to pin, short reason, full notice only where it matters |
| One package in depth: advisories with CVE and fix, deprecation, license, lookalike names, policy violations |
| Docs from the published package and its repo at the release tag, for the version you name or the one installed |
| Library name to registry package ( |
| What changes between two versions: breaking changes, renamed APIs, advisories the move fixes |
| Whole-tree audit of a lockfile or manifest, with SARIF; the GitHub Action runs it in CI |
Ecosystems: npm, PyPI, Cargo, Go, Maven and Gradle, NuGet, RubyGems, Composer, GitHub Actions.
Verdicts never say ok when a source did not answer. A committed .pinright.json sets allow and
deny lists, license rules, severity threshold and what to do when a source is down.
How it works ·
the hook ·
team policy ·
CLI ·
GitHub Action
Privacy and limits
No account, no telemetry. pinright sends package names and versions to deps.dev, OSV, the registries, jsDelivr and GitHub, never your code; SECURITY.md lists each host. The hook reads commands and files statically: it is a guardrail, not a sandbox, and the threat model lists what gets past it. When a source is down the built-in default lets the install through; the starter policy asks instead.
More
Install · prompt injection · benchmark · security review · changelog · contributing · release runbook
The report we value most is a false positive: a command the hook blocked, or a package it
flagged, that should have passed. Open an issue with the template and paste the command and the
output of npx pinright doctor --json. Report a vulnerability in pinright privately, as
SECURITY.md describes.
MIT. Built by Hiper AI (opensource@hiperai.com). Site: pinright.dev. Everyone taking part follows the Code of Conduct.
Available Tools
6 toolscheck-manifestAudit a whole dependency treeA
Audits every package in a lockfile (direct and transitive) against OSV, the way Dependabot would, and says how to fix each finding: the direct upgrade on the same release line, the parent upgrade that clears a transitive one, or an override. Pass a project directory or a file path, or the file content with its name. Supported: package-lock.json, npm-shrinkwrap.json, pnpm-lock.yaml, yarn.lock, package.json, requirements.txt, poetry.lock, uv.lock, pdm.lock, pyproject.toml, Cargo.lock, Cargo.toml, go.mod, Gemfile.lock, packages.lock.json, gradle.lockfile, pom.xml, build.gradle, build.gradle.kts, libs.versions.toml, composer.lock, composer.json, requirements*.txt. Without a lockfile the tree is resolved through deps.dev. GitHub workflows (.github/workflows/*.yml, action.yml, or the directory) get an Actions check: advisories and SHA pinning.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Project directory or path to a lockfile/manifest. | |
| content | No | File content, when the file is not on disk yet. | |
| fileName | No | Name of the file in content, e.g. "package-lock.json". | |
| includeDev | No | Include dev dependencies (default true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does reasonably well: it discloses the data source (OSV), the remediation taxonomy (same-line direct upgrade, parent upgrade, override), the deps.dev resolution fallback, and the special GitHub Actions path covering advisories and SHA pinning. It does not mention network/auth requirements (e.g., GitHub token for the Actions check), rate limits, or whether anything is written to disk, which keeps it below a 5.
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?
Purpose and remediation behavior are front-loaded in the first sentence, with input modes and supported formats following logically. The supported-file enumeration is long but earns its place as a validity check for fileName; the trailing GitHub Actions sentence is slightly tacked on but is genuinely necessary scope information.
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 four-parameter audit tool with no output schema, the description covers inputs, data source, fallback resolution, remediation output, and the Actions special case. What it lacks is return-shape detail (per-finding structure, severity counts) that would otherwise be supplied by an output schema, since none exists here.
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 coverage is 100%, so baseline is 3, but the description adds real meaning beyond the schema: it explains why path can be a directory versus a file, and the long supported-format list effectively defines what fileName values are valid. includeDev is left entirely to its schema description, which is the only semantic gap.
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?
"Audits every package in a lockfile (direct and transitive) against OSV" gives a specific verb, resource, and scope, and the explicit "direct and transitive" framing separates it from a single-package check like check-package. It also states what the output delivers (a fix per finding), so an agent knows the shape of the value returned.
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 clearly states the input modes — project directory, file path, or content plus fileName — and enumerates which manifests/lockfiles are accepted, plus the deps.dev fallback when no lockfile exists. It does not explicitly name a sibling (check-package, check-packages) or say when to prefer those over this whole-tree audit, so routing is left partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check-packageCheck a package before installing itA
Supply-chain verdict for one package, no docs: known advisories (CVE/GHSA, malware), deprecation, license, newest version with no known advisories, the safe version on the same release line as the one you pass, and typosquat lookalikes. For several packages use check-packages, one call for the whole list.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Package name as the registry knows it, e.g. "lodash", "requests". | |
| detail | No | Return the full JSON report (every advisory, dates, sources) instead of the summary. | |
| version | No | Version you intend to install or already use. | |
| ecosystem | Yes | npm, pypi, cargo, go, maven, nuget, rubygems or composer (aliases like "python" work). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does well: it discloses that the operation is a non-mutating lookup and itemizes the returned verdict components, which is the key behavioral fact for a pre-install check. It does not mention rate limits, auth requirements, or how expensive a call is, leaving a gap for a tool with zero annotation coverage.
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 sentences, no filler. The verdict contents are front-loaded in a scannable list, and the sibling routing note is placed last as a clean boundary statement.
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 four-parameter, single-package advisory lookup with no output schema, the description enumerates the return categories and explains the same-release-line logic, which substitutes effectively for a missing output schema. An agent has everything needed to call it correctly and interpret the result.
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 coverage is 100%, so the baseline is 3; the description earns more by clarifying the intent behind `version` – it reports "the safe version on the same release line as the one you pass," and contrasts the newest safe version with that same-line fix. That adds decision-relevant meaning beyond the schema's plain "Version you intend to install or already use."
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?
"Supply-chain verdict for one package" names a specific verb-and-resource, then enumerates exactly what the verdict contains: advisories (CVE/GHSA, malware), deprecation, license, newest safe version, same-release-line safe version, typosquat lookalikes. It also explicitly distinguishes itself from the batch sibling check-packages, so an agent can route 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?
It states the single-package scope ("for one package"), the exclusion ("no docs"), and the alternative with its selection condition: "For several packages use check-packages, one call for the whole list." That is explicit when-to-use plus a named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check-packagesCheck a whole dependency list in one callA
Supply-chain verdict for up to 50 packages at once: one table row per package (verdict, version to pin, short reason) and the full notice only for the ones that need attention. Call it once with every dependency you plan to add, before writing the manifest, instead of one check per package. Packages already in the project are checked at their installed version when you omit it.
| Name | Required | Description | Default |
|---|---|---|---|
| packages | Yes | ||
| ecosystem | No | Default for every package: npm, pypi, cargo, go, maven, nuget, rubygems or composer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does most of it: it states the batch ceiling, the return shape (verdict, version to pin, short reason, full notice only for problem packages), and the omit-version fallback to installed version. It does not disclose freshness/latency of the supply-chain lookup or whether checks hit the network, which is the main remaining gap for a tool with zero annotation coverage.
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 tight sentences, front-loaded with what the tool returns, then when to call it, then the version-omission nuance. No filler and nothing repeated from structured fields verbatim.
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 usefully sketches the response (one row per package, full notice only for flagged ones), which is what an agent needs to plan around. Only the ecosystem resolution and any failure/error behavior are unaddressed, a minor gap for a two-parameter read-style 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?
Adds real meaning beyond the schema: the schema only says version can be omitted 'to get the version to use', while the description clarifies that omitting it for packages already in the project means the installed version is checked. It also restates the 50-item cap in prose. The top-level ecosystem default is left entirely to the schema, so not a full 5 at 50% 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?
Names a specific resource and verb ('supply-chain verdict for up to 50 packages at once') and explicitly scopes the batch nature of the call. It also implicitly contrasts with the single-package sibling by saying 'instead of one check per package', so an agent can route between check-packages and check-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?
Gives a concrete trigger ('Call it once with every dependency you plan to add, before writing the manifest') and a concrete anti-pattern ('one check per package'). The alternative is described rather than named, so the agent must infer that the single-package path is check-package, which stops this short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find-libraryFind a library (with security verdict)A
Finds the registry package for a library name ("next.js" -> npm:next, "pytorch" -> pypi:torch) and returns ids for get-docs, with the newest version that has no known advisories (safe) and a verdict. Skip it when you know the registry name: get-docs takes "npm:next" or "pypi:requests" directly, and check-packages takes plain names.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | What you want to do with it; also used to guess the language. | |
| ecosystem | No | npm, pypi, cargo, go, maven, nuget, rubygems or composer, when you know it. | |
| libraryName | Yes | Library name, e.g. "next.js", "requests", "tokio". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose meaningful behavior: it resolves a human name to a registry id, selects the newest version without known advisories labeled "safe," and returns a verdict. It does not say what happens when a name is ambiguous or unknown, or whether the advisory check is live, which keeps it short of a 5.
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 sentences, front-loaded with purpose and resolution examples, then the skip condition with alternatives. Parenthetical examples are load-bearing rather than filler; nothing could be cut without losing routing information.
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 three-parameter lookup with no output schema, the description covers what comes back (ids, safe version, verdict) and when to bypass the tool. Missing is failure behavior for unresolvable or ambiguous names, which an agent would want before calling.
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 coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by showing how libraryName is normalized into a registry-qualified id and by implying the ecosystem is inferred when omitted. It stops short of explaining how query influences resolution beyond the schema's own note about language guessing.
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 ("finds the registry package for a library name") and immediately concretizes it with mappings like "next.js" -> npm:next and "pytorch" -> pypi:torch. It also names what it produces (ids for get-docs, newest advisory-free version, verdict), so it is clearly distinguishable from get-docs and check-packages.
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?
Gives an explicit exclusion rule: "Skip it when you know the registry name," and explains that get-docs accepts "npm:next" directly while check-packages takes plain names. Both the when and the when-not are stated with the alternative tools named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-docsDocumentation for the version you will use (security-checked)A
Returns the documentation sections that answer your question, taken from the package at a specific version (its published files and its repo at the release tag) and the project site. Without a version it documents the newest version with no known advisories. With a vulnerable version it starts with a SECURITY NOTICE and documents the safe version on the same release line, so the code you write keeps working after the upgrade.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Package name with ecosystem, as check-package takes them, instead of libraryId. | |
| query | No | The question or task, e.g. "protect routes with middleware". Without it: setup and main API. | |
| tokens | No | Approximate size of the answer in tokens (default 2500; raise it only when the answer was cut short). | |
| version | No | Version the project uses or pins, if any. Overrides the one in libraryId. | |
| ecosystem | No | Registry, when the id does not say it or says the wrong one; overrides the id. | |
| libraryId | No | Id from find-library, e.g. "npm:next" or "npm:next@15.1.0". A GitHub repo ("/vercel/next.js") also works. Or pass name and ecosystem instead. | |
| packageName | No | Registry package name, when it differs from the id; overrides the id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the security-notice prefix, the fallback to the safe version on the same release line, and the sources consulted. It omits failure behavior (unknown package, no matching sections) and any rate or auth constraints, keeping it below 5.
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 sentences, front-loaded with what is returned and immediately followed by the version-dependent behavior. Every clause carries distinct information with no repetition of schema or title text.
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?
Seven optional parameters with full schema descriptions and no output schema; the description supplies the one thing the schema cannot, namely the version-resolution and security behavior. An agent has enough to call this correctly without further explanation.
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 coverage is 100%, so the baseline is 3, but the description adds real meaning for the version parameter: absence means newest advisory-free version, and a vulnerable version triggers a security notice plus safe-version docs. That clarifies semantics beyond the schema's terse 'Version the project uses or pins'.
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 ('Returns the documentation sections that answer your question') plus the exact source basis (published files, repo at release tag, project site). This clearly separates it from check-package, find-library, and upgrade-guide, which do not return documentation content.
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 description establishes the context of use (you have a question about a package's API) and conditional behavior for missing or vulnerable versions, but never states when to prefer this over siblings like upgrade-guide or to call find-library first. Usage routing is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upgrade-guideWhat changes between two versionsA
Breaking changes, removed or renamed APIs, config and default changes, packages that split off, deprecations, and the advisories fixed, between the version a project uses and the one to move to. Sources: changelogs and GitHub release notes for the versions in between, migration guides when a major is crossed, and (npm) a diff of the exported .d.ts API. Call it before upgrading across a major, when a SECURITY NOTICE recommends a new major, or to fix a Dependabot PR. Without "to" it uses the version pinright recommends.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Version to move to. Default: the recommended safe version. | |
| from | No | Version the project uses now, e.g. "15.5.28" (a range like "4.x" picks its newest release). | |
| query | No | What you are changing, e.g. "middleware auth redirect"; ranks entries about it first. | |
| tokens | No | Approximate size of the answer in tokens (default 5000). | |
| package | No | Package name, with ecosystem, instead of libraryId. | |
| ecosystem | No | npm, pypi, cargo, go, maven, nuget or rubygems. | |
| libraryId | No | Id like "npm:next" or "pypi:langchain" (a version in it is used as "from"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load, and it does disclose the evidence sources (changelogs, GitHub release notes, migration guides, and an npm .d.ts API diff) plus the fallback to the pinright-recommended version when 'to' is omitted. It does not cover auth requirements, rate limits, or the shape of the response, leaving some behavioral gaps.
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?
It is front-loaded with the content the tool returns, followed by sources and then call conditions, in roughly the right order with no filler sentences. The 'Sources:' clause is dense and adds length, but each element is informative rather than redundant.
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 seven-parameter, zero-required read tool with no annotations and no output schema, the description covers what is returned, where it comes from, and the defaulting behavior well enough to invoke it correctly. Only the concrete response format and any size-pagination expectations (beyond the 'tokens' param) are left implicit.
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 100%, so every parameter is already documented in the schema, including the 'to' default and the libraryId version-as-'from' convention. The description restates the 'to' default and adds no syntax or interaction detail beyond the schema, so the baseline of 3 applies.
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 names a specific resource and scope: breaking changes, removed/renamed APIs, config and default changes, split-off packages, deprecations, and fixed advisories between the project's current version and its target. That enumeration distinguishes it clearly from siblings like get-docs and check-package without needing to name them.
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 gives three concrete trigger conditions: before crossing a major, when a SECURITY NOTICE recommends a new major, and to fix a Dependabot PR. It also states the no-argument default behavior. It stops short of saying when NOT to use it or explicitly pointing at a sibling alternative, so it is not a full 5.
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.
6 tool updates
v1.0.0- First observed
check-manifest - First observed
check-package - First observed
check-packages - First observed
find-library - First observed
get-docs - First observed
upgrade-guide
TDQS
Scored across 6 tools
Each tool maps to a distinct workflow step: name resolution, documentation lookup, migration guidance, manifest audit, single-package verdict, and batch-package verdict. The descriptions explicitly distinguish check-package from check-packages and clarify when find-library can be skipped because get-docs accepts registry-qualified ids directly.
All tools use kebab-case and mostly follow a verb_noun pattern (find-library, get-docs, check-manifest, check-package). The only minor deviation is upgrade-guide, which reads more like a noun compound, but overall the naming is predictable and readable.
Six tools is well-scoped for a package supply-chain and documentation server. Each tool has a clear role, and the batch check-packages tool prevents the count from being unnecessarily inflated by per-dependency checks.
The surface covers resolving package names, retrieving docs, planning upgrades, auditing lockfiles and GitHub workflows, and checking one or many packages for advisories. No obvious lifecycle step for supply-chain safety or package documentation is missing.
Maintenance
Related MCP Connectors
Package intelligence for AI agents across npm, PyPI, crates.io and deps.dev. No API keys.
Package intelligence for AI agents across npm, PyPI, crates.io and deps.dev. No API keys.
Real-time Python package and vulnerability data for AI coding agents.
@latest documentation and code examples to 9000+ libraries for LLMs and AI code editors in a singl…
Related MCP Servers
- AlicenseAqualityFmaintenanceDependency security & health auditing for AI agents with no account or API key required.22MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to retrieve exact-version library documentation from the project's lockfile and installed packages, providing cited API signatures and doc comments offline without rate limits.1MIT
- AlicenseAqualityBmaintenanceVerified, dated facts for AI coding agents: what breaks between npm package versions (diffed from TypeScript types), per-version vulnerabilities, the newest version compatible with a given Node/Python/Rust/PHP, end-of-life dates of ~480 runtimes and frameworks, and AI model prices. Covers npm, PyPI, crates.io and Packagist.121AGPL 3.0
- AlicenseAqualityAmaintenanceEnables AI coding agents to ground dependency setup, compatibility checks, and major-version migration advice in a project's real runtime, lockfiles, and config files. It parses local project state and npm registry metadata deterministically, then returns tag-pinned install commands, breaking changes, and upgrade steps rather than generic documentation.5213 npmMIT