Agent access
How an agent, a script or an assistant reads this site: every item, service, provider, cloud and category page as Markdown and as JSON, a query address with filters, and an MCP endpoint.
What you can ask for
Every item, service, provider, cloud and category page exists in three forms that are built from the same record: HTML for people, Markdown for agents and JSON for tools. Add .md or .json to the address of a page to get its Markdown or its JSON form. The home page is /index.md and /index.json.
One item in its three forms, taken from the data as it is now: Azure Kubernetes Service: Kubernetes 1.31 LTS end of life.
HTML
The page, as people read it.
https://eolwatch.dev/items/azure-aks-kubernetes-1-31-lts-end-of-supportMarkdown
The same record as text: its fields at the top, then what breaks, what to do and the sources.
https://eolwatch.dev/items/azure-aks-kubernetes-1-31-lts-end-of-support.mdJSON
The same record as data: the fields of the data export and the addresses of its other forms.
https://eolwatch.dev/items/azure-aks-kubernetes-1-31-lts-end-of-support.json
The Markdown and the JSON form of the home page, a cloud page and a category page hold every list of items the page shows: in JSON the other lists are in sections and the counts of the home page in windows. The JSON form of a service page holds the whole record of each of its items, and in sections the lists the page sorts them into: upcoming, ended and in effect.
An address that ends in .md or .json always answers that form, so it is the one to put in a link or in the instructions of an agent. The address of the page itself also answers Markdown or JSON when the request asks for it in its Accept header, with text/markdown or application/json. A cache that already holds the HTML of that address (a browser that loaded the page, a proxy in front of the site) may answer with the HTML.
curl -H "Accept: text/markdown" https://eolwatch.dev/items/azure-aks-kubernetes-1-31-lts-end-of-supportA page that does not exist answers 404 and a withdrawn item answers 410, in the form that was asked for. An item, service or provider page answers 406 to a header that accepts none of the three forms.
Ask with filters
/data/items.json answers one page of the items that match the query parameters you add. Without a parameter it returns every published item in one file.
Azure retirements due in the next 90 days
https://eolwatch.dev/data/items.json?cloud=azure&type=retirement&within_days=90What ended in the last 30 days
https://eolwatch.dev/data/items.json?within_days=30&status=ended
Parameters
| Parameter | Values | Meaning |
|---|---|---|
| cloud | azure, aws, gcp, oci, multi | azure, aws, gcp, oci, multiCloud of the item. Repeat the parameter or separate the values with commas to ask for several. |
| type | retirement, end_of_support, breaking_change | retirement, end_of_support, breaking_changeKind of change. Repeat the parameter or separate the values with commas to ask for several. The hyphen forms of the site links (end-of-support, breaking-change) are accepted too. |
| category | services, features, kubernetes, runtimes, databases, compute-skus, os-images, apis-sdks, iac, other | services, features, kubernetes, runtimes, databases, compute-skus, os-images, apis-sdks, iac, otherCategory group, as in the address of a category page. |
| service | a service slug of at most 80 characters | a service slug of at most 80 charactersService slug of at most 80 characters, as in the service_slug field. Two clouds can use the same slug, so send cloud with it. |
| q | at most 100 characters | at most 100 charactersSearch text of at most 100 characters. Every word must occur in the title, the summary, the service, the slug or an affected version. |
| from | YYYY-MM-DD | YYYY-MM-DDEarliest effective_date to include (YYYY-MM-DD). An item without a date never matches. A month, quarter or year is compared by its first day; use within_days for what is due or what ended. |
| to | YYYY-MM-DD | YYYY-MM-DDLatest effective_date to include (YYYY-MM-DD). An item without a date never matches. A month, quarter or year is compared by its first day; use within_days for what is due or what ended. |
| within_days | a whole number from 1 to 3650, not together with from or to | a whole number from 1 to 3650, not together with from or toOnly items at most this many days from the as_of day (1 to 3650). With status upcoming: items due in the next N days, including an item whose month, quarter or year has started and is not over. With status ended or in_effect: items that ended or took effect in the last N days. With status all: all of these. Cannot be combined with from or to. |
| status | upcoming, ended, in_effect, all | upcoming, ended, in_effect, allupcoming (the default): items whose effective period is not over, including items without a date. ended: retirements and end of support dates whose whole period is over. in_effect: breaking changes whose date has passed (a breaking change takes effect, it does not end, so it is never in ended). all: every item. |
| sort | date, added, service | date, added, servicedate (the default): by effective_date, items without a date last; a list of ended items or of changes in effect (status=ended, status=in_effect) is ordered by the last day of each effective period. added: newest first by created_at. service: by service name. |
| dir | asc, desc | asc, descasc (the default) or desc. The added order ignores it. |
| limit | a whole number from 1 to 200 | a whole number from 1 to 200Most items in one answer: 1 to 200, 50 by default. With detail=full: 1 to 50, 20 by default. |
| offset | a whole number from 0 to 100000 | a whole number from 0 to 100000Number of matching items to skip. Send the next_offset of an answer to get the next page. |
| detail | compact, full | compact, fullcompact (the default): one short row per item. full: the whole record of each item. |
The answer
One JSON object. These fields are enough to read it and to page through a list:
as_of: The UTC day (YYYY-MM-DD) every value that depends on the day was counted for.total: Number of items that match the query.count: Number of items in this answer.next_offset: The offset of the next page, or null when this answer holds the last match.next_url: Address of the next page of this list, at the data address, or null when this answer holds the last match.items: The items: compact rows, or whole records when detail is full.
A value that is not allowed answers 400, and the answer names the parameter and what it accepts. The shape of an answer is published as a JSON Schema document. The data addresses and the Markdown and JSON forms are described in the OpenAPI description. A JSON answer of a data address names its schema document in a Link header.
Other lists as data
- /data/services.json: Every service that has a published item, with its counts and the date of its next item.
- /data/providers.json: Every infrastructure as code provider, tool and module whose releases are read for breaking changes, with its newest tracked release.
- /data/changes.json: One page of the changelog: items added, dates changed, items updated and items withdrawn, newest first.
Connect an agent
The MCP endpoint serves the same data to a client that speaks the Model Context Protocol. It only reads, and it needs no key.
https://eolwatch.dev/mcpTools
search_items: Lists published items of EOL Watch: retirements, end of support dates and breaking changes.get_item: Returns one published item in full: its dates, summary, impact, migration path, replacement, affected versions and sources, as Markdown and as structured data.list_services: Lists every service that has a published item, with its number of items, how many of them are upcoming and the date of the next one.list_providers: Lists the infrastructure as code providers, tools and modules whose releases are read for breaking changes, each with its newest tracked release.get_provider_changes: Returns what the page of one provider, tool or module shows: the range of releases that is tracked, the summary sentence, the notices and the breaking changes of each release that lists any.recent_changes: Returns one page of the changelog of EOL Watch, newest first: items added, effective dates changed, items updated and items withdrawn.
Point a client at it
In a client that supports remote servers, add a server of the HTTP kind and give it the address above. The Model Context Protocol names this transport Streamable HTTP. No key, extra header or sign-in is asked for.
Discovery files
These files tell a tool where everything on this page is.
- llms.txt: the index for agents. It says how to read the site, then links the lists as Markdown and the data addresses. It follows the llms.txt proposal.
- llms-full.txt: every upcoming item in one text, with its effective date, cloud, service and type, its source and the address of its Markdown form. Its first lines say whether the summary of each item is in it.
- Feeds: the RSS and Atom feeds and the calendar files, for all clouds and for each cloud.
- sitemap.xml: the pages of the site, for search engines.
A page that has a Markdown and a JSON form names both in its head, as link rel="alternate" tags, so a tool that holds the HTML finds them.
What this site does not do
- No address takes a file, a resource ID or a subscription ID. The estate check runs in your browser, and what you give it stays there.
- Nothing is written through these addresses: each of them only reads. No key and no account are needed.
- The site itself stores nothing about a request to the Markdown and JSON forms, the data addresses or the MCP endpoint: no IP address, no user agent and no search text. The hosting platform may keep its own access logs. What the pages for people count is in the privacy section.
- License of the data: Not decided yet. The license for these exports has not been chosen yet, so no reuse terms are stated. Ask the site owner before you redistribute the data. Version dates taken from or cross-checked with endoflife.date remain subject to the license of that project.
- Each source is rechecked once a day, so there is no need to ask for the same address more often than once an hour.