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 by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 45 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A4.6/5.0

Scored across 23 tools

Disambiguation4/5

The descriptions are unusually careful about drawing boundaries (batch vs single vs latest-version OSV checks, info-lookup vs blast-radius vs maintainer-change tools), which resolves most potential confusion. There is still genuine overlap among the vulnerability-checking family (query_vulnerabilities, batch_query_vulnerabilities, get_package, get_package_version, analyze_transitive_dependencies, prioritize_remediation) where an agent must read closely to pick correctly.

Naming Consistency5/5

Every tool is snake_case with a predictable verb_noun shape (analyze_*, check_*, get_*, batch_query_*, generate_sbom, diff_dependencies). No mixing of camelCase or divergent conventions; the pattern is immediately readable.

Tool Count4/5

23 tools is on the heavy side and near the '16-25 feels heavy' threshold, but the domain genuinely spans vulnerabilities, licenses, install scripts, maintainer/provenance risk, SBOM, diffing, remediation, and upgrade simulation, so most tools earn a distinct place rather than duplicating.

Completeness5/5

Coverage is deep and lifecycle-complete for an npm supply-chain security suite: discovery (search), inspection (get_package/version), vulnerability checking, license compliance, install-script and provenance analysis, maintainer risk, remediation prioritization with playbooks, SBOM generation, dependency diffing, and upgrade simulation.

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.6/5.0
Behavior5/5

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

Beyond the readOnly/openWorld annotations, the description reveals essential behavioral traits: it fetches directly from the published tarball, performs a heuristic static scan, does not execute code, cannot detect behavior gated on runtime conditions, and returns a weighted score and risk tier. This is substantial added 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 every element earns its place: scope, what it checks, return value, limitations, and usage guidance. The dense red-flag enumeration could be summarized more tightly, but it is informative rather than fluff. Overall, it is well structured and front-loaded with the core action.

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 what the tool does, how it operates, its limitations, its output, and how it relates to siblings. Given that an output schema exists, the description is more than complete for an agent to decide when and how to invoke it.

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% for both parameters (name and version), and the schema already explains their meaning and defaults. The description adds no additional parameter-level details, so the baseline 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?

The description opens with a specific action and resource: 'Statically scans a package's preinstall/install/postinstall/prepare lifecycle scripts AND the file(s) they reference'. It also clearly differentiates itself from sibling tools by stating it does NOT check the raw script listing and explicitly points to get_package/get_package_version for that purpose.

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 direct when-to-use guidance: '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.' It also states what the tool cannot do, such as not executing code and not seeing runtime-gated behavior, which helps agents decide if this is the right tool.

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. An npm alias (e.g. "totally-safe": "npm:minimist@0.0.8") is followed to its real target — actualName names the real package that vulnerability data attaches to (name stays the declared/alias key) — this is NOT silently skipped, since doing so would mean a vulnerable package hides behind whatever name a project calls it. A node with resolutionError set (unsatisfiable range, 404, or a git/file/workspace/URL specifier — those still aren't followed, only npm: aliases are) has isVulnerable: null, not false — it was never actually scanned, so "not vulnerable" would be a fabricated clean bill of health; only trust isVulnerable: true/false once a real version was resolved and checked. 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; 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 readOnly/openWorld/non-destructive behavior, so the description had a lower bar but exceeded it substantially. It discloses npm alias following to actualName, resolutionError producing isVulnerable: null rather than false, independent semver max-satisfying resolution per branch, and truncation via truncated/truncationNote. This gives the agent a faithful model of edge-case behavior.

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 front-loads the core purpose and then systematically covers return fields, edge cases, limits, and alternatives. Every section earns its place given the tool's complexity, and there is no filler or redundant restatement of exact schema text.

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 restate return structures, yet it still names key output fields like summary, vulnerablePaths, nodes, and truncated/truncationNote with enough interpretation to use them correctly. It also covers npm aliases, resolution errors, traversal limits, and when to use a sibling tool, making the description highly complete.

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 input schema already covers both parameters with 100% description coverage, including maxDepth default and packages format. The description adds valuable real-world grounding by referencing package.json dependencies, depth defaults and caps, version range semantics, and alias resolution behavior, going modestly 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 states a specific verb-resource pair: recursively resolves dependency graphs and batch-checks resolved packages against OSV.dev. It also distinguishes itself from a flat-list alternative by explicitly mentioning transitive vulnerabilities and naming batch_query_vulnerabilities as the sibling it is not.

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: prefer batch_query_vulnerabilities when you already have a flat list of exact packages, and use this tool when you need graph traversal across transitive dependencies. It also states scope boundaries such as only following the dependencies field and not emulating npm hoisting, which further clarifies when results are appropriate.

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. peerDependencies (root and, for a monorepo, each workspace member's own manifest) are excluded from the audit by default, same as batch_query_vulnerabilities — pass includePeerDependencies: true to also check them; see warnings for which peers were excluded.

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.
includePeerDependenciesNoInclude package.json peerDependencies (root and, for a monorepo, each workspace member) in the audit. Default false — a peer is often intentionally left unresolved by the consumer. See warnings for which peers were excluded.

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.7/5.0
Behavior5/5

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

Annotations only say readOnly, openWorld, and non-destructive; the description adds extensive behavioral detail: lockfile priority order, default-branch fetching, automatic monorepo detection and merge caps, the 100/10/5 package limits, deep vs light scan distinction, peer-dependency exclusion default, and a detailed cost/fan-out estimate. This goes far beyond the annotations without contradicting them.

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 very long, but it is a complex aggregate tool and the length is mostly dense, non-redundant detail. The lead sentence carries the core purpose, and later sections organize around monorepo handling, scan tiers, cost, and peer deps. It could be broken into cleaner paragraphs, but every sentence adds 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, return values need no description. The description covers input semantics, behavior, limits, defaults, excluded groups, and cost implications, leaving no obvious decision an agent needs to make before invoking it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema already covers all parameters, the description adds critical semantics not in the field docs: the default ref behavior, default policy meaning, lockfile-selection consequences for includeDevDependencies, yarn.lock's inability to distinguish dev deps, and the meaning of peer-dependency exclusion. This is exactly the context an agent needs to set parameters 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-resource pairing (audits a GitHub repository's npm dependencies via URL) and immediately enumerates the exact pipelines it aggregates, naming the sibling tools it subsumes. This makes it unmistakable from analyze_install_script, batch_query_vulnerabilities, etc.

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 explicitly frames the tool as a single-call aggregator of the individual sibling pipelines ('no copy-pasting file contents required') and warns it is the most expensive tool, advising against looping across many repos. It does not spell out the inverse direction ('use the individual tool when you need only one check'), but the contrast is strong enough.

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. For an explicit packages list or raw package.json content — names that were never actually resolved against a registry, unlike a real lockfile/SBOM — package names are also cross-checked against the npm registry (capped at 200 unique names): a name that doesn't exist there would otherwise show a silent, indistinguishable vulnerabilityCount: 0 — see unresolvedPackages/existenceCheckNote and do not read those entries as a clean bill of health. A packages[].version that doesn't currently appear on the registry (a typo'd/fabricated version, OR a real version that was published and later removed, e.g. unpublished for containing malware) is cross-checked the same way — see nonexistentVersions; don't assume it never existed, and don't assume vulnerabilityCount:0 for it means clean, since OSV can still carry findings for a version the registry no longer lists. A packages[] entry given with NO version at all (e.g. {name:"react"}) is intentionally queried unversioned against OSV — this returns advisories affecting ANY historical published version of that package, not just the latest or whatever a project actually has installed; see the corresponding warnings entry naming which packages this applied to, and don't report "package X is vulnerable" from an unversioned result without separately confirming against the specific version in use (get_package/get_package_version). Each result also carries signals (deprecated, hasInstallScripts for the specific requested/resolved version, popularityTier/maintenanceTier, and possibleTyposquatOf — same deterministic rule-based labels as get_package/search_packages, capped at the same 200 unique names): a clean vulnerabilityCount:0 does NOT mean safe to use if signals flags a likely typosquat, an abandoned/stale package, or a deprecation notice — surface those explicitly rather than reporting only the vulnerability count. signals is null for a scanStatus: "not-scanned" entry, deliberately — a git/file/workspace/URL dependency can be declared under a name that collides with a real npm package (e.g. a git dependency literally named "lodash"), and that unrelated public package's popularity/maintenance signals must not be attached to it just because the name happens to resolve on the registry. A lockfile-resolved result also carries source (resolvedUrl/integrity straight from that lockfile entry, plus nonRegistryHost): nonRegistryHost: true means the tarball URL points somewhere other than the expected npm/yarn registry host — e.g. a compromised mirror or a hand-edited lockfile — which a name+version match against OSV cannot detect on its own, since a malicious tarball can share the same name/version as the real package and carry zero OSV findings. source is null when the input format doesn't record this (package.json content, an explicit packages entry, or pnpm-lock, which never records a resolvedUrl). nonRegistryHost: false alone is NOT proof the tarball is correct — source.identityMismatch: true catches a SAME-HOST swap that host-checking cannot: a lockfile entry can declare e.g. "lodash@4.18.1" while resolvedUrl actually points at the real registry.npmjs.org's own tarball for a completely different package/version, and vulnerabilityCount above was still computed for the DECLARED name/version, not whatever that resolved tarball actually is — treat identityMismatch: true as a lockfile-tamper finding, not a cosmetic mismatch, and see source.resolvedName/resolvedVersion for what the tarball actually names. vulnerabilityCount/advisoryCount are raw OSV/GHSA advisory counts and can over-count: OSV sometimes publishes more than one advisory record for the same underlying CVE — use uniqueVulnerabilityCount (deduped by shared CVE alias) when reporting 'how many distinct issues' rather than a raw advisory tally. When content is itself a package.json (not a lockfile/SBOM), projectLifecycleScripts surfaces that SCANNED PROJECT's own preinstall/install/postinstall/prepare scripts, if any — these run arbitrary code the moment someone runs npm install on the project itself, separate from anything a dependency does, and 'scan my package.json' should not silently skip the one script that actually executes for the project being scanned. An npm alias (e.g. "totally-safe": "npm:minimist@0.0.8") is followed to its real target in every input format — results[i].package.actualName names the real package that vulnerability/signal data attaches to (.name stays the declared/alias key); this is NOT silently skipped, since doing so would let a vulnerable package hide behind whatever name a project calls it. A dependency whose spec points somewhere other than the registry (git/file/workspace/URL) or that never resolved to a version is excluded from vulnerability querying entirely rather than queried by name alone — vulnerabilityCount: 0 for one of these would otherwise misleadingly attach an unrelated public npm package's entire vulnerability history to it. When content is a package.json, peerDependencies are excluded from scanning by default (a peer is often intentionally left unresolved by the consumer) — see ignoredPeerDependencyNames, and pass includePeerDependencies: true to also check them, since a vulnerable/malicious peerDependency is otherwise invisible to this scan. results[i].package.declaredSpec is set whenever .version was RESOLVED from a package.json semver range/tag (e.g. "^18.2.0" -> "18.2.0") rather than being an already-exact pin or a lockfile-derived version — a range can silently pick up a new, possibly-compromised release the next time this project is installed, while an exact pin can't, so don't treat a range-resolved isVulnerable:false as equally durable to a pinned one just because they look identical today.

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.
includePeerDependenciesNoIgnored when using `packages`; only applies when `content` is a package.json. peerDependencies are excluded from scanning by default (see ignoredPeerDependencyNames) since a peer is often intentionally left unresolved by the consumer — set this to also check them.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
warningsNo
inputFormatNo
ignoredCountNo
enrichmentNoteNo
queryFailureCountNo
existenceCheckNoteNo
parsedPackageCountNo
unresolvedPackagesNo
nonexistentVersionsNo
totalVulnerabilitiesYes
projectLifecycleScriptsNo
ignoredPeerDependencyNamesNo
projectLifecycleScriptRiskNo
totalUniqueVulnerabilitiesYes
packagesWithVulnerabilitiesYes

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 safety profile is covered. The description goes far beyond annotations: it discloses chunked querying behind the scenes, npm registry cross-checking with caps, silent-zero pitfalls, unversioned query semantics, signals null behavior, source/identityMismatch tamper detection, alias following, peerDependency exclusion, and advisory over-counting. This is exceptionally rich behavioral disclosure.

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 extremely long and dense, with many clauses packed into single sentences. It is front-loaded with the core purpose, but the sheer volume of caveats and edge cases makes it hard to parse. Every sentence earns its place in terms of content value, but the structure is not concise; it reads as a wall of text rather than a scannable definition.

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 (4 params, 100% schema coverage, output schema present, 20 siblings), the description is remarkably complete. It covers input formats, output fields, edge cases, security implications, and cross-tool routing. Nothing an agent needs to call this correctly is missing; the output schema handles return-value 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 description coverage is 100%, so the schema already documents all four parameters. The description adds substantial meaning beyond the schema: it explains the content formats, the packages/version semantics (unversioned queries, range resolution), the includePeerDependencies default behavior, and the includeDevDependencies scope. It doesn't add much about the boolean parameters beyond what the schema says, but the coverage is already complete.

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 ('Query OSV.dev for known vulnerabilities across a whole npm dependency inventory at once') and immediately distinguishes the batch mode from single-package alternatives. It names the two input modes (packages list or raw content) and the sibling tool query_vulnerabilities is implicitly differentiated by the batch/inventory framing.

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: batch inventory scanning vs single-package queries, and repeatedly tells the agent what NOT to do (don't read vulnerabilityCount:0 as clean for unresolved names, don't report unversioned results as vulnerable, don't treat range-resolved as durable). It also names the sibling get_package/get_package_version for confirmation and query_vulnerabilities for single-package queries.

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_radiusCheck npm maintainer blast radiusA
Read-only
Inspect

Given an npm username, lists the packages npm's maintainer: search index returns for that account and looks for a tight cluster of packages whose latest version was published within a short rolling window of each other — the shape of a compromised-account supply-chain attack, where a stolen credential is used on every package the account can publish to within hours (e.g. the September 2025 chalk/debug compromise, ~18 packages in ~2 hours). A large total package count is not itself a red flag; only a tight publish-time cluster is scored, weighted by its package count and combined weekly downloads/dependentsCount. Clusters mostly within one npm scope (a monorepo release) are dampened, and multiple clusters combine with diminishing returns. isCurrentMaintainer shows whether the account still maintains each package. avatarUrl is a proxied Gravatar image (null if no email is on record). Natural follow-up to check_maintainer_changes: call this with a newly added maintainer's username to see whether the same account touched other packages around the same time. Limitations: npm's search index can lag or omit packages; results are capped at 250 packages ranked by relevance, not recency (see resultsTruncated/totalPackagesFound); lastPublished reflects only each package's latest version. npmscanUrl is the account's npmscan profile; npmProfileUrl is its npmjs.com page.

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
npmscanUrlYes
totalScoreYes
npmProfileUrlYes
packagesReturnedYes
resultsTruncatedYes
clusterWindowHoursYes
maintainerUsernameYes
totalPackagesFoundYes

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already establish it as a safe read (readOnlyHint=true, destructiveHint=false, openWorldHint=true), yet the description adds substantial depth: the scoring model, damping of single-scope/monorepo clusters, diminishing returns for multiple clusters, and hard limitations (index lag, 250-package relevance cap exposed via resultsTruncated/totalPackagesFound, lastPublished only reflecting latest version). This is genuinely beyond what the annotations convey.

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 core purpose is front-loaded and virtually every sentence carries behavioral or interpretive information. It is long and dense, and it spends several sentences explaining output fields (isCurrentMaintainer, avatarUrl, npmscanUrl, npmProfileUrl) that an output schema already covers, which is the main conciseness cost.

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 single-parameter read tool with an output schema present, this covers everything an agent needs: what is scored, what is not a signal, damping rules, index limitations, and the recommended workflow relationship to a sibling. Return values need not be re-explained because the output schema exists.

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 single parameter is fully documented in the schema itself (exact npm username, not email/package/scope). The description adds no format or syntax detail beyond 'given an npm username,' so the baseline 3 applies when the schema does the heavy lifting.

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 — lists the packages npm's maintainer:<username> search index returns and scores them for a tight publish-time cluster signalling a compromised-account supply-chain attack. It names the concrete threat shape and distinguishes itself from related siblings by identifying itself 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 Guidelines4/5

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

Gives an explicit trigger: after check_maintainer_changes, call this with a newly added maintainer's username to see whether the same account touched other packages. It also advises that a large total package count alone is not a red flag, guiding interpretation. It stops short of naming an alternative to use instead when this tool does not apply.

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 a proxied GitHub avatar image, 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?

Annotations declare readOnly/openWorld/non-destructive, and the description still adds substantial behavior: results are derived from packument snapshots with 'no extra API calls', it enumerates four distinct flag categories, explains the GitHub repo cross-check, and documents null semantics for ownerLogin/ownerAvatarUrl when GitHub wasn't reached. This is far beyond what annotations convey.

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?

It is long, but dense with distinct information: mechanism, four flag types, repo cross-check, usage routing, and follow-up. Front-loaded with the core action. The single run-on paragraph makes it harder to scan than it needs to be, and a phrase or two could be trimmed.

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 analysis tool with an output schema already present, the description covers the mechanism, every flag class, the secondary GitHub check, and how it relates to the two neighboring tools. Nothing an agent needs to decide or call 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?

Only one parameter, and schema coverage is 100% with a clear example ('lodash' or '@scope/name'). The description adds no further naming or format guidance beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb and resource ('reconstructs a package's maintainer-change history straight from the npm packument') and immediately distinguishes itself from siblings by scoping to maintainer/ownership change rather than general health or publish integrity. An agent can tell exactly which question this tool answers.

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 routes: use get_package/check_package_provenance for general health first, use this for 'who controls this package, and did that change recently', and follow up with check_maintainer_blast_radius for the cross-package blast-radius question. It even states the limitation ('the question this tool can't answer on its own'), which is unusually strong guidance.

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?

Beyond readOnlyHint/destructiveHint, the description discloses the heuristic nature, the three check strategies, the exact limitation that Sigstore is not cryptographically re-verified, and the anomaly logic. There is no contradiction with 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 front-loaded and every sentence contributes, but it is a dense, long paragraph that could be tightened or bulleted for quicker scanning. No filler, yet it is heavier than the minimum viable definition.

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 annotated read-only behavior, an output schema, and fully described parameters, the description still adds the missing edge cases: no-provenance versions, best-effort tag matching, and what counts as an anomaly. Nothing needed for correct invocation is absent.

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 the exact package name and the optional version with 'omit to use the latest published version'. The description adds context about source-repo fetching and tarball diffs but no additional parameter-level syntax or format details.

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 enumerates three distinct checks, making the tool's job unmistakable. It also differentiates it from get_package/get_package_version by positioning those as basic-info prerequisites and this tool as the publish-integrity-risk assessment.

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 instructs the agent to use get_package/get_package_version first and says to use this tool specifically for publish-integrity risk. It also states when a result should not be interpreted as malice ('bare absence is never scored on its own'), giving clear when-to-use and when-not-to-conclude 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. If a candidate's OSV.dev vulnerability check itself failed (network/timeout/upstream outage), isLatestVersionVulnerable comes back false only because the field has to be a boolean — vulnerabilityCheckFailed:true is the real signal there, and means that candidate's safe/not-safe answer is unknown, not confirmed clean. 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.8/5.0
Behavior5/5

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

Even though annotations already declare readOnlyHint=true and destructiveHint=false, the description adds substantial behavioral detail: parallel fetching, deterministic pick that never selects deprecated or typosquat-flagged candidates, the vulnerabilityCheckFailed fallback semantics, truncation behavior for transitive install size (with truncated/sizeUnknownCount flags), and the 'found:false plus resolutionError' handling for unresolved names. These extend far beyond the annotation surface and align with the openWorldHint.

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 with the core purpose and selection context, and every sentence carries information — no filler. However, it is a single dense paragraph with many nested clauses and technical caveats, which could hamper quick skimming. Breaking it into bullets would improve scannability without losing content. The density is justified by the tool's complexity, but the structure is not optimal.

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 the tool's core behavior, output highlights (downloads, tiers, install size, differentiators, recommendation), error handling (vulnerability check failures, unresolved names), and boundary conditions (duplicate rejection, truncation). Given the presence of an output schema and only one well-described parameter, an agent has everything needed to invoke it correctly. It is complete for a tool of this complexity.

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 beyond the schema by explaining that the packages should be candidates for the same job, that duplicate names are rejected, and how unresolved names are represented (found:false with resolutionError). It also links the packages parameter to the parallel enrichment and decision logic. Slightly more could be said about the exact format of names, but the description already meaningfully augments 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 states a specific verb and resource: 'Given 2-5 candidate packages for the same job ... fetches the same ... enrichment ... and returns a structured side-by-side plus a deterministic, reasoned pick.' It clearly distinguishes from siblings by referencing get_package for the underlying enrichment and explicitly naming deeper alternatives (analyze_install_script, analyze_transitive_dependencies). An agent can understand the tool's role 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 Guidelines5/5

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

It explicitly says when to use the tool: 'Given 2-5 candidate packages for the same job.' It also provides 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.' Additional usage rules like duplicate name rejection and unresolved name handling are clearly stated, making the boundary between this tool and its siblings unambiguous.

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. An npm alias (e.g. "totally-safe": "npm:minimist@0.0.8") is followed to its real target in every format — actualName names the real package that vulnerability/install-script data attaches to (name stays the declared/alias key); this is NOT silently skipped, since doing so would let a vulnerable package hide behind whatever name a project calls it. 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, a headline signal — 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. installScriptIntroduced is a boolean across all four lifecycle keys, so it treats a bare "prepare": "husky" bump the same as a newly-added network-capable postinstall — read installScriptKeysIntroduced (null when only npm-lock's boolean hint was available, not the real scripts object; otherwise the actual key(s) added) to tell those apart before treating a flag as high-severity. sourceIntegrityChanged catches a DIFFERENT attack shape than a version bump: a lockfile entry whose resolved tarball URL or integrity hash changed while the version string stayed IDENTICAL — e.g. a compromised registry mirror or a hand-edited lockfile pointing a legitimate-looking "lodash@4.17.21" at a different, unverified artifact — which a version-only diff would report as "no change" (resolvedUrl/integrity are null when a format doesn't record either, package.json has neither). Scope notes: package.json is diffed as its own declared dependency list only (a manifest has no transitive data at all, and this includes peerDependencies, unlike batch_query_vulnerabilities/generate_sbom which exclude them by default — a diff should catch a peerDependency change just like any other); every lockfile format (package-lock.json, pnpm-lock.yaml, yarn.lock) reports its FULL resolved graph — direct and transitive alike — so a transitive-only change (e.g. a nested qs bumped while the direct express version is untouched) is caught, not just direct dependency changes; check comparisonNote when the two snapshots are different formats/scopes. 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. projectLifecycleChanges diffs the SCANNED PROJECT's own root preinstall/install/postinstall/prepare scripts (package.json only — null when neither snapshot is one) — independent of the dependency list above, since a PR that only adds a root postinstall ("postinstall": "curl ... | sh") changes nothing about added/removed/changed and would otherwise be invisible to this tool entirely; introduced/changed on a preinstall/install/postinstall key is counted in flaggedCount. overridesChanges similarly diffs package.json's overrides (npm), resolutions (yarn), or pnpm.overrides — these force a specific version onto a transitive dependency (often to pin past a known vulnerability), so a PR that quietly removes, downgrades, or introduces one is exactly the kind of change a dependency diff should catch, and previously nothing here read this field at all; ANY change here (introduced/removed/changed) is counted in flaggedCount, since an override can be a security control being weakened just as easily as an attack forcing a compromised version onto an otherwise-untouched dependency. 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
overridesChangesYes
projectLifecycleChangesYes

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only convey read-only/non-destructive hints, so the description carries the full burden of behavioral disclosure. It exposes alias-following semantics, installScriptIntroduced boolean behavior, sourceIntegrityChanged, format scope differences, presence-only script detection, comparisonNote, projectLifecycleChanges, and overridesChanges, plus null-case caveats. This far exceeds what annotations provide and never contradicts them.

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 a single dense paragraph of several hundred words with no bullet points or sectioning. It front-loads the core purpose and every sentence does carry useful edge-case detail, but the lack of structure makes it hard to scan and would benefit from bullets or short sections. Acceptable for the complexity, but not concise.

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 is exhaustive for a tool of this complexity: supported formats, attack shapes, scope differences, output semantics, counters, null cases, and alternative routing are all covered. With an output schema present, return values need not be described, and even the 100-package cap is mentioned. Nothing an agent needs to 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?

Both parameters are already fully documented in the schema with their format list and auto-detection behavior, reaching 100% coverage. The description adds only marginal parameter-level meaning (e.g., before/after PR context, scope notes), most of which is tool behavior rather than parameter semantics. 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 opening sentence names the exact resource (two raw dependency snapshot files) and the specific verb (compares), and lists concrete outputs (added/removed/version-bumped). It also explicitly distinguishes itself from siblings like analyze_install_script, batch_query_vulnerabilities, and generate_sbom, so an agent can route correctly 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 explicitly states it is 'Ideal for a CI gate reviewing a dependency-changing PR' and gives concrete when-to-use/alternatives guidance: use analyze_install_script for deep-dive on flags, and notes that batch_query_vulnerabilities/generate_sbom exclude peerDependencies by default while this tool includes them. It even explains why a root postinstall change would be invisible without this tool.

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 remove-now/patch-now/patch-soon/scheduled/monitor ranking prioritize_remediation exposes for hand-built finding lists (a MAL-* advisoryId in the audit report is auto-detected as malware and forces remove-now). 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.8/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 safety is covered. The description adds rich behavioral detail: direct parsing, malware auto-detection, GHSA-to-CVE resolution via OSV.dev, and the consequence of skipping that step, plus carrying isDirect/fixAvailable/fixTarget fields. It also discloses the limitation of using only the first advisory per package.

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 earns its place—purpose first, then mechanisms, then limitations, then alternatives. It is front-loaded and well-organized. It could arguably be a 5, but the length (though justified) makes it slightly less concise than the crispest examples.

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 (two input formats, external resolution, extra fields, edge cases), the description covers all critical aspects: parsing, ranking, resolution, field semantics, limitations, and alternatives. An output schema exists, so return values are not required. 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?

Schema coverage is 100%, so the parameter is already documented. However, the description adds meaningful format details (npm 7+ vs legacy npm 6 structures) beyond the schema's generic description, which helps the agent prepare valid input. Baseline 3 would be acceptable, but the extra format specificity earns a 4.

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 ('rank') and resource ('raw npm audit --json output'), and immediately contrasts it with prioritize_remediation for hand-built lists, and batch_query_vulnerabilities for yarn/pnpm. It leaves no ambiguity about what this tool does and how it differs from siblings.

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 says when to use (raw npm audit output) and when not (yarn/pnpm audit), naming alternatives (batch_query_vulnerabilities) and also points to query_vulnerabilities for cases where a package has multiple advisories. This is exemplary guidance.

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. When content is a package.json, peerDependencies are excluded by default (a peer is often intentionally left unresolved by the consumer) — pass includePeerDependencies: true to include them as SBOM components too, since an SBOM meant to be complete shouldn't silently omit a whole dependency category.

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.
includePeerDependenciesNoIgnored when using `packages`; only applies when `content` is a package.json. peerDependencies are excluded by default — set this to also include them as SBOM components.

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?

Adds substantial behavior beyond the readOnlyHint/openWorldHint/destructiveHint annotations: discloses that OSV.dev and registry calls occur, clarifies VEX analysis.state 'in_triage' is an unreviewed automated finding (not an exploitability claim), explains SPDX 2.3 has no vulnerabilities array so externalRefs are used, and states the transitive dependencies[] graph is intentionally omitted rather than fabricated. 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?

Front-loaded with the core purpose and format details in the first sentence, and every subsequent sentence carries behaviorally meaningful information. However, it is a dense wall of text across four long paragraphs that could benefit from structural separation; the density is justified by tool complexity but the length is at the upper edge.

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?

Highly complete for a complex 10-parameter tool with nested objects and an output schema: it explains output-format differences (CycloneDX vulnerabilities[]/licenses vs SPDX externalRefs/licenseDeclared), enrichment and policy options, intentional omissions, and cross-tool parameter reuse. 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?

Schema coverage is high (90%), but the description still adds value: enumerates the content formats (package.json, package-lock.json, yarn.lock, pnpm-lock.yaml, CycloneDX/SPDX JSON) beyond the schema, documents the 100-item cap on packages when includeLicenses is on, cross-references the policy param shape to check_license_compliance, and explains peerDependencies exclusion default and includeDevDependencies ignoring behavior — details the schema omits.

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: 'emits a spec-valid CycloneDX 1.6 or SPDX 2.3 JSON document' with an explicit format choice and default. No sibling tool generates SBOMs (siblings cover vulnerability queries, license checks, remediation), so it is cleanly distinguished from all alternatives.

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?

Gives clear contextual guidance: references the shared input shape with batch_query_vulnerabilities, explains when to skip enrichment passes (includeVulnerabilities/includeLicenses=false for speed), when to set includePeerDependencies (when an SBOM must be complete), and the content-vs-packages exclusivity. It lacks an explicit 'don't use when' exclusion, but for a generation tool the usage contexts are well covered.

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). If the KEV or EPSS lookup itself fails (network/timeout/upstream outage), kev/epss come back null only because those fields have to be nullable — kevCheckFailed/epssCheckFailed (true in that case) is the real signal, and means "unknown", not "confirmed absent/unscored". For a search, a failed EPSS batch call sets epssCheckFailed on every result in that response, since one call scores every id together; kevCheckFailed is tracked per-CVE since each is looked up independently. 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
kevCheckFailedNo
resultsPerPageNo
epssCheckFailedNo
dateRangeClampedNo

TDQS

A4.8/5.0
Behavior5/5

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

Despite annotations (readOnlyHint=true, openWorldHint=true, destructiveHint=false) already covering the read-only profile, the description adds substantial behavioral disclosure: the automatic MITRE fallback for unscored CVEs (`source: "mitre"`), the precise nullable-field semantics (`kev`/`epss` null means 'unknown' via `kevCheckFailed`/`epssCheckFailed`, not 'confirmed absent'), the distinction between batch EPSS failure vs per-CVE KEV failure, and the shared NVD rate limit prompting retries. This goes well beyond what annotations convey.

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 core purpose is front-loaded in the first sentence, and the dense follow-on sentences earn their place given the tool's complexity: dual lookup/search modes, nullable-field error semantics, fallback routing, and rate limiting all need explanation. It is verbose, and the educational aside about CVSS measuring impact vs likelihood is slightly extraneous to tool invocation, preventing a 5, but nothing is 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, 0 required, an output schema, and annotations, the description covers every operational concern an agent needs: mode selection, sibling routing, fallback behavior, null/error-flag interpretation, rate-limit handling, and ecosystem scope. With the output schema present, the description rightly does not need to explain return values. Nothing material 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 100%, so the baseline is 3. The description adds value beyond the schema by explaining parameter interplay: that cveId supersedes search filters, that keywordSearch (e.g. a package name) should be used to narrow broad ecosystem-wide search results, and that severity filtering alone is a weaker prioritization signal than the returned EPSS score. This crosses the baseline into genuinely helpful parameter guidance.

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: 'Look up authoritative NIST NVD data for one exact CVE ID... or browse/search NVD by keyword, CVSS severity, CWE, or a publication-date range.' It explicitly distinguishes itself from siblings: 'NVD is NOT npm-scoped — unlike query_vulnerabilities/get_latest_advisories' and 'prefer get_latest_advisories for npm-specific browsing.' An agent can tell exactly what this tool does and how it differs from its siblings.

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 and when-not-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 names the alternative (query_vulnerabilities/get_latest_advisories) and explains the ecosystem-scope reason for choosing the sibling.

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 npm security advisories and known-malicious-package findings. Three disjoint sources, selected via type: "reviewed" (default) is GitHub's curated, mostly CVE-backed advisories; "malware" is GitHub's own known-malicious-package advisories; "osv" is OSV.dev's OpenSSF malicious-packages feed, a separate dataset whose entries use MAL-/OSV ids rather than GHSA ids. None of "malware"/"osv" carry a CVE or meaningful CWE beyond "embedded malicious code". Filter by severity, vulnerability category (XSS, SQL/NoSQL Injection, SSRF, Access Control, Code Injection, etc. — reviewed only), an affected package name, or (reviewed/malware only) 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
typeNoAdvisory source: "reviewed" (curated CVE-style, default), "malware" (GitHub-curated known-malicious packages), or "osv" (OSV.dev/OpenSSF malicious-packages feed)
cveIdNoLook up one exact advisory by its CVE ID (e.g. "CVE-2024-12345") — reviewed/malware only
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") — reviewed/malware only
affectsNoFilter to advisories affecting this npm package name
categoryNoFilter by vulnerability category (reviewed only). 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; not applicable to "malware"/"osv")
directionNoSort by published date, newest or oldest first (default desc)

Output Schema

ParametersJSON Schema
NameRequiredDescription
typeYes
categoryYes
severityYes
directionYes
advisoriesYes
nextCursorYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations cover read-only/open-world; the description adds significant context beyond annotations: the disjoint dataset semantics, different ID schemes (MAL-/OSV vs GHSA), absence of CVE/CWE in malware/osv feeds, and pagination via opaque cursor.

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?

Front-loads purpose and source breakdown, then filters and pagination. Dense but each sentence carries distinct, decision-relevant information; 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?

With an output schema present, return format needn't be explained. The description compensates fully for the tool's inherent complexity: three heterogeneous datasets, ID formats, filter applicability, and pagination semantics.

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 raises it by clarifying default values, mutual applicability (category reviewed-only, severity not applicable to malware/osv), and the cursor round-trip contract ('pass nextCursor back as cursor').

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+resource ('Browse recently published npm security advisories and known-malicious-package findings') and immediately explains the three disjoint sources, which distinguishes it from siblings like query_vulnerabilities or get_cve.

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?

Clearly explains when each source type applies and that lookups by GHSA/CVE are reviewed/malware only. Does not explicitly name alternative sibling tools, but the source semantics provide strong usage context.

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 — a proxied Gravatar image (null if no email is on record). 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. npmscanUrl is this account's profile page on npmscan itself; npmProfileUrl is the account's actual page on npmjs.com, included for verification since that's the authoritative record of the account.

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
npmscanUrlYes
npmProfileUrlYes
totalDependentsYes
packagesReturnedYes
resultsTruncatedYes
maintainerUsernameYes
totalPackagesFoundYes
totalWeeklyDownloadsYes
currentlyMaintainsCountYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly/openWorld/non-destructive), but the description adds meaningful context beyond them: it discloses the upstream data source (registry.npmjs.org /-/v1/search), the absence of a dedicated maintainer-list endpoint, the revoke-vs-current distinction in currentlyMaintainsCount, and the null case for avatarUrl. It stops short of describing pagination or result caps on the search index, which would matter for completeness.

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?

Front-loaded with the core behavior and the sibling disambiguation in the first two sentences, which is the right ordering. It is dense and long, with several parenthetical asides that cost readability, but no sentence is truly wasted.

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 single-parameter read tool with annotations covering safety, a 100%-covered schema, and an output schema, the description supplies everything an agent needs: what is returned, the data source, caveats, and when to prefer a sibling. Return-value detail is present but not required, so nothing 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 single parameter is fully documented (exact username, not email/package/scope). The description adds nothing beyond "Given an npm username," so the 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?

States a specific verb+resource (returns packages and aggregates for an npm maintainer) and explicitly distinguishes itself from check_maintainer_blast_radius, which it names. An agent can tell this is a profile/info lookup, not a security scan, without opening either schema.

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

Usage Guidelines5/5

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

Gives explicit when-not guidance ("does NOT run the publish-cluster / compromised-account detection... use that tool instead") and a concrete when-to-use trigger via its pairing with check_maintainer_changes. It routes the agent among siblings rather than leaving selection to inference.

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). If the OSV.dev query itself fails (network/timeout/upstream outage), isLatestVersionVulnerable comes back false only because the field has to be a boolean — vulnerabilityCheckFailed:true is the real signal there, and means the safe/not-safe answer is unknown, not confirmed clean. 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
vulnerabilityCheckFailedYes
isLatestVersionVulnerableYes

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 tool's safety is clear. The description adds valuable behavioral context: explains that the topPackagesRank is from a periodically-refreshed snapshot not live, that vulnerabilityCheckFailed distinguishes unknown from clean, and that maintenanceTier and popularityTier are rule-based not model-generated. This goes beyond annotations without contradicting them.

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 front-loads the core purpose, but it is overly long and includes many enumerated details that could be summarized without losing critical guidance. The sentences are long and packed with information, making it less scannable. It earns a 3 because it does convey necessary context but lacks brevity and clear separation of ideas.

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 (returns many fields, has output schema, and handles failure modes), the description is thorough: it covers return values implicitly via field enumeration, explains failure signals, and provides guidance on interpretation. The presence of an output schema reduces the need to describe return structure, and the description fills in the nuanced behaviors.

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 coverage is 100% with a clear description of the 'name' parameter (exact package name, with examples). The description reinforces the importance of the package name but does not add further parameter-specific details beyond what the schema states, so a slight deduction is reasonable.

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 npm registry metadata and enumerates a comprehensive list of fields, including version, install scripts, maintainers, license, download trends, vulnerability status, and more. It distinguishes itself from siblings like get_package_version by explicitly pointing to alternative tools for specific older version 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 provides explicit guidance on when to use this tool vs alternatives: it says to use get_package_version or query_vulnerabilities for specific older versions, and it warns to read deprecated and maintenanceSummary before recommending. It also explains the behavior of vulnerabilityCheckFailed, setting clear expectations for failure conditions.

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. If the OSV.dev query itself fails (network/timeout/upstream outage), isVulnerable comes back false only because the field has to be a boolean — vulnerabilityCheckFailed:true is the real signal there, and means the answer is unknown, not confirmed clean.

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
vulnerabilityCheckFailedYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already set readOnlyHint, openWorldHint, and destructiveHint=false. The description goes further by detailing the failure mode of the OSV.dev query: when the query fails, isVulnerable is forced to false and vulnerabilityCheckFailed:true is the real signal. This is critical behavioral disclosure beyond annotations and prevents misinterpretation of a false negative.

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 longer than average but every sentence carries weight: purpose, key outputs, usage guidance, and failure-mode caveat. It is front-loaded with the core action and ends with the most nuanced edge case. No filler or redundancy.

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 (registry metadata + vulnerability check), the description covers the essential return fields (isVulnerable, highestSeverity, findings with severity/summary/fixedVersion) and explicitly addresses the failure case. The output schema exists, so full enumeration isn't needed. An agent has everything necessary to call it correctly and interpret results accurately.

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 both name and version are fully described in the schema. The description adds context about the use case (lockfile pins) but doesn't add parameter-specific meaning beyond what the schema already provides. Baseline 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?

The description states a specific verb ('Fetch registry metadata') and resource ('one exact version of a package'), then adds the secondary action of checking against OSV.dev. It distinguishes itself from siblings like get_package (latest release) and query_vulnerabilities by explicitly targeting exact pinned versions. No ambiguity.

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 an explicit when-to-use: 'Use this to check a version pinned in a lockfile rather than the latest release.' This clearly routes the agent away from using it for latest versions, implicitly pointing to alternatives. It also explains how to interpret edge-case failure behavior, adding operational guidance.

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 remove-now/patch-now/patch-soon/scheduled/monitor tier per finding. A finding with findingType: "malware" (or a MAL-* advisoryId, auto-detected even when findingType is omitted) always lands in remove-now — the tier above patch-now — regardless of score: a confirmed-malicious package needs removal/replacement, not an "urgent patch" (there often isn't a fixed version to patch TO), and EPSS/severity don't meaningfully apply to "how malicious" the way they do to a genuine vulnerability. When EPSS data isn't available at all (no CVE id, or a real CVE that just isn't in FIRST.org's database) severity becomes the sole usable signal and is scored on its own scale instead of being diluted to a ~10% sliver of the composite — a bare CRITICAL/HIGH GHSA finding with no CVE alias lands in patch-soon/scheduled, not monitor, the way it would if severity kept its normal secondary weight with nothing else to combine it with. 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.9/5.0
Behavior5/5

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

The description goes far beyond the sparse annotations (readOnlyHint, openWorldHint, destructiveHint). It discloses the full ranking logic: combination of CISA KEV, EPSS, and severity; the malware override to remove-now; the fallback to severity alone when EPSS is absent; and the deduplication of shared CVE IDs. These behavioral details are exactly what an agent needs to predict side effects and edge cases.

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 serves a purpose: it is front-loaded with the core purpose, then details the ranking signals, edge cases, and exclusions. While it is verbose, the complexity of the tool justifies the length. It could be tightened slightly by trimming explanatory asides, but overall structure is logical and easy to parse.

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 presence of an output schema (which covers return structure), and the rich annotations, the description is complete. It covers input expectations, all ranking scenarios, the malware special case, the EPSS fallback, and what the tool does not do. 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.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema descriptions cover 100% of parameters, the description adds deeper semantic meaning by explaining how each parameter influences ranking (e.g., cveId 'enables CISA KEV + FIRST.org EPSS enrichment', findingType 'forces the remove-now tier regardless of score', severity 'used as a fallback/secondary signal'). It also explains the interaction between parameters, such as EPSS unavailability causing severity to become the sole signal, which is not evident from schema alone.

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 clear, specific purpose: rank a batch of vulnerability findings by fix priority. It names the input sources (batch_query_vulnerabilities, analyze_transitive_dependencies, query_vulnerabilities) and explicitly differentiates itself from siblings by stating it does NOT re-query OSV/NVD. This makes the tool's role unambiguous.

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 states when to use it: 'Given a batch of vulnerability findings already flagged elsewhere... ranks them by what to actually fix first.' It also clarifies what it does not do ('does NOT re-query OSV/NVD itself') and what the caller must supply ('pass in the severity/CVE id findings other tools already returned'). This gives clear operational guidance and excludes misuse cases.

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. Also cross-checks the name/version against the npm registry: isVulnerable:false on a package that does not actually exist there (typo, wrong ecosystem) would otherwise look identical to a genuinely clean result — see packageExists/existenceCheckNote. A name or version not found on the registry does NOT discard already-fetched OSV data or short-circuit into an error: OSV/GHSA advisory data is independent of the package's current registry listing, and a package/version pulled from npm for being malicious (unpublished/yanked) is exactly the case where real vulnerability data must still be reported, not hidden behind a 404. 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
packageExistsYes
highestSeverityYes
vulnerabilitiesYes
existenceCheckNoteYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only state readOnly/openWorld/non-destructive hints. The description adds critical non-obvious behavior: it cross-checks the npm registry and exposes packageExists/existenceCheckNote to distinguish a nonexistent package from a genuinely clean result. It also explicitly says that a registry 404 does not discard OSV data or become an error, covering the malicious-unpublished-package edge case.

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 longer than average, but each item earns its place: core query behavior, result shape, registry cross-check, edge-case handling, and a usage directive. It is front-loaded with the primary purpose and output contract before nuanced caveats. It is dense but not 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?

For a read-only query tool with an output schema and helpful annotations, the description covers the full call context: what it checks, what it returns, how to interpret isVulnerable:false, and when to use it. The registry edge-case explanation is especially valuable and hard to discover otherwise. Nothing essential 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 input schema already covers all three parameters, so the description does not need to repeat basics. It adds useful semantic context, such as checking a lockfile-pinned version, the npm default for ecosystem, and the fact that name/version feed the registry cross-check. This is a meaningful bonus over the schema 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 first sentence states a specific verb and resource ('Query OSV.dev for known vulnerabilities affecting an npm package') and adds an explicit scope qualifier ('optionally scoped to one exact version'). The description also contrasts itself with 'a raw advisory dump,' helping an agent distinguish it from sibling tools like get_cve or batch_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 gives an explicit trigger: 'Use before recommending, installing, or upgrading a package,' which tells an agent the decision context. It also describes what the tool is not for ('not a raw advisory dump') and explains the registry cross-check behavior. It does not explicitly name sibling alternatives for bulk queries, but the context is clear enough.

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.7/5.0
Behavior5/5

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

The description discloses important behavioral nuances beyond the annotations: topPackagesRank is not live, labels are deterministic rather than model-generated, low-popularity/stale results are likely abandoned or squatted, and possibleTyposquatOf should be called out rather than silently filtered. This gives the agent critical interpretation guidance that readOnlyHint/openWorldHint do not convey.

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 high-density: every sentence adds interpretive or routing value. It front-loads the core search action and then layers result-signal meaning, warning signs, and follow-up recommendations in a logical order. No sentences are 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 search tool feeding into a security-analysis workflow, the description covers result interpretation, caveats, red flags, and the recommended next step (get_package). The output schema handles structural return details, so the description does not need to restate them. An agent has enough context to use the tool correctly and act on its output.

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 input schema already documents query and limit, including defaults and constraints. The description only restates the query semantics ('by name or keywords') and adds no meaningful parameter-level detail beyond what the schema provides. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific action and resource: searching the npm registry by name or keywords. It goes beyond a tautology by explaining what each result contains and how the tool differs from follow-up tools like get_package. An agent can immediately understand this is the entry-point search tool among the sibling set.

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 guidance on when to use the results: use the popularity and maintenance signals rather than name recognition or READMEs, treat possibleTyposquatOf as a red flag, and call get_package on the shortlist for deeper vetting. This actively routes the agent to the correct next tool and prevents misuse.

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

simulate_dependency_upgradeSimulate an npm dependency upgradeA
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 declare readOnlyHint=true / destructiveHint=false / openWorldHint=true, and the description still adds substantial behavioral detail beyond them: the riskTier taxonomy, the reasons list, pre-1.0 minor-bump-as-breaking convention, multi-major skip flagging, registry-sourced signals (deprecation, new lifecycle scripts, engines.node tightening), and the fetchError-per-entry failure isolation. It also states the batch cost characteristic (deduped/parallelized fetches, one OSV call) that no annotation conveys.

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?

Front-loaded with the core promise ('tells you whether that specific upgrade is safe ... before you run npm install') and every sentence carries signal. It is dense and long, and the batch/param guidance repeats what the schema already documents, so some trimming is possible, but 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?

For a complex, zero-required-param, batch-capable tool with an output schema, the description covers the classification logic, the riskTier output, the per-entry fetchError behavior, and the cost model without needing to restate return fields. An agent has everything required to select and invoke it correctly, including the choosing between single and batch forms.

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 and the description must add value to earn more. It does: it spells out the mutual exclusivity of packages vs packageName/currentVersion ('not both'), clarifies that targetVersion is optional and defaults to the registry latest dist-tag, and links the fields to prioritize_remediation's output shape. This largely mirrors schema text, so it lands at 4 rather than 5.

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 precise verb+resource (simulate a dependency upgrade) and goes further to enumerate exactly what it classifies (semver jump type, deprecation, lifecycle scripts, engines.node, prerelease, OSV vulnerabilityDelta) and what it explicitly does NOT do (read changelog/source diff). It distinguishes itself from siblings both by naming prioritize_remediation as the upstream pairing and by defining its boundary as a fast deterministic pre-check rather than a full review.

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?

Gives explicit when-to-use ('before you actually run npm install', 'natural follow-up to prioritize_remediation: pass its packageName + currentVersion + fixedVersion straight in') and when-not-to-use ('not a substitute for reading the release notes on a flagged major bump'). It also routes the batch case explicitly ('for simulating more than one upgrade at once ... pass packages ... not both'), which is exactly the discrimination an agent needs.

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. A candidate is also never suggested if it's deprecated, has a confirmed HIGH/CRITICAL OSV vulnerability, or its own OSV check itself failed (network/timeout/upstream outage) — an unverifiable candidate is excluded the same as a confirmed-bad one, not defaulted to 'looks fine', since this tool's entire purpose is not recommending something dangerous. Best for turning a 'don't use this package' warning into an actionable replacement shortlist. If the OSV.dev vulnerability check fails for the SOURCE package (as opposed to a candidate, which gets excluded per above), source.isLatestVersionVulnerable comes back false only because the field has to be a boolean — source.vulnerabilityCheckFailed:true is the real signal there, and means that safe/not-safe answer is unknown, not confirmed clean.

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.5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint and non-destructiveness, but the description goes far beyond that. It discloses critical behavioral nuances: unverifiable candidates are excluded rather than defaulting to safe, the source's vulnerabilityCheckFailed flag is the real signal (since isLatestVersionVulnerable returns false as a placeholder), and the ranking/filtering criteria. This is essential for an agent to interpret results correctly.

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 opens with the core purpose, then explains the methodology, then the best-use case, and finally a crucial caveat about vulnerability-check failure. The structure is logical and front-loaded with the primary action, making it easy for an agent to parse and apply.

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?

Despite the tool being read-only and having an output schema, the description covers exceptional cases like OSV check failures and candidate exclusion. It explains what the output contains (short list with whySuggested notes) and why certain candidates are never suggested. For a tool with this complexity, the description is exceptionally complete and leaves no critical gaps 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 description coverage is 100%, so the baseline is 3. The description does not add much parameter-specific detail beyond what the schema already provides. It references the 'name' parameter as the source package and mentions the 'limit' implicitly in 'Max suggestions,' but these are already in the schema. The description's value is in process explanation, not parameter meanings.

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 the exact purpose: given a problematic package, suggest better-maintained alternatives in the same category. It clearly distinguishes this from sibling tools by highlighting the category-matching and safety-filtering behavior, and explicitly frames it as turning a 'don't use' warning into a replacement 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?

The description includes 'Best for turning a ... warning into an actionable replacement shortlist,' which gives clear usage context. It also explains the internal decision logic but does not explicitly name alternative sibling tools or say when NOT to use it (e.g., when you just want to search packages). Still, it provides enough situational guidance for an agent.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool update
    • Changedenrich_npm_audit5 fields changed
      • addedOutput schema / properties / ranked / items / properties / findingType
        Added value: +{
        +  "enum": [
        +    "malware",
        +    "vulnerability",
        +    "supply-chain",
        +    "install-script"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / ranked / items / properties / tier / enum
        Previous value: -[
        -  "patch-now",
        -  "patch-soon",
        -  "scheduled",
        -  "monitor"
        -]New value: +[
        +  "remove-now",
        +  "patch-now",
        +  "patch-soon",
        +  "scheduled",
        +  "monitor"
        +]
      • changedOutput schema / properties / ranked / items / required
        Previous value: -[
        -  "rank",
        -  "packageName",
        -  "cveId",
        -  "advisoryId",
        -  "advisoryTitle",
        -  "currentVersion",
        -  "fixedVersion",
        -  "severity",
        -  "kev",
        -  "epss",
        -  "score",
        -  "tier",
        -  "reason",
        -  "npmscanUrl",
        -  "cveNpmscanUrl",
        -  "isDirect",
        -  "fixAvailable",
        -  "fixTarget"
        -]New value: +[
        +  "rank",
        +  "packageName",
        +  "cveId",
        +  "advisoryId",
        +  "currentVersion",
        +  "fixedVersion",
        +  "severity",
        +  "kev",
        +  "epss",
        +  "score",
        +  "tier",
        +  "findingType",
        +  "reason",
        +  "npmscanUrl",
        +  "cveNpmscanUrl",
        +  "advisoryTitle",
        +  "isDirect",
        +  "fixAvailable",
        +  "fixTarget"
        +]
      • addedOutput schema / properties / summary / properties / removeNow
        Added value: +{
        +  "type": "number"
        +}
      • changedOutput schema / properties / summary / required
        Previous value: -[
        -  "patchNow",
        -  "patchSoon",
        -  "scheduled",
        -  "monitor",
        -  "kevListedCount"
        -]New value: +[
        +  "removeNow",
        +  "patchNow",
        +  "patchSoon",
        +  "scheduled",
        +  "monitor",
        +  "kevListedCount"
        +]
  2. 1 tool update
    • Changedbatch_query_vulnerabilities1 field changed
      • changedOutput schema / properties / results / items / properties / source / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "integrity": {
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "nonRegistryHost": {
        -        "type": [
        -          "boolean",
        -          "null"
        -        ]
        -      },
        -      "resolvedUrl": {
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "resolvedUrl",
        -      "integrity",
        -      "nonRegistryHost"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "identityMismatch": {
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "integrity": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "nonRegistryHost": {
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "resolvedName": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "resolvedUrl": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "resolvedVersion": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "resolvedUrl",
        +      "integrity",
        +      "nonRegistryHost",
        +      "identityMismatch",
        +      "resolvedName",
        +      "resolvedVersion"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
  3. 1 tool update
    • Changedbatch_query_vulnerabilities2 fields changed
      • addedOutput schema / properties / results / items / properties / source
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": false,
        +      "properties": {
        +        "integrity": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "nonRegistryHost": {
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "resolvedUrl": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "required": [
        +        "resolvedUrl",
        +        "integrity",
        +        "nonRegistryHost"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • changedOutput schema / properties / results / items / required
        Previous value: -[
        -  "package",
        -  "npmscanUrl",
        -  "scanStatus",
        -  "vulnerabilityCount",
        -  "advisoryCount",
        -  "uniqueVulnerabilityCount",
        -  "vulnerabilities",
        -  "signals"
        -]New value: +[
        +  "package",
        +  "npmscanUrl",
        +  "scanStatus",
        +  "vulnerabilityCount",
        +  "advisoryCount",
        +  "uniqueVulnerabilityCount",
        +  "vulnerabilities",
        +  "signals",
        +  "source"
        +]
  4. 1 tool update
    • Changedget_cve5 fields changed
      • addedOutput schema / properties / cves / items / properties / epssCheckFailed
        Added value: +{
        +  "$ref": "#/properties/epssCheckFailed"
        +}
      • addedOutput schema / properties / cves / items / properties / kevCheckFailed
        Added value: +{
        +  "$ref": "#/properties/kevCheckFailed"
        +}
      • changedOutput schema / properties / cves / items / required
        Previous value: -[
        -  "id",
        -  "npmscanUrl",
        -  "vulnStatus",
        -  "description",
        -  "published",
        -  "lastModified",
        -  "cvss",
        -  "cwes",
        -  "references",
        -  "source",
        -  "kev",
        -  "epss"
        -]New value: +[
        +  "id",
        +  "npmscanUrl",
        +  "vulnStatus",
        +  "description",
        +  "published",
        +  "lastModified",
        +  "cvss",
        +  "cwes",
        +  "references",
        +  "source",
        +  "kev",
        +  "epss",
        +  "kevCheckFailed",
        +  "epssCheckFailed"
        +]
      • addedOutput schema / properties / epssCheckFailed
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / kevCheckFailed
        Added value: +{
        +  "type": "boolean"
        +}
  5. 4 tool updates
    • Changedcompare_packages2 fields changed
      • addedOutput schema / properties / candidates / items / properties / vulnerabilityCheckFailed
        Added value: +{
        +  "type": "boolean"
        +}
      • 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",
        -  "installSize",
        -  "score"
        -]New value: +[
        +  "name",
        +  "found",
        +  "resolutionError",
        +  "npmscanUrl",
        +  "description",
        +  "license",
        +  "latestVersion",
        +  "deprecated",
        +  "weeklyDownloads",
        +  "downloadTrend",
        +  "githubStars",
        +  "hasBuiltInTypes",
        +  "daysSinceLastPublish",
        +  "popularityTier",
        +  "maintenanceTier",
        +  "maintenanceSummary",
        +  "possibleTyposquatOf",
        +  "isLatestVersionVulnerable",
        +  "vulnerabilityCheckFailed",
        +  "highestSeverity",
        +  "vulnerabilityCount",
        +  "installScriptRisk",
        +  "installSize",
        +  "score"
        +]
    • Changedget_package2 fields changed
      • addedOutput schema / properties / vulnerabilityCheckFailed
        Added value: +{
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "name",
        -  "description",
        -  "license",
        -  "homepage",
        -  "repository",
        -  "keywords",
        -  "maintainers",
        -  "distTags",
        -  "latestVersion",
        -  "latestVersionInfo",
        -  "recentVersions",
        -  "createdAt",
        -  "modifiedAt",
        -  "npmscanUrl",
        -  "weeklyDownloads",
        -  "githubStars",
        -  "hasBuiltInTypes",
        -  "daysSinceLastPublish",
        -  "popularityTier",
        -  "maintenanceTier",
        -  "maintenanceSummary",
        -  "topPackagesRank",
        -  "downloadTrend",
        -  "possibleTyposquatOf",
        -  "isLatestVersionVulnerable",
        -  "highestSeverity",
        -  "vulnerabilities"
        -]New value: +[
        +  "name",
        +  "description",
        +  "license",
        +  "homepage",
        +  "repository",
        +  "keywords",
        +  "maintainers",
        +  "distTags",
        +  "latestVersion",
        +  "latestVersionInfo",
        +  "recentVersions",
        +  "createdAt",
        +  "modifiedAt",
        +  "npmscanUrl",
        +  "weeklyDownloads",
        +  "githubStars",
        +  "hasBuiltInTypes",
        +  "daysSinceLastPublish",
        +  "popularityTier",
        +  "maintenanceTier",
        +  "maintenanceSummary",
        +  "topPackagesRank",
        +  "downloadTrend",
        +  "possibleTyposquatOf",
        +  "isLatestVersionVulnerable",
        +  "vulnerabilityCheckFailed",
        +  "highestSeverity",
        +  "vulnerabilities"
        +]
    • Changedget_package_version2 fields changed
      • addedOutput schema / properties / vulnerabilityCheckFailed
        Added value: +{
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "name",
        -  "version",
        -  "description",
        -  "license",
        -  "dependencies",
        -  "scripts",
        -  "deprecated",
        -  "tarball",
        -  "shasum",
        -  "npmscanUrl",
        -  "isVulnerable",
        -  "highestSeverity",
        -  "vulnerabilities"
        -]New value: +[
        +  "name",
        +  "version",
        +  "description",
        +  "license",
        +  "dependencies",
        +  "scripts",
        +  "deprecated",
        +  "tarball",
        +  "shasum",
        +  "npmscanUrl",
        +  "isVulnerable",
        +  "vulnerabilityCheckFailed",
        +  "highestSeverity",
        +  "vulnerabilities"
        +]
    • Changedsuggest_alternative4 fields changed
      • addedOutput schema / properties / source / properties / vulnerabilityCheckFailed
        Added value: +{
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / source / required
        Previous value: -[
        -  "name",
        -  "latestVersion",
        -  "deprecated",
        -  "isLatestVersionVulnerable",
        -  "highestSeverity",
        -  "popularityTier",
        -  "maintenanceTier",
        -  "possibleTyposquatOf",
        -  "npmscanUrl"
        -]New value: +[
        +  "name",
        +  "latestVersion",
        +  "deprecated",
        +  "isLatestVersionVulnerable",
        +  "vulnerabilityCheckFailed",
        +  "highestSeverity",
        +  "popularityTier",
        +  "maintenanceTier",
        +  "possibleTyposquatOf",
        +  "npmscanUrl"
        +]
      • addedOutput schema / properties / suggestions / items / properties / vulnerabilityCheckFailed
        Added value: +{
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / suggestions / items / required
        Previous value: -[
        -  "name",
        -  "version",
        -  "description",
        -  "npmscanUrl",
        -  "weeklyDownloads",
        -  "dependentsCount",
        -  "githubStars",
        -  "hasBuiltInTypes",
        -  "deprecated",
        -  "isLatestVersionVulnerable",
        -  "highestSeverity",
        -  "popularityTier",
        -  "maintenanceTier",
        -  "topPackagesRank",
        -  "categoryOverlap",
        -  "matchedQueries",
        -  "whySuggested"
        -]New value: +[
        +  "name",
        +  "version",
        +  "description",
        +  "npmscanUrl",
        +  "weeklyDownloads",
        +  "dependentsCount",
        +  "githubStars",
        +  "hasBuiltInTypes",
        +  "deprecated",
        +  "isLatestVersionVulnerable",
        +  "vulnerabilityCheckFailed",
        +  "highestSeverity",
        +  "popularityTier",
        +  "maintenanceTier",
        +  "topPackagesRank",
        +  "categoryOverlap",
        +  "matchedQueries",
        +  "whySuggested"
        +]
  6. 6 tool updates
    • Changedanalyze_transitive_dependencies3 fields changed
      • addedOutput schema / properties / nodes / items / properties / actualName
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / nodes / items / properties / isVulnerable / type
        Previous value: -"boolean"New value: +[
        +  "boolean",
        +  "null"
        +]
      • changedOutput schema / properties / nodes / items / required
        Previous value: -[
        -  "name",
        -  "version",
        -  "depth",
        -  "isRoot",
        -  "rootPackages",
        -  "parents",
        -  "npmscanUrl",
        -  "resolutionError",
        -  "isVulnerable",
        -  "highestSeverity",
        -  "vulnerabilities"
        -]New value: +[
        +  "name",
        +  "actualName",
        +  "version",
        +  "depth",
        +  "isRoot",
        +  "rootPackages",
        +  "parents",
        +  "npmscanUrl",
        +  "resolutionError",
        +  "isVulnerable",
        +  "highestSeverity",
        +  "vulnerabilities"
        +]
    • Changedaudit_github_repository1 field changed
      • addedInput schema / properties / includePeerDependencies
        Added value: +{
        +  "description": "Include package.json peerDependencies (root and, for a monorepo, each workspace member) in the audit. Default false — a peer is often intentionally left unresolved by the consumer. See warnings for which peers were excluded.",
        +  "type": "boolean"
        +}
    • Changedbatch_query_vulnerabilities7 fields changed
      • addedInput schema / properties / includePeerDependencies
        Added value: +{
        +  "description": "Ignored when using `packages`; only applies when `content` is a package.json. peerDependencies are excluded from scanning by default (see ignoredPeerDependencyNames) since a peer is often intentionally left unresolved by the consumer — set this to also check them.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / ignoredPeerDependencyNames
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / projectLifecycleScriptRisk
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "hasLifecycleScripts": {
        +      "type": "boolean"
        +    },
        +    "riskTier": {
        +      "enum": [
        +        "none",
        +        "low",
        +        "moderate",
        +        "high",
        +        "critical"
        +      ],
        +      "type": "string"
        +    },
        +    "totalScore": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "hasLifecycleScripts",
        +    "riskTier",
        +    "totalScore"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / results / items / properties / package / properties / actualName
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / results / items / properties / package / properties / declaredSpec
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / results / items / properties / scanStatus
        Added value: +{
        +  "enum": [
        +    "scanned",
        +    "not-scanned"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / results / items / required
        Previous value: -[
        -  "package",
        -  "npmscanUrl",
        -  "vulnerabilityCount",
        -  "advisoryCount",
        -  "uniqueVulnerabilityCount",
        -  "vulnerabilities",
        -  "signals"
        -]New value: +[
        +  "package",
        +  "npmscanUrl",
        +  "scanStatus",
        +  "vulnerabilityCount",
        +  "advisoryCount",
        +  "uniqueVulnerabilityCount",
        +  "vulnerabilities",
        +  "signals"
        +]
    • Changeddiff_dependencies10 fields changed
      • addedOutput schema / properties / added / items / properties / actualName
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / added / items / properties / integrity
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / added / items / properties / resolvedUrl
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / added / items / properties / sourceIntegrityChanged
        Added value: +{
        +  "type": [
        +    "boolean",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / added / items / required
        Previous value: -[
        -  "name",
        -  "npmscanUrl",
        -  "beforeVersion",
        -  "afterVersion",
        -  "coexistingVersions",
        -  "changeType",
        -  "hasInstallScript",
        -  "installScriptIntroduced",
        -  "installScriptKeys",
        -  "installScriptKeysIntroduced",
        -  "isVulnerable",
        -  "highestSeverity",
        -  "vulnerabilities",
        -  "vulnerabilityDelta",
        -  "resolutionNote"
        -]New value: +[
        +  "name",
        +  "actualName",
        +  "npmscanUrl",
        +  "beforeVersion",
        +  "afterVersion",
        +  "coexistingVersions",
        +  "changeType",
        +  "hasInstallScript",
        +  "installScriptIntroduced",
        +  "installScriptKeys",
        +  "installScriptKeysIntroduced",
        +  "sourceIntegrityChanged",
        +  "resolvedUrl",
        +  "integrity",
        +  "isVulnerable",
        +  "highestSeverity",
        +  "vulnerabilities",
        +  "vulnerabilityDelta",
        +  "resolutionNote"
        +]
      • addedOutput schema / properties / overridesChanges
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": false,
        +      "properties": {
        +        "changed": {
        +          "additionalProperties": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "after": {
        +                "type": "string"
        +              },
        +              "before": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "before",
        +              "after"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "object"
        +        },
        +        "introduced": {
        +          "additionalProperties": {
        +            "type": "string"
        +          },
        +          "type": "object"
        +        },
        +        "removed": {
        +          "additionalProperties": {
        +            "type": "string"
        +          },
        +          "type": "object"
        +        }
        +      },
        +      "required": [
        +        "introduced",
        +        "removed",
        +        "changed"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / projectLifecycleChanges
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": false,
        +      "properties": {
        +        "changed": {
        +          "additionalProperties": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "after": {
        +                "type": "string"
        +              },
        +              "before": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "before",
        +              "after"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "object"
        +        },
        +        "introduced": {
        +          "additionalProperties": {
        +            "type": "string"
        +          },
        +          "type": "object"
        +        },
        +        "removed": {
        +          "additionalProperties": {
        +            "type": "string"
        +          },
        +          "type": "object"
        +        }
        +      },
        +      "required": [
        +        "introduced",
        +        "removed",
        +        "changed"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / removed / items / properties / actualName
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / removed / items / required
        Previous value: -[
        -  "name",
        -  "version",
        -  "npmscanUrl"
        -]New value: +[
        +  "name",
        +  "actualName",
        +  "version",
        +  "npmscanUrl"
        +]
      • changedOutput schema / required
        Previous value: -[
        -  "summary",
        -  "beforeFormat",
        -  "afterFormat",
        -  "comparisonNote",
        -  "added",
        -  "removed",
        -  "changed",
        -  "totalAdded",
        -  "totalRemoved",
        -  "totalChanged",
        -  "flaggedCount",
        -  "truncated",
        -  "truncationNote",
        -  "enrichmentNote"
        -]New value: +[
        +  "summary",
        +  "beforeFormat",
        +  "afterFormat",
        +  "comparisonNote",
        +  "added",
        +  "removed",
        +  "changed",
        +  "totalAdded",
        +  "totalRemoved",
        +  "totalChanged",
        +  "flaggedCount",
        +  "truncated",
        +  "truncationNote",
        +  "enrichmentNote",
        +  "projectLifecycleChanges",
        +  "overridesChanges"
        +]
    • Changedgenerate_sbom1 field changed
      • addedInput schema / properties / includePeerDependencies
        Added value: +{
        +  "description": "Ignored when using `packages`; only applies when `content` is a package.json. peerDependencies are excluded by default — set this to also include them as SBOM components.",
        +  "type": "boolean"
        +}
    • Changedprioritize_remediation7 fields changed
      • changedInput schema / properties / findings / items / properties / advisoryId / description
        Previous value: -"GHSA/OSV advisory id, passed through unchanged for reference"New value: +"GHSA/OSV advisory id, passed through unchanged for reference — a MAL-* id is auto-detected as malware even without findingType set"
      • addedInput schema / properties / findings / items / properties / findingType
        Added value: +{
        +  "description": "\"malware\" forces the remove-now tier regardless of score/CVE/severity — set this (or pass a MAL-* advisoryId) for a confirmed-malicious package. Omit for an ordinary vulnerability finding.",
        +  "enum": [
        +    "malware",
        +    "vulnerability",
        +    "supply-chain",
        +    "install-script"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / ranked / items / properties / findingType
        Added value: +{
        +  "enum": [
        +    "malware",
        +    "vulnerability",
        +    "supply-chain",
        +    "install-script"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / ranked / items / properties / tier / enum
        Previous value: -[
        -  "patch-now",
        -  "patch-soon",
        -  "scheduled",
        -  "monitor"
        -]New value: +[
        +  "remove-now",
        +  "patch-now",
        +  "patch-soon",
        +  "scheduled",
        +  "monitor"
        +]
      • changedOutput schema / properties / ranked / items / required
        Previous value: -[
        -  "rank",
        -  "packageName",
        -  "cveId",
        -  "advisoryId",
        -  "currentVersion",
        -  "fixedVersion",
        -  "severity",
        -  "kev",
        -  "epss",
        -  "score",
        -  "tier",
        -  "reason",
        -  "npmscanUrl",
        -  "cveNpmscanUrl"
        -]New value: +[
        +  "rank",
        +  "packageName",
        +  "cveId",
        +  "advisoryId",
        +  "currentVersion",
        +  "fixedVersion",
        +  "severity",
        +  "kev",
        +  "epss",
        +  "score",
        +  "tier",
        +  "findingType",
        +  "reason",
        +  "npmscanUrl",
        +  "cveNpmscanUrl"
        +]
      • addedOutput schema / properties / summary / properties / removeNow
        Added value: +{
        +  "type": "number"
        +}
      • changedOutput schema / properties / summary / required
        Previous value: -[
        -  "patchNow",
        -  "patchSoon",
        -  "scheduled",
        -  "monitor",
        -  "kevListedCount"
        -]New value: +[
        +  "removeNow",
        +  "patchNow",
        +  "patchSoon",
        +  "scheduled",
        +  "monitor",
        +  "kevListedCount"
        +]
  7. 2 tool updates
    • Changedbatch_query_vulnerabilities9 fields changed
      • addedInput schema / properties / packages / items / properties / version / description
        Added value: +"One exact published version, e.g. \"18.2.0\" (not a range/tag like \"^18.2.0\" or \"latest\" — those are resolved against the registry first, at the cost of an extra lookup, rather than rejected)"
      • addedOutput schema / properties / nonexistentVersions
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / projectLifecycleScripts
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / results / items / properties / advisoryCount
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / results / items / properties / signals
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": false,
        +      "properties": {
        +        "deprecated": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "hasInstallScripts": {
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "maintenanceTier": {
        +          "enum": [
        +            "active",
        +            "aging",
        +            "stale",
        +            "unknown"
        +          ],
        +          "type": "string"
        +        },
        +        "popularityTier": {
        +          "enum": [
        +            "very-high",
        +            "high",
        +            "moderate",
        +            "low",
        +            "very-low",
        +            "unknown"
        +          ],
        +          "type": "string"
        +        },
        +        "possibleTyposquatOf": {
        +          "anyOf": [
        +            {
        +              "additionalProperties": false,
        +              "properties": {
        +                "name": {
        +                  "type": "string"
        +                },
        +                "rank": {
        +                  "type": "number"
        +                }
        +              },
        +              "required": [
        +                "name",
        +                "rank"
        +              ],
        +              "type": "object"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        }
        +      },
        +      "required": [
        +        "deprecated",
        +        "hasInstallScripts",
        +        "popularityTier",
        +        "maintenanceTier",
        +        "possibleTyposquatOf"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / results / items / properties / uniqueVulnerabilityCount
        Added value: +{
        +  "type": "number"
        +}
      • changedOutput schema / properties / results / items / required
        Previous value: -[
        -  "package",
        -  "npmscanUrl",
        -  "vulnerabilityCount",
        -  "vulnerabilities"
        -]New value: +[
        +  "package",
        +  "npmscanUrl",
        +  "vulnerabilityCount",
        +  "advisoryCount",
        +  "uniqueVulnerabilityCount",
        +  "vulnerabilities",
        +  "signals"
        +]
      • addedOutput schema / properties / totalUniqueVulnerabilities
        Added value: +{
        +  "type": "number"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "results",
        -  "totalVulnerabilities",
        -  "packagesWithVulnerabilities"
        -]New value: +[
        +  "results",
        +  "totalVulnerabilities",
        +  "totalUniqueVulnerabilities",
        +  "packagesWithVulnerabilities"
        +]
    • Changeddiff_dependencies3 fields changed
      • addedOutput schema / properties / added / items / properties / installScriptKeys
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "enum": [
        +          "preinstall",
        +          "install",
        +          "postinstall",
        +          "prepare"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / added / items / properties / installScriptKeysIntroduced
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "enum": [
        +          "preinstall",
        +          "install",
        +          "postinstall",
        +          "prepare"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • changedOutput schema / properties / added / items / required
        Previous value: -[
        -  "name",
        -  "npmscanUrl",
        -  "beforeVersion",
        -  "afterVersion",
        -  "coexistingVersions",
        -  "changeType",
        -  "hasInstallScript",
        -  "installScriptIntroduced",
        -  "isVulnerable",
        -  "highestSeverity",
        -  "vulnerabilities",
        -  "vulnerabilityDelta",
        -  "resolutionNote"
        -]New value: +[
        +  "name",
        +  "npmscanUrl",
        +  "beforeVersion",
        +  "afterVersion",
        +  "coexistingVersions",
        +  "changeType",
        +  "hasInstallScript",
        +  "installScriptIntroduced",
        +  "installScriptKeys",
        +  "installScriptKeysIntroduced",
        +  "isVulnerable",
        +  "highestSeverity",
        +  "vulnerabilities",
        +  "vulnerabilityDelta",
        +  "resolutionNote"
        +]
  8. 1 tool update
    • Changedget_latest_advisories7 fields changed
      • changedInput schema / properties / category / description
        Previous value: -"Filter 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"New value: +"Filter by vulnerability category (reviewed only). 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"
      • changedInput schema / properties / cveId / description
        Previous value: -"Look up one exact advisory by its CVE ID (e.g. \"CVE-2024-12345\")"New value: +"Look up one exact advisory by its CVE ID (e.g. \"CVE-2024-12345\") — reviewed/malware only"
      • changedInput schema / properties / ghsaId / description
        Previous value: -"Look up one exact advisory by its GHSA ID (e.g. \"GHSA-xxxx-xxxx-xxxx\")"New value: +"Look up one exact advisory by its GHSA ID (e.g. \"GHSA-xxxx-xxxx-xxxx\") — reviewed/malware only"
      • changedInput schema / properties / severity / description
        Previous value: -"Filter by severity (default all)"New value: +"Filter by severity (default all; not applicable to \"malware\"/\"osv\")"
      • changedInput schema / properties / type / description
        Previous value: -"Advisory source: \"reviewed\" (curated CVE-style, default) or \"malware\" (known-malicious packages)"New value: +"Advisory source: \"reviewed\" (curated CVE-style, default), \"malware\" (GitHub-curated known-malicious packages), or \"osv\" (OSV.dev/OpenSSF malicious-packages feed)"
      • changedInput schema / properties / type / enum
        Previous value: -[
        -  "reviewed",
        -  "malware"
        -]New value: +[
        +  "reviewed",
        +  "malware",
        +  "osv"
        +]
      • changedOutput schema / properties / type / enum
        Previous value: -[
        -  "reviewed",
        -  "malware"
        -]New value: +[
        +  "reviewed",
        +  "malware",
        +  "osv"
        +]
  9. 5 tool updates
    • Changedbatch_query_vulnerabilities2 fields changed
      • addedOutput schema / properties / existenceCheckNote
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / unresolvedPackages
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Changedcheck_maintainer_blast_radius2 fields changed
      • addedOutput schema / properties / npmscanUrl
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "maintainerUsername",
        -  "npmProfileUrl",
        -  "avatarUrl",
        -  "totalPackagesFound",
        -  "packagesReturned",
        -  "resultsTruncated",
        -  "clusterWindowHours",
        -  "packages",
        -  "clusters",
        -  "findings",
        -  "totalScore",
        -  "riskTier",
        -  "note"
        -]New value: +[
        +  "maintainerUsername",
        +  "npmscanUrl",
        +  "npmProfileUrl",
        +  "avatarUrl",
        +  "totalPackagesFound",
        +  "packagesReturned",
        +  "resultsTruncated",
        +  "clusterWindowHours",
        +  "packages",
        +  "clusters",
        +  "findings",
        +  "totalScore",
        +  "riskTier",
        +  "note"
        +]
    • Changedget_latest_advisories3 fields changed
      • addedInput schema / properties / type
        Added value: +{
        +  "description": "Advisory source: \"reviewed\" (curated CVE-style, default) or \"malware\" (known-malicious packages)",
        +  "enum": [
        +    "reviewed",
        +    "malware"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / type
        Added value: +{
        +  "enum": [
        +    "reviewed",
        +    "malware"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "severity",
        -  "category",
        -  "direction",
        -  "nextCursor",
        -  "advisories"
        -]New value: +[
        +  "type",
        +  "severity",
        +  "category",
        +  "direction",
        +  "nextCursor",
        +  "advisories"
        +]
    • Changedget_maintainer_profile2 fields changed
      • addedOutput schema / properties / npmscanUrl
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "maintainerUsername",
        -  "npmProfileUrl",
        -  "avatarUrl",
        -  "totalPackagesFound",
        -  "packagesReturned",
        -  "resultsTruncated",
        -  "currentlyMaintainsCount",
        -  "totalWeeklyDownloads",
        -  "totalDependents",
        -  "packages",
        -  "note"
        -]New value: +[
        +  "maintainerUsername",
        +  "npmscanUrl",
        +  "npmProfileUrl",
        +  "avatarUrl",
        +  "totalPackagesFound",
        +  "packagesReturned",
        +  "resultsTruncated",
        +  "currentlyMaintainsCount",
        +  "totalWeeklyDownloads",
        +  "totalDependents",
        +  "packages",
        +  "note"
        +]
    • Changedquery_vulnerabilities3 fields changed
      • addedOutput schema / properties / existenceCheckNote
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / packageExists
        Added value: +{
        +  "type": [
        +    "boolean",
        +    "null"
        +  ]
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "package",
        -  "version",
        -  "npmscanUrl",
        -  "isVulnerable",
        -  "highestSeverity",
        -  "vulnerabilities"
        -]New value: +[
        +  "package",
        +  "version",
        +  "npmscanUrl",
        +  "packageExists",
        +  "existenceCheckNote",
        +  "isVulnerable",
        +  "highestSeverity",
        +  "vulnerabilities"
        +]
  10. 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"
        +]
  11. 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"
        +]
  12. 1 tool update
    • Addedget_maintainer_profile
  13. 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"
        -]
  14. 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"
        +]
  15. 1 tool update
    • Addedenrich_npm_audit
  16. 1 tool update
    • Addedgenerate_sbom

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Enables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.
    16
    22 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Browse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources