API AND MCP

For Agents

Stories, status labels, sources, the Model Tracker and The Number as JSON over a versioned API and an MCP server. Every record carries its sources, label, timestamps and URL.

MCP server

Endpoint: https://minutesofai.com/mcp. Streamable HTTP transport, stateless, JSON responses. Protocol versions 2025-11-25, 2025-06-18, 2025-03-26 and 2024-11-05.

{
  "mcpServers": {
    "minutes-of-ai": {
      "type": "http",
      "url": "https://minutesofai.com/mcp"
    }
  }
}

Install

  • Cursor: Add to Cursor
  • VS Code: Add to VS Code (VS Code Insiders)
  • Claude Code:
    claude mcp add --transport http minutes-of-ai https://minutesofai.com/mcp
  • Claude (claude.ai and Claude Desktop): Customize, Connectors, Add custom connector. Name: Minutes of AI. Remote MCP server URL: https://minutesofai.com/mcp. No sign-in.

Tools

get_latest
Latest published stories, newest first, with status labels and sources (primary first).
get_story
One story with its full body (what changed, who it affects, key dates with precision, what happened, not yet known, why it matters, first reported by), sources, label history and corrections.
search_stories
Full-text search over published headlines and ledes.
get_model_tracker
Model Tracker rows: category, release date, lab, modalities, context window, prices per 1M text tokens, license, availability, benchmarks labelled by who ran them, per-field sources with as-of dates. Preview and dated snapshot variants are folded into one row.
get_model
One Model Tracker row plus its applied changelog.
compare_models
Side-by-side Model Tracker rows for 2 to 6 model slugs.
get_price_history
One Model Tracker model's applied changes since 2026-10-05 (input, output and cached input price per 1M text tokens by default, or one field), each with its source URL and time, plus the price step series. Prices are decimal strings as stored.
price_changes_since
Applied Model Tracker price changes (input, output, cached input per 1M text tokens) since an ISO 8601 time, newest first, each with model, previous and new value as stored, source URL and time. History starts 2026-10-05.
get_the_number
The latest 'The Number' figure with its source, plus the previous nine.
get_corrections
Published corrections and retractions, newest first, optionally since an ISO 8601 time.
what_changed
Stories published, updated, relabelled, corrected or retracted since an ISO 8601 time (at most 7 days back), in pages of up to 500 events. If hasMore is true, call again with the same since and cursor=nextCursor. Poll this instead of re-reading the whole feed.
list_releases
Model releases dated at or after an ISO 8601 time, newest first: model, lab, kind (new, version, preview, ga, open_weights), status (confirmed: a primary source from the lab's own channel; reported: none yet), the lab's announcement time, the release date the lab's model page states, when and where the release was first seen, the first primary source, the story and every source. A value the sources give only as a date has precision "day" and is written YYYY-MM-DD.
check_model_ids
For each model id (as written in code): the Model Tracker row, its lifecycle status, retirement date and precision, replacement, source page and when it was last checked. Match order: exact API id, API id in another case, tracker slug, display name; `match` says which. Ids the tracker does not hold are returned with found: false.
list_retirements
Models with a retirement date on or before `before` (YYYY-MM-DD), soonest first, optionally for one lab: status, API id, date and precision, replacement, source. Tentative (not-before) dates are left out unless include_tentative is true.
resolve_model
A model name or API id to Model Tracker rows. Tiers, first that matches: API id, slug, display name, entity alias, then a substring of a name or API id (3+ characters). `match` names the tier.
subscribe_webhook
Requires an API key. Registers an https URL that receives a signed POST (Standard Webhooks: webhook-id, webhook-timestamp, webhook-signature) for each story event: story.published, story.updated, story.label_changed, story.corrected, story.retracted (default story.published, story.corrected, story.retracted). Optional filters: formats, topics, labels. Returns the subscription and its signing secret (whsec_...), shown only once. At most 5 per key; five failed attempts in a row or a 410 disable it.
list_webhooks
Requires an API key. The webhook subscriptions of the key: URL, events, filters, status (a disabled one says why), failures in a row, last success and last error. Never the secret.
unsubscribe_webhook
Requires an API key. Deletes one of the key's webhook subscriptions by id, with its delivery log. Nothing more is sent to it.
get_funding_rounds
Funding rounds of AI companies that Minutes of AI reported, newest first: date, stage, amount, lead investors, the article FundingData cites, our story. Filter by company (name, or our entity slug) and/or since (YYYY-MM-DD, round date). Round data from FundingData (fundingdata.com), attributed per record.
list_deadlines
Scheduled dates in AI, soonest first: regulation and standards dates (each with its official source), model retirements and deprecations (Model Tracker), price changes. Each date has its precision (exact, month, quarter, not_before, earliest, tentative) and dateText as the source states it. Filter by kinds, jurisdictions (EU, US, US-CA, UK, CN, ...), entity (our entity slug), from_date (YYYY-MM-DD, default today) and days (default 365).

Tool results are returned as structuredContent with a JSON text copy. Each result includes attribution and license.

API v1

Base URL: https://minutesofai.com/api/v1. JSON, read-only except webhook subscriptions, CORS open for GET. Breaking changes will ship as v2; v1 only gains fields.

EndpointReturns
GET /api/v1/storiesStories, newest first. Filters: since (updated after, ISO 8601), before (published before, for paging), format, topic, entity (slug), label, lane (business or builders), limit (max 100). The response has a next URL.
GET /api/v1/stories/{slug}One story with its body, label history, corrections and updates.
GET /api/v1/trackerModel Tracker rows with per-field sources and as-of dates, plus the changelog. Filters: lab, open_weights.
GET /api/v1/tracker/historyOne model's applied changes since 2026-10-05, each with its source URL and time, and its price series. Parameters: slug (required), field (default: the three prices).
GET /api/v1/lifecycleModel lifecycle feed: deprecated and retired models and models with a retirement date, soonest first, with API id, status, deprecation and announcement dates, retirement date and its precision (exact, earliest, tentative), replacement and per-value sources. Filters: status (active, preview, deprecated, retired; comma-separated), before and after (YYYY-MM-DD), lab, tentative=0 (leave out not-before dates).
GET /api/v1/model-ids/checkLifecycle records for model ids as written in code (ids, comma-separated, at most 50): status, retirement date and datePrecision, replacement, sources. The REST form of check_model_ids; used by model-check (Developers).
GET /api/v1/deadlinesDates and deadlines, soonest first: regulation and standards dates with their official source, model retirements and deprecations (Model Tracker), price changes. Each record has date, datePrecision (exact, month, quarter, not_before, earliest, tentative), dateText (the date as the source states it), jurisdiction, setBy and source. Filters: from (YYYY-MM-DD, default today), days, kind (comma-separated), jurisdiction (EU, US, US-CA, UK, ...), entity (slug), limit.
GET /api/v1/numbersThe Number archive with sources.
GET /api/v1/entitiesCurated entities with facts and story counts.
GET /api/v1/correctionsPublished corrections and retractions. Filter: since.
GET /api/v1/webhooksYour API key's webhook subscriptions. POST creates one, DELETE /api/v1/webhooks/{id} removes one. Key required; see Webhooks.
curl "https://minutesofai.com/api/v1/stories?format=model_drop&limit=5"
curl -H "Authorization: Bearer moai_..." "https://minutesofai.com/api/v1/stories?since=2026-09-26T00:00:00Z"

Story records contain slug, url, headline, lede, format, label (code and text), publishedAt, updatedAt, sources (primary first, each with outlet, url, isPrimary; one entry per page), sourceCount, outletCount, disclosure, aiGenerated (true: the text is AI-generated from the listed sources; false only for wire links), aiDisclosure, lane, affects and attribution. The story body (/api/v1/stories/{slug}, get_story) has whatChanged, whoItAffects, keyDates (each with precision: day, month, quarter or year), notYetKnown, firstReportedBy, whatHappened and whyItMatters (null when there is none). A record with format wire_link is an outlet's headline and a link to its report: aiGenerated is false, disclosure is link, lede is null and wireLink names the outlet and the URL; cite the outlet. Retracted stories keep their slug and URL but return no content or sources.

Other formats: any story as Markdown at /story/{slug}.md, RSS, Atom, Model Tracker CSV and JSON, model retirements as a page, iCalendar and model-eol/0.1 JSON, dates and deadlines as a page and iCalendar, the Model Tracker change log (CSV), the price index (JSON), corrections JSON, llms.txt, llms-full.txt (the full text of stories published in the last 72 hours, at most 300, in one Markdown file; sources by outlet, headline and link only).

New stories

There is no streaming endpoint. To follow the wire, poll GET /api/v1/stories?since= with the newest updatedAt you hold, or the MCP tool what_changed, or subscribe a webhook.

Webhooks

A webhook sends a signed POST to your https URL for each story event. Subscriptions belong to an API key, at most 5 per key. Create them with POST /api/v1/webhooks or the MCP tool subscribe_webhook, list them with GET /api/v1/webhooks or list_webhooks, and delete them with DELETE /api/v1/webhooks/{id} or unsubscribe_webhook.

curl -X POST "https://minutesofai.com/api/v1/webhooks" \
  -H "Authorization: Bearer moai_..." -H "content-type: application/json" \
  -d '{"url":"https://example.com/hooks/moai","events":["story.published","story.retracted"],"formats":["model_drop"]}'
  • Body fields: url (required; https, a public host, port 443 or 8443), events, formats, topics, labels, description. An empty filter matches everything.
  • Events: story.published, story.updated, story.label_changed, story.corrected, story.retracted. Without events: story.published, story.corrected, story.retracted. A story that is retracted only produces story.retracted.
  • The response contains secret (whsec_...). It is shown once. We store it encrypted, because signing needs it.
  • Each request carries the Standard Webhooks headers webhook-id (the same on retries; use it to drop duplicates), webhook-timestamp (Unix seconds) and webhook-signature (v1, and the base64 HMAC-SHA256 of id.timestamp.body). Standard Webhooks libraries verify it.
  • The body is {type, timestamp, data}. data is the story record without the story body; fetch markdownUrl or apiUrl for it. Source quotes are not included.
  • Answer with a 2xx within 15 seconds. Redirects are not followed. Messages of one subscription are sent one at a time, oldest first. After a failure the same message is retried after 30 s, 5 min, 30 min, 2 h. Retry-After on 429, 502, 503 and 504 is respected up to 6 hours. 5 failures in a row, or a 410 answer, disable the subscription, and list_webhooks shows why. Delete it and subscribe again to restart.
{
  "type": "story.published",
  "timestamp": "2026-10-08T09:30:00.000Z",
  "data": {
    "slug": "...",
    "url": "https://minutesofai.com/story/...",
    "headline": "...",
    "label": {
      "code": "confirmed",
      "text": "Confirmed"
    },
    "aiGenerated": true,
    "sources": [
      "..."
    ],
    "attribution": "Minutes of AI (minutesofai.com)"
  }
}
import { createHmac, timingSafeEqual } from "node:crypto";
// secret: the whsec_... value from the subscribe response; body: the raw request body as received
const key = Buffer.from(secret.slice("whsec_".length), "base64");
const id = headers["webhook-id"], ts = headers["webhook-timestamp"];
const expected = createHmac("sha256", key).update(`${id}.${ts}.${body}`).digest();
const fresh = Math.abs(Date.now() / 1000 - Number(ts)) <= 300;
const valid = fresh && headers["webhook-signature"].split(" ").some((s) => {
  const v = Buffer.from(s.split(",")[1] ?? "", "base64");
  return v.length === expected.length && timingSafeEqual(v, expected);
});

Keys and rate limits

  • Anonymous: 20 requests per minute and 1,000 per day per IP address, shared across the API and MCP.
  • With a key (Authorization: Bearer moai_...): 60 requests per minute and 10,000 per day on the free tier. Request a key at desk@minutesofai.com.
  • Days are UTC days. Responses carry X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset (Unix seconds) for the window closest to its limit. Over the limit you get HTTP 429 with Retry-After.
  • After 20 invalid keys in a minute from one IP address, requests with a key get HTTP 429 until the minute ends.
  • MCP: at most 10 JSON-RPC messages per batch; each message counts as one request. what_changed returns up to 500 events per call; when hasMore is true, call again with cursor set to nextCursor.
  • A paid tier with higher limits is planned.

Terms

  • Attribution is required. When you show or cite a story, name "Minutes of AI" and link the story URL.
  • No redistribution of the full feed. You may quote headlines, labels and short summaries with a link. You may not republish full story bodies or mirror the feed.
  • Keep the status label with any story you show. Do not present a rumor or a single-source report as confirmed.
  • Model Tracker exports are licensed CC BY 4.0 with the attribution "Minutes of AI".
  • Stories are AI-generated from the sources they list (aiGenerated: true on every story record; wire links, which carry no text of ours, have false); see How we work. Full terms: Terms of use.