Check PyPI and npm upgrades: known vulnerabilities, the safe version, and what each upgrade breaks.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Before building on Alpine, Linux ARM, Windows ARM, a Mac or Lambda, checks which npm dependencies contain native code and whether a prebuilt binary exists for the target platform. For those that would compile from source (needing a C/C++ toolchain and Python) or fail, gives the nearest newer version that ships a prebuilt for that platform, with that upgrade's risk.
Target platform: os-cpu[-libc], e.g. linux-x64-glibc, linux-arm64-musl, darwin-arm64, win32-arm64; or alpine, alpine-arm64, linux, linux-arm64, lambda, lambda-arm64, windows, win-arm64, mac, mac-intel
The project's dependencies: the contents of package-lock.json (best), package.json, or one 'name@version' per line
Max breaking changes shown for each suggested fix
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http developer-tools https://api.wiscolabs.dev/mcp/dev
Before building on Alpine, Linux ARM, Windows ARM, a Mac or Lambda, checks which npm dependencies contain native code and whether a prebuilt binary exists for the target platform. For those that would compile from source (needing a C/C++ toolchain and Python) or fail, gives the nearest newer version that ships a prebuilt for that platform, with that upgrade's risk.
| Argument | Type | Description |
|---|---|---|
| limit | string | Max breaking changes shown for each suggested fix |
| platform* | string | Target platform: os-cpu[-libc], e.g. linux-x64-glibc, linux-arm64-musl, darwin-arm64, win32-arm64; or alpine, alpine-arm64, linux, linux-arm64, lambda, lambda-arm64, windows, win-arm64, mac, mac-intel |
| requirements* | string | The project's dependencies: the contents of package-lock.json (best), package.json, or one 'name@version' per line |
{
"type": "object",
"required": [
"platform",
"requirements"
],
"properties": {
"limit": {
"type": "string",
"default": "5",
"description": "Max breaking changes shown for each suggested fix"
},
"platform": {
"type": "string",
"examples": [
"alpine-arm64"
],
"description": "Target platform: os-cpu[-libc], e.g. linux-x64-glibc, linux-arm64-musl, darwin-arm64, win32-arm64; or alpine, alpine-arm64, linux, linux-arm64, lambda, lambda-arm64, windows, win-arm64, mac, mac-intel"
},
"requirements": {
"type": "string",
"examples": [
"[email protected]\[email protected]"
],
"description": "The project's dependencies: the contents of package-lock.json (best), package.json, or one 'name@version' per line"
}
}
}Before moving a project to a new Node.js version (e.g. off Node 20 to 22 or 24), checks each npm dependency's declared Node support (its engines field). For each that doesn't support the target, gives the smallest newer release that does, with that upgrade's risk. Works from a package-lock.json without installing anything.
| Argument | Type | Description |
|---|---|---|
| node* | string | Target Node.js version: a major like 24 (means the latest 24.x) or an exact 22.11.0 |
| limit | string | Max breaking changes shown for each suggested fix |
| requirements* | string | The project's dependencies: the contents of package-lock.json (best), package.json, or one 'name@version' per line |
{
"type": "object",
"required": [
"node",
"requirements"
],
"properties": {
"node": {
"type": "string",
"examples": [
"24"
],
"description": "Target Node.js version: a major like 24 (means the latest 24.x) or an exact 22.11.0"
},
"limit": {
"type": "string",
"default": "5",
"description": "Max breaking changes shown for each suggested fix"
},
"requirements": {
"type": "string",
"examples": [
"[email protected]\[email protected]"
],
"description": "The project's dependencies: the contents of package-lock.json (best), package.json, or one 'name@version' per line"
}
}
}Latest and latest stable version, repository, release count, and where its release notes come from.
| Argument | Type | Description |
|---|---|---|
| name* | string | Package name |
| ecosystem | string | PyPI or npm |
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"examples": [
"flask"
],
"description": "Package name"
},
"ecosystem": {
"type": "string",
"default": "PyPI",
"description": "PyPI or npm"
}
}
}Before upgrading a core npm package (react, typescript, eslint, vite...), checks every dependency in the project that declares it as a peer dependency: does the installed version accept the new version, and if not, the smallest release that does, with that upgrade's risk. Also checks the new version's own peer requirements against what's installed. Answers the questions behind npm's ERESOLVE errors without running npm.
| Argument | Type | Description |
|---|---|---|
| limit | string | Max breaking changes shown for each suggested fix |
| upgrade* | string | The package and version to upgrade to: react@19 (newest stable 19.x), [email protected] (exact), or react (latest stable) |
| requirements* | string | The project's dependencies: the contents of package-lock.json (best), package.json, or one 'name@version' per line |
{
"type": "object",
"required": [
"upgrade",
"requirements"
],
"properties": {
"limit": {
"type": "string",
"default": "5",
"description": "Max breaking changes shown for each suggested fix"
},
"upgrade": {
"type": "string",
"examples": [
"react@19"
],
"description": "The package and version to upgrade to: react@19 (newest stable 19.x), [email protected] (exact), or react (latest stable)"
},
"requirements": {
"type": "string",
"examples": [
"[email protected]\[email protected]\[email protected]"
],
"description": "The project's dependencies: the contents of package-lock.json (best), package.json, or one 'name@version' per line"
}
}
}For a TypeScript project: which dependencies ship their own type declarations, which need a DefinitelyTyped @types package (and the version that matches the installed library), and which installed @types packages describe a different major version than the library.
| Argument | Type | Description |
|---|---|---|
| requirements* | string | The project's dependencies, including any @types packages: the contents of package-lock.json (best), package.json, or one 'name@version' per line |
{
"type": "object",
"required": [
"requirements"
],
"properties": {
"requirements": {
"type": "string",
"examples": [
"[email protected]\n@types/[email protected]\[email protected]"
],
"description": "The project's dependencies, including any @types packages: the contents of package-lock.json (best), package.json, or one 'name@version' per line"
}
}
}Give it a project's dependencies: a requirements.txt or pip freeze output for Python, or a package-lock.json, package.json, or name@version lines for npm. Flags malicious packages and versions with known vulnerabilities (with the smallest safe version to move to, preferring a low-risk patch), then reports what each upgrade breaks, removes, or deprecates, ranked into remove_now / fix_now / no_fix_available / upgrade_first / safe / review / needs_care.
| Argument | Type | Description |
|---|---|---|
| limit | string | Max items shown per category for each package |
| ecosystem | string | PyPI or npm. A package.json or package-lock.json is recognized as npm automatically. |
| requirements* | string | Python: requirements.txt contents, one 'package==version' per line. npm: the contents of package-lock.json (best), package.json, or one 'name@version' per line. Lines without one exact version are listed but can't be assessed. |
{
"type": "object",
"required": [
"requirements"
],
"properties": {
"limit": {
"type": "string",
"default": "5",
"description": "Max items shown per category for each package"
},
"ecosystem": {
"type": "string",
"default": "PyPI",
"description": "PyPI or npm. A package.json or package-lock.json is recognized as npm automatically."
},
"requirements": {
"type": "string",
"examples": [
"flask==2.3.3\nrequests==2.31.0\npydantic==1.10.13"
],
"description": "Python: requirements.txt contents, one 'package==version' per line. npm: the contents of package-lock.json (best), package.json, or one 'name@version' per line. Lines without one exact version are listed but can't be assessed."
}
}
}Is this exact version of a package affected by known security advisories? Returns each vulnerability (with CVE ids and severity), the versions that fix it, and the smallest safe upgrade.
| Argument | Type | Description |
|---|---|---|
| name* | string | Package name |
| version* | string | The exact version you're using |
| ecosystem | string | Package ecosystem (OSV naming) |
{
"type": "object",
"required": [
"name",
"version"
],
"properties": {
"name": {
"type": "string",
"examples": [
"urllib3"
],
"description": "Package name"
},
"version": {
"type": "string",
"examples": [
"1.26.18"
],
"description": "The exact version you're using"
},
"ecosystem": {
"type": "string",
"default": "PyPI",
"description": "Package ecosystem (OSV naming)"
}
}
}What breaks, gets removed, is deprecated, or gains a security fix when upgrading one package between two versions, with an overall upgrade risk.
| Argument | Type | Description |
|---|---|---|
| to* | string | The version you want to upgrade to (use latest_version from package_info if unsure) |
| from* | string | The version you're on now |
| name* | string | Package name, e.g. flask (PyPI) or express or @babel/core (npm) |
| limit | string | Max items shown per category |
| ecosystem | string | PyPI or npm |
{
"type": "object",
"required": [
"name",
"from",
"to"
],
"properties": {
"to": {
"type": "string",
"examples": [
"3.1.3"
],
"description": "The version you want to upgrade to (use latest_version from package_info if unsure)"
},
"from": {
"type": "string",
"examples": [
"2.3.3"
],
"description": "The version you're on now"
},
"name": {
"type": "string",
"examples": [
"flask"
],
"description": "Package name, e.g. flask (PyPI) or express or @babel/core (npm)"
},
"limit": {
"type": "string",
"default": "15",
"description": "Max items shown per category"
},
"ecosystem": {
"type": "string",
"default": "PyPI",
"description": "PyPI or npm"
}
}
}For each pinned Python package, whether a prebuilt wheel exists for a target Python version and platform (Windows ARM, Alpine/musl, Linux ARM, macOS, a new Python version). Without one, pip builds from source, which usually fails without a compiler for packages with C extensions. For each that's missing, gives the nearest newer version that has a wheel, with that upgrade's risk.
| Argument | Type | Description |
|---|---|---|
| limit | string | Max breaking changes shown for each suggested upgrade |
| python* | string | Target Python version, e.g. 3.13 |
| platform* | string | Target platform: manylinux_x86_64 or manylinux_aarch64 (glibc Linux, e.g. Debian/Ubuntu; assumes glibc 2.36, or give an exact tag like manylinux_2_28_x86_64), musllinux_x86_64 or musllinux_aarch64 (Alpine), win_amd64, win_arm64, win32, macosx_arm64, macosx_x86_64 |
| requirements* | string | requirements.txt contents or pip freeze output, one 'package==version' per line |
{
"type": "object",
"required": [
"requirements",
"python",
"platform"
],
"properties": {
"limit": {
"type": "string",
"default": "5",
"description": "Max breaking changes shown for each suggested upgrade"
},
"python": {
"type": "string",
"examples": [
"3.13"
],
"description": "Target Python version, e.g. 3.13"
},
"platform": {
"type": "string",
"examples": [
"win_arm64"
],
"description": "Target platform: manylinux_x86_64 or manylinux_aarch64 (glibc Linux, e.g. Debian/Ubuntu; assumes glibc 2.36, or give an exact tag like manylinux_2_28_x86_64), musllinux_x86_64 or musllinux_aarch64 (Alpine), win_amd64, win_arm64, win32, macosx_arm64, macosx_x86_64"
},
"requirements": {
"type": "string",
"examples": [
"numpy==1.26.4\npsycopg2==2.9.9\nrequests==2.31.0"
],
"description": "requirements.txt contents or pip freeze output, one 'package==version' per line"
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 4, 2026.