Skip to main content
Glama

Analyze multiple dependency changes in parallel

analyze_packages_bulk
Read-onlyIdempotent

Batch-analyze up to 50 package upgrades to get a unified risk report ranked by security, caution, review, likely-safe, and safe, with breaking changes and CVEs.

Instructions

Analyzes a list of package upgrades in parallel and returns a unified risk report with packages ranked by recommendation level (security > caution > review > likely-safe > safe). Use when the user provides many dependency changes from a Dependabot PR, npm outdated output, lockfile diff, or batch upgrade. Returns: total count, breakdown by semver class, total security fixes found, packages with breaking changes, and per-package details. Limit 50 packages per call (chunk larger lists).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
changesYesList of package changes to analyze

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
packagesYesPer-package results, ranked security > caution > review > likely-safe > safe
bySemverClassYesBreakdown of the batch by semver class
totalPackagesYesNumber of package changes submitted
securityFixesTotalYesTotal security advisories resolved across the whole batch
packagesWithBreakingChangesYesHow many packages had at least one breaking change

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changedv0.3.2
    • changedInput schema / properties / changes / items / properties / ecosystem / enum
      Previous value: -[
      -  "npm",
      -  "pypi"
      -]New value: +[
      +  "npm",
      +  "pypi",
      +  "github-actions"
      +]
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "bySemverClass": {
      +      "additionalProperties": false,
      +      "description": "Breakdown of the batch by semver class",
      +      "properties": {
      +        "major": {
      +          "description": "Count of major bumps",
      +          "type": "number"
      +        },
      +        "minor": {
      +          "description": "Count of minor bumps",
      +          "type": "number"
      +        },
      +        "patch": {
      +          "description": "Count of patch bumps",
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "major",
      +        "minor",
      +        "patch"
      +      ],
      +      "type": "object"
      +    },
      +    "packages": {
      +      "description": "Per-package results, ranked security > caution > review > likely-safe > safe",
      +      "items": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "breakingChanges": {
      +                "description": "Breaking changes extracted from release notes; empty when none were found",
      +                "items": {
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              },
      +              "ecosystem": {
      +                "description": "Package ecosystem",
      +                "enum": [
      +                  "npm",
      +                  "pypi",
      +                  "github-actions"
      +                ],
      +                "type": "string"
      +              },
      +              "fromVersion": {
      +                "description": "Version being upgraded from",
      +                "type": "string"
      +              },
      +              "migrationLinks": {
      +                "description": "Migration or upgrade guide URLs found in release notes",
      +                "items": {
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              },
      +              "package": {
      +                "description": "Package name that was analyzed",
      +                "type": "string"
      +              },
      +              "recommendation": {
      +                "description": "Single-line verdict explaining the recommendation level",
      +                "type": "string"
      +              },
      +              "recommendationLevel": {
      +                "description": "Risk classification, used to rank packages in bulk results",
      +                "enum": [
      +                  "safe",
      +                  "likely-safe",
      +                  "review",
      +                  "caution",
      +                  "security"
      +                ],
      +                "type": "string"
      +              },
      +              "releaseCount": {
      +                "description": "Number of GitHub releases found strictly between the two versions",
      +                "type": "number"
      +              },
      +              "releaseExcerpts": {
      +                "description": "Raw release-note excerpts, present only as a fallback when a major/minor bump yielded no breaking changes",
      +                "items": {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "excerpt": {
      +                      "description": "Short excerpt of the release notes",
      +                      "type": "string"
      +                    },
      +                    "tag": {
      +                      "description": "Release tag the excerpt came from",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "tag",
      +                    "excerpt"
      +                  ],
      +                  "type": "object"
      +                },
      +                "type": "array"
      +              },
      +              "repoUrl": {
      +                "description": "Source repository URL, or null when none could be resolved",
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "securityFixes": {
      +                "description": "Advisories affecting fromVersion that are resolved at toVersion",
      +                "items": {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "id": {
      +                      "description": "Advisory identifier (e.g. 'GHSA-29mw-wpgm-hmr9' or a CVE)",
      +                      "type": "string"
      +                    },
      +                    "severity": {
      +                      "description": "Severity as reported by OSV (e.g. 'LOW', 'MODERATE', 'HIGH', 'CRITICAL')",
      +                      "type": "string"
      +                    },
      +                    "summary": {
      +                      "description": "One-line description of the advisory",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "id",
      +                    "summary",
      +                    "severity"
      +                  ],
      +                  "type": "object"
      +                },
      +                "type": "array"
      +              },
      +              "semverClass": {
      +                "description": "Semver relationship between the two versions",
      +                "enum": [
      +                  "major",
      +                  "minor",
      +                  "patch",
      +                  "downgrade",
      +                  "unknown"
      +                ],
      +                "type": "string"
      +              },
      +              "toVersion": {
      +                "description": "Version being upgraded to",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "package",
      +              "ecosystem",
      +              "fromVersion",
      +              "toVersion",
      +              "semverClass",
      +              "repoUrl",
      +              "releaseCount",
      +              "breakingChanges",
      +              "securityFixes",
      +              "migrationLinks",
      +              "recommendation",
      +              "recommendationLevel"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "error": {
      +                "description": "Why the analysis could not be completed",
      +                "type": "string"
      +              },
      +              "package": {
      +                "description": "Package name whose analysis failed",
      +                "type": "string"
      +              },
      +              "recommendationLevel": {
      +                "const": "review",
      +                "description": "Always 'review' — a package that could not be analyzed cannot be cleared automatically",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "package",
      +              "error",
      +              "recommendationLevel"
      +            ],
      +            "type": "object"
      +          }
      +        ]
      +      },
      +      "type": "array"
      +    },
      +    "packagesWithBreakingChanges": {
      +      "description": "How many packages had at least one breaking change",
      +      "type": "number"
      +    },
      +    "securityFixesTotal": {
      +      "description": "Total security advisories resolved across the whole batch",
      +      "type": "number"
      +    },
      +    "totalPackages": {
      +      "description": "Number of package changes submitted",
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "totalPackages",
      +    "bySemverClass",
      +    "securityFixesTotal",
      +    "packagesWithBreakingChanges",
      +    "packages"
      +  ],
      +  "type": "object"
      +}
  2. First observedv0.1.1

TDQS

A4.5/5.0
Behavior5/5

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

The description adds substantial behavioral detail beyond the annotations: it discloses parallel execution, the unified risk report structure, the explicit recommendation ordering (security > caution > review > likely-safe > safe), the returned aggregates, and the 50-package limit with a chunking instruction. The readOnlyHint, openWorldHint, and idempotentHint are already provided by annotations, and the description does not contradict them. This is a strong, transparent behavioral profile.

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 tightly structured: purpose first, then use case, then return content, then a practical limit. It is four sentences with no filler, and every sentence adds information an agent needs to invoke correctly or set expectations. The limit and chunking guidance is efficiently placed at the end.

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

Completeness5/5

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

For a tool with one well-schematized parameter, a rich output schema, and annotations covering safety and idempotency, the description is complete. It covers what the tool does, common triggers, output content, and operational constraints (parallel, 50-item limit, chunking). Nothing an agent needs to decide between this and the singular sibling is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3; the schema already documents the 'changes' array and the ecosystem enum. The description adds contextual color by calling the items 'package upgrades' and referencing batch sources, but it does not add significant semantic detail about the fromVersion or toVersion fields, which remain self-explanatory. This meets the adequate threshold without exceeding the schema-driven baseline.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Analyzes a list of package upgrades in parallel and returns a unified risk report with packages ranked by recommendation level.' It clearly distinguishes itself from the singular sibling tool by explicitly targeting 'many dependency changes' and listing concrete batch sources like Dependabot PRs, npm outdated output, lockfile diffs, and batch upgrades. The ranking order further clarifies the tool's specific output, leaving no ambiguity about what it does.

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

Usage Guidelines4/5

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

The description gives clear when-to-use context: 'Use when the user provides many dependency changes from a Dependabot PR, npm outdated output, lockfile diff, or batch upgrade.' This strongly implies that single changes belong to the sibling analyze_package_change tool, but it does not explicitly name the alternative or state a when-not condition. That is a clear usage context without formal exclusions, so it misses the top score only slightly.

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

Deploy Server

Other Tools