Skip to main content
Glama

dep-diff-mcp

MCP server that translates a lockfile diff into a human-readable upgrade plan.

Point your AI assistant (Cursor, Claude Desktop, Claude Code) at a Dependabot PR, npm outdated output, or any pair of package versions, and get back a ranked upgrade plan: semver class, breaking changes pulled from GitHub release notes, CVEs fixed in the range, migration guide links, and a clear recommendation per package.

What it looks like

Ask your assistant, in plain language:

Is it safe to bump lodash from 4.17.20 to 4.17.21?

It calls analyze_package_change and gets back:

{
  "package": "lodash",
  "ecosystem": "npm",
  "fromVersion": "4.17.20",
  "toVersion": "4.17.21",
  "semverClass": "patch",
  "repoUrl": "https://github.com/lodash/lodash",
  "releaseCount": 0,
  "breakingChanges": [],
  "securityFixes": [
    {
      "id": "GHSA-29mw-wpgm-hmr9",
      "summary": "Regular Expression Denial of Service (ReDoS) in lodash",
      "severity": "MODERATE"
    },
    {
      "id": "GHSA-35jh-r3h4-6jhm",
      "summary": "Command Injection in lodash",
      "severity": "HIGH"
    }
  ],
  "migrationLinks": [],
  "recommendation": "RECOMMENDED: 2 security fix(es) (incl. high/critical).",
  "recommendationLevel": "security"
}

A patch bump you would normally merge without looking. It closes a HIGH-severity command injection. That is the case this server exists for.

GitHub Actions

Dependabot opens more actions/* pull requests than almost anything else, and its scheduled version updates carry no advisory data. Ask:

Is it safe to bump tj-actions/changed-files from 45.0.7 to 46.0.1?

{
  "package": "tj-actions/changed-files",
  "ecosystem": "github-actions",
  "semverClass": "major",
  "repoUrl": "https://github.com/tj-actions/changed-files",
  "securityFixes": [
    {
      "id": "GHSA-mrrh-fwg8-r2c3",
      "summary": "tj-actions changed-files through 45.0.7 allows remote attackers to discover secrets",
      "severity": "HIGH"
    }
  ],
  "recommendation": "RECOMMENDED: 1 security fix(es) (incl. high/critical).",
  "recommendationLevel": "security"
}

A whole Dependabot batch

Here's my Dependabot PR — what's actually risky in it?

analyze_packages_bulk takes up to 50 changes at once and ranks them security > caution > review > likely-safe > safe:

{
  "totalPackages": 5,
  "bySemverClass": { "major": 1, "minor": 3, "patch": 1 },
  "securityFixesTotal": 7,
  "packagesWithBreakingChanges": 1,
  "packages": [ /* one entry per package, same shape as above */ ]
}

Condensing the recommendation field of each entry, that batch comes back in this order:

Package

Change

Class

Verdict

lodash

4.17.20 → 4.17.21

patch

RECOMMENDED — 2 security fixes (incl. high/critical)

axios

1.6.0 → 1.7.9

minor

RECOMMENDED — 1 security fix (incl. high/critical)

express

4.18.2 → 5.0.0

major

RECOMMENDED — 2 security fixes; 3 breaking changes, migration guide

requests (PyPI)

2.31.0 → 2.32.0

minor

RECOMMENDED — 2 security fixes

typescript

5.3.3 → 5.4.5

minor

LIKELY SAFE — minor version, additive changes per semver

Note the ordering: the patch bump outranks the major one. Semver tells you how much changed; it does not tell you what is urgent.

Every response above is real output from the hosted instance, trimmed only where marked.

Related MCP server: upgrade-pilot-mcp

Install

Claude Code

One command, user scope (available in every project):

claude mcp add -s user dep-diff -- npx -y @digicatalyst/dep-diff-mcp

Project scope (writes .mcp.json at repo root, team-shared):

claude mcp add -s project dep-diff -- npx -y @digicatalyst/dep-diff-mcp

With an explicit token (skip this if you have the gh CLI authenticated — see GitHub token below):

claude mcp add -s user --env GITHUB_TOKEN=ghp_xxx dep-diff -- npx -y @digicatalyst/dep-diff-mcp

Verify:

claude mcp list

Restart the Claude Code session to pick up the server.

Cursor and Claude Desktop

Add to your MCP client config:

  • Cursor: ~/.cursor/mcp.json

  • Claude Desktop: ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)

{
  "mcpServers": {
    "dep-diff": {
      "command": "npx",
      "args": ["-y", "@digicatalyst/dep-diff-mcp"]
    }
  }
}

Restart your MCP client. Ask something like "what's risky in this Dependabot PR?" and the tools are invoked automatically.

Hosted remote (no install)

A hosted instance runs at https://dep-diff.digicatalyst.ca/mcp over streamable HTTP, so you can skip the npm package entirely:

claude mcp add -s user -t http dep-diff https://dep-diff.digicatalyst.ca/mcp

Or in a client config:

{
  "mcpServers": {
    "dep-diff": {
      "type": "http",
      "url": "https://dep-diff.digicatalyst.ca/mcp"
    }
  }
}

The hosted instance authenticates to GitHub with its own token, so release-note lookups work at full rate limits without you configuring anything. Pass ?githubToken=ghp_xxx on the URL only if you would rather requests counted against your own GitHub quota. It is stateless and keeps no logs of your queries — see PRIVACY.md. Run the npm package locally instead if you would rather your token never leave your machine.

The same instance is also listed on Smithery, which proxies to it through their gateway.

The server hits the GitHub API to read release notes. Without a token you get 60 requests per hour (GitHub's anonymous limit) — enough for occasional single-package queries, not enough for bulk lockfile analysis.

The server resolves a token in this order:

  1. GITHUB_TOKEN environment variable, if set.

  2. gh auth token — if the GitHub CLI is installed and authenticated, the server uses that token automatically. No config change needed.

  3. Anonymous (60 req/hr).

If you already have gh installed (brew install gh && gh auth login), stop here — the server picks up your existing auth. No plaintext token anywhere.

Alternative: environment variable

Create a fine-grained token at https://github.com/settings/tokens:

  • Token name: dep-diff-mcp

  • Expiration: 90 days (rotate periodically)

  • Repository access: Public Repositories (read-only) — no private repo access

  • Permissions: none beyond the default public read — do not grant repo, workflow, user, or any write scope

Then reference it in the MCP config:

{
  "mcpServers": {
    "dep-diff": {
      "command": "npx",
      "args": ["-y", "@digicatalyst/dep-diff-mcp"],
      "env": { "GITHUB_TOKEN": "github_pat_xxx" }
    }
  }
}

Security notes

  • This config file lives on your disk in plaintext. Keep perms tight (chmod 600) and do not paste the token into AI chats, issues, or shared screens — transcripts are often retained.

  • The token in this config should be least-privilege (public repo read only). Even leaked, it can only read public data you could already read.

  • Rotate tokens periodically. Revoke any token that may have been exposed at https://github.com/settings/tokens.

  • The server never writes the token to stdout/stderr or the response payload.

Tools

analyze_package_change

Analyze one package upgrade. Inputs: ecosystem (npm, pypi, or github-actions), name, fromVersion, toVersion.

analyze_packages_bulk

Analyze up to 50 package upgrades in parallel. Returns packages ranked by risk (security > caution > review > likely-safe > safe), plus summary counts.

What you get back

  • Semver classification — major / minor / patch / downgrade / unknown

  • Breaking changes — extracted from GitHub release notes headers

  • Security fixes — CVEs present at fromVersion but resolved at toVersion (via OSV.dev)

  • Migration links — upgrade guide URLs found in release notes

  • Recommendation — single-line verdict + level

Both tools return this twice: as the JSON text block shown above, and as MCP structured content validated against a declared outputSchema. A client that supports structured output can read recommendationLevel or securityFixes[] straight off the response instead of re-parsing the text. Clients that don't are unaffected — the text block is unchanged.

Supported ecosystems

  • npm

  • PyPI

  • GitHub Actions — pass the action reference as the name (actions/checkout, or a nested github/codeql-action/init). An action reference is already a repository coordinate, so release notes and breaking changes resolve without a registry lookup, and bare major tags such as 4 -> 5 classify correctly.

Development

npm install
npm run build
GITHUB_TOKEN=ghp_xxx npm run inspect   # MCP Inspector

License

MIT

Available Tools

2 tools
analyze_package_changeAnalyze a single dependency version changeA
Read-onlyIdempotent
Inspect

Given one package and two versions (from -> to), returns a structured upgrade analysis: semver classification, GitHub release notes summary, detected breaking changes, security advisories fixed in the range, migration guide links, and a clear recommendation. Use when the user asks about a specific package upgrade ('what changed between react 18 and 19', 'is it safe to bump axios from 0.27 to 1.0', 'what does upgrading lodash 4.17.20 to 4.17.21 fix'). Supports npm, pypi, and github-actions (use the action reference as the name, e.g. actions/checkout). For analyzing many packages at once or a Dependabot batch, use analyze_packages_bulk instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesPackage name (e.g. 'react', 'requests')
ecosystemYesPackage ecosystem
toVersionYesTarget version (e.g. '19.0.0')
fromVersionYesCurrent version (e.g. '18.2.0')

Output Schema

ParametersJSON Schema
NameRequiredDescription
packageYesPackage name that was analyzed
repoUrlYesSource repository URL, or null when none could be resolved
ecosystemYesPackage ecosystem
toVersionYesVersion being upgraded to
fromVersionYesVersion being upgraded from
semverClassYesSemver relationship between the two versions
releaseCountYesNumber of GitHub releases found strictly between the two versions
securityFixesYesAdvisories affecting fromVersion that are resolved at toVersion
migrationLinksYesMigration or upgrade guide URLs found in release notes
recommendationYesSingle-line verdict explaining the recommendation level
breakingChangesYesBreaking changes extracted from release notes; empty when none were found
releaseExcerptsNoRaw release-note excerpts, present only as a fallback when a major/minor bump yielded no breaking changes
recommendationLevelYesRisk classification, used to rank packages in bulk results

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint, openWorldHint, idempotentHint, destructiveHint=false). The description adds non-redundant behavioral context: it specifies the structured analysis contents, including semver classification, breaking-change detection, security advisories, and migration links. It also discloses ecosystem-specific naming behavior for github-actions, which is useful behavioral nuance beyond what annotations express.

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 front-loaded with the primary behavior, then moves through triggers, supported ecosystems, and alternative routing. Every sentence earns its place: the output list sets expectations, the example queries illustrate intent, the ecosystem note prevents mis-use, and the sibling reference prevents mis-routing. The only minor redundancy is repeating 'single package' already in the title, but it reinforces scope.

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

Completeness5/5

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

With an output schema present and safety annotations covering side effects, the description leaves no critical gap. It explains what the tool returns, exactly when to invoke it, which ecosystems are supported, how to write the name for github-actions, and when to prefer the bulk sibling. An agent has everything necessary to select and invoke this tool correctly.

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

Parameters4/5

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

Schema description coverage is 100% and all four parameters have clear descriptions with examples, so the schema carries most of the burden. The description adds one genuinely useful parameter nuance beyond the schema: for github-actions, the name parameter should use the action reference like 'actions/checkout'. No other parameter semantics are added, so a 4 rather than 5 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 precise verb-resource pairing: 'Given one package and two versions... returns a structured upgrade analysis' and enumerates the concrete outputs (semver classification, release notes, breaking changes, advisories, migration links, recommendation). It also explicitly distinguishes itself from the sibling by describing what analyze_packages_bulk is for, so an agent can tell them apart 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?

Provides explicit usage criteria: 'Use when the user asks about a specific package upgrade' followed by three concrete example queries. It also states the exclusion condition: 'For analyzing many packages at once or a Dependabot batch, use analyze_packages_bulk instead.' This gives clear when-to-use and when-not-to-use guidance with an alternative.

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

analyze_packages_bulkAnalyze multiple dependency changes in parallelA
Read-onlyIdempotent
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
changesYesList of package changes to analyze

Output Schema

ParametersJSON Schema
NameRequiredDescription
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

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already provide readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description is consistent with them. It adds useful behavioral context beyond the annotations by disclosing parallel execution and the 50-package limit with chunking guidance.

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 three front-loaded sentences with no filler: purpose and result first, usage triggers second, output summary and limit third. Every sentence earns its place and the structure makes the tool easy to evaluate quickly.

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 annotations covering safety, a single parameter with full schema coverage, and an output schema, the description is complete. It covers purpose, result contents, common input sources, and the chunking limit. The only minor omission is an explicit pointer to the singular sibling, but the plural focus makes that implicit.

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?

With schema description coverage at 100%, the schema already explains the single 'changes' parameter and its structure. The description reinforces the bulk nature and the 50-package limit, but it does not add new semantic detail about the parameter fields themselves, so the baseline score of 3 is appropriate.

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

Purpose4/5

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

The description clearly states a specific verb, resource, and result: it analyzes a list of package upgrades in parallel and returns a unified risk report with packages ranked by recommendation level. It distinguishes itself from the sibling analyze_package_change through its explicit plural/bulk focus, though it does not name the sibling directly.

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 explicit when-to-use guidance by listing concrete triggers: Dependabot PR, npm outdated output, lockfile diff, or batch upgrade. It does not explicitly state when not to use it or mention the singular alternative, so it stops short of a full 5.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 2 tool updatesv0.3.2
    • Changedanalyze_package_change2 fields changed
      • changedInput schema / 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": {
        +    "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"
        +}
    • Changedanalyze_packages_bulk2 fields changed
      • 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. 2 tool updatesv0.1.1
    • First observedanalyze_package_change
    • First observedanalyze_packages_bulk

TDQS

A4.4/5.0
Disambiguation5/5

The two tools are clearly separated by scope: one handles a single package upgrade, the other handles multiple packages in bulk. Each description explicitly references the other, so an agent can unambiguously choose based on input size.

Naming Consistency5/5

Both tools follow the same analyze_package_* pattern, with the singular 'change' and plural 'bulk' clearly differentiating them. This is a consistent and predictable verb_noun convention.

Tool Count4/5

Two tools is minimal, but the server's narrow purpose of dependency upgrade analysis is well served by one individual and one bulk entry point. It is slightly thin but not unreasonable for the domain.

Completeness4/5

The pair covers both single-package and multi-package analysis, which covers most workflows. A minor gap is the lack of direct lockfile/diff parsing, but users can supply the package list from those sources.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    AI-powered dependency vulnerability and breaking change analyzer that scans dependencies, identifies vulnerabilities via OSV.dev, and uses AI to assess real impact and suggest fixes.
    3
    Apache 2.0
  • A
    license
    B
    quality
    D
    maintenance
    Enables AI agents to safely upgrade JavaScript and TypeScript projects through dependency analysis, upgrade path detection, breaking change identification, codemod application, and PR summary generation.
    14
    19
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/DigiCatalyst-Systems/dep-diff-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server