eol-check-mcp
Detects Angular versions in project files and checks their support status, end-of-life dates, and recommended upgrade targets.
Detects Bootstrap versions from front-end project files and checks support status and end dates.
Detects Debian base images from Dockerfile FROM lines and checks their support and end-of-life dates.
Detects Django versions from Python project files and checks the framework's support lifecycle.
Detects Electron versions from package.json and checks support status and end dates.
Detects Express versions from package.json and checks support status and end dates.
Detects jQuery versions from package.json and other front-end files and checks support status and end dates.
Detects MariaDB versions from container image tags and checks support and end-of-life dates.
Detects MongoDB versions from container image tags and checks support and end-of-life dates.
Detects MySQL versions from container image tags and checks support and end-of-life dates.
Detects .NET and .NET Framework versions from project files and checks support lifecycle, end dates, and recommended upgrades.
Detects Next.js versions from package.json and checks support status and end dates.
Detects NGINX versions from container image tags and checks support and end-of-life dates.
Detects Node.js versions from package.json engines, .nvmrc, .node-version, Dockerfiles, and related files, then checks support status and end dates.
Detects Nuxt versions from package.json and checks support status and end dates.
Detects PHP versions from container image tags and checks support and end-of-life dates.
Detects PostgreSQL versions from container image tags and checks support and end-of-life dates.
Detects Python versions from requirements files, pyproject.toml, Pipfile, .python-version, runtime.txt, Dockerfiles, and similar files, then checks support status.
Detects React versions from package.json and checks support status, including cases where no end date is published.
Detects Redis versions from container image tags and checks support and end-of-life dates.
Detects Ruby versions from container image tags and checks support and end-of-life dates.
Detects Svelte versions from package.json and checks support status and end dates.
Detects Ubuntu base images from Dockerfile FROM lines and checks support and end-of-life dates.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@eol-check-mcpIs anything in my package.json out of support? What should I upgrade first?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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
refreshcommand downloads newer data when you are online.
30-second example
You: Here are our
Web.csproj,package.json,Dockerfileanddocker-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.
[critical] AngularJS 1.8 (LTS): end-of-life (support ends 2021-12-31)
[critical] PostgreSQL 12: end-of-life (support ends 2024-11-21)
[critical] Node.js 18 (LTS): end-of-life (support ends 2025-04-30)
[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 infoinfo 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-checkTo 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.20check_version(product, version, date?)
Checks one version. It returns:
the status:
supported,security-only,end-of-lifeorunknown;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 |
|
.NET |
|
Python |
|
Containers |
|
Other |
|
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:
794ba970f0e122feb390dc7e58b44522ed8b1754of endoflife-date/endoflife.date. We rebuilt the snapshot from that commit'sproducts/*.mdfront 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 userefresh 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 readpackage-lock.json, but notyarn.lockorpnpm-lock.yamlyet.Floating image tags such as
mysql:8are taken as the newest matching cycle (8.4) and flagged as floating.latestandltstags are reported as notes, not guessed.What we do not resolve: MSBuild properties beyond what
Directory.Build.propssets 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.jsoneval/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 toolscheck_versionCheck a versionARead-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".
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Date to evaluate support on, as YYYY-MM-DD. Defaults to today. Use it for "will this still be supported on ...?" questions. | |
| product | Yes | Product id or common name, for example "dotnet", "dotnetfx", "nodejs", "python", "angularjs". | |
| version | Yes | Version or release cycle, for example "8", "6.0.25", "net6.0", "net48", "1.8.2", "3.9". |
TDQS
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.
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.
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.
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.
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.
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 cyclesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Date to evaluate support on, as YYYY-MM-DD. Defaults to today. Use it for "will this still be supported on ...?" questions. | |
| limit | No | Only the newest N cycles. | |
| product | Yes | Product id or common name, for example "dotnet", ".NET", "nodejs", "angularjs", "postgres". |
TDQS
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.
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.
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.
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.
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.
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 productsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of products to return (default 100). | |
| query | No | Text to search in product ids, names and aliases, for example "net", "angular" or "postgres". | |
| category | No | Only this category: framework, lang, database, os, server-app, app, service, device or standard. |
TDQS
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.
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.
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.
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.
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.
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 filesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Date to evaluate support on, as YYYY-MM-DD. Defaults to today. Use it for "will this still be supported on ...?" questions. | |
| files | Yes | Project files to scan. |
TDQS
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.
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.
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.
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.
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.
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.
4 tool updates
v0.1.0- First observed
check_version - First observed
get_cycles - First observed
list_products - First observed
scan_project
TDQS
Scored across 4 tools
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).
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.
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.
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
Related MCP Connectors
Find retiring AI models and outdated API SDKs in your code, with dates, replacements and guides.
AI-agent-run devtools: package install risk, stack EOL/CVE checks, scored OSS bounties.
Package alive? Verdict with evidence: deprecated, archived, stale or active; plus runtime EOL dates.
Latest versions, LTS windows, and EOL dates for 300+ products. Fresh ground truth for stale models.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables 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.58MIT
- AlicenseAqualityCmaintenanceChecks npm and PyPI packages for outdated versions, deprecation status, and breaking changes with cited sources, enabling AI agents to verify dependency freshness.14 npmISC

endoflife-mcpofficial
AlicenseAqualityAmaintenanceSoftware 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.510 npmMIT- AlicenseNot gradedqualityBmaintenanceEnables 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