Skip to content

Upgrade Brief

by upgrade-brief.shopttyass-85f.workers.dev · remote · no sign-in to list tools · v0.3.0 · published by dev.workers.shopttyass-85f.upgrade-brief

Breaking changes and changelogs between two npm or PyPI package versions, from real release notes.

Final · 4Changes · 3

7 tools: 4 do something that can't be undone and 3 change things.

Scanned Oct 22, 2026

4 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http upgrade-brief https://upgrade-brief.shopttyass-85f.workers.dev/mcp

Findings

Matches of fixed checks, with the text they matched.

4 warn
  • The server marks "npm_breaking_changes" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

    Matched text

    annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}; The input addresses people (input.to): what it sends cannot be taken back.

    What this check looks for
  • The server marks "npm_changelog" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

    Matched text

    annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}; The input addresses people (input.to): what it sends cannot be taken back.

    What this check looks for
  • The server marks "pypi_breaking_changes" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

    Matched text

    annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}; The input addresses people (input.to): what it sends cannot be taken back.

    What this check looks for
  • The server marks "pypi_changelog" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

    Matched text

    annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}; The input addresses people (input.to): what it sends cannot be taken back.

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

7 tools

Can't be undone 4Claude Code: ask
  • npm_breaking_changesnpm breaking changes between two versions of a package, read from its real CHANGELOG and GitHub release notes: documented breaking items per version, major bumps, Node.js engine / …Reads text others writeCan send data out1 finding

    Why it is in this group

    • The input addresses people (input.to): what it sends cannot be taken back.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    • outboundThe input takes a destination (input.to): what the tool writes goes there.

    Findings

    • Warn

      The server marks "npm_breaking_changes" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

      Matched text

      annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}; The input addresses people (input.to): what it sends cannot be taken back.

      What this check looks for
    Description, as the server wrote it
    npm breaking changes between two versions of a package, read from its real CHANGELOG and GitHub release notes: documented breaking items per version, major bumps, Node.js engine / ESM-CJS / peer dependency changes, migration guide links and a verdict. Paid: $0.005 USDC per call via x402.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: true
    • idempotentHint: true
  • npm_changelognpm changelog between two versions: full release notes of every version in the range (newest first), with dates, bump type, deprecations, extracted breaking changes and package.jso…Reads text others writeCan send data out1 finding

    Why it is in this group

    • The input addresses people (input.to): what it sends cannot be taken back.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    • outboundThe input takes a destination (input.to): what the tool writes goes there.

    Findings

    • Warn

      The server marks "npm_changelog" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

      Matched text

      annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}; The input addresses people (input.to): what it sends cannot be taken back.

      What this check looks for
    Description, as the server wrote it
    npm changelog between two versions: full release notes of every version in the range (newest first), with dates, bump type, deprecations, extracted breaking changes and package.json changes. Paid: $0.01 USDC per call via x402.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: true
    • idempotentHint: true
  • pypi_breaking_changesPyPI breaking changes between two versions of a Python package, from its CHANGELOG/HISTORY/CHANGES file and GitHub releases: breaking items per version, Requires-Python and depende…Reads text others writeCan send data out1 finding

    Why it is in this group

    • The input addresses people (input.to): what it sends cannot be taken back.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    • outboundThe input takes a destination (input.to): what the tool writes goes there.

    Findings

    • Warn

      The server marks "pypi_breaking_changes" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

      Matched text

      annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}; The input addresses people (input.to): what it sends cannot be taken back.

      What this check looks for
    Description, as the server wrote it
    PyPI breaking changes between two versions of a Python package, from its CHANGELOG/HISTORY/CHANGES file and GitHub releases: breaking items per version, Requires-Python and dependency changes, yanked versions, migration guide links and a verdict. Paid: $0.005 USDC per call via x402.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: true
    • idempotentHint: true
  • pypi_changelogPyPI changelog between two versions of a Python package: full release notes per version (newest first) with dates, bump type, yanked flags, extracted breaking changes and Requires-…Reads text others writeCan send data out1 finding

    Why it is in this group

    • The input addresses people (input.to): what it sends cannot be taken back.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    • outboundThe input takes a destination (input.to): what the tool writes goes there.

    Findings

    • Warn

      The server marks "pypi_changelog" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

      Matched text

      annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}; The input addresses people (input.to): what it sends cannot be taken back.

      What this check looks for
    Description, as the server wrote it
    PyPI changelog between two versions of a Python package: full release notes per version (newest first) with dates, bump type, yanked flags, extracted breaking changes and Requires-Python / dependency changes. Paid: $0.01 USDC per call via x402.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: true
    • idempotentHint: true
Changes things 3Claude Code: ask
  • dependency_upgrade_planDependency upgrade plan for up to 5 npm or PyPI packages: per package the breaking changes to the target version, major bumps, engine/Python and peer dependency changes, migration …Reads text others writeNo findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Dependency upgrade plan for up to 5 npm or PyPI packages: per package the breaking changes to the target version, major bumps, engine/Python and peer dependency changes, migration guides and a risk score, ordered by risk, plus peer requirements between the listed packages. Paid: $0.02 USDC per call via x402.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: true
    • idempotentHint: true
  • npm_versionsFree: published versions of an npm package (newest first) with publish dates, bump type and deprecations, to pick valid from/to values.Reads text others writeNo findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Free: published versions of an npm package (newest first) with publish dates, bump type and deprecations, to pick valid from/to values.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: true
    • idempotentHint: true
  • pypi_versionsFree: published versions of a PyPI project (newest first, PEP 440 order) with publish dates and bump type.Reads text others writeNo findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Free: published versions of a PyPI project (newest first, PEP 440 order) with publish dates and bump type.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: true
    • idempotentHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Exfil surface

Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.

No private-data, untrusted-input, outbound path in this server alone: no tool is tagged private-data.

Reads private data0
Reads files, mail, messages, databases, secrets, calendars or repositories.
Reads text others write7
Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
Can send data out4
Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.

Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.

Install

Pinned to version 0.3.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http upgrade-brief https://upgrade-brief.shopttyass-85f.workers.dev/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change or a way out, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [],
    "ask": [
      "mcp__upgrade-brief__npm_breaking_changes",
      "mcp__upgrade-brief__npm_changelog",
      "mcp__upgrade-brief__pypi_breaking_changes",
      "mcp__upgrade-brief__pypi_changelog",
      "mcp__upgrade-brief__dependency_upgrade_plan",
      "mcp__upgrade-brief__npm_versions",
      "mcp__upgrade-brief__pypi_versions"
    ],
    "deny": []
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as upgrade-brief. Review it before you use it.

Capability tags behind 7 rules
  • mcp__upgrade-brief__npm_breaking_changes untrusted-input, outbound
  • mcp__upgrade-brief__npm_changelog untrusted-input, outbound
  • mcp__upgrade-brief__pypi_breaking_changes untrusted-input, outbound
  • mcp__upgrade-brief__pypi_changelog untrusted-input, outbound
  • mcp__upgrade-brief__dependency_upgrade_plan untrusted-input
  • mcp__upgrade-brief__npm_versions untrusted-input
  • mcp__upgrade-brief__pypi_versions untrusted-input