Wisco Labs: developer tools
Server Details
Check PyPI and npm upgrades: known vulnerabilities, the safe version, and what each upgrade breaks.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 9 tools
Each tool targets a distinct compatibility axis (native binaries, Node engines, peer deps, TS types, Python wheels, vulnerabilities, breaking changes), so an agent can usually pick correctly. The one soft boundary is upgrade_check, which bundles vulnerability flagging and breakage reporting across a whole project and therefore overlaps with vulnerabilities and what_changed for single packages; the descriptions clarify the project-vs-package scope but the distinction still requires reading.
Six of nine tools follow a clear <domain>_check pattern (native_check, node_check, peer_check, types_check, wheel_check, upgrade_check), which is predictable and readable. The remaining three (package_info, vulnerabilities, what_changed) each break the pattern in a different way, a minor but noticeable deviation.
Nine tools is well within the ideal range and each one maps to a distinct pre-upgrade question a developer actually asks. No tool feels redundant or bolted on; the set is tightly scoped to dependency-upgrade risk analysis.
The surface covers npm platform/engine/peer/type concerns, Python wheel availability, vulnerability lookup, and breaking-change analysis — a coherent lifecycle for 'is this upgrade safe'. Minor gaps remain: there is no Python analogue of node_check (python_requires support), no transitive dependency-tree resolution, and no tool that actually applies an upgrade, though agents can work around these.
Available Tools
9 toolsnative_checkWill my npm dependencies install on this platform without compiling?ARead-onlyIdempotentInspect
Before building on Alpine, Linux ARM, Windows ARM, a Mac or Lambda, checks which npm dependencies contain native code and whether a prebuilt binary exists for the target platform. For those that would compile from source (needing a C/C++ toolchain and Python) or fail, gives the nearest newer version that ships a prebuilt for that platform, with that upgrade's risk.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max breaking changes shown for each suggested fix | 5 |
| platform | Yes | Target platform: os-cpu[-libc], e.g. linux-x64-glibc, linux-arm64-musl, darwin-arm64, win32-arm64; or alpine, alpine-arm64, linux, linux-arm64, lambda, lambda-arm64, windows, win-arm64, mac, mac-intel | |
| requirements | Yes | The project's dependencies: the contents of package-lock.json (best), package.json, or one 'name@version' per line |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, non-destructive, closed-world behavior, so the bar is lower. The description adds genuine context beyond that: it discloses the two failure modes it reports (would compile from source needing a C/C++ toolchain and Python, or would fail) and that it returns an upgrade suggestion annotated with the upgrade's risk. It does not discuss latency or result size, but nothing is contradicted.
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 the scenario and followed by the result shape, with no filler. The second sentence is dense but each clause carries information (compile requirement, failure case, upgrade suggestion, risk).
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 three parameters, full schema coverage, and annotations already handling safety, the description covers what an agent needs: what it computes, when to run it, and rough shape of the answer. Since there is no output schema, it could have gone further in describing the returned recommendation format, but it is adequate for a read-only analysis 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 coverage is 100%, so all three parameters are documented in the input schema, and the baseline of 3 applies. The description adds little syntax or format detail beyond the schema; its only marginal contribution is implying that 'limit' controls how much of each upgrade's risk is surfaced, which the schema already states as 'max breaking changes shown'.
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 gives a concrete verb and resource: it checks which npm dependencies contain native code and whether a prebuilt binary exists for a target platform. That is specific enough to separate it from siblings like types_check or peer_check. It does not explicitly differentiate itself from upgrade_check, even though it also surfaces 'the nearest newer version' with upgrade risk, leaving some overlap for the agent to infer.
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 opening clause 'Before building on Alpine, Linux ARM, Windows ARM, a Mac or Lambda' gives a clear situational trigger for when to call this tool. There is no explicit when-not guidance and no sibling tool is named as an alternative, so the agent must infer the boundaries itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
node_checkWill my npm dependencies run on this Node.js version?ARead-onlyIdempotentInspect
Before moving a project to a new Node.js version (e.g. off Node 20 to 22 or 24), checks each npm dependency's declared Node support (its engines field). For each that doesn't support the target, gives the smallest newer release that does, with that upgrade's risk. Works from a package-lock.json without installing anything.
| Name | Required | Description | Default |
|---|---|---|---|
| node | Yes | Target Node.js version: a major like 24 (means the latest 24.x) or an exact 22.11.0 | |
| limit | No | Max breaking changes shown for each suggested fix | 5 |
| requirements | Yes | The project's dependencies: the contents of package-lock.json (best), package.json, or one 'name@version' per line |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is read-only, idempotent, non-destructive, and closed-world. The description adds meaningful behavior: it works from package-lock.json without installing anything, inspects declared engines support rather than runtime behavior, and returns the smallest newer compatible release with upgrade risk. It does not explain how 'risk' is determined, which is a minor gap.
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?
The description is three tight sentences, front-loads the primary use case, and avoids redundant or filler wording. Each sentence adds useful information about when to use the tool, what it checks, and how it operates.
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 analysis tool with fully documented parameters and annotations covering safety, the description is largely complete. It explains the input source, the check performed, and the shape of the recommendation. It could more explicitly define what 'risk' means or mention the limit parameter's effect, but those are secondary details.
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 the schema already explains node, requirements, and limit. The description reinforces the target-version and package-lock use cases but does not add syntax or meaning beyond what the schema provides. Baseline 3 is appropriate.
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 uses a specific verb and resource: it checks each npm dependency's declared Node support (engines field) for a target Node.js version and suggests newer compatible releases. It is clear what the tool does, though it does not explicitly distinguish itself from related siblings like upgrade_check or native_check.
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 a clear usage context: 'Before moving a project to a new Node.js version.' That tells an agent when to reach for it. It does not name alternatives or state when not to use it, so it falls short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
package_infoBasic facts about a packageCRead-onlyIdempotentInspect
Latest and latest stable version, repository, release count, and where its release notes come from.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Package name | |
| ecosystem | No | PyPI or npm | PyPI |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and openWorldHint=false, so the safety profile is fully carried by structured data. The description's only added value is disclosing what is returned (version/repo/release count/release-notes source), which matters because no output schema exists, but it says nothing about lookup failures, missing packages, or ecosystem-dependent behavior.
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 compact sentence with no filler, and the most important returned fields are front-loaded. It is a grammatical fragment with no leading verb, which slightly reduces immediate clarity about the action being taken.
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 two-parameter read-only lookup with no output schema, describing the returned fields is the right instinct and mostly sufficient. However, with eight similar siblings and an ecosystem switch, the agent is not told what 'latest stable' means per ecosystem, nor how to handle a package that has no repository or release notes.
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%, with 'name' (example 'flask') and 'ecosystem' (default PyPI, PyPI or npm) both documented in the schema. The description adds no meaning beyond that—it never mentions that the returned fields vary by ecosystem or how the package name is resolved.
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 enumerates returned data fields (versions, repository, release count, release-notes source) but never states a verb or resource action, so the agent must infer from the tool name and title that this is a package-metadata lookup. It also does nothing to separate itself from siblings such as what_changed or vulnerabilities, which also concern package data.
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?
There is no indication of when to call this versus the eight siblings (native_check, peer_check, types_check, upgrade_check, etc.). The agent gets a list of outputs but no routing criteria, prerequisites, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
peer_checkWill my npm packages accept this upgrade? (peer dependencies)ARead-onlyIdempotentInspect
Before upgrading a core npm package (react, typescript, eslint, vite...), checks every dependency in the project that declares it as a peer dependency: does the installed version accept the new version, and if not, the smallest release that does, with that upgrade's risk. Also checks the new version's own peer requirements against what's installed. Answers the questions behind npm's ERESOLVE errors without running npm.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max breaking changes shown for each suggested fix | 5 |
| upgrade | Yes | The package and version to upgrade to: react@19 (newest stable 19.x), react@19.1.0 (exact), or react (latest stable) | |
| requirements | Yes | The project's dependencies: the contents of package-lock.json (best), package.json, or one 'name@version' per line |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the description is free to add genuine behavioral context — that no npm process is executed, that the analysis is bidirectional (dependents' peer ranges plus the new version's own peer requirements), and that suggestions include risk and the smallest acceptable release. It does not describe result shape or how 'risk' is graded, which is the only remaining gap.
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?
The trigger condition is front-loaded, and the second sentence ('Answers the questions behind npm's ERESOLVE errors without running npm') efficiently justifies the tool's existence. The first sentence is long and clause-heavy with parenthetical examples, but no sentence is filler, so it stays readable.
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 carries the burden of describing returns and does so: acceptance per dependency, the smallest release that does accept, that upgrade's risk, plus the new version's own peer requirements. What is missing is the shape of that output (how risk is expressed, what 'limit' truncates), which matters for a 3-parameter analytical tool whose result the agent must interpret.
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 interpretation: it explains how the 'requirements' blob is actually consumed (filtered down to packages declaring the target as a peer dependency) rather than merely restating its accepted formats. It does not explain 'limit' or how it interacts with the risk output, leaving one parameter to the schema alone.
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 concrete operation — check whether every dependency that declares the upgraded package as a peer dependency accepts the new version — and bounds it to a specific ecosystem (npm peer deps) and trigger (pre-upgrade of react/typescript/eslint/vite). Combined with the title, an agent can tell this apart from upgrade_check, node_check, and native_check without opening the 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 usage context clearly: 'Before upgrading a core npm package' and 'Answers the questions behind npm's ERESOLVE errors without running npm', which tells the agent both the moment to call it and why to prefer it over shelling out to npm. It does not explicitly name a sibling alternative or an exclusion case, so it stops 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.
types_checkWhich npm dependencies need @types packages, and which version?ARead-onlyIdempotentInspect
For a TypeScript project: which dependencies ship their own type declarations, which need a DefinitelyTyped @types package (and the version that matches the installed library), and which installed @types packages describe a different major version than the library.
| Name | Required | Description | Default |
|---|---|---|---|
| requirements | Yes | The project's dependencies, including any @types packages: the contents of package-lock.json (best), package.json, or one 'name@version' per line |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint:false and openWorldHint:false, so the safety profile is covered. The description adds value beyond that by disclosing the shape of the analysis output (three distinct verdict categories, including version-mismatch detection), which matters since no output schema exists.
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 sentence with the scope qualifier front-loaded and three parallel clauses that each carry distinct information; no filler. It is dense but readable, and nothing could be cut without losing one of the three result categories.
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 one-parameter, read-only analysis tool with full schema coverage and rich annotations, the description covers the essential question (what the tool determines) and the results it returns. It lacks only sibling differentiation and any note on input edge cases, which are minor given the schema's explicit format guidance.
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%: the single 'requirements' parameter is documented with accepted formats (package-lock.json best, package.json, or name@version lines) and a concrete example. The description adds no additional meaning about the parameter, 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 uses a clear framing ("For a TypeScript project") and enumerates the three concrete answers the tool produces: self-shipped declarations, needed DefinitelyTyped @types packages with matching versions, and mismatched @types major versions. This is far more specific than the name 'types_check' alone, though it never names a sibling (e.g., native_check, node_check) to distinguish scope explicitly.
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 "For a TypeScript project" qualifier implies the usage context (projects with TypeScript dependencies) and the mention of a matching-version check hints at the post-install/audit use case. However, there is no explicit when-to-use versus when-not guidance and no routing to alternatives among the many sibling check tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upgrade_checkCheck a whole project's dependenciesARead-onlyIdempotentInspect
Give it a project's dependencies: a requirements.txt or pip freeze output for Python, or a package-lock.json, package.json, or name@version lines for npm. Flags malicious packages and versions with known vulnerabilities (with the smallest safe version to move to, preferring a low-risk patch), then reports what each upgrade breaks, removes, or deprecates, ranked into remove_now / fix_now / no_fix_available / upgrade_first / safe / review / needs_care.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items shown per category for each package | 5 |
| ecosystem | No | PyPI or npm. A package.json or package-lock.json is recognized as npm automatically. | PyPI |
| requirements | Yes | Python: requirements.txt contents, one 'package==version' per line. npm: the contents of package-lock.json (best), package.json, or one 'name@version' per line. Lines without one exact version are listed but can't be assessed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, closed-world), and the description goes well beyond them by disclosing what the tool actually computes: malicious-package detection, vulnerability flags with the smallest safe target version preferring low-risk patches, and a breakage/removal/deprecation report. Since there is no output schema, this prose is the only source of return-value expectations, and it delivers them.
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 with the input contract front-loaded ahead of the behavioral payoff, which is the right ordering. The second sentence is dense, packing four analytical claims plus a seven-category ranking list into one clause chain, which reduces scannability slightly.
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 complex, multi-ecosystem audit tool with no output schema, the description covers inputs, detection behavior, and the shape of results. What remains unexplained is the meaning of several ranking buckets (needs_care, review, upgrade_first) and how the limit parameter shapes the report, so an agent could not fully predict the response structure.
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 the parameters are already documented at the field level. The description adds a little context by naming concrete input formats (pip freeze output, name@version lines) and echoing the partial-data caveat, but it says nothing about the limit parameter's effect or about precedence between ecosystem and the supplied content.
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 object ('check a whole project's dependencies') and immediately scopes it to project-wide auditing rather than a single package, which implicitly separates it from per-package siblings like package_info or vulnerabilities. It also enumerates the accepted input formats and the ranked categories returned, so an agent knows exactly what class of tool this is.
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 opening imperative ('Give it a project's dependencies: ...') tells the agent precisely what to supply, and the ecosystem parameter description notes that package.json/package-lock.json are auto-detected as npm. There is no explicit when-not guidance or named alternative (e.g. use vulnerabilities for a single pinned package, what_changed for diffs), so the routing logic must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vulnerabilitiesKnown vulnerabilities in a package versionARead-onlyIdempotentInspect
Is this exact version of a package affected by known security advisories? Returns each vulnerability (with CVE ids and severity), the versions that fix it, and the smallest safe upgrade.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Package name | |
| version | Yes | The exact version you're using | |
| ecosystem | No | Package ecosystem (OSV naming) | PyPI |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and closed-world, so the safety profile is fully covered. The description adds real value by describing the return payload (CVE ids, severity, fixing versions, smallest safe upgrade), which matters since there is no output schema. However, it says nothing about behavior for unknown packages, unsupported ecosystems, or empty results.
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 the core question and followed by the return contents; no wasted wording. The question form is slightly less scannable than a declarative verb-resource statement but is compact and purposeful.
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 carries the burden of explaining return values and does so adequately in one clause. For a three-parameter read-only lookup it is nearly complete, with only edge-case behavior (no advisories found, unknown ecosystem) left unaddressed.
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% and every parameter already carries a description, including the example values and the PyPI default, so the schema does the heavy lifting. The description's emphasis on 'exact version' marginally reinforces that version must be pinned rather than a range, but adds no new semantics for ecosystem or name.
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 verb-and-resource question ('is this exact version of a package affected by known security advisories') and previews the return content. An agent can distinguish it from node_check or types_check easily, though it doesn't explicitly separate itself from upgrade_check, which superficially overlaps via the 'smallest safe upgrade' output.
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 by the phrasing 'this exact version of a package' and the required name/version pair, so an agent can infer this is a per-version security lookup. There is no explicit when-to-use vs when-not guidance, no mention of when to prefer a sibling like upgrade_check or package_info, and no prerequisites stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
what_changedWhat changed between two versions of a packageARead-onlyIdempotentInspect
What breaks, gets removed, is deprecated, or gains a security fix when upgrading one package between two versions, with an overall upgrade risk.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | The version you want to upgrade to (use latest_version from package_info if unsure) | |
| from | Yes | The version you're on now | |
| name | Yes | Package name, e.g. flask (PyPI) or express or @babel/core (npm) | |
| limit | No | Max items shown per category | 15 |
| ecosystem | No | PyPI or npm | PyPI |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, so safety is covered. The description adds real value by disclosing the shape of the result: four change categories plus an overall upgrade risk, which substitutes for the absent output schema. It does not say what happens when changelogs are unavailable or how the risk rating is derived.
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 dense sentence with no filler, and the output categories are front-loaded. It reads as a noun-phrase fragment rather than a sentence, which slightly hurts scannability, but nothing is wasted.
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 five-parameter read-only tool with full schema coverage and no output schema, the description covers both scope and the categorical result set, which is the main gap it needed to fill. Minor omissions remain around the limit truncation and default ecosystem behavior, both of which the schema already documents.
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%, with each parameter documented including examples and the 'use latest_version from package_info' hint, so the description adds nothing beyond it. Baseline 3 applies since the schema carries the full burden.
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 analysis: breaking changes, removals, deprecations, security fixes, plus an overall risk rating for a package upgrade between two named versions. That is concrete and distinguishable from siblings like package_info or vulnerabilities, though it never names those siblings explicitly.
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 'when upgrading one package between two versions' framing implies the use case, but there is no explicit routing guidance versus upgrade_check, vulnerabilities, or package_info. An agent must infer on its own which of the eight siblings to pick for adjacent questions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wheel_checkWill pip find prebuilt wheels for this platform?ARead-onlyIdempotentInspect
For each pinned Python package, whether a prebuilt wheel exists for a target Python version and platform (Windows ARM, Alpine/musl, Linux ARM, macOS, a new Python version). Without one, pip builds from source, which usually fails without a compiler for packages with C extensions. For each that's missing, gives the nearest newer version that has a wheel, with that upgrade's risk.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max breaking changes shown for each suggested upgrade | 5 |
| python | Yes | Target Python version, e.g. 3.13 | |
| platform | Yes | Target platform: manylinux_x86_64 or manylinux_aarch64 (glibc Linux, e.g. Debian/Ubuntu; assumes glibc 2.36, or give an exact tag like manylinux_2_28_x86_64), musllinux_x86_64 or musllinux_aarch64 (Alpine), win_amd64, win_arm64, win32, macosx_arm64, macosx_x86_64 | |
| requirements | Yes | requirements.txt contents or pip freeze output, one 'package==version' per line |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/closed-world, so the bar is lower, and the description still adds real behavioral content: what happens downstream when a wheel is missing, and that missing entries are accompanied by the nearest newer version with a wheel plus that upgrade's risk. It doesn't describe output shape, per-package error handling, or how partial/unparseable requirement lines are treated.
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 no filler, and the core answer (does a wheel exist) is front-loaded before the consequence. Minor cost: 'For each that's missing' has a loose antecedent and requires a re-read to bind to the packages just mentioned.
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 does carry return-value burden, and it covers the main payloads: per-package wheel availability and, for misses, the nearest wheeled version plus upgrade risk. Given four well-documented parameters, the remaining gap — what a lockfile with unresolvable/loosely-pinned entries yields — is modest but not covered.
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% and each parameter carries its own description with examples, so the schema does the heavy lifting. The description adds only indirect meaning — the 'nearest newer version with that upgrade's risk' behavior implicitly explains the `limit` parameter's role — without naming or elaborating any parameter.
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 the specific resource (pinned Python packages) and the specific check (prebuilt wheel availability for a target Python version and platform), with concrete platform examples in parentheses. An agent can distinguish it from node_check/node_check-style siblings because the description is explicit about 'pip' and 'Python packages'. It never names a sibling directly, so it stops short of full differentiation.
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 by the stated consequence ('without one, pip builds from source, which usually fails without a compiler'), which tells the agent the scenario this tool serves: pre-flight install planning on uncommon platforms. There is no explicit when-to-use vs. when-not, and no routing to native_check, upgrade_check, or package_info for adjacent questions.
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.
9 tool updates
- First observed
native_check - First observed
node_check - First observed
package_info - First observed
peer_check - First observed
types_check - First observed
upgrade_check - First observed
vulnerabilities - First observed
what_changed - First observed
wheel_check
Related MCP Connectors
Check exact npm/PyPI upgrades for evidence-backed breaking changes; query APIs and components.
Check an npm or Python package, or a package.json, for vulnerabilities and upkeep.
What breaks between versions, vulnerabilities, compatible versions, EOL dates: npm, PyPI, Rust, PHP.
Breaking changes between two versions: npm, PyPI, GitHub Actions, Helm, Terraform, crates.io, Go.
Related MCP Servers
- AlicenseAqualityAmaintenanceTranslates a lockfile diff into a human-readable upgrade plan. For every dependency bump (npm or PyPI) returns semver class, breaking changes from GitHub release notes, CVEs fixed in the range, migration guide links, and a clear per-package recommendation. Bulk tool ranks up to 50 package changes in parallel by risk (security > caution > review > likely-safe > safe).2113 npm2MIT
- AlicenseAqualityCmaintenanceChecks npm and PyPI packages for outdated versions, deprecation status, and breaking changes with cited sources, enabling AI agents to verify dependency freshness.16 npmISC
- AlicenseAqualityAmaintenanceEnables AI coding agents to vet an npm release against the package's own history — publisher, provenance, install scripts, new dependencies, code changes — before installing or upgrading it. Returns an ALLOW / REVIEW / BLOCK verdict with supporting evidence, what other checks say, and the safe version to install instead.71MIT
- AlicenseNot gradedqualityCmaintenanceAnalyzes npm dependency upgrades to reveal which files and functions in your codebase break, with confidence tiers and transitive call chain tracing.16 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.