Skip to main content
Glama
mervenor

eol-check-mcp

by mervenor

eol-check-mcp

An MCP (Model Context Protocol) server that lets an AI assistant answer one question well: is this project's stack still supported, and what should we upgrade first?

Give your assistant (Claude Desktop, Claude Code or any MCP client) a project's package.json, .csproj, requirements.txt, Dockerfile and similar files. It gets back every runtime and framework we can detect, each one's support status and end dates, a list sorted by urgency, and a one-paragraph summary in plain English.

  • Works offline: a dated snapshot of endoflife.date data ships with the server (487 products, 9,250 release cycles, data of 28 October 2026).

  • Answers for any date, not only today: "will .NET 8 still be supported on 11 November 2026?"

  • Read-only. It never touches your disk; the assistant passes file contents in.

  • Optional refresh command downloads newer data when you are online.

30-second example

You: Here are our Web.csproj, package.json, Dockerfile and docker-compose.yml. Is anything out of support?

Assistant (calls scan_project): On 28 October 2026 we found 4 components with a published support schedule in 4 files. 3 are past end of life: AngularJS 1.8 (ended 31 December 2021), PostgreSQL 12 (ended 21 November 2024) and Node.js 18 (ended 30 April 2025). 1 loses support within 90 days: ASP.NET Core on Microsoft .NET 8 on 10 November 2026. Upgrade AngularJS 1.8 first: it has had no security fixes for 1,762 days; the target is Angular 22.

  1. [critical] AngularJS 1.8 (LTS): end-of-life (support ends 2021-12-31)

  2. [critical] PostgreSQL 12: end-of-life (support ends 2024-11-21)

  3. [critical] Node.js 18 (LTS): end-of-life (support ends 2025-04-30)

  4. [high] ASP.NET Core on Microsoft .NET 8 (LTS): supported (support ends 2026-11-10)

That is real output from the bundled data, with the date fixed to 28 October 2026.

Related MCP server: Dependency Freshness MCP Server

Install

You need Node.js 20 or later. The package is not on npm yet, so build it from source:

git clone https://github.com/mervenor/eol-check-mcp.git
cd eol-check-mcp
npm install        # also builds dist/
node dist/index.js info

info prints the snapshot in use. In the configurations below, replace /absolute/path/to/eol-check-mcp with the folder you cloned into.

Claude Desktop

Open Settings → Developer → Edit Config and add the server to claude_desktop_config.json (on macOS ~/Library/Application Support/Claude/claude_desktop_config.json, on Windows %APPDATA%\Claude\claude_desktop_config.json):

{
  "mcpServers": {
    "eol-check": {
      "command": "node",
      "args": ["/absolute/path/to/eol-check-mcp/dist/index.js"]
    }
  }
}

On Windows, write the path with escaped backslashes, for example "C:\\tools\\eol-check-mcp\\dist\\index.js". Restart Claude Desktop afterwards.

Claude Code

claude mcp add eol-check -- node /absolute/path/to/eol-check-mcp/dist/index.js
claude mcp get eol-check

To share it with your team, add --scope project, or commit this .mcp.json at the project root:

{
  "mcpServers": {
    "eol-check": {
      "command": "node",
      "args": ["/absolute/path/to/eol-check-mcp/dist/index.js"]
    }
  }
}

Other MCP clients

Run node /absolute/path/to/eol-check-mcp/dist/index.js as a stdio server.

Tools

All four tools are read-only. Each returns a short text answer and the full result as structured JSON (structuredContent). Wherever a tool takes date (YYYY-MM-DD), it defaults to today.

list_products(query?, category?, limit?)

Finds product ids in the snapshot.

{ "query": "angular" }
2 products matching "angular":
- angular: Angular (framework)
- angularjs: AngularJS (framework)

get_cycles(product, date?, limit?)

Lists a product's release cycles, newest first, with release date, LTS flag, end of active support, end of security support, status, days remaining or overdue, and latest patch.

{ "product": "dotnet", "limit": 4 }
Microsoft .NET: 13 cycles tracked, 3 still supported on 28 October 2026. Recommended: Microsoft .NET 10 (LTS).

- 10 (LTS): supported, support ends 2028-11-14, latest 10.0.13
- 9: supported, support ends 2026-11-10, latest 9.0.21
- 8 (LTS): supported, support ends 2026-11-10, latest 8.0.32
- 7: end-of-life, support ends 2024-05-14, latest 7.0.20

check_version(product, version, date?)

Checks one version. It returns:

  • the status: supported, security-only, end-of-life or unknown;

  • the dates, plus days remaining or days overdue;

  • the latest patch in the cycle, the newest cycle and the recommended upgrade;

  • a successor product where one exists (AngularJS → Angular, .NET Framework → .NET).

Versions are accepted the way people write them: 8, 8.0.11, net8.0, net472, v4.6.2, v18.19.0, lts/hydrogen, 3.12, jammy.

{ "product": "angularjs", "version": "1.8.2" }
AngularJS 1.8 (LTS) reached end of life on 31 December 2021 (1,762 days ago). Extended Long Term
Support is still available. AngularJS (1.x) was replaced by Angular (2 and later), which is a
rewrite rather than an upgrade. Current target: Angular 22.
{ "product": "dotnet", "version": "net8.0", "date": "2026-11-11" }
Microsoft .NET 8 (LTS) reached end of life on 10 November 2026 (1 day ago). Recommended upgrade:
Microsoft .NET 10 (LTS), supported until 14 November 2028.

scan_project(files, date?)

Takes file contents and returns each detected runtime or framework with its status, sorted by urgency (critical = end of life, high = ends within 90 days, medium = security fixes only or ends within a year, low), the evidence (which file and line), caveats and a one-paragraph summary.

{
  "files": [
    { "path": "Web.csproj", "content": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">…<TargetFramework>net8.0</TargetFramework>…" },
    { "path": "package.json", "content": "{ \"dependencies\": { \"angular\": \"~1.8.2\" }, \"engines\": { \"node\": \">=18\" } }" },
    { "path": "Dockerfile", "content": "FROM node:18-alpine AS assets\nFROM mcr.microsoft.com/dotnet/aspnet:8.0" },
    { "path": "docker-compose.yml", "content": "services:\n  db:\n    image: postgres:12" }
  ]
}

The answer is the one shown in the 30-second example.

Files we read

Ecosystem

Files

Node.js and front end

package.json, package-lock.json / npm-shrinkwrap.json, angular.json, bower.json, .nvmrc, .node-version

.NET

*.csproj / *.vbproj / *.fsproj, Directory.Build.props, global.json, web.config, packages.config

Python

requirements*.txt, pyproject.toml (PEP 621 and Poetry), Pipfile, .python-version, runtime.txt

Containers

Dockerfile (FROM lines, build stages, ARG defaults), docker-compose*.yml / compose*.yaml (image: lines)

Other

.tool-versions

What we detect: Node.js; .NET (including .NET Core) and .NET Framework (3.5 SP1 to 4.8.1); ASP.NET Core (shares the .NET lifecycle) and classic ASP.NET MVC / Web API (follows .NET Framework); AngularJS; Angular; React; Next.js; Vue; Nuxt; Svelte; Ember; Express; Electron; jQuery; Bootstrap; Python; Django; and, from image tags, PostgreSQL, MySQL, MariaDB, Redis, MongoDB, nginx, PHP, Ruby, Go and base images (Debian, Ubuntu, Alpine).

Data

  • Source: endoflife.date, API v1 (/api/v1/products/full), downloaded on 28 October 2026.

  • Upstream commit: 794ba970f0e122feb390dc7e58b44522ed8b1754 of endoflife-date/endoflife.date. We rebuilt the snapshot from that commit's products/*.md front matter as a cross-check. Both sources agree on all 487 products and every support date across the 9,250 cycles.

  • Licence: MIT, © endoflife.date contributors. See NOTICE.

  • Checked facts: the bundled data shows .NET 8 and .NET 9 end of support on 10 November 2026, and AngularJS (every 1.x cycle) end of life on 31 December 2021. The test suite fails if a refresh changes either fact.

We store each date, not a yes/no flag, so status is worked out for whatever day you ask about. A support end date is the last supported day; .NET 8 counts as end of life from 11 November 2026.

Refreshing the data

node dist/index.js refresh                # API first, Git repository if the API is unreachable
node dist/index.js refresh --source git   # Git only (needs git on the PATH)
node dist/index.js info                   # which snapshot is in use

refresh writes to your user cache (~/.cache/eol-check-mcp/snapshot.json, or $XDG_CACHE_HOME). The server uses that copy when it is at least as new as the bundled one. Set EOL_CHECK_SNAPSHOT to use a specific file. Set EOL_CHECK_TODAY=YYYY-MM-DD to fix "today" for demos and tests.

Limits

  • The data has a date. Without refresh, answers reflect endoflife.date on 28 October 2026. Vendors move dates and new releases appear.

  • Some products publish no end date. React and .NET Framework 4.8 / 4.8.1 are examples. We report these as supported or security-only with "no end date published"; we do not guess one.

  • Ranges are read at their lowest version. "react": "^18.2.0" is checked as 18.2.0; add the lock file for the installed version. We read package-lock.json, but not yarn.lock or pnpm-lock.yaml yet.

  • Floating image tags such as mysql:8 are taken as the newest matching cycle (8.4) and flagged as floating. latest and lts tags are reported as notes, not guessed.

  • What we do not resolve: MSBuild properties beyond what Directory.Build.props sets directly, and transitive dependencies.

  • What we do not do: check vulnerabilities (CVEs), and we cannot see paid extended support you may have bought. When endoflife.date tracks extended support, we mention it, but we still count the version as end of life.

  • Unlisted products are ignored. A framework that endoflife.date does not track is not reported.

Development

npm install
npm test            # Vitest unit and end-to-end tests (fixed "today")
npm run eval        # 24-case evaluation set, deterministic, prints a score
npm run lint        # ESLint
npm run typecheck   # TypeScript, strict
npm run build       # compiles to dist/
npm run check       # all of the above
npm run snapshot    # maintainers: rebuild data/snapshot.json

eval/cases.json holds the questions, the tool an assistant should call and the facts the answer must contain. eval/run.ts runs them through a real MCP client against the bundled data, with no language model involved.

Who maintains this

We are Mervenor. We take over, stabilise and modernise existing web applications, and add AI features to them.

Need help upgrading what it finds? Mervenor — hello@mervenor.com — https://mervenor.com

Licence

Code: MIT, see LICENSE. Data: MIT, from endoflife.date, see NOTICE.

Available Tools

4 tools
check_versionCheck a versionA
Read-onlyIdempotent

Checks one product version: supported, security-only or end-of-life on the given date, with the end dates, days remaining or overdue, the latest patch in that cycle, the newest cycle and the recommended upgrade. Accepts versions as people write them: "8", "8.0.11", "net8.0", "net472", "4.8", "v18.19.0", "lts/hydrogen", "3.12".

NameRequiredDescriptionDefault
dateNoDate to evaluate support on, as YYYY-MM-DD. Defaults to today. Use it for "will this still be supported on ...?" questions.
productYesProduct id or common name, for example "dotnet", "dotnetfx", "nodejs", "python", "angularjs".
versionYesVersion or release cycle, for example "8", "6.0.25", "net6.0", "net48", "1.8.2", "3.9".

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the description's job is to add context — and it does, spelling out exactly what computed values come back and that arbitrary version notations are normalized. It stays silent on failure behavior for unknown products/versions and on any auth or rate constraints.

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?

Purpose is front-loaded in the first clause, with return fields and input tolerance following in priority order. The trailing example list is long but each item demonstrates a distinct notation family, so it earns most of its space.

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

Completeness4/5

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

With no output schema and no annotation hints about returns, the description correctly compensates by naming the returned fields. The remaining gap is discoverability: nothing tells the agent that `product` values come from list_products, nor what happens when a product or version is unrecognized.

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 baseline is 3, but the description genuinely extends the schema: it adds `v18.19.0`-style prefixes, `net472`, `4.8`, and `lts/hydrogen` codenames that the schema's own examples do not cover, telling the agent normalization is tolerant. The `product` and `date` parameters get no description-level treatment, keeping it below 5.

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?

Specific verb + resource ('Checks one product version') plus a precise enumeration of the result fields (support status, end dates, days remaining/overdue, latest patch, newest cycle, recommended upgrade). The singular 'one product version' scope counters scan_project and get_cycles by implication, though no sibling is named outright.

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

Usage Guidelines3/5

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

Usage is implied rather than stated: it is clearly a point-lookup check, and the accepted-input list signals real-world version strings. There is no explicit when-to-use, when-not, or pointer to list_products for discovering valid product ids, so an agent must infer routing from the sibling names.

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

get_cyclesGet release cyclesA
Read-onlyIdempotent

Returns every release cycle of a product, newest first, with release date, LTS flag, end of active support, end of security support (end of life), status on the given date, days remaining or overdue, and the latest patch version.

NameRequiredDescriptionDefault
dateNoDate to evaluate support on, as YYYY-MM-DD. Defaults to today. Use it for "will this still be supported on ...?" questions.
limitNoOnly the newest N cycles.
productYesProduct id or common name, for example "dotnet", ".NET", "nodejs", "angularjs", "postgres".

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already establish read-only, idempotent, non-destructive behavior, so the safety profile is covered. The description adds genuine context beyond that: result ordering ('newest first') and the fact that status and days-remaining are computed relative to a supplied evaluation date, which tells the agent the output is time-sensitive even though the resource is static.

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?

One front-loaded sentence: verb and resource first, then the returned field list. Every clause names a concrete output field or ordering rule; nothing is wasted or restated from the title.

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

Completeness4/5

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

With no output schema, the description carries the full burden of explaining returns, and it does so thoroughly by enumerating release date, LTS flag, both support end dates, computed status, days remaining, and latest patch. Minor gaps remain around error behavior for unknown products and the up-to-500 limit ceiling, but nothing essential to calling 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?

Schema coverage is 100%, with the date, limit and product parameters each documented in the schema, so the baseline is 3. The description only adds the 'newest first' ordering that implicitly ties limit to recency; it adds nothing about product id resolution or limit interaction beyond what the schema already says.

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?

States a specific verb and resource ('Returns every release cycle of a product') and enumerates exactly what comes back, so an agent knows precisely what this fetches. It never names or differentiates itself from the related sibling check_version, so the agent must infer which one answers a support-status question.

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

Usage Guidelines3/5

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

There is no explicit when-to-use or when-not-to-use statement, and no reference to the alternatives in the sibling list (check_version, scan_project). Usage is only implied by the resource being fetched and by the 'newest first' ordering, which is enough to make the basic case clear but leaves the check_version boundary unresolved.

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

list_productsList productsA
Read-onlyIdempotent

Lists the products in the endoflife.date snapshot (runtimes, frameworks, databases, operating systems and more), with their ids for use in the other tools. Filter by a search text and/or category.

NameRequiredDescriptionDefault
limitNoMaximum number of products to return (default 100).
queryNoText to search in product ids, names and aliases, for example "net", "angular" or "postgres".
categoryNoOnly this category: framework, lang, database, os, server-app, app, service, device or standard.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is fully covered. The description adds that this is a static snapshot and that ids feed downstream tools, but says nothing about result truncation, ordering, or what a response entry looks like.

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?

Two tight sentences, no filler. The identity of the resource comes first, the payoff (ids for other tools) and filtering behavior follow in a logical reading order.

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

Completeness4/5

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

For a simple read-only list tool with full annotation coverage and a fully documented schema, this is nearly sufficient; the role of the returned ids is the key missing context and it is supplied. Only the absence of any note on result volume or paging behavior keeps it off a 5, and limit/default are covered in the schema anyway.

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 each parameter carries a precise description, so the schema does the heavy lifting. The description only adds that the two filters combine ("and/or"), which is a marginal gain over the schema text.

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?

"Lists the products in the endoflife.date snapshot" gives a specific verb and resource, then enumerates the domain (runtimes, frameworks, databases, operating systems) so the scope is unmistakable. The clause about returning ids "for use in the other tools" positions it distinctly against get_cycles/check_version/scan_project, which all consume those ids.

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 phrase "for use in the other tools" plus "Filter by a search text and/or category" makes the intended discovery-first workflow and narrowing options clear. It stops short of explicitly saying when not to use it or which sibling to reach for next, so an agent must infer the ordering.

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

scan_projectScan project filesA
Read-onlyIdempotent

Reads project files you pass in (contents, not paths on disk) and reports every runtime and framework it detects (Node.js, .NET and .NET Framework, ASP.NET Core, AngularJS, Angular, React, Next.js, Vue, Python, Django, PostgreSQL, MySQL and more) with its support status, sorted most urgent first, plus a one-paragraph summary. Supported files: package.json, package-lock.json, npm-shrinkwrap.json, angular.json, bower.json, *.csproj / .vbproj / .fsproj, Directory.Build.props, global.json, web.config, packages.config, requirements.txt, pyproject.toml, Pipfile, .python-version, runtime.txt, .nvmrc, .node-version, .tool-versions, Dockerfile / .dockerfile / Containerfile, docker-compose.yml / compose.yaml.

NameRequiredDescriptionDefault
dateNoDate to evaluate support on, as YYYY-MM-DD. Defaults to today. Use it for "will this still be supported on ...?" questions.
filesYesProject files to scan.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/non-open-world, so the safety profile is covered. The description adds real value beyond that: the deterministic ordering (most urgent first) and the presence of a summary paragraph, which matter for interpreting results. It stops short of saying what happens with unrecognized file names or with files beyond the 200-item cap.

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?

Purpose and output shape are stated first, then the file list — good front-loading. The enumerated format whitelist is long but it is operationally necessary for the agent to know what to send, so it earns its space; only the trailing 'and more' softens an otherwise tight list.

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 no output schema present, the description carries the burden of describing returns — and it does, including ranking order and an extra summary field. Combined with the supported-file list and the contents-not-paths warning, an agent has everything needed to call this 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 coverage is 100%, so baseline is 3; the description earns an extra point by supplying the supported-filename whitelist and by clarifying that a path's name (not its content alone) decides how the file is interpreted. That is meaningfully more than the schema's `path`/`content` field docs.

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?

Specific verb (reads) plus resource (project files) plus precisely stated output (detected runtimes/frameworks with support status, sorted most urgent first, plus a summary paragraph). Nothing here overlaps with siblings like check_version or get_cycles, so an agent can route to it unambiguously.

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 front-loads the key invocation constraint — pass file *contents*, not disk paths — which pre-empts the most likely misuse. It also conveys the use case via the supported-file whitelist, but it never names an alternative tool or states when *not* to use this one.

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. 4 tool updatesv0.1.0
    • First observedcheck_version
    • First observedget_cycles
    • First observedlist_products
    • First observedscan_project

TDQS

A4.2/5.0

Scored across 4 tools

Disambiguation5/5

Each tool targets a distinct step of the EOL-checking workflow: enumerating products, fetching release cycles, checking a single version, and scanning project files. There is no overlap; check_version and scan_project differ clearly by input type (single version string vs. file contents).

Naming Consistency5/5

All four tools follow a clean verb_noun snake_case pattern (list_products, get_cycles, check_version, scan_project). Verbs are chosen precisely to reflect different operations, making the naming predictable and self-documenting.

Tool Count5/5

Four tools is well-scoped for a focused EOL-checking server, with each tool earning its place in the lifecycle. Nothing feels redundant or missing at the count level.

Completeness4/5

The surface covers discovery, cycle detail, single-version checks, and project scanning, which handles the core workflow end to end. Minor gaps remain, such as no explicit way to enumerate available categories or bulk-check an arbitrary list of versions without a project file.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to check software end-of-life dates and support status using the endoflife.date API, providing accurate information on software lifecycle, security status, and upgrade recommendations in real-time.
    5
    8
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Software end-of-life intelligence for AI agents: EOL dates, support timelines and 0-100 upgrade risk scores for 480+ products. Check whether a version is still supported, score its risk, or audit an entire stack.
    5
    10 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables checking whether software packages are deprecated, archived, stale, active, or unknown with supporting evidence, auditing dependency manifests, and looking up runtime support and end-of-life dates.
    MIT