Skip to main content
Glama

Server Details

Detect malicious or vulnerable npm packages: registry search, OSV.dev and GitHub advisory lookups

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP
URL

Available Tools

23 tools
analyze_install_scriptAnalyze an npm package install scriptA
Read-only
Inspect

Statically scans a package's preinstall/install/postinstall/prepare lifecycle scripts AND the file(s) they reference — fetched directly from the published tarball, not just the command string in package.json — against npmscan's documented red-flags rubric (/docs/red-flags): child_process use, network calls, access to sensitive paths/env (.ssh, .aws, .npmrc, *TOKEN/*KEY), obfuscation, remote binaries hosted off trusted CDNs, writes to HOME, Discord/Telegram/Pastebin exfil endpoints, eval on decoded strings, chmod+exec of downloaded binaries, and CI-metadata telemetry — plus a possibleTyposquatOf name check. Returns a weighted totalScore and riskTier ('none'/'low'/'moderate'/'high'/'critical'). This is a heuristic static scan, not proof of malice or a guarantee of safety: it doesn't execute any code, can't see behavior gated on runtime conditions, and does NOT check maintainer/ownership history (a separate red-flags signal this tool doesn't cover). Use get_package/get_package_version first for the raw script listing; use this when you need to know what an install script actually does, not just that one exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesExact npm package name, e.g. "lodash" or "@scope/name"
versionNoExact version to analyze; omit to use the latest published version

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYes
versionYes
findingsYes
riskTierYes
scanNoteYes
npmscanUrlYes
totalScoreYes
filesScannedYes
lifecycleScriptsYes
hasLifecycleScriptsYes
possibleTyposquatOfYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds substantial behavioral context: it is a heuristic static scan, does not execute code, cannot see runtime-gated behavior, and is not proof of safety. This goes beyond the annotation baseline and manages expectations well.

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?

The description is long but every clause carries information: scope, rubric, output, limitations, and usage guidance. It is front-loaded with the core scan scope before diving into rubric details, and the length is justified by the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and a description that names the return fields (totalScore, riskTier), defines limitations, lists exclusions, and provides usage ordering, nothing needed for correct invocation or interpretation is missing.

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 coverage is 100% with clear descriptions for both name and version. The description adds little parameter-specific meaning beyond confirming it fetches from the published tarball, but since the schema already documents the parameters fully, baseline 3 is appropriate.

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 ('statically scans') and resource (npm package lifecycle scripts plus referenced files fetched from the tarball), and enumerates the rubric categories. It clearly differentiates from sibling tools by specifying what it analyzes and what it returns (totalScore, riskTier).

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 instructs to use get_package/get_package_version first for raw script listings and defines when this tool is needed ('when you need to know what an install script actually does'). It also states what it does not cover (maintainer/ownership history), helping an agent avoid misusing it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

analyze_transitive_dependenciesAnalyze transitive dependencies for vulnerabilitiesA
Read-only
Inspect

Recursively resolves one or more direct/root packages' dependency graphs — e.g. the "dependencies" section of a package.json — up to maxDepth levels deep (default 2, max 3) and batch-checks every resolved package@version against OSV.dev, so vulnerabilities buried several levels down (which would never show up from checking direct dependencies alone) still surface. summary is a one-sentence, deterministic recap (packages scanned, unresolved count, vulnerable count and which roots pulled them in) — read it first. The vulnerablePaths field directly answers "which of my dependencies pulled this in" by naming the root package(s) responsible for each vulnerable transitive package; nodes has the full resolved graph (depth, parents, resolutionError) for deeper inspection. Scope/limits worth knowing before trusting a "clean" result: only the "dependencies" field is followed (not devDependencies/peerDependencies/optionalDependencies); each range is resolved independently per branch via semver max-satisfying against published versions — this does NOT emulate npm/yarn's actual node_modules hoisting/dedup, so read results as "which vulnerable versions are reachable in the graph," not the exact installed layout; git/file/workspace/URL/npm-alias dependencies aren't resolvable from the registry and show up with a resolutionError instead of being silently skipped; and the whole traversal is capped at a total node budget — check truncated/truncationNote rather than assuming a large graph was scanned exhaustively. Prefer batch_query_vulnerabilities instead when you only need to check exact packages you already have a flat list for (faster, no graph walk).

ParametersJSON Schema
NameRequiredDescriptionDefault
maxDepthNoHow many levels of transitive dependencies to expand beyond the given root packages (0 = only check the roots themselves). Default 2, capped at 3 to bound registry calls and stay within the request timeout.
packagesYes1-15 direct/root packages to expand from, e.g. a package.json's "dependencies". version accepts an exact version or a semver range like "^4.17.21"; omitted = latest.

Output Schema

ParametersJSON Schema
NameRequiredDescription
nodesYes
rootsYes
summaryYes
maxDepthYes
truncatedYes
enrichmentNoteYes
truncationNoteYes
unresolvedCountYes
vulnerablePathsYes
totalPackagesScannedYes
totalVulnerabilitiesYes
vulnerablePackageCountYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, and the description is consistent with both. It adds substantial behavioral context beyond annotations: per-branch semver max-satisfying resolution rather than npm/yarn hoisting/dedup emulation, only the dependencies field being followed, unresolvable git/file/URL deps surfacing as resolutionError instead of being skipped, a total node budget requiring checks of truncated/truncationNote, and a deterministic summary field to read first.

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?

The description is long but every section earns its place: mechanics with defaults, guidance on which output fields to read first, four material limitations that affect how results must be interpreted, and a routing sentence to the sibling tool. It is front-loaded with the core verb and resource, and the caveats are organized so an agent can parse them in dependency order.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex tool with recursive traversal, semver range resolution, and an external vulnerability-checking service, the description is complete: it covers defaults, caps, unsupported dependency types, truncation behavior, result-field semantics, and the sibling alternative. The output schema exists so return values need not be restated, yet the description still explains the three most important fields (summary, vulnerablePaths, nodes) for correct result interpretation.

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?

Schema coverage is 100%, so the baseline is 3; the description adds value on top by explaining how packages and version ranges actually behave: ranges are "resolved independently per branch via semver max-satisfying against published versions," maxDepth reflects how many levels beyond roots are expanded, and the 0-level meaning is clarified in the schema. It also gives the reason for the maxDepth cap (registry call bounds and timeout), which the schema's bare maximum does not convey.

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?

The description states a specific verb and resource: it "recursively resolves one or more direct/root packages' dependency graphs" and "batch-checks every resolved package@version against OSV.dev." It also distinguishes itself from siblings by explaining the graph-walking scenario it is uniquely suited for and explicitly naming batch_query_vulnerabilities as the alternative for flat-list checks.

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?

The description explicitly routes to the alternative: "Prefer batch_query_vulnerabilities instead when you only need to check exact packages you already have a flat list for (faster, no graph walk)." It also states the when-to-use case — surfacing vulnerabilities buried several levels down that direct-dependency checking would miss — and gives concrete scope caveats an agent must know before trusting a clean result.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

audit_github_repositoryAudit a GitHub repository's npm dependenciesA
Read-only
Inspect

Given a GitHub repository URL, fetches its package.json (and, if present, a pnpm-lock.yaml/package-lock.json/yarn.lock — first one found wins, in that priority order) straight from the repo's default branch and runs the same vulnerability, license-compliance, install-script, and ownership-risk pipelines batch_query_vulnerabilities/check_license_compliance/analyze_install_script/check_maintainer_changes/check_package_provenance expose individually, in one call — no copy-pasting file contents required. A monorepo (package.json#workspaces, Yarn's {packages:[...]} form, or pnpm-workspace.yaml) is detected automatically: pnpm-lock.yaml and yarn.lock already record every workspace member's dependencies directly, and for package.json-only or package-lock.json repos this additionally lists the repo's file tree, resolves the declared glob patterns to member directories, and merges each member's dependencies into the audit (capped at 50 member packages) — see isMonorepo/workspacePatterns/workspacePackageCount/workspaceNote in the result. Every direct dependency (up to 100 per call, across the root and any merged workspace members) gets: an OSV.dev vulnerability check, a license-compliance verdict against the given policy (same default as check_license_compliance: only copyleft/network-copyleft/proprietary are violations unless you pass one), and a tarball-free install-script risk signal (installScriptScanScope: 'lifecycle-scripts-only'). Up to 10 of the packages that actually declare a lifecycle script — prioritized by already-vulnerable, then possible-typosquat, then whatever's left — additionally get the full tarball-fetching deep scan analyze_install_script itself runs (installScriptScanScope: 'deep-tarball-scan', with a populated installScriptFindings array); any remaining flagged packages past that cap keep the lighter signal only, noted in deepScanNote. Any package that comes back vulnerable at high/critical severity, a possible typosquat, or deprecated (ownershipRiskEligible) additionally gets check_maintainer_changes and check_package_provenance run against it — up to 5 such packages per call (ownershipRiskChecked), prioritized the same way as the deep install-script scan, populating maintainerRiskTier/maintainerFindings and provenanceRiskTier/provenanceFindings; remaining eligible packages past that cap are named in ownershipCheckNote. This is the most expensive tool in the suite (a repo lookup, a handful of file fetches, up to 100 registry doc fetches, one OSV batch call, up to 10 tarball fetches, up to 5 packages each getting a maintainer-history check plus a provenance check — the latter alone can fan out to ~8 more registry fetches on its own — and, for a monorepo needing enumeration, one file-tree listing plus up to 50 more manifest fetches) — don't call it in a loop across many repos.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNoBranch, tag, or commit SHA to audit. Omit to use the repository's default branch.
urlYesGitHub repository URL, e.g. "https://github.com/owner/repo".
policyNoLicense allow/deny policy, same shape as check_license_compliance. Omit for the default policy (only copyleft/network-copyleft/proprietary are violations).
includeDevDependenciesNoInclude package.json devDependencies in the audit. Default false. Ignored when a lockfile is used instead (its own format decides direct-dependency scope), and yarn.lock can never distinguish dev from production dependencies regardless of this flag.

Output Schema

ParametersJSON Schema
NameRequiredDescription
refYes
ownerYes
policyYes
summaryYes
findingsYes
repoNameYes
warningsYes
isMonorepoYes
inputFormatYes
deepScanNoteYes
lockfilePathYes
manifestPathYes
totalPackagesYes
workspaceNoteYes
truncationNoteYes
deepScannedCountYes
overflowPackagesYes
defaultBranchUsedYes
workspacePatternsYes
ownershipCheckNoteYes
licenseViolationCountYes
ownershipCheckedCountYes
workspacePackageCountYes
vulnerablePackageCountYes
installScriptFlaggedCountYes
ownershipRiskFlaggedCountYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes far beyond the readOnly/openWorld annotations: it discloses lockfile priority order, monorepo detection behavior, per-call caps (100 dependencies, 50 workspace members, 10 deep scans, 5 ownership checks), prioritization rules, and the cost profile. It also surfaces limitations such as yarn.lock not distinguishing dev from production dependencies.

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?

The description is a single dense paragraph, but the opening sentence front-loads the core action and every subsequent clause adds an operationally important constraint or caveat. It is longer than ideal and could benefit from bullet structure, but no sentence is filler given the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers detection behavior, caps, fallback outputs, result fields (isMonorepo, workspaceNote, deepScanNote, ownershipCheckNote), cost, and limitations, and an output schema also exists. An agent has everything needed to decide whether to call it and what to expect.

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?

Input-schema coverage is 100%, and the schema already carries detailed descriptions for url, ref, policy, and includeDevDependencies, including defaults and lockfile interactions. The tool description adds broad behavioral constraints like the 100-dependency cap, but it does not materially enrich the meaning of individual parameters beyond the schema.

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?

The description names a specific verb and resource: audit a GitHub repository by fetching package manifests and lockfiles and running the vulnerability, license, install-script, and ownership-risk pipelines. It explicitly references sibling tools as individual pipelines and frames the tool as the all-in-one repository-level version, so it is clearly distinguishable from them.

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?

It explains this is a combined alternative to the individually exposed pipelines and warns that it is the most expensive tool, stating 'don't call it in a loop across many repos.' This gives an agent a clear cost-based usage boundary and names the operations it replaces.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

batch_query_vulnerabilitiesBatch query known vulnerabilitiesA
Read-only
Inspect

Query OSV.dev for known vulnerabilities across a whole npm dependency inventory at once: either pass a flat {packages:[...]} list, or paste raw package.json / lockfile / CycloneDX JSON / SPDX JSON content via content. The tool normalizes npm dependencies first, then chunk-queries OSV behind the scenes so large SBOMs don't stop at the upstream 100-package batch limit. Each finding includes severity, a summary, CVE aliases, and the fixed version — not just a bare advisory ID — so a dependency audit answer doesn't need a follow-up call per flagged package.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentNoRaw dependency inventory content: package.json, package-lock.json, yarn.lock, pnpm-lock.yaml, CycloneDX JSON, or SPDX JSON. Use this OR `packages`, not both.
packagesNoExplicit package list (1-1000 items). Use this OR `content`, not both.
includeDevDependenciesNoIgnored when using `packages`; only applies when `content` is a manifest/lockfile format that distinguishes dev dependencies.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
warningsNo
inputFormatNo
ignoredCountNo
enrichmentNoteNo
queryFailureCountNo
parsedPackageCountNo
totalVulnerabilitiesYes
packagesWithVulnerabilitiesYes

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses meaningful behavior: it normalizes npm dependencies first, chunk-queries OSV.dev behind the scenes, handles large inputs past the upstream 100-package limit, and returns enriched findings with severity, summary, CVE aliases, and fixed versions.

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?

The description is front-loaded and information-dense, covering purpose, input modes, internal behavior, and output value. It is slightly longer than strictly necessary because some format details are also present in the schema, but every sentence contributes useful decision-making context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the optional mutually exclusive parameters, the external OSV.dev dependency, and the batch behavior, the description covers the key aspects an agent needs: input options, normalization, chunking behavior, and what kind of findings are returned. The output schema handles return-value details, so the description is sufficiently complete.

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 100%, so the baseline is 3. The description adds context about input formats and normalization, but most parameter meaning is already present in the schema. It does not materially enrich the semantics of `packages`, `content`, or `includeDevDependencies` beyond what the schema states.

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?

The description clearly states a specific verb and resource: querying OSV.dev for known vulnerabilities across a whole npm dependency inventory. It also distinguishes itself from per-package or single-CVE tools by emphasizing batch operation and that no follow-up call is needed per flagged package.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use this tool: when auditing an entire npm dependency inventory at once, including large SBOMs. It implies the alternative of querying per package, but it does not explicitly name query_vulnerabilities or state when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_license_complianceCheck a dependency list against a license policyA
Read-only
Inspect

Given a list of packages (name + optional exact version or semver range — e.g. straight from a package.json "dependencies" object) and an optional allow/deny license policy, resolves each package's declared SPDX license and reports a compliance verdict per package. Classifies every license into one of permissive/weak-copyleft/copyleft/network-copyleft/proprietary/public-domain/unknown, and understands simple SPDX expressions: "(MIT OR GPL-3.0)" is compliant if EITHER side is permitted (a consumer may legally pick the clean alternative), "MIT AND Apache-2.0" requires both sides to pass, and "X WITH exception" is judged on X. A mixed/nested expression like "(MIT OR ISC) AND Apache-2.0" is reported as needsReview rather than guessed at. policy.deny entries always win over policy.allow (so a name can appear in both without a silent contradiction); with policy.allow set, anything not matching it is a violation (unproven is treated as non-compliant); with neither given, the default policy flags only copyleft/network-copyleft/proprietary (e.g. GPL/AGPL/UNLICENSED) — weak-copyleft (LGPL/MPL/EPL) and unrecognized license strings are surfaced but not auto-flagged. Policy entries accept an exact SPDX id, a family prefix ("GPL" catches GPL-2.0/GPL-3.0-only/etc.), or a category name. This reads only the registry-declared license field — it does not fetch or parse LICENSE file contents from the source repository.

ParametersJSON Schema
NameRequiredDescriptionDefault
policyNoOmit entirely to use the default policy: only copyleft/network-copyleft/proprietary are violations.
packagesYes1-100 packages to check. version accepts an exact version or a semver range like "^4.17.21"; omitted = latest.

Output Schema

ParametersJSON Schema
NameRequiredDescription
policyYes
resultsYes
summaryYes
totalPackagesYes
compliantCountYes
violationCountYes
unresolvedCountYes
needsReviewCountYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/openWorld/non-destructive annotations, the description adds substantial behavioral detail: it defines license classification categories, explains how SPDX OR/AND/WITH expressions are evaluated, states that mixed nested expressions are reported as needsReview, and notes that policy.deny always overrides policy.allow. It also exposes the limitation that LICENSE file contents are not parsed. These disclosures meaningfully shape agent expectations and contradict nothing in the annotations.

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?

The first sentence is a compact, front-loaded summary of the tool's core purpose, and each subsequent sentence adds a distinct non-obvious behavior: classification categories, SPDX expression interpretation, mixed-expression fallback, deny precedence, and the registry-field limitation. The length is proportionate to the tool's complexity, with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with nested schemas and an output schema, the description covers the input format, optional policy behavior, expression evaluation rules, precedence semantics, and a critical limitation. An agent has enough information to decide whether to invoke the tool and what kinds of results to expect, and the output schema handles return-value details.

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?

The schema already documents both parameters and their fields at 100% coverage, providing a strong baseline. The description goes further by giving concrete semantics: packages can come 'straight from a package.json dependencies object', version accepts exact or semver ranges, omitted version means latest, deny always wins over allow, and omitted policy means the default policy applies. This adds practical invocation guidance beyond the schema.

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?

The description opens with a specific action: resolving a list of packages' declared SPDX licenses and reporting a compliance verdict per package, with the title naming the resource and goal. The focus on licensing, policy handling, and per-package verdicts clearly distinguishes it from sibling vulnerability, provenance, and maintainer-focused tools without needing explicit cross-references.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly states when to use the tool: given a list of packages and an optional allow/deny license policy. It also clarifies that omitting the policy uses the default, and it emphasizes the limitation that only the registry-declared license field is read. It does not explicitly name alternative sibling tools or state 'when not to use', so it falls just 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.

check_maintainer_blast_radiusFind every package an npm maintainer account touches, and flag a tight publish clusterA
Read-only
Inspect

Given an npm username, finds every package npm's own maintainer: search index currently returns for that account (registry.npmjs.org's /-/v1/search — the same reverse lookup npmjs.com's own site search uses; the public registry API has no dedicated 'list packages by maintainer' endpoint otherwise) and looks for a tight cluster of packages whose LATEST version was published within a short rolling window of each other. That's the shape of a compromised-account supply-chain attack: a stolen or phished credential doesn't get used on one package, it gets used on every package that account can publish to, usually within hours — the exact pattern behind the September 2025 chalk/debug ('qix') compromise, which hit roughly 18 packages within about 2 hours. A large total package count is NOT itself a red flag — many legitimate maintainers publish hundreds of packages over a career — only a tight publish-time cluster is scored, weighted up by how many packages it includes and by their combined weekly downloads/dependentsCount, since a burst touching a handful of near-zero-download packages is a very different event than one touching something with billions of weekly downloads. A cluster where most of the packages share one npm scope (e.g. @docusaurus/*) is dampened, since that's the shape of a project's own monorepo doing one coordinated release, not a compromised account spread across unrelated packages — this is why a large official org account (e.g. facebook/fb) publishing several of its own monorepos still lands well below what a plain sum of its cluster count would suggest. Multiple distinct clusters on one account combine with diminishing returns (the single worst cluster counts in full; each additional one contributes half the previous one's weight), not a plain sum — an account that does many independent, legitimate coordinated releases over its lifetime should not accumulate an unbounded score purely from being prolific. avatarUrl is the same Gravatar image npmjs.com's own profile page shows for this account, derived from the email already public in the registry's own maintainer records but served from our own /api/avatar/:hash proxy rather than linking gravatar.com directly (null only if no returned package still lists an email for this exact username). Each returned package's CURRENT maintainer list is cross-checked against the queried username (isCurrentMaintainer), since access is often already revoked by the time this runs. Natural follow-up to check_maintainer_changes: when that tool flags a newly added or fully turned-over maintainer on one package, call this with that maintainer's username to see whether the same account touched other packages around the same time. Known limitations: npm's search index is a text-relevance index, not a guaranteed-complete/real-time reverse index (results can lag or omit edge cases); results are capped at one page (up to 250 packages, ranked by npm's own relevance/popularity scoring, NOT by recency) so a very large footprint may be truncated (see resultsTruncated/totalPackagesFound) and a real cluster outside that page could be missed; and lastPublished reflects only each package's latest version, not its full history.

ParametersJSON Schema
NameRequiredDescriptionDefault
maintainerUsernameYesExact npm username, e.g. "sindresorhus" — as shown at npmjs.com/~username. Not an email address, not a package name or scope.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteYes
clustersYes
findingsYes
packagesYes
riskTierYes
avatarUrlYes
totalScoreYes
npmProfileUrlYes
packagesReturnedYes
resultsTruncatedYes
clusterWindowHoursYes
maintainerUsernameYes
totalPackagesFoundYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as read-only and open-world, and the description adds substantial behavioral detail beyond that: it names the exact npm search endpoint, warns that results are capped at 250 and may lag or be truncated, explains how current maintainer membership is cross-checked, and details scoring behavior such as popularity weighting and diminishing returns for multiple clusters. No contradiction with the annotations exists.

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?

The description is long but front-loaded and organized: it begins with the core operation, then explains the threat rationale, scoring behavior, and known limitations. Every section adds useful context, though some details like the qix compromise example and avatarUrl proxy explanation could arguably be trimmed or moved into the output schema without losing invocation guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the description is complete: it covers data source, limitations, truncation behavior, scoring semantics, output fields, and the natural relationship to sibling tools. The output schema exists, so the description does not need to enumerate return values, and it still names key output fields like resultsTruncated and totalPackagesFound where interpretation matters.

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 coverage is 100%, and the schema already fully documents maintainerUsername as an exact npm username, not an email, package name, or scope. The description reinforces this by saying 'Given an npm username' and by explaining how the username is used in the maintainer search, but it does not add new constraints or examples beyond the schema. Baseline 3 is appropriate.

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?

The description states a precise operation: given an npm username, enumerate packages via npm's maintainer search and detect tight publish-time clusters. It clearly names the underlying API source and the threat pattern it detects, and it distinguishes itself from related tools by positioning it as a follow-up to check_maintainer_changes.

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?

The description gives an explicit trigger condition: call this when check_maintainer_changes flags a newly added or fully turned-over maintainer. It also warns that a large total package count is not a red flag, preventing misuse of the tool as a volume metric, and explains the compromised-account scenario it is designed for.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_maintainer_changesCheck an npm package for maintainer/ownership red flagsA
Read-only
Inspect

Reconstructs a package's maintainer-change history straight from the npm packument — every published version carries the maintainers-list SNAPSHOT as it stood at that publish plus who actually ran npm publish (_npmUser), so diffing consecutive snapshots in publish-time order recovers exactly who was added or removed and when, with no extra API calls. Flags: (1) a maintainer added recently who then published a release shortly afterward on a package with real prior history — the account-takeover/hostile-handoff shape behind incidents like ua-parser-js, event-stream, and the 2025 chalk/debug ('qix') compromise; (2) a full, sudden replacement of the entire maintainer list; (3) a long-standing maintainer quietly dropped from the list; (4) a maintainer-list change that happened on npm's site AFTER the latest release — not yet tied to any published version, which is the more urgent case since it means access changed hands but nothing has shipped with it yet. Also cross-checks the declared GitHub repository: whether it still resolves to the same owner/name (a transfer/rename), whether it's reachable at all, and whether the latest npm release landed long after any real push activity there — repository.ownerLogin/ownerAvatarUrl name and show the CURRENT owning account (the new one after a transfer, not the one originally declared in package.json), with ownerAvatarUrl served from our own /api/github/avatar proxy rather than linking avatars.githubusercontent.com directly, both null whenever the repo check itself didn't reach GitHub. Use get_package/check_package_provenance first for the package's general health and publish-integrity signals; use this specifically for the 'who controls this package, and did that change recently' question. If this flags a newly added or fully turned-over maintainer, follow up with check_maintainer_blast_radius on that maintainer's username — it lists every other package the same account currently touches and flags a tight publish-time cluster across them, the 'did this compromise hit just one package or a dozen' question this tool can't answer on its own.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesExact npm package name, e.g. "lodash" or "@scope/name"

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYes
historyYes
findingsYes
riskTierYes
npmscanUrlYes
repositoryYes
totalScoreYes
lookbackDaysYes
currentMaintainersYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes far beyond the readOnlyHint and destructiveHint annotations by revealing the internal method (diffing maintainer-list snapshots from the npm packument), the guarantee of no extra API calls, the exact red-flag heuristics, and the GitHub repository cross-checks including what the ownerAvatarUrl proxy does. It even discloses null behavior ('both null whenever the repo check itself didn't reach GitHub'). This is exemplary transparency for a read-only analysis tool.

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?

The description is long but information-dense; nearly every sentence adds a distinct fact or behavioral guarantee. It is front-loaded with the mechanism and flags before moving to GitHub checks and usage guidance. A minor grammar issue ('repository.ownerLogin/ownerAvatarUrl name and show the CURRENT owning account') and a somewhat long tail about avatar proxying prevent a perfect score, but overall the structure serves an agent well.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the description covers the essential input, methodology, flags, output semantics, and follow-up workflow. The output schema exists and would provide the full field list, so the description need not enumerate every return value; it nonetheless clarifies candidate-specific fields like repository.ownerLogin and ownerAvatarUrl. No critical operational context is missing 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?

The input schema already documents the single 'name' parameter with a clear description and examples ('lodash' or '@scope/name'), so schema coverage is 100%. The tool description adds nothing beyond the tool's overall scope, which is acceptable because the parameter is trivial and fully documented in the schema. Baseline 3 is appropriate; no additional guidance is needed.

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?

The description opens with a specific verb ('Reconstructs') and resource ('a package's maintainer-change history'), then enumerates four concrete flags that define the tool's unique value. It clearly distinguishes itself from siblings like get_maintainer_profile and check_package_provenance, and even names check_maintainer_blast_radius as a different follow-up tool. An agent can confidently know what this tool does and what it does not do.

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?

The description explicitly states when to use this tool: 'Use get_package/check_package_provenance first for the package's general health and publish-integrity signals; use this specifically for the who controls this package, and did that change recently question.' It also gives a concrete follow-up instruction to run check_maintainer_blast_radius when a specific flag condition is met. This is model usage guidance with both alternatives and exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_package_provenanceCheck an npm package version for publish-provenance red flagsA
Read-only
Inspect

Checks whether a package version was published with npm's own Sigstore-backed publish provenance (npm publish --provenance), and cross-checks that provenance against reality rather than just reporting its presence. Three checks: (1) parses the SLSA build attestation (declared source repo, commit, builder identity, GitHub Actions run URL) and flags a builder that isn't GitHub-hosted, or an attested source repo that doesn't match package.json's own repository field; (2) when this version LACKS provenance, checks whether most peer packages (same npm scope, or same maintainer for an unscoped name) DO have it — a package that's the odd one out in an org that otherwise always publishes from CI is a real anomaly, not proof of malice; (3) fetches package.json from the source repository at the exact attested commit (or a best-effort matching git tag when no provenance/commit is available) and diffs its install-lifecycle scripts (preinstall/install/postinstall/prepare) and dependency names against what's actually in the published tarball — this is the single highest-signal check here, since a script or dependency that exists on npm but was never committed is exactly the pattern of a stolen-npm-token publish that bypasses CI (the event-stream/ua-parser-js incident shape). This is a heuristic, structural check: it does NOT cryptographically re-verify the Sigstore bundle (Fulcio cert chain, Rekor inclusion proof) — it trusts that npm's registry already refused to accept a publish that failed that verification, and checks the CONTENT of what the registry reports instead. Most packages don't use --provenance yet, so its bare absence is never scored on its own — only an org-norm anomaly or an actual source mismatch is. Use get_package/get_package_version first for basic package info; use this specifically to assess publish-integrity risk.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesExact npm package name, e.g. "lodash" or "@scope/name"
versionNoExact version to check; omit to use the latest published version

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYes
peersYes
versionYes
findingsYes
riskTierYes
npmscanUrlYes
provenanceYes
sourceDiffYes
totalScoreYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true and openWorldHint=true, so the description carries the burden of behavioral disclosure. It fully discloses that this is a heuristic structural check, does NOT cryptographically re-verify the Sigstore bundle, trusts the registry's prior verification, and treats results as anomaly signals rather than proof of malice. This is rich, accurate behavioral context beyond the annotations.

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?

The description is long but well-structured with numbered checks, a clear limitations section, and front-loaded purpose. Each sentence adds meaningful guidance, though a few parenthetical examples (event-stream/ua-parser-js) are illustrative rather than strictly necessary. Overall it is detailed without being padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the description fully explains the three checks, the meaning of their results, the heuristic limitations, and how to sequence it with sibling tools. An output schema exists, so not describing return values is acceptable. Nothing an agent needs to decide when and how to call this tool is missing.

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?

Input schema coverage is 100%, with both 'name' and 'version' already described (exact name, optional version defaults to latest). The description adds context about commit/tag matching but does not add much parameter-level meaning beyond the schema. Baseline 3 is appropriate because the schema fully carries parameter documentation.

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?

The description opens with a specific verb+resource: 'Checks whether a package version was published with npm's own Sigstore-backed publish provenance' and then enumerates three concrete checks. It clearly distinguishes this tool from sibling tools by framing it as a publish-integrity risk assessment rather than a general package info or vulnerability query.

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 instructs to 'Use get_package/get_package_version first for basic package info; use this specifically to assess publish-integrity risk.' It also clarifies when not to over-interpret results: bare absence of provenance is never scored alone, only an org-norm anomaly or source mismatch is. This gives an agent clear routing and interpretation guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compare_packagesCompare npm packages side-by-sideA
Read-only
Inspect

Given 2-5 candidate packages for the same job (e.g. "axios vs got vs node-fetch"), fetches the same registry/popularity/maintenance/vulnerability enrichment get_package computes for each one in parallel and returns a structured side-by-side plus a deterministic, reasoned pick. Each candidate gets downloads + trend, popularityTier/maintenanceTier, GitHub stars, TypeScript support, license, deprecated status, latest-version vulnerability status, a lightweight installScriptRisk signal (scans lifecycle script command strings for known red flags — does NOT fetch the tarball; call analyze_install_script on a specific candidate for that deeper scan), and installSize (the candidate's own dist.unpackedSize plus a transitive rollup — summed dist.unpackedSize across its resolved dependency tree, walked up to depth 2 / 60 nodes per candidate; installSize.transitive.truncated/sizeUnknownCount flag when that sum is partial rather than pretending it's exact — call analyze_transitive_dependencies on a specific candidate for the full graph). differentiators names which candidates stand out on each dimension (most downloads, only ones with TS types, which are deprecated/vulnerable/flagged as a typosquat/install-script risk, smallest/largest install size). recommendation.pick is chosen deterministically from a weighted score (popularity, maintenance, deprecation, vulnerabilities, typosquat flag, install-script risk, TS support, GitHub stars — install size is reported but not scored) — never a deprecated or typosquat-flagged candidate — with rationale explaining why and confidence reflecting how close the top two scored. A name that can't be resolved (typo, unpublished, malformed) still appears in candidates with found:false and resolutionError set rather than failing the whole call; duplicate names in the input are rejected.

ParametersJSON Schema
NameRequiredDescriptionDefault
packagesYes2-5 exact npm package names to compare, e.g. ["axios", "got", "node-fetch"].

Output Schema

ParametersJSON Schema
NameRequiredDescription
candidatesYes
recommendationYes
differentiatorsYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint and openWorldHint annotations, the description discloses substantial behavior: fetches happen in parallel, installScriptRisk does NOT fetch the tarball, installSize transitive rollup is truncated with explicit flags, unresolved names appear with found:false rather than failing, and duplicate names are rejected. It also explains the deterministic scoring and exclusion of deprecated/typosquat candidates. This far exceeds annotation coverage and contradicts nothing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and heavily nested, with long parentheticals and dash-separated caveats (e.g., the installSize transitive rollup explanation). It is front-loaded with the core purpose and every clause carries information, but the prose would benefit from shorter sentences and better paragraph breaks for readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the description is remarkably complete: it covers error handling for unresolved names, duplicate rejection, dependency-tree truncation behavior, scoring weights, exclusions, and routing to deeper tools. Since an output schema exists, the lack of specific return-value details is acceptable. An agent has enough context to invoke this tool correctly in most scenarios.

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?

The single parameter 'packages' already has a descriptive schema comment with examples, so baseline is 3. The description adds extra semantic nuance: candidates should be 'for the same job' and duplicate names are rejected. These details are not present in the schema and help the agent use the parameter correctly.

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?

The description opens with a specific verb and resource: it compares 2-5 npm packages side-by-side and returns a structured comparison plus a reasoned pick. It distinguishes itself from siblings like analyze_install_script and analyze_transitive_dependencies by explicitly scoping its purpose to comparison rather than deep single-package analysis.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides clear context by stating it is for candidates 'for the same job' and explicitly points to alternatives: 'call analyze_install_script on a specific candidate for that deeper scan' and 'call analyze_transitive_dependencies on a specific candidate for the full graph'. However, it never explicitly says when NOT to use this tool, such as 'use get_package for a single package', so it lacks a full when-not dimension.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

diff_dependenciesDiff two package.json/lockfile snapshotsA
Read-only
Inspect

Compares two raw snapshots of a package.json, package-lock.json (npm v1-v3), yarn.lock (classic v1 or Berry), or pnpm-lock.yaml — e.g. before/after a PR — and reports which packages were added, removed, or version-bumped. For every added or bumped package (up to 100 per call), also checks whether its resolved version carries a preinstall/install/postinstall/prepare lifecycle script that the before-version did NOT have (installScriptIntroduced, the highest-signal field here — a routine-looking patch bump quietly adding a postinstall is exactly the shape of a compromised-maintainer supply-chain attack) and batch-checks it against OSV.dev, reporting vulnerabilityDelta (introduced/fixed/still-vulnerable/still-clean) rather than just a bare isVulnerable flag. Scope notes: only direct dependencies are diffed for package.json/package-lock.json/pnpm-lock.yaml (their own formats distinguish direct from transitive); yarn.lock has no such distinction, so its side of the diff covers every resolved package in the file — expect a larger added/removed count when diffing a yarn.lock, and check comparisonNote when the two snapshots are different formats. The install-script check is presence-only (read from the registry packument or lockfile metadata, not a tarball content scan) — use analyze_install_script for a deep-dive on anything flagged here. Ideal for a CI gate reviewing a dependency-changing PR.

ParametersJSON Schema
NameRequiredDescriptionDefault
afterYesRaw file content of the "after" snapshot — a package.json, package-lock.json (npm v1-v3), yarn.lock (classic v1 or Berry), or pnpm-lock.yaml. Format is auto-detected; before/after may be different formats.
beforeYesRaw file content of the "before" snapshot — a package.json, package-lock.json (npm v1-v3), yarn.lock (classic v1 or Berry), or pnpm-lock.yaml. Format is auto-detected; before/after may be different formats.

Output Schema

ParametersJSON Schema
NameRequiredDescription
addedYes
changedYes
removedYes
summaryYes
truncatedYes
totalAddedYes
afterFormatYes
beforeFormatYes
flaggedCountYes
totalChangedYes
totalRemovedYes
comparisonNoteYes
enrichmentNoteYes
truncationNoteYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint, openWorldHint, and non-destructive. The description adds significant non-obvious behaviors: 100-per-call cap, presence-only install-script check (not tarball scan), direct-vs-transitive diff scoping per format, vulnerabilityDelta granularity, and comparisonNote for mixed formats. No contradiction.

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?

The description is long but every sentence carries meaningful information—supported formats, limit, signal explanation, scope differences, and alternatives. It is well-structured but dense; could be trimmed slightly without losing value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity and that an output schema exists, the description amply covers all critical operational nuances: what it reports, the limit, format-specific scope, how install scripts are checked, and when to delegate to a sibling. Nothing essential is missing.

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 coverage is 100% and both before/after already have detailed descriptions in the schema (raw content, supported formats, auto-detection, may differ). The tool description repeats that but adds no new parameter-level meaning beyond contextualizing the diff workflow. Baseline 3 applies.

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?

Clearly states the verb 'Compares' and the resource: two raw snapshots of package manifests, listing supported formats and the add/remove/version-bump report. It also distinguishes itself from sibling analyze_install_script by explicitly naming it as the deep-dive alternative.

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 identifies its primary use case ('Ideal for a CI gate reviewing a dependency-changing PR') and gives an alternative ('use analyze_install_script for a deep-dive'). It also provides scope caveats for yarn.lock and mixed-format comparisons, so the agent knows what to expect.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

enrich_npm_auditRank raw `npm audit --json` output by what to fix firstA
Read-only
Inspect

Given the raw output of npm audit --json (npm 7+'s {vulnerabilities: {...}} format, or legacy npm 6's {advisories: {...}}), parses it directly — no need to re-paste package.json/lockfile content — and runs it through the same patch-now/patch-soon/scheduled/monitor ranking prioritize_remediation exposes for hand-built finding lists. npm audit's JSON almost never includes a CVE id (only a GHSA advisory URL), so this resolves each GHSA to its CVE alias via OSV.dev when one exists (ghsaResolvedToCveCount reports how many) before doing the same CISA KEV + FIRST.org EPSS + severity scoring — skipping this step would silently degrade most findings to severity-only ranking despite prioritize_remediation being built around CVE-keyed KEV/EPSS data. Also carries through npm-audit-specific context prioritize_remediation itself has no field for: isDirect (direct vs. transitive dependency) and fixAvailable/fixTarget (npm's own computed fix — note fixTarget can name a different package than the vulnerable one, e.g. bumping a parent to pull in a patched transitive dependency). A package with more than one distinct advisory in the source report only has its first advisory used for ranking; a warning names the package so query_vulnerabilities can be called on it directly for the rest. yarn audit --json and pnpm audit --json use different report shapes and are not supported — use batch_query_vulnerabilities with the project's manifest/lockfile for those instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYesRaw stdout of `npm audit --json` — either npm 7+ format ({"auditReportVersion": 2, "vulnerabilities": {...}}) or legacy npm 6 format ({"advisories": {...}}).

Output Schema

ParametersJSON Schema
NameRequiredDescription
rankedYes
summaryYes
warningsYes
inputFormatYes
skippedCountYes
totalFindingsYes
uniqueCveCountYes
ghsaResolvedToCveCountYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the description doesn't contradict them. It enriches the safety profile by explaining that it resolves GHSA IDs to CVEs and that skipping this step would silently degrade findings. It also discloses the multi-advisory handling (only first advisory used) and the fixTarget caveat (may name a different package). This level of behavioral disclosure goes well beyond what annotations alone encode.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is comprehensive but verbose, running several sentences packed with caveats and alternatives. It is well-structured and front-loaded with a clear purpose, but not concise; a shorter version could convey the same essential facts. Every sentence earns its place, but a tighter edit would improve scannability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one parameter, no nested objects, but an output schema, the description covers input formats, transformation logic, edge cases (multiple advisories), and alternatives. It even warns about the silent degradation if CVE resolution is skipped. Nothing an agent needs to call it correctly is missing.

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?

The sole parameter, content, is described in the schema with 100% coverage of its format (npm 7+ vs npm 6). The description adds that it is parsed directly (no re-pasting of package.json) and explains why the GHSA resolution matters, which clarifies the purpose of the input beyond the literal schema. Since schema coverage is complete, the description adds value without being essential.

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?

The description opens with a specific verb-resource pair: 'Rank raw npm audit --json output by what to fix first'. It immediately distinguishes itself from prioritize_remediation (which works on hand-built findings) and from query/batch_query_vulnerabilities, and explicitly lists unsupported formats (yarn/pnpm) with a pointer to the alternative. Purpose is unmistakable.

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?

The description explicitly states when to use this tool (given raw npm audit output) and when not to (yarn/pnpm audit), naming batch_query_vulnerabilities as the alternative. It also describes a fallback: if a package has multiple advisories, call query_vulnerabilities on it. These usage rules are explicit and unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_sbomGenerate a CycloneDX or SPDX SBOMA
Read-only
Inspect

Given the same inputs batch_query_vulnerabilities accepts — either a flat {packages:[...]} list, or raw package.json / lockfile / CycloneDX JSON / SPDX JSON content via content — emits a spec-valid CycloneDX 1.6 or SPDX 2.3 JSON document (pick with format, default 'cyclonedx') with npmscan's own OSV.dev vulnerability findings and registry license data embedded in each spec's native fields: CycloneDX gets a top-level vulnerabilities[] array (VEX analysis.state: 'in_triage' — an unreviewed automated finding, not a claim of exploitability) and per-component licenses[]; SPDX (which has no vulnerabilities array in 2.3) gets one externalRefs SECURITY/advisory entry per finding and licenseDeclared/licenseConcluded. Only a flat package inventory is known here, so the CycloneDX dependencies[] transitive graph and any SPDX package hierarchy are intentionally omitted rather than fabricated. Set includeVulnerabilities/includeLicenses to false to skip either enrichment pass (faster, no registry/OSV calls for that pass); pass policy (same shape as check_license_compliance) to also get per-package compliance context; componentName/componentVersion name the SBOM's own root component/document if known.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNoSBOM format to emit. Default 'cyclonedx'.
policyNoLicense allow/deny policy, same shape as check_license_compliance. Omit for the default policy.
contentNoRaw dependency inventory content: package.json, package-lock.json, yarn.lock, pnpm-lock.yaml, CycloneDX JSON, or SPDX JSON. Use this OR `packages`, not both.
packagesNoExplicit package list (1-1000 items, capped to 100 when includeLicenses is on). Use this OR `content`, not both.
componentNameNoName of the SBOM's own root component/document, if known.
includeLicensesNoResolve registry license data and embed it natively. Default true.
componentVersionNo
includeDevDependenciesNoIgnored when using `packages`; only applies when `content` is a manifest/lockfile format that distinguishes dev dependencies.
includeVulnerabilitiesNoQuery OSV.dev and embed findings natively. Default true.

Output Schema

ParametersJSON Schema
NameRequiredDescription
sbomYes
formatYes
policyNo
warningsNo
inputFormatNo
ignoredCountNo
enrichmentNoteNo
parsedPackageCountYes
totalVulnerabilitiesYes
licenseViolationCountNo
packagesWithVulnerabilitiesYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the read-only/non-destructive annotations by disclosing important behavioral nuances: VEX findings are marked in_triage and are not exploitability claims, SPDX has no vulnerability array so externalRefs are used, and the transitive dependency graph is intentionally omitted rather than fabricated. This is exactly the kind of non-obvious behavior an agent needs to know.

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?

The description is long and dense, but it earns its length by packing in format-specific behavior, caveats, and parameter effects. It is not front-loaded with the output first, but the title and opening input framing still orient the agent quickly. There is no filler, and every clause adds operational value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex tool with 9 parameters, nested objects, and an output schema, the description covers the essential operational details: inputs, formats, vulnerability/license embedding differences, omission of dependency graphs, policy integration, and performance-related flags. The presence of an output schema means return-structure details do not need to be repeated, and nothing critical is missing.

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?

Schema description coverage is already high at 89%, so the baseline is 3. The description adds meaningful extra semantics: packages/content are framed as the same accepted inputs as batch_query_vulnerabilities, includeVulnerabilities/includeLicenses are tied to faster execution by skipping OSV/registry calls, and componentName/componentVersion are clarified as naming the root component. This is a solid enhancement without being fully redundant.

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?

The description clearly states the tool's function: generate a spec-valid CycloneDX 1.6 or SPDX 2.3 SBOM document from a package list or raw dependency content. It also differentiates itself by naming the specific enrichment data (OSV.dev vulnerabilities and registry licenses) and how they are embedded per format, which distinguishes it from the sibling query/compliance tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives strong usage context: it explains the two accepted input modes, references sibling tools for shared input/policy shapes, and notes when to disable enrichment passes for speed. It does not explicitly state when not to use this tool versus alternative siblings, but for an SBOM-generation tool the intended use case is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_cveLook up a CVE in the NIST NVDA
Read-only
Inspect

Look up authoritative NIST NVD data for one exact CVE ID (e.g. "CVE-2026-2950"), or browse/search NVD by keyword, CVSS severity, CWE, or a publication-date range. Every result is enriched with CISA KEV status (kev, non-null only if this CVE is a confirmed, actively-exploited-in-the-wild vulnerability — treat that as an urgent-patch signal regardless of CVSS score) and FIRST.org EPSS (epss, the probability of exploitation in the next 30 days — a better prioritization signal than CVSS severity alone, which measures impact, not likelihood). For a single cveId lookup, if NVD has no record yet or hasn't scored it, this falls back to the raw MITRE CVE record automatically (source: "mitre" on the result) rather than returning nothing. NVD is NOT npm-scoped — unlike query_vulnerabilities/get_latest_advisories, search results can include CVEs for any ecosystem, so pass keywordSearch (e.g. the package name) to narrow it. Prefer this for the authoritative CVSS score/vector/KEV/EPSS data on a CVE already found via another tool, or when a user pastes a CVE ID/link directly; prefer get_latest_advisories for npm-specific browsing. NVD enforces a strict shared rate limit, so this tool may occasionally ask you to retry in a few seconds — do so rather than assuming failure.

ParametersJSON Schema
NameRequiredDescriptionDefault
cveIdNoExact CVE ID for a single lookup, e.g. "CVE-2026-2950". When given, search filters below are ignored and should be omitted.
cweIdNoFilter by weakness type, e.g. "CWE-79"
severityNoFilter by CVSS v3 base severity
startIndexNoPagination offset for a search
keywordSearchNoFree-text search, e.g. a package or product name
publishedSinceNoPublication date range start (YYYY-MM-DD). Must be given together with publishedUntil.
publishedUntilNoPublication date range end (YYYY-MM-DD). Must be given together with publishedSince; range is capped at 120 days.
resultsPerPageNoMax results for a search (default 10, capped at 50)

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
kevNo
cvesNo
cvssNo
cwesNo
epssNo
noteNo
cveIdNo
foundNo
sourceNo
publishedNo
npmscanUrlNo
referencesNo
startIndexNo
vulnStatusNo
descriptionNo
lastModifiedNo
totalResultsNo
resultsPerPageNo
dateRangeClampedNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnlyHint=true and destructiveHint=false, and the description adds significant behavioral context beyond that: results are enriched with KEV and EPSS, single-ID lookups fall back to MITRE records with source: 'mitre', and NVD has a shared rate limit that may require retries. This gives the agent practical expectations about data provenance, urgency semantics, and transient failures.

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?

The description is long but every sentence earns its place: purpose, enrichment semantics, fallback behavior, scope warning, routing guidance, and rate-limit caveat. The core action is front-loaded in the first sentence, and the additional caveats are each relevant to avoiding incorrect agent behavior. Nothing reads as filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 8 parameters, two operating modes, and cross-ecosystem scope, the description covers all critical decision points: exact ID lookup vs search, non-npm scope, fallback source, priority signals, rate limiting, and sibling-tool routing. The output schema exists, so the absence of return-field detail is not a gap.

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?

Schema description coverage is 100%, so the baseline is 3. The description adds meaningful context on top of the schema: it explains that keywordSearch should carry a package name to narrow the cross-ecosystem NVD results, clarifies that cveId mode ignores search filters, and explains the purpose of EPSS/KEV fields. This goes beyond the raw schema but not exhaustively for every parameter.

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?

The description opens with a specific verb and resource: 'Look up authoritative NIST NVD data' for one exact CVE ID or as a search/browse tool. It clearly distinguishes itself from sibling tools by stating that NVD is NOT npm-scoped, unlike query_vulnerabilities/get_latest_advisories. This makes the tool's purpose immediately identifiable.

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?

The description gives explicit when-to-use guidance: 'Prefer this for the authoritative CVSS score/vector/KEV/EPSS data on a CVE already found via another tool, or when a user pastes a CVE ID/link directly; prefer get_latest_advisories for npm-specific browsing.' It also tells the agent to pass keywordSearch to narrow results because NVD covers all ecosystems. This is strong routing guidance with named alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_latest_advisoriesGet latest npm security advisoriesA
Read-only
Inspect

Browse recently published, reviewed GitHub Security Advisories for the npm ecosystem. Filter by severity, vulnerability category (XSS, SQL/NoSQL Injection, SSRF, Access Control, Code Injection, etc.), an affected package name, or look up one exact advisory by GHSA or CVE ID. Paginated with an opaque cursor: pass a previous response's nextCursor back in as cursor to fetch the next page.

ParametersJSON Schema
NameRequiredDescriptionDefault
cveIdNoLook up one exact advisory by its CVE ID (e.g. "CVE-2024-12345")
cursorNoOpaque pagination cursor from a previous response's nextCursor, to fetch the next page
ghsaIdNoLook up one exact advisory by its GHSA ID (e.g. "GHSA-xxxx-xxxx-xxxx")
affectsNoFilter to advisories affecting this npm package name
categoryNoFilter by vulnerability category. One of: access-control, dos, xss, ssrf, auth, code-injection, info-exposure, path-traversal, input-validation, prototype-pollution, command-injection, sqli, crypto, race-condition, open-redirect, csrf, crlf-injection, xml-injection, malicious-code, deserialization
severityNoFilter by severity (default all)
directionNoSort by published date, newest or oldest first (default desc)

Output Schema

ParametersJSON Schema
NameRequiredDescription
categoryYes
severityYes
directionYes
advisoriesYes
nextCursorYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as read-only, non-destructive, and open-world, so the safety profile is covered. The description adds genuine behavioral detail beyond annotations by explaining pagination with an opaque cursor and the notion of 'reviewed' advisories. This is useful runtime context that the annotations alone do not provide.

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 sentences cover the resource, filtering options, exact lookup, and pagination mechanics with no filler. The most important capability is front-loaded, and every sentence contributes actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and no nested objects, the description covers the key operational aspects an agent needs: what is returned conceptually, how to paginate, what filters exist, and how to do an exact lookup. Nothing critical is missing for correct invocation.

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?

Schema coverage is 100%, so parameters are already documented. The description adds value by explaining how the cursor relates to a previous response's nextCursor and by summarizing the filter dimensions (severity, category, package, exact ID). It complements rather than repeats the schema.

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?

The description explicitly names the resource ('npm security advisories'), the action ('browse', 'filter', 'look up'), and the scope ('recently published, reviewed'). It also distinguishes the exact-lookup behavior from browsing, making the tool's purpose unmistakable even 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool: to browse recent advisories, filter by severity/category/package, or look up by GHSA/CVE. It does not explicitly name alternatives or exclusion criteria, leaving some sibling differentiation to inference, but the intended use cases are well stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_maintainer_profileGet basic profile info for an npm maintainerA
Read-only
Inspect

Given an npm username, returns every package npm's own maintainer: search index currently returns for that account (registry.npmjs.org's /-/v1/search — the public registry API has no dedicated 'list packages by maintainer' endpoint otherwise), plus precomputed aggregates: currentlyMaintainsCount (still listed as maintainer right now vs. already-revoked), totalWeeklyDownloads and totalDependents summed across every returned package, and avatarUrl — the same Gravatar image npmjs.com's own profile page shows for this account, derived from the email already public in the registry's own maintainer records but served from our own /api/avatar/:hash proxy rather than linking gravatar.com directly (null only if no returned package still lists an email for this exact username). This is a plain info lookup — it does NOT run the publish-cluster / compromised-account detection that check_maintainer_blast_radius does; use that tool instead when the goal is a security read on whether this account's recent activity looks like a takeover, not just a profile summary. Natural pairing with check_maintainer_changes: once that tool names a maintainer on a package, call this with that maintainer's username to see the rest of what they touch.

ParametersJSON Schema
NameRequiredDescriptionDefault
maintainerUsernameYesExact npm username, e.g. "sindresorhus" — as shown at npmjs.com/~username. Not an email address, not a package name or scope.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteYes
packagesYes
avatarUrlYes
npmProfileUrlYes
totalDependentsYes
packagesReturnedYes
resultsTruncatedYes
maintainerUsernameYes
totalPackagesFoundYes
totalWeeklyDownloadsYes
currentlyMaintainsCountYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/openWorld/destructive annotations, it discloses that this is a plain info lookup, does NOT run compromised-account detection, depends on npm's current search index, and defines what currentlyMaintainsCount and avatarUrl mean. No contradiction with annotations.

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?

The definition is heavily front-loaded and every clause adds context, but it is a long single run-on paragraph with dense parentheticals. It is efficient in content, not in structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description need not re-explain return shape; it covers the data source quirk, aggregate semantics, avatar null behavior, and routing to sibling tools. Nothing essential is missing for correct invocation.

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 coverage is 100% and the schema already documents maintainerUsername as an exact npm username with exclusions. The description only says 'Given an npm username,' so it adds no additional parameter meaning beyond the schema baseline.

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?

The description states a specific verb and resource: 'Given an npm username, returns every package npm's own maintainer:<username> search index currently returns for that account,' then enumerates the aggregates. It also contrasts itself with check_maintainer_blast_radius, making the tool's scope unmistakable.

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?

It explicitly tells the agent to use check_maintainer_blast_radius instead when the intent is a security/takeover read, and it names the natural workflow with check_maintainer_changes. This is direct when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_packageGet npm package detailsA
Read-only
Inspect

Fetch npm registry metadata for a package: latest version, install scripts (preinstall/postinstall are a key risk signal), maintainers, license, recent version history, weekly downloads, GitHub stars, TypeScript support, days since last publish, a topPackagesRank (position among npm's ~100k most-downloaded packages, from npmscan's own periodically-refreshed snapshot — not live), and a downloadTrend (growing/stable/declining vs. ~3 months ago). Also checks the LATEST version against OSV.dev for known vulnerabilities — isLatestVersionVulnerable/highestSeverity give a direct safe/not-safe answer, and each finding includes severity, a summary, and the fixedVersion to upgrade to (use get_package_version or query_vulnerabilities to check a specific older version instead). Also returns popularityTier/maintenanceTier (deterministic rule-based labels, not model-generated) and a plain-language maintenanceSummary, plus a possibleTyposquatOf flag if the name is one typo away from a top-5,000 package while itself being obscure — read deprecated and maintenanceSummary before recommending a package, since a long gap since the last release can mean either a stable/finished package or a slowing one. Includes a link to the full npmscan.com analysis page.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesExact npm package name, e.g. "lodash" or "@scope/name"

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYes
licenseYes
distTagsYes
homepageYes
keywordsYes
createdAtYes
modifiedAtYes
npmscanUrlYes
repositoryYes
descriptionYes
githubStarsYes
maintainersYes
downloadTrendYes
latestVersionYes
popularityTierYes
recentVersionsYes
hasBuiltInTypesYes
highestSeverityYes
maintenanceTierYes
topPackagesRankYes
vulnerabilitiesYes
weeklyDownloadsYes
latestVersionInfoYes
maintenanceSummaryYes
possibleTyposquatOfYes
daysSinceLastPublishYes
isLatestVersionVulnerableYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnly, openWorld, and non-destructive behavior, so the bar is lower, but the description adds significant behavioral context: topPackagesRank is from a periodically-refreshed snapshot and not live; popularityTier/maintenanceTier are deterministic rule-based labels, not model-generated; possibleTyposquatOf has a specific definition; and the vulnerability fields are described as giving a 'direct safe/not-safe answer.' No contradictions with annotations exist.

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?

The description is long, but nearly every clause adds decision-relevant information, such as install scripts being a key risk signal, snapshot staleness, and tier derivation. It is front-loaded with the core resource and risk signal, and the length is justified by the tool's rich output. It loses a point only for being dense and somewhat run-on.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one parameter and a rich output schema, the description covers all the non-obvious semantics an agent needs: interpretability of downloadTrend, staleness of ranking data, how to interpret last-publish gaps, typosquatting detection, and where to find the full analysis page. The output schema already exists, so the description does not need to restate return types. Nothing critical is missing.

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 100% and the sole parameter, name, is already well-defined in the schema as an exact npm package name with examples. The tool description repeats that it fetches package metadata but adds no parameter semantics beyond the schema. Baseline 3 is appropriate because the schema carries the full burden.

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?

The description opens with a specific verb and resource: 'Fetch npm registry metadata for a package' and enumerates concrete returned fields (latest version, install scripts, maintainers, license, downloads, vulnerability check). It also explicitly distinguishes itself from get_package_version by clarifying it checks the LATEST version against OSV.dev while older versions require a different tool.

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?

The description gives explicit routing guidance: 'use get_package_version or query_vulnerabilities to check a specific older version instead.' It also instructs the agent to read deprecated and maintenanceSummary before recommending a package, and explains the interpretation nuance of long gaps since last publish. This clearly communicates when to use this tool versus alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_package_versionGet a specific npm package versionA
Read-only
Inspect

Fetch registry metadata for one exact version of a package (dependencies, install scripts, tarball) AND check that exact version against OSV.dev for known vulnerabilities — isVulnerable/highestSeverity give a direct answer, and each finding includes severity, a summary, and the fixedVersion to upgrade to. Use this to check a version pinned in a lockfile rather than the latest release.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesExact npm package name
versionYesExact version string, e.g. "4.17.21"

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYes
shasumYes
licenseYes
scriptsYes
tarballYes
versionYes
deprecatedYes
npmscanUrlYes
descriptionYes
dependenciesYes
isVulnerableYes
highestSeverityYes
vulnerabilitiesYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly and non-destructive, and the description adds rich behavioral context: the tool performs an external OSV.dev check, returns a direct vulnerability verdict, and details each finding. This goes well beyond annotations and tells the agent exactly what side effects and outputs to expect.

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 sentences, no filler, with the core action front-loaded and the vulnerability-checking behavior described concisely. Every phrase earns its place, and the lockfile guidance is a valuable addition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a dual-purpose tool (registry fetch + vulnerability check) with an output schema and annotations, the description is complete: it explains the direct answer fields, the nature of findings, and the intended use case. No critical information is missing for an agent to call it correctly.

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 100%, with both name and version well-documented in the schema. The description repeats that it's an 'exact version' and clarifies the purpose, but adds no new semantic information about the parameters themselves. Baseline 3 is appropriate.

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?

The description clearly states the tool fetches registry metadata for a specific version and checks that version against OSV.dev for vulnerabilities, listing the exact outputs (dependencies, install scripts, tarball, isVulnerable, highestSeverity, findings with severity, summary, fixedVersion). This is precise and distinguishes it from siblings like get_package or query_vulnerabilities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use this to check a version pinned in a lockfile rather than the latest release,' providing a clear when-to-use condition and a when-not-to-use (latest release). It doesn't name specific alternative tools but gives enough context to route an agent correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_remediation_playbookGet the concrete remediation playbook for a flagged findingA
Read-only
Inspect

Maps a finding's rule value from analyze_install_script, check_maintainer_changes, or check_package_provenance to the matching human-authored incident-response playbook (the same content published at /docs/playbooks) and returns its concrete, ordered steps, severity tier, real-incident references, and prevention tips — not just a link. Pass the exact rule string(s) a prior finding already returned (batch up to 10 in one call to cover a whole findings array; duplicates resolving to the same playbook are deduplicated) or an id to look up a specific playbook by slug directly. Each matched rule also gets its own short situationNote explaining specifically what that rule caught — so a batch of several different rules landing on the same playbook does not read as identical, repeated boilerplate. An unrecognized rule or id is not an error — it comes back with matched:false and a note, since a low-severity or baseline-only finding (e.g. analyze_install_script's lifecycle-present) legitimately has no dedicated playbook.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoA playbook slug to look up directly, e.g. "postinstall-binary" — see /docs/playbooks
rulesNo1-10 exact `rule` values copied from findings already returned by analyze_install_script/check_maintainer_changes/check_package_provenance

Output Schema

ParametersJSON Schema
NameRequiredDescription
matchesYes
playbooksYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is clear. The description adds valuable behavioral context: batching with deduplication, situationNote per rule to avoid repeated boilerplate, and the matched:false behavior for unrecognized inputs. It also discloses that the content matches /docs/playbooks, giving the agent a confidence anchor.

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?

The description is long but every sentence earns its place: it explains the mapping, the return payload, batching, deduplication, situationNote behavior, and error semantics. It is front-loaded with the core purpose and then layers in usage details. No filler or repetition of schema fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 2 optional params and no required params, the description is remarkably complete. It covers input source, batching limits, deduplication, per-rule output nuance, unmatched behavior, and references the published playbook location. The output schema exists, so return values don't need to be spelled out.

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?

Schema coverage is 100% and the schema descriptions already explain both id and rules well. The description adds meaning by explaining how the two parameters relate (id for direct slug lookup, rules for batch lookup from findings), and clarifies that duplicates resolving to the same playbook are deduplicated. This goes beyond the schema's basic field descriptions.

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?

The description precisely identifies the tool's function: it maps rule values from specific sibling analysis tools to human-authored playbooks and returns ordered steps, severity tier, references, and prevention tips. It clearly distinguishes itself from siblings like prioritize_remediation and query_vulnerabilities by saying it returns actual playbook content, not just a link.

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?

The description explicitly says when to use this tool: after a finding from analyze_install_script, check_maintainer_changes, or check_package_provenance, and how to batch up to 10 rules. It also explains what is not an error (unrecognized rule/id returns matched:false) and gives a concrete example of an id lookup. Alternatives are implicitly covered by naming the exact source tools, and the description clarifies the 'not just a link' distinction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

prioritize_remediationRank a batch of flagged vulnerabilities by what to fix firstA
Read-only
Inspect

Given a batch of vulnerability findings already flagged elsewhere (e.g. from batch_query_vulnerabilities, analyze_transitive_dependencies, or query_vulnerabilities across a whole package.json/lockfile audit), ranks them by what to actually fix first. Combines CISA KEV status (confirmed active exploitation in the wild — an automatic top-priority override), FIRST.org EPSS (probability of exploitation in the next 30 days — the primary ranking signal, since it measures likelihood rather than just impact), and severity (a secondary/fallback signal, most useful for a GHSA finding with no CVE alias) into one composite score and a patch-now/patch-soon/scheduled/monitor tier per finding. This does NOT re-query OSV/NVD itself — pass in the severity/CVE id findings other tools already returned; it only adds KEV/EPSS enrichment (the same data get_cve returns per-CVE) and ranks the batch. A CVE id shared by multiple findings in the same call is only looked up once.

ParametersJSON Schema
NameRequiredDescriptionDefault
findingsYes1-200 previously-flagged vulnerability findings to rank

Output Schema

ParametersJSON Schema
NameRequiredDescription
rankedYes
summaryYes
totalFindingsYes
uniqueCveCountYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations readOnlyHint, openWorldHint, and destructiveHint, the description discloses meaningful behavior: KEV is an automatic top-priority override, EPSS is the primary signal, severity is a fallback, and CVE lookups are deduplicated within a call. This aligns with the annotations and adds useful detail about ranking logic.

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?

The description is long but densely informative; each sentence contributes distinct guidance about tool selection, ranking signals, input provenance, or deduplication behavior. It is appropriately front-loaded with the core purpose, though slightly more verbose than strictly necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's algorithmic complexity and the presence of an output schema, the description covers the important invocation context: where findings come from, how scores are composed, how tiers are derived, what happens for GHSA-only findings, and the deduplication behavior. No significant missing context remains for an agent to invoke it correctly.

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?

Schema description coverage is 100%, so the baseline is 3. The description adds additional param-level guidance: findings without a CVE alias (e.g. GHSA advisories) are still ranked using severity alone, and the input should be previously-flagged findings rather than raw package data. This goes beyond the schema's basic field definitions.

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?

The description states a specific verb ('ranks') and resource ('a batch of vulnerability findings already flagged elsewhere'), and clearly defines the outcome ('what to actually fix first'). It also distinguishes itself from siblings by naming upstream tools such as batch_query_vulnerabilities, analyze_transitive_dependencies, and query_vulnerabilities, and by explicitly saying it does NOT re-query OSV/NVD.

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?

It gives explicit when-to-use context: pass in findings that other tools have already returned, not raw package data. It also states an explicit exclusion ('does NOT re-query OSV/NVD itself') and names an alternative (get_cve returns the same per-CVE enrichment), so an agent can decide between tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_vulnerabilitiesQuery known vulnerabilities for a packageA
Read-only
Inspect

Query OSV.dev for known vulnerabilities affecting an npm package, optionally scoped to one exact version (e.g. to check whether a version pinned in a lockfile is safe). Returns isVulnerable and highestSeverity as a direct answer, plus each finding's severity, a plain-language summary, CVE aliases, and the fixedVersion to upgrade to — not a raw advisory dump. Use before recommending, installing, or upgrading a package.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesnpm package name
versionNoOptional exact version to narrow results, e.g. to check one version pinned in a lockfile
ecosystemNoOSV ecosystem, default "npm"

Output Schema

ParametersJSON Schema
NameRequiredDescription
packageYes
versionYes
npmscanUrlYes
isVulnerableYes
highestSeverityYes
vulnerabilitiesYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it read-only and non-destructive; the description adds useful behavioral context beyond annotations by specifying it returns a summarized 'direct answer' and 'not a raw advisory dump,' while noting the external source (OSV.dev). No contradiction with the readOnlyHint.

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 tight sentences cover purpose, return shape, and usage timing. The most decision-relevant information is front-loaded with no filler or repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple 3-parameter read-only tool with 100% schema coverage and an output schema, the description fully covers what the tool does, what it returns, and when to use it. Nothing an agent needs to select and invoke it correctly is missing.

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 100%, so the baseline is 3. The description reinforces the version parameter's purpose via the lockfile example, but it does not add new meaning beyond what the input schema already provides.

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 and resource ('Query OSV.dev for known vulnerabilities affecting an npm package') with an optional exact-version scope. This clearly distinguishes it from siblings by promising a direct isVulnerable answer for a single package, not a raw advisory feed.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly directs use 'before recommending, installing, or upgrading a package,' giving clear decision context. It does not explicitly name when-not-to-use or alternatives such as batch_query_vulnerabilities, so it falls just 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.

search_packagesSearch npm packagesA
Read-only
Inspect

Search the npm registry by name or keywords. Each result includes its current weekly/monthly download counts, dependentsCount (how many other npm packages depend on it), topPackagesRank (position among npmscan's own top-100k-by-downloads snapshot — not live, but a second independent popularity signal), and deterministic (not model-generated) popularityTier/maintenanceTier labels — a package matching the query with a 'very-low' popularityTier, zero dependents, or a 'stale' maintenanceTier is very likely an abandoned, copy-paste, or squatted package, not a real contender, regardless of how relevant its name/description look. A result may also carry possibleTyposquatOf — set when its name is one typo away (e.g. 'raect' vs 'react') from a top-5,000 package while itself having very low popularity; treat that as a red flag to call out explicitly, not silently filter. Use these (not name recognition or the package's own README) to judge which candidates are actually established, and call get_package on your shortlist for install-script risk, TypeScript support, and GitHub stars before recommending one. Includes a link to each package's full npmscan.com risk/analysis page.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results to return (default 20, max 50)
queryYesSearch text, e.g. a package name or keywords

Output Schema

ParametersJSON Schema
NameRequiredDescription
queryYes
totalYes
resultsYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate a harmless read-only search, but the description goes well beyond them by disclosing that topPackagesRank is from a snapshot and not live, that labels are deterministic rather than model-generated, and that certain result signals indicate likely abandoned or squatted packages. It also defines the possibleTyposquatOf field semantics and how the agent should react, which is valuable behavioral context not visible in the schema.

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?

The description is long but every sentence carries operational value, especially the caveats about abandoned packages and typosquatting. It is front-loaded with the primary action and then layers interpretation and workflow guidance, though a slightly more structured format would improve scannability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity and the presence of an output schema, the description fully covers what the agent needs: what results include, how to interpret unreliable signals, how to handle typosquat flags, and what to do next (call get_package). No critical guidance is missing.

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 coverage is 100% — both query and limit are already documented with constraints and defaults. The description adds only minor context ('by name or keywords'), which does not materially exceed the schema, so the baseline score of 3 is appropriate.

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?

Description states a specific verb ('Search') and resource ('the npm registry'), and defines what the results include. It clearly distinguishes from sibling get_package by framing search as the discovery step and get_package as the deep-dive on a shortlist.

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?

Provides explicit workflow guidance: use download counts, dependentsCount, and popularityTier/maintenanceTier instead of name recognition or README, and call get_package on the shortlist before recommending. It also tells the agent how to treat possibleTyposquatOf results, effectively specifying when to flag versus silently filter.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simulate_dependency_upgradeSimulate upgrading one package from one version to another, or a whole batch at onceA
Read-only
Inspect

Given a package and a current/target version, tells you whether that specific upgrade is a safe patch/minor bump or a likely-breaking major bump, before you actually run npm install. Natural follow-up to prioritize_remediation: pass its packageName + currentVersion + fixedVersion straight in to check whether the suggested fix is a drop-in patch or something that needs a review pass. Classifies the jump by semver (major/minor/patch/prerelease), treats a minor bump between two pre-1.0 (0.x) versions as breaking-risk per semver's own "the API isn't stable yet" convention, and flags skipping over multiple major versions in one jump (e.g. 2.x -> 5.x) as needing a per-major changelog review rather than just a diff against the final target. Beyond semver, it also checks the registry for real signals the version number alone won't tell you: whether the target version is marked deprecated, whether it introduces a preinstall/install/postinstall/prepare lifecycle script the current version didn't have, whether it tightens its engines.node requirement, and whether it is itself a prerelease. Finally it batch-checks both versions against OSV.dev and reports vulnerabilityDelta (introduced/fixed/still-vulnerable/still-clean) — catching the case where a suggested "fix" version doesn't actually clear every open CVE. Combines all of this into one riskTier (safe/low-risk/review-recommended/breaking-change-likely/unknown) with a reasons list explaining exactly which signals drove it. This does NOT read the package's changelog/release notes or scan the target tarball's source diff for actual breaking API usage — it's a fast, deterministic pre-check, not a substitute for reading the release notes on a flagged major bump. For simulating more than one upgrade at once — e.g. every "patch-now" finding prioritize_remediation just ranked — pass packages: [{packageName, currentVersion, targetVersion?}, ...] (1-100 items) instead of packageName/currentVersion/targetVersion, not both. Registry fetches are deduped/parallelized and all OSV checks for the whole batch run as one call, so this is not the same cost as N single-item calls. A package that can't be resolved at all (typo, unpublished, registry error) shows up as its own results entry with fetchError set instead of failing the whole batch.

ParametersJSON Schema
NameRequiredDescriptionDefault
packagesNoBatch of upgrades to simulate (1-100 items), each mirroring the single-item packageName/currentVersion/targetVersion fields. Use this OR packageName/currentVersion, not both. Natural pairing with prioritize_remediation: pass its ranked findings straight in as one call instead of one simulate_dependency_upgrade call per finding.
packageNameNoExact npm package name, e.g. "lodash" or "@scope/name". Use this (with currentVersion) OR `packages`, not both.
targetVersionNoVersion to simulate upgrading to — exact version, range, or dist-tag (e.g. the fixedVersion a prioritize_remediation finding named). Omit to use the registry's "latest" dist-tag. Only applies to the single-item `packageName` form.
currentVersionNoCurrently installed version — an exact version (e.g. "4.17.20"), a semver range (e.g. "^4.17.0"), or a dist-tag. Required when `packageName` is used.

Output Schema

ParametersJSON Schema
NameRequiredDescription
reasonsNo
resultsNo
verdictNo
riskTierNo
directionNo
npmscanUrlNo
semverBumpNo
packageNameNo
batchSummaryNo
engineChangeNo
zeroMajorNoteNo
targetDeprecatedNo
targetVersionNoteNo
currentVersionNoteNo
isBreakingBySemverNo
targetIsPrereleaseNo
targetIsVulnerableNo
vulnerabilityDeltaNo
currentIsVulnerableNo
majorVersionsSkippedNo
resolvedTargetVersionNo
targetVulnerabilitiesNo
requestedTargetVersionNo
resolvedCurrentVersionNo
installScriptIntroducedNo
requestedCurrentVersionNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint/openWorldHint/destructiveHint=false, and the description is fully consistent with them. Beyond the annotations, it discloses the complete signal set (deprecation, lifecycle script introduction, engines.node tightening, prerelease status), the vulnerabilityDelta semantics against OSV.dev, the 0.x-as-breaking semver convention, multi-major jump handling, the deduped/parallelized cost model, and per-item fetchError isolation instead of whole-batch failure.

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?

The description is long (~300 words) but every sentence carries non-redundant information for a genuinely complex tool, and it is front-loaded with the core contract before diving into signals, exclusions, and batch behavior. Its structure flows logically, though it is slightly wordy in spots (repeated 'not both', dense parenthetical-heavy sentences) — dense but earned.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with two invocation forms, a rich output schema, and multiple analysis signals, the description covers everything needed to call it correctly: single vs batch inputs, output contract (riskTier, vulnerabilityDelta, reasons, fetchError), explicit non-goals, cost characteristics, and error behavior. Nothing critical is left to inference.

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?

Schema coverage is 100%, so the baseline is 3. The description adds genuine value beyond the schema: mutual exclusivity of packages vs packageName/currentVersion, the default of targetVersion to the 'latest' dist-tag when omitted, mapping fixedVersion from prioritize_remediation findings directly, and the batch cost note (one deduped call vs N single calls). This elevates it above baseline, though the schema already documents each field's format precisely.

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?

The opening sentence states a specific verb and resource with a concrete outcome: 'tells you whether that specific upgrade is a safe patch/minor bump or a likely-breaking major bump, before you actually run npm install.' It differentiates itself from siblings immediately by scoping to pre-install upgrade simulation and explicitly names prioritize_remediation as its natural predecessor, so an agent can distinguish it without opening schemas.

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?

The description names the exact workflow context ('Natural follow-up to prioritize_remediation: pass its packageName/currentVersion/fixedVersion straight in') and states explicit exclusions: 'This does NOT read the package's changelog/release notes... not a substitute for reading the release notes on a flagged major bump.' It also gives precise when-to-use guidance for batch vs single-item invocation, including the 'not both' rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

suggest_alternativeSuggest better-maintained npm alternativesA
Read-only
Inspect

Given a package that looks deprecated, vulnerable, abandoned, or suspicious, suggest better-maintained alternatives in the same category. This tool first checks the source package's own latest-version health (deprecation, latest-version OSV verdict, popularity/maintenance tiers, typosquat flag), then combines maintainer-provided deprecation hints with deterministic npm search-based category matching. It ranks candidates using category overlap plus search_packages-style popularity/maintenance signals, filters out typosquats and weak/stale contenders, and returns a short list with plain-language whySuggested notes. Best for turning a 'don't use this package' warning into an actionable replacement shortlist.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesExact npm package name, e.g. "request" or "node-sass"
limitNoMax suggestions to return (default 5, max 10)
reasonNoOptional reason to bias filtering/ranking

Output Schema

ParametersJSON Schema
NameRequiredDescription
reasonYes
sourceYes
confidenceYes
suggestionsYes
categoryTokensYes
searchedQueriesYes
nonPackageAlternativesYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool read-only and open-world; the description adds real behavior beyond that: it checks the source package's health, combines maintainer deprecation hints with npm search category matching, filters out typosquats and stale contenders, and returns whySuggested reasons. No contradiction with annotations.

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?

The description packs the purpose, workflow, filtering logic, output format, and when-to-use into one focused paragraph. The main purpose is front-loaded and every sentence carries operational detail for an agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-parameter tool with an output schema and read-only/open-world annotations, the description covers the decision path, ranking/filtering behavior, and expected output shape. An agent can correctly select and invoke it without needing further documentation.

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?

Schema coverage is 100%, so the baseline is 3; the description adds meaningful context by explaining how the source package health check and category-overlap ranking use the name, and how the reason parameter biases filtering and ranking. This pushes it above baseline without being redundant.

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?

The description opens with a specific verb–resource pairing ('suggest better-maintained alternatives in the same category') and explains the multi-step health-check-and-search process, which clearly distinguishes it from sibling tools like search_packages or get_package. It even frames the use case as turning a 'don't use this package' warning into a shortlist.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit trigger ('Given a package that looks deprecated, vulnerable, abandoned, or suspicious') and a 'Best for' sentence, so an agent knows when to invoke it. It does not explicitly name sibling tools or state when not to use them, which keeps it just below the strongest possible guidance.

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. Dates show when Glama detected each change.

  1. 1 tool update
    • Changedcheck_maintainer_changes3 fields changed
      • addedOutput schema / properties / repository / properties / ownerAvatarUrl
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / repository / properties / ownerLogin
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / repository / required
        Previous value: -[
        -  "checked",
        -  "declaredRepository",
        -  "currentFullName",
        -  "transferred",
        -  "archived",
        -  "reachable",
        -  "note"
        -]New value: +[
        +  "checked",
        +  "declaredRepository",
        +  "currentFullName",
        +  "transferred",
        +  "archived",
        +  "reachable",
        +  "ownerLogin",
        +  "ownerAvatarUrl",
        +  "note"
        +]
  2. 2 tool updates
    • Changedcheck_maintainer_blast_radius2 fields changed
      • addedOutput schema / properties / avatarUrl
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "maintainerUsername",
        -  "npmProfileUrl",
        -  "totalPackagesFound",
        -  "packagesReturned",
        -  "resultsTruncated",
        -  "clusterWindowHours",
        -  "packages",
        -  "clusters",
        -  "findings",
        -  "totalScore",
        -  "riskTier",
        -  "note"
        -]New value: +[
        +  "maintainerUsername",
        +  "npmProfileUrl",
        +  "avatarUrl",
        +  "totalPackagesFound",
        +  "packagesReturned",
        +  "resultsTruncated",
        +  "clusterWindowHours",
        +  "packages",
        +  "clusters",
        +  "findings",
        +  "totalScore",
        +  "riskTier",
        +  "note"
        +]
    • Changedget_maintainer_profile2 fields changed
      • addedOutput schema / properties / avatarUrl
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "maintainerUsername",
        -  "npmProfileUrl",
        -  "totalPackagesFound",
        -  "packagesReturned",
        -  "resultsTruncated",
        -  "currentlyMaintainsCount",
        -  "totalWeeklyDownloads",
        -  "totalDependents",
        -  "packages",
        -  "note"
        -]New value: +[
        +  "maintainerUsername",
        +  "npmProfileUrl",
        +  "avatarUrl",
        +  "totalPackagesFound",
        +  "packagesReturned",
        +  "resultsTruncated",
        +  "currentlyMaintainsCount",
        +  "totalWeeklyDownloads",
        +  "totalDependents",
        +  "packages",
        +  "note"
        +]
  3. 1 tool update
    • Addedget_maintainer_profile
  4. 1 tool update
    • Changedsimulate_dependency_upgrade8 fields changed
      • changedInput schema / properties / currentVersion / description
        Previous value: -"Currently installed version — an exact version (e.g. \"4.17.20\"), a semver range (e.g. \"^4.17.0\"), or a dist-tag"New value: +"Currently installed version — an exact version (e.g. \"4.17.20\"), a semver range (e.g. \"^4.17.0\"), or a dist-tag. Required when `packageName` is used."
      • changedInput schema / properties / packageName / description
        Previous value: -"Exact npm package name, e.g. \"lodash\" or \"@scope/name\""New value: +"Exact npm package name, e.g. \"lodash\" or \"@scope/name\". Use this (with currentVersion) OR `packages`, not both."
      • addedInput schema / properties / packages
        Added value: +{
        +  "description": "Batch of upgrades to simulate (1-100 items), each mirroring the single-item packageName/currentVersion/targetVersion fields. Use this OR packageName/currentVersion, not both. Natural pairing with prioritize_remediation: pass its ranked findings straight in as one call instead of one simulate_dependency_upgrade call per finding.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "currentVersion": {
        +        "description": "Currently installed version — an exact version, a semver range, or a dist-tag",
        +        "maxLength": 128,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "packageName": {
        +        "description": "Exact npm package name, e.g. \"lodash\" or \"@scope/name\"",
        +        "maxLength": 214,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "targetVersion": {
        +        "description": "Version to simulate upgrading to — exact version, range, or dist-tag. Omit to use the registry's \"latest\" dist-tag.",
        +        "maxLength": 128,
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "packageName",
        +      "currentVersion"
        +    ],
        +    "type": "object"
        +  },
        +  "maxItems": 100,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • changedInput schema / properties / targetVersion / description
        Previous value: -"Version to simulate upgrading to — exact version, range, or dist-tag (e.g. the fixedVersion a prioritize_remediation finding named). Omit to use the registry's \"latest\" dist-tag."New value: +"Version to simulate upgrading to — exact version, range, or dist-tag (e.g. the fixedVersion a prioritize_remediation finding named). Omit to use the registry's \"latest\" dist-tag. Only applies to the single-item `packageName` form."
      • removedInput schema / required
        Removed value: -[
        -  "packageName",
        -  "currentVersion"
        -]
      • addedOutput schema / properties / batchSummary
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "fetchFailedCount": {
        +      "type": "number"
        +    },
        +    "riskTierCounts": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "breakingChangeLikely": {
        +          "type": "number"
        +        },
        +        "lowRisk": {
        +          "type": "number"
        +        },
        +        "reviewRecommended": {
        +          "type": "number"
        +        },
        +        "safe": {
        +          "type": "number"
        +        },
        +        "unknown": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "safe",
        +        "lowRisk",
        +        "reviewRecommended",
        +        "breakingChangeLikely",
        +        "unknown"
        +      ],
        +      "type": "object"
        +    },
        +    "totalRequested": {
        +      "type": "number"
        +    },
        +    "vulnQueryFailedCount": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "totalRequested",
        +    "fetchFailedCount",
        +    "riskTierCounts",
        +    "vulnQueryFailedCount"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / results
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "currentIsVulnerable": {
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "currentVersionNote": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "direction": {
        +        "enum": [
        +          "upgrade",
        +          "downgrade",
        +          "same",
        +          "unresolved"
        +        ],
        +        "type": "string"
        +      },
        +      "engineChange": {
        +        "anyOf": [
        +          {
        +            "additionalProperties": false,
        +            "properties": {
        +              "after": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              },
        +              "before": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              },
        +              "tightened": {
        +                "type": "boolean"
        +              }
        +            },
        +            "required": [
        +              "before",
        +              "after",
        +              "tightened"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "fetchError": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "installScriptIntroduced": {
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "isBreakingBySemver": {
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "majorVersionsSkipped": {
        +        "type": [
        +          "number",
        +          "null"
        +        ]
        +      },
        +      "npmscanUrl": {
        +        "type": "string"
        +      },
        +      "packageName": {
        +        "type": "string"
        +      },
        +      "reasons": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "requestedCurrentVersion": {
        +        "type": "string"
        +      },
        +      "requestedTargetVersion": {
        +        "type": "string"
        +      },
        +      "resolvedCurrentVersion": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "resolvedTargetVersion": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "riskTier": {
        +        "enum": [
        +          "safe",
        +          "low-risk",
        +          "review-recommended",
        +          "breaking-change-likely",
        +          "unknown"
        +        ],
        +        "type": "string"
        +      },
        +      "semverBump": {
        +        "anyOf": [
        +          {
        +            "enum": [
        +              "major",
        +              "premajor",
        +              "minor",
        +              "preminor",
        +              "patch",
        +              "prepatch",
        +              "prerelease"
        +            ],
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "targetDeprecated": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "targetIsPrerelease": {
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "targetIsVulnerable": {
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "targetVersionNote": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "targetVulnerabilities": {
        +        "items": {
        +          "$ref": "#/properties/targetVulnerabilities/items"
        +        },
        +        "type": "array"
        +      },
        +      "verdict": {
        +        "type": "string"
        +      },
        +      "vulnerabilityDelta": {
        +        "anyOf": [
        +          {
        +            "enum": [
        +              "introduced",
        +              "fixed",
        +              "still-vulnerable",
        +              "still-clean",
        +              "unknown"
        +            ],
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "zeroMajorNote": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "packageName",
        +      "npmscanUrl",
        +      "requestedCurrentVersion",
        +      "requestedTargetVersion",
        +      "resolvedCurrentVersion",
        +      "resolvedTargetVersion",
        +      "currentVersionNote",
        +      "targetVersionNote",
        +      "direction",
        +      "semverBump",
        +      "isBreakingBySemver",
        +      "majorVersionsSkipped",
        +      "zeroMajorNote",
        +      "targetIsPrerelease",
        +      "targetDeprecated",
        +      "installScriptIntroduced",
        +      "engineChange",
        +      "currentIsVulnerable",
        +      "targetIsVulnerable",
        +      "vulnerabilityDelta",
        +      "targetVulnerabilities",
        +      "riskTier",
        +      "reasons",
        +      "verdict",
        +      "fetchError"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "packageName",
        -  "npmscanUrl",
        -  "requestedCurrentVersion",
        -  "requestedTargetVersion",
        -  "resolvedCurrentVersion",
        -  "resolvedTargetVersion",
        -  "currentVersionNote",
        -  "targetVersionNote",
        -  "direction",
        -  "semverBump",
        -  "isBreakingBySemver",
        -  "majorVersionsSkipped",
        -  "zeroMajorNote",
        -  "targetIsPrerelease",
        -  "targetDeprecated",
        -  "installScriptIntroduced",
        -  "engineChange",
        -  "currentIsVulnerable",
        -  "targetIsVulnerable",
        -  "vulnerabilityDelta",
        -  "targetVulnerabilities",
        -  "riskTier",
        -  "reasons",
        -  "verdict"
        -]
  5. 1 tool update
    • Changedaudit_github_repository12 fields changed
      • addedOutput schema / properties / findings / items / properties / maintainerFindings
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "$ref": "#/properties/findings/items/properties/installScriptFindings/anyOf/0/items"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / findings / items / properties / maintainerRiskTier
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/properties/findings/items/properties/installScriptRiskTier/anyOf/0"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / findings / items / properties / ownershipRiskChecked
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / findings / items / properties / ownershipRiskEligible
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / findings / items / properties / ownershipRiskReason
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "critical-or-high-severity-vulnerability",
        +        "possible-typosquat",
        +        "deprecated"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / findings / items / properties / provenanceFindings
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "$ref": "#/properties/findings/items/properties/installScriptFindings/anyOf/0/items"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / findings / items / properties / provenanceRiskTier
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/properties/findings/items/properties/installScriptRiskTier/anyOf/0"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • changedOutput schema / properties / findings / items / required
        Previous value: -[
        -  "name",
        -  "requestedVersion",
        -  "resolvedVersion",
        -  "npmscanUrl",
        -  "deprecated",
        -  "possibleTyposquatOf",
        -  "isVulnerable",
        -  "highestSeverity",
        -  "vulnerabilities",
        -  "rawLicense",
        -  "licenseCategory",
        -  "isLicenseCompliant",
        -  "licenseNeedsReview",
        -  "licenseViolation",
        -  "hasLifecycleScripts",
        -  "installScriptRiskTier",
        -  "installScriptScore",
        -  "installScriptScanScope",
        -  "installScriptFindings",
        -  "resolutionError"
        -]New value: +[
        +  "name",
        +  "requestedVersion",
        +  "resolvedVersion",
        +  "npmscanUrl",
        +  "deprecated",
        +  "possibleTyposquatOf",
        +  "isVulnerable",
        +  "highestSeverity",
        +  "vulnerabilities",
        +  "rawLicense",
        +  "licenseCategory",
        +  "isLicenseCompliant",
        +  "licenseNeedsReview",
        +  "licenseViolation",
        +  "hasLifecycleScripts",
        +  "installScriptRiskTier",
        +  "installScriptScore",
        +  "installScriptScanScope",
        +  "installScriptFindings",
        +  "resolutionError",
        +  "ownershipRiskEligible",
        +  "ownershipRiskReason",
        +  "ownershipRiskChecked",
        +  "maintainerRiskTier",
        +  "maintainerFindings",
        +  "provenanceRiskTier",
        +  "provenanceFindings"
        +]
      • addedOutput schema / properties / ownershipCheckNote
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / ownershipCheckedCount
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / ownershipRiskFlaggedCount
        Added value: +{
        +  "type": "number"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "summary",
        -  "owner",
        -  "repoName",
        -  "ref",
        -  "defaultBranchUsed",
        -  "manifestPath",
        -  "lockfilePath",
        -  "inputFormat",
        -  "isMonorepo",
        -  "workspacePatterns",
        -  "workspacePackageCount",
        -  "workspaceNote",
        -  "policy",
        -  "findings",
        -  "overflowPackages",
        -  "totalPackages",
        -  "vulnerablePackageCount",
        -  "licenseViolationCount",
        -  "installScriptFlaggedCount",
        -  "deepScannedCount",
        -  "warnings",
        -  "truncationNote",
        -  "deepScanNote"
        -]New value: +[
        +  "summary",
        +  "owner",
        +  "repoName",
        +  "ref",
        +  "defaultBranchUsed",
        +  "manifestPath",
        +  "lockfilePath",
        +  "inputFormat",
        +  "isMonorepo",
        +  "workspacePatterns",
        +  "workspacePackageCount",
        +  "workspaceNote",
        +  "policy",
        +  "findings",
        +  "overflowPackages",
        +  "totalPackages",
        +  "vulnerablePackageCount",
        +  "licenseViolationCount",
        +  "installScriptFlaggedCount",
        +  "deepScannedCount",
        +  "ownershipCheckedCount",
        +  "ownershipRiskFlaggedCount",
        +  "warnings",
        +  "truncationNote",
        +  "deepScanNote",
        +  "ownershipCheckNote"
        +]
  6. 1 tool update
    • Addedenrich_npm_audit
  7. 1 tool update
    • Addedgenerate_sbom
  8. 2 tool updates
    • Changedaudit_github_repository5 fields changed
      • addedOutput schema / properties / isMonorepo
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / workspaceNote
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / workspacePackageCount
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / workspacePatterns
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "summary",
        -  "owner",
        -  "repoName",
        -  "ref",
        -  "defaultBranchUsed",
        -  "manifestPath",
        -  "lockfilePath",
        -  "inputFormat",
        -  "policy",
        -  "findings",
        -  "overflowPackages",
        -  "totalPackages",
        -  "vulnerablePackageCount",
        -  "licenseViolationCount",
        -  "installScriptFlaggedCount",
        -  "deepScannedCount",
        -  "warnings",
        -  "truncationNote",
        -  "deepScanNote"
        -]New value: +[
        +  "summary",
        +  "owner",
        +  "repoName",
        +  "ref",
        +  "defaultBranchUsed",
        +  "manifestPath",
        +  "lockfilePath",
        +  "inputFormat",
        +  "isMonorepo",
        +  "workspacePatterns",
        +  "workspacePackageCount",
        +  "workspaceNote",
        +  "policy",
        +  "findings",
        +  "overflowPackages",
        +  "totalPackages",
        +  "vulnerablePackageCount",
        +  "licenseViolationCount",
        +  "installScriptFlaggedCount",
        +  "deepScannedCount",
        +  "warnings",
        +  "truncationNote",
        +  "deepScanNote"
        +]
    • Changedcompare_packages5 fields changed
      • addedOutput schema / properties / candidates / items / properties / installSize
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": false,
        +      "properties": {
        +        "transitive": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "sizeUnknownCount": {
        +              "type": "number"
        +            },
        +            "transitiveDependencyCount": {
        +              "type": "number"
        +            },
        +            "transitiveUnpackedSize": {
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            },
        +            "truncated": {
        +              "type": "boolean"
        +            }
        +          },
        +          "required": [
        +            "transitiveUnpackedSize",
        +            "transitiveDependencyCount",
        +            "sizeUnknownCount",
        +            "truncated"
        +          ],
        +          "type": "object"
        +        },
        +        "unpackedSize": {
        +          "type": [
        +            "number",
        +            "null"
        +          ]
        +        }
        +      },
        +      "required": [
        +        "unpackedSize",
        +        "transitive"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • changedOutput schema / properties / candidates / items / required
        Previous value: -[
        -  "name",
        -  "found",
        -  "resolutionError",
        -  "npmscanUrl",
        -  "description",
        -  "license",
        -  "latestVersion",
        -  "deprecated",
        -  "weeklyDownloads",
        -  "downloadTrend",
        -  "githubStars",
        -  "hasBuiltInTypes",
        -  "daysSinceLastPublish",
        -  "popularityTier",
        -  "maintenanceTier",
        -  "maintenanceSummary",
        -  "possibleTyposquatOf",
        -  "isLatestVersionVulnerable",
        -  "highestSeverity",
        -  "vulnerabilityCount",
        -  "installScriptRisk",
        -  "score"
        -]New value: +[
        +  "name",
        +  "found",
        +  "resolutionError",
        +  "npmscanUrl",
        +  "description",
        +  "license",
        +  "latestVersion",
        +  "deprecated",
        +  "weeklyDownloads",
        +  "downloadTrend",
        +  "githubStars",
        +  "hasBuiltInTypes",
        +  "daysSinceLastPublish",
        +  "popularityTier",
        +  "maintenanceTier",
        +  "maintenanceSummary",
        +  "possibleTyposquatOf",
        +  "isLatestVersionVulnerable",
        +  "highestSeverity",
        +  "vulnerabilityCount",
        +  "installScriptRisk",
        +  "installSize",
        +  "score"
        +]
      • addedOutput schema / properties / differentiators / properties / largestInstallSize
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / differentiators / properties / smallestInstallSize
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / differentiators / required
        Previous value: -[
        -  "mostDownloads",
        -  "mostGithubStars",
        -  "hasTypeScriptSupport",
        -  "hasKnownVulnerabilities",
        -  "deprecated",
        -  "possibleTyposquat",
        -  "installScriptRiskFlagged"
        -]New value: +[
        +  "mostDownloads",
        +  "mostGithubStars",
        +  "hasTypeScriptSupport",
        +  "hasKnownVulnerabilities",
        +  "deprecated",
        +  "possibleTyposquat",
        +  "installScriptRiskFlagged",
        +  "smallestInstallSize",
        +  "largestInstallSize"
        +]
  9. 1 tool update
    • Addedsimulate_dependency_upgrade
  10. 1 tool update
    • Addedget_remediation_playbook
  11. 2 tool updates
    • Addedaudit_github_repository
    • Addedcheck_maintainer_blast_radius
  12. 1 tool update
    • Addedcompare_packages
  13. 3 tool updates
    • Changedbatch_query_vulnerabilities3 fields changed
      • changedInput schema / properties / content / description
        Previous value: -"Optional raw dependency inventory content: package.json, package-lock.json, yarn.lock, pnpm-lock.yaml, CycloneDX JSON, or SPDX JSON."New value: +"Raw dependency inventory content: package.json, package-lock.json, yarn.lock, pnpm-lock.yaml, CycloneDX JSON, or SPDX JSON. Use this OR `packages`, not both."
      • changedInput schema / properties / includeDevDependencies / description
        Previous value: -"Only applies when `content` is a package manifest/lockfile format that can distinguish dev dependencies. Default false."New value: +"Ignored when using `packages`; only applies when `content` is a manifest/lockfile format that distinguishes dev dependencies."
      • changedInput schema / properties / packages / description
        Previous value: -"Optional explicit package list (1-1000 items). Use this OR `content`, not both."New value: +"Explicit package list (1-1000 items). Use this OR `content`, not both."
    • Changedget_cve4 fields changed
      • changedInput schema / properties / cveId / description
        Previous value: -"Exact CVE ID for a single lookup, e.g. \"CVE-2026-2950\". When given, all search filters below are ignored."New value: +"Exact CVE ID for a single lookup, e.g. \"CVE-2026-2950\". When given, search filters below are ignored and should be omitted."
      • addedInput schema / properties / publishedUntil / $ref
        Added value: +"#/properties/publishedSince"
      • removedInput schema / properties / publishedUntil / pattern
        Removed value: -"^\\d{4}-\\d{2}-\\d{2}$"
      • removedInput schema / properties / publishedUntil / type
        Removed value: -"string"
    • Changedsearch_packages2 fields changed
      • addedInput schema / properties / query / maxLength
        Added value: +64
      • changedInput schema / properties / query / minLength
        Previous value: -1New value: +2
  14. 4 tool updates
    • Changedbatch_query_vulnerabilities10 fields changed
      • addedInput schema / properties / content
        Added value: +{
        +  "description": "Optional raw dependency inventory content: package.json, package-lock.json, yarn.lock, pnpm-lock.yaml, CycloneDX JSON, or SPDX JSON.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / includeDevDependencies
        Added value: +{
        +  "description": "Only applies when `content` is a package manifest/lockfile format that can distinguish dev dependencies. Default false.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / packages / description
        Previous value: -"1-100 packages to check"New value: +"Optional explicit package list (1-1000 items). Use this OR `content`, not both."
      • changedInput schema / properties / packages / maxItems
        Previous value: -100New value: +1000
      • removedInput schema / required
        Removed value: -[
        -  "packages"
        -]
      • addedOutput schema / properties / ignoredCount
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / inputFormat
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / parsedPackageCount
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / queryFailureCount
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Addeddiff_dependencies
    • Addedprioritize_remediation
    • Addedsuggest_alternative
  15. 1 tool update
    • Addedcheck_license_compliance
  16. 1 tool update
    • Addedcheck_maintainer_changes
  17. 1 tool update
    • Addedcheck_package_provenance
  18. 1 tool update
    • Addedanalyze_transitive_dependencies

Frequently Asked Questions

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    C
    maintenance
    Enables security scanning for npm dependencies by checking manifest and lockfiles against the OSV.dev and Socket.dev vulnerability databases. It provides tools to detect vulnerabilities in specific packages and retrieve detailed technical reports for identified security issues.
    3
    22
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Audits npm packages for supply-chain attacks (typosquatting, malicious install scripts, credential exfiltration) before installation, returning a SAFE/SUSPICIOUS/DANGEROUS verdict.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4.4/5.0
Disambiguation4/5

Most tools have clearly distinct scopes, such as flat vs. transitive vulnerability checks and per-package vs. GitHub-repo audits. The main ambiguity is that several tools all ultimately report OSV/NVD findings or perform install-script risk checks, though the descriptions do draw clear boundaries and include cross-references to steer selection.

Naming Consistency5/5

Every tool follows a consistent lowercase snake_case verb_noun pattern, e.g. analyze_install_script, check_maintainer_changes, prioritize_remediation. The naming is predictable and makes the action and target of each tool immediately clear.

Tool Count3/5

At 22 tools, the surface is at the heavy end of the rubric and pushes beyond the typical 3-15 well-scoped range. The tools are individually purposeful and broad in coverage, but the count is high enough that an agent faces a large decision space and several workflows that overlap or compose in complex ways.

Completeness5/5

The set covers the full npm supply-chain assessment lifecycle: discovery, metadata lookup, vulnerability scanning, transitive dependency analysis, license checks, install-script analysis, maintainer and provenance checks, SBOM generation, dependency diffs, upgrade simulation, remediation prioritization, and alternative suggestion. There are no obvious dead ends or major missing operations for the stated domain.

Resources