Dated, sourced facts about AI and tech companies: what was true on a day, and what changed since.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Optional. "Bearer asof_..." counts requests against an AsOf API key's own budget instead of the per-address limit. The server answers without it.
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.
Every claim that became true, stopped being true, or was first recorded after a date. The diff query. Optionally scoped to one entity. Claims dated in the future (announced for a later date) are not changes yet and are left out; timeline shows them. limit default 50, max 200; offset pages through the first 900, newest first (the last page is shortened to end there). cursor pages the same feed with no cap, in the order the claims were recorded (oldest first; order: recorded in the answer): pass "" for the first page, then next_cursor from the previous answer; not with offset. assertable_only keeps claims the record asserts for their own dates. Each row carries kind (people, money, products, models or other), the same kinds /changes filters by; kind keeps one (on the page, so a page can come back short). For one entity's state on two days compared per fact, use entity_diff.
ISO date YYYY-MM-DD
Only changes of this kind (lib/change-types.ts, as /changes?type=)
Page in recorded order with no cap: "" for the first page, then next_cursor from the previous answer (opaque). Not with offset
Skip this many changes, newest first (next_offset from the previous page); up to 900. Not with cursor
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http asof https://asof.is/mcp
Headers
Authorization (optional, not in the config above): Optional. "Bearer asof_..." counts requests against an AsOf API key's own budget instead of the per-address limit. The server answers without it.Every claim that became true, stopped being true, or was first recorded after a date. The diff query. Optionally scoped to one entity. Claims dated in the future (announced for a later date) are not changes yet and are left out; timeline shows them. limit default 50, max 200; offset pages through the first 900, newest first (the last page is shortened to end there). cursor pages the same feed with no cap, in the order the claims were recorded (oldest first; order: recorded in the answer): pass "" for the first page, then next_cursor from the previous answer; not with offset. assertable_only keeps claims the record asserts for their own dates. Each row carries kind (people, money, products, models or other), the same kinds /changes filters by; kind keeps one (on the page, so a page can come back short). For one entity's state on two days compared per fact, use entity_diff.
| Argument | Type | Description |
|---|---|---|
| kind | string | Only changes of this kind (lib/change-types.ts, as /changes?type=) |
| limit | integer | |
| since* | string | ISO date YYYY-MM-DD |
| cursor | string | Page in recorded order with no cap: "" for the first page, then next_cursor from the previous answer (opaque). Not with offset |
| entity | string | |
| offset | integer | Skip this many changes, newest first (next_offset from the previous page); up to 900. Not with cursor |
| assertable_only | boolean |
{
"type": "object",
"required": [
"since"
],
"properties": {
"kind": {
"enum": [
"people",
"money",
"products",
"models",
"other"
],
"type": "string",
"description": "Only changes of this kind (lib/change-types.ts, as /changes?type=)"
},
"limit": {
"type": "integer",
"default": 50
},
"since": {
"type": "string",
"description": "ISO date YYYY-MM-DD"
},
"cursor": {
"type": "string",
"description": "Page in recorded order with no cap: \"\" for the first page, then next_cursor from the previous answer (opaque). Not with offset"
},
"entity": {
"type": "string"
},
"offset": {
"type": "integer",
"default": 0,
"description": "Skip this many changes, newest first (next_offset from the previous page); up to 900. Not with cursor"
},
"assertable_only": {
"type": "boolean",
"default": false
}
}
}One claim by id with its sources and supersession links, its three dates (valid_from, published, recorded) and the check behind it: the method and, where kept, the passage on the source page that states the value.
| Argument | Type | Description |
|---|---|---|
| id* | string | Claim id, e.g. clm_01J9X4N2 |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Claim id, e.g. clm_01J9X4N2"
}
}
}What the record covers for an entity, so an empty answer can be told apart: not covered (no source reads it), unknown (covered, nothing checked yet) or covered with nothing on that date. sources: the official feeds that record posts on it or speak for it, its SEC filing (CIK, ticker), Hugging Face authors, Wikidata item and the status dashboard. holds: its public claims by predicate (claims, open, kind: fact, event, list or identifier). freshness: per ingest, when it last added a claim here (last_added), when one was last checked against its source (last_checked) and when reverify.py last confirmed one against Wikidata (last_verified). gaps: what the record does not cover, e.g. 'financials: none; files with the SEC as alphabet'. group: the other records of its company group and how each joined.
| Argument | Type | Description |
|---|---|---|
| entity* | string | Entity slug, e.g. google |
{
"type": "object",
"required": [
"entity"
],
"properties": {
"entity": {
"type": "string",
"description": "Entity slug, e.g. google"
}
}
}What changed on an entity's record between two days: its state on from against its state on to (today when omitted), compared by claim. added: facts held on to and not on from. ended: held on from, not on to, and not replaced. replaced: the same predicate with another value, the claim that held on from beside the one that holds on to (paired by the record's superseded_by pointer, when the predicate has exactly one of each and the new value begins the day the old one ends, or when the predicate has one holder at a time, such as ceo, chair, cfo or headquarters, and one holder ended while another began). unchanged counts the claims held on both days; by_predicate gives each predicate's counts; summary is the one sentence the page /record/{slug}/diff leads with: quote it. Rows carry the fields entity_state rows carry; added rows are labelled for to, ended rows for from. Posts and Hugging Face repos are counted (skipped_posts), not listed: changes_since lists them. counts, by_predicate and summary cover the whole diff; the rows are paged in the order replaced, added, ended (limit default 50, max 200; offset pages; complete: false and next_offset say there is more). group: true reads the entity's company group (as in entity_state), each row naming its record. from must be before to.
| Argument | Type | Description |
|---|---|---|
| to | string | The later day, ISO date YYYY-MM-DD; today when omitted |
| from* | string | The earlier day, ISO date YYYY-MM-DD |
| group | boolean | Compare the entity's company group (Google with Alphabet, Google DeepMind, Gemini...) |
| limit | integer | Rows per page across replaced, added and ended (max 200) |
State of an entity as of a date: the claims that held on that day, with sources and confidence. Omit as_of for today. For a company, person, product or regulator (a model has its own lineage fields), summary is the one dated, sourced sentence its record page opens with, title its page title from the same facts, key_facts the page's fact card (each with its claim) and faq the questions the page answers: quote summary as the record's answer. By default returns the core facts (leadership, ownership, names, financials, headquarters) and skips identifiers, bulk lists and events; pass predicates to ask for specific ones (e.g. ['subsidiary','board_member','hf_repo_created']) or scope='all'. By default only claims the record asserts are returned (valid, or primary-sourced at confidence 0.7+; never flagged or marked for review); scope='all' returns everything held on the date with its status; assertable_only overrides either default. Capped by limit (default 60, max 300); offset pages. as_of is effective time: a quarter's revenue is dated at the quarter end even though it was filed weeks later. known_by answers what could have been known on a day, strictly: only claims a source had published, or AsOf had recorded, by then; a figure published later is listed under not_yet_published and the claim it replaced is returned with ended_later; a claim no source dates that AsOf recorded later is listed under publication_unknown, not counted as known. Pass known_by alone for that day, or both for 'true on as_of, as known by known_by'. Dated events (released, launched, partnership, customer, acquired, ranking_update) are not state: ask timeline for those. group: true answers for the entity's company group (the records linked by parent_id, ownership claims or an official feed that speaks for both, and their products): each row's entity names its record, a fact held on two records is one row with the other in also_on, and group.members says how each record joined. An empty answer carries empty: the reason (nothing public, nothing held on the day, or only events and lists), the entity's coverage gaps and the records group: true would add. fact_pages lists the entity's one-fact pages today (revenue, ceo, valuation, headquarters...), each with a fetch id: the current value with its sources, every dated value before it and what replaced what.
| Argument |
|---|
Fetch a page's markdown twin by its path: /record/{slug}.md (add ?as_of=YYYY-MM-DD for a past day), /record/{slug}/{predicate}.md (a fact page: one fact's every dated value, e.g. /record/anthropic/revenue.md; entity_state's fact_pages lists them), /record/{slug}/diff.md?from=YYYY-MM-DD&to=YYYY-MM-DD (what changed between two days, as entity_diff answers), /timelines/{slug}.md, /timelines/{slug}/{YYYY}.md (one year of a timeline), /claim/{id}.md, /day/{YYYY-MM-DD}.md, /days/{YYYY}.md, /brief/{YYYY-MM-DD}.md, /brief/week/{YYYY-MM-DD}.md, /trends/{topic}.md (add ?in=ai or ?in=tech, and ?company=<key> for one company), or a site page: /index.md, /record.md, /timelines.md, /changes.md, /days.md, /brief.md, /trends.md, /about.md, /api-docs.md, /data.md, /privacy.md, /terms.md. A query string a page does not read is refused. A day after today or an impossible date is not a page. A page longer than 48,000 characters is cut at a line, with a note naming the tool that returns the rest.
| Argument | Type | Description |
|---|---|---|
| id* | string | Page path ending in .md, with its query string if any, e.g. /record/google.md, /record/anthropic/revenue.md, /trends/models.md?company=openai or /about.md |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Page path ending in .md, with its query string if any, e.g. /record/google.md, /record/anthropic/revenue.md, /trends/models.md?company=openai or /about.md"
}
}
}Find entities by name, slug, ticker or former name ('MSFT', 'Facebook', 'Google AI Mode'; accents, spacing and one typo forgiven), and claims by value, predicate, entity and date ('who is the CEO of Microsoft', 'Google core update March 2026'), best match first. Returns slugs to use with the other tools, matching claims (entity, predicate, value, date) and the days a query names. A product released, a ranking update rolled out, a company acquired are values on their maker's record, not entities, so search for the thing itself ('August 2026 spam update') and read the date off the claim. A question in full ('who ran Nvidia in 2019', 'Meta revenue as of 2024-06-30', 'what changed at OpenAI since March 2026') is also answered: answers holds one card per fact asked (answer is the first), each with a sentence (the value, its date and sources; what holds today when the day asked is past; the change against the value before), the entity, the fact and the day it was read as asking about, and the claims from the entity's state on that day (asserted ones first, or the held ones and why each is not asserted). 'X vs Y revenue' compares two entities (against); 'before', 'formerly' give the history; 'as known on DATE' counts only what was public by then (held_back); 'how old', 'how long' add years. An entity on the record that lacks the fact gets kind 'gap' with what it does hold (coverage). Empty when the query is not such a question. Up to 300 characters. kind narrows to entities or claims; limit (default 20, max 50) applies to each; assertable_only drops claims the record does not assert from the lists.
| Argument | Type | Description |
|---|---|---|
| kind | string | all (default), entities or claims |
| limit | integer | |
| query* | string |
Dated events and state changes for an entity in chronological order, superseded claims included, future-dated (announced) items included. Newest first when limited. Pass predicates to filter (e.g. ['released','model_release']; hf_repo_created is the day a Hugging Face repository was created, not a release date); on for one exact date, or from/to for a range; limit default 100, max 500; offset pages back (complete: false and next_offset say there is more). assertable_only keeps claims the record asserts for their own dates: a superseded CEO is assertable for the years he held the role. Each row carries its source's title: when a question names a date, answer from the rows on that date, and when several rows share a date, the title says which post each came from. Confidence ranks sources, not dates. group: true reads the entity's company group (as in entity_state): each row's entity names its record and a fact held on two records is one row (also_on). Every row carries its kind (people, money, products, models, other); kind keeps one. summary is the sentence the timeline page leads with and counts its claims by kind, over the entity's own timeline.
| Argument | Type | Description |
|---|---|---|
| on | string | Only events dated exactly this day, YYYY-MM-DD |
| to | string | Latest date, YYYY-MM-DD |
| from | string | Earliest date, YYYY-MM-DD |
| kind | string | Only this kind of change |
| group | boolean | Every record of the entity's company group, merged |
What the record's dated events say about how AI and tech companies ship and where their money goes, by quarter since 2023. Counted from checked claims only, by trend tags a model gives each claim from a fixed list, including whether the claim is about AI or the rest of tech (judged by the announcement, not the company). domain ai or tech keeps one side and adds each company's releases, updates and deals; omit it for both, each row carrying d. summary is the sentence the page leads with (the totals over the quarters returned and the busiest complete quarter), with a topic the topic's. Without topic: product updates per quarter and each theme's count (themes: agents, coding, voice_audio, image_video, reasoning, search, memory_personalization, connectors, enterprise_security, open_weights, health_science, finance_legal, education, commerce_ads, robotics_physical, safety_policy, compute_infra, pricing_access, devices, developer_platform, os_apps, media_entertainment), releases by kind, model releases by company (each company read with its products, as group: true reads it) and tier, deals by kind (funding_round, investment_out, grant_program, capital_commitment, acquisition, partnership, customer, expansion, valuation), the amounts disclosed per currency (as stated, never converted), the latest releases and deals, the largest amounts, who bought whom, countries, partners' kinds, and each source's coverage (sources start on different days: compare shares within a quarter rather than counts across quarters). model_releases lists every model release with its day, maker, tier and themes; with domain ai, cadence gives each company's median days between model releases (and between frontier ones), its latest release and how long ago, and the mix (small and fast, frontier, open weights) in the last two complete quarters against the two before. quarter (YYYY-Qn) without topic is the first quarter returned; the default is the last eight. Without topic each list of claims holds its first rows (limit, default 20, as far as a list fits the result; lists gives each list's total) and the per-company, per-quarter rows are left to /v1/trends. With topic (a theme, a deal kind, model, release for every release, update for every product update or deal for every deal): the checked claims behind it, newest first, in quarter, domain and company when given, as timeline rows with their tags. limit default 50, max 200; offset pages.
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 13, 2026.
| entity* | string | Entity slug, e.g. openai |
| offset | integer | Skip this many rows (next_offset from the previous page) |
{
"type": "object",
"required": [
"entity",
"from"
],
"properties": {
"to": {
"type": "string",
"description": "The later day, ISO date YYYY-MM-DD; today when omitted"
},
"from": {
"type": "string",
"description": "The earlier day, ISO date YYYY-MM-DD"
},
"group": {
"type": "boolean",
"default": false,
"description": "Compare the entity's company group (Google with Alphabet, Google DeepMind, Gemini...)"
},
"limit": {
"type": "integer",
"default": 50,
"description": "Rows per page across replaced, added and ended (max 200)"
},
"entity": {
"type": "string",
"description": "Entity slug, e.g. openai"
},
"offset": {
"type": "integer",
"default": 0,
"description": "Skip this many rows (next_offset from the previous page)"
}
}
}| Type |
|---|
| Description |
|---|
| as_of | string | ISO date YYYY-MM-DD |
| group | boolean | Answer for the entity's company group: Google with Alphabet, Google DeepMind, Gemini... |
| limit | integer | |
| scope | string | core (default) or all |
| entity* | string | Entity slug, e.g. google, openai, anthropic |
| offset | integer | Skip this many matching claims (next_offset from the previous page) |
| known_by | string | ISO date YYYY-MM-DD: count only claims a dated source published, or AsOf recorded, by this day. as_of defaults to it |
| predicates | array | Only these predicates |
| assertable_only | boolean | Only claims the record asserts for the day. Default true for core, false for all |
{
"type": "object",
"required": [
"entity"
],
"properties": {
"as_of": {
"type": "string",
"description": "ISO date YYYY-MM-DD"
},
"group": {
"type": "boolean",
"default": false,
"description": "Answer for the entity's company group: Google with Alphabet, Google DeepMind, Gemini..."
},
"limit": {
"type": "integer",
"default": 60
},
"scope": {
"enum": [
"core",
"all"
],
"type": "string",
"description": "core (default) or all"
},
"entity": {
"type": "string",
"description": "Entity slug, e.g. google, openai, anthropic"
},
"offset": {
"type": "integer",
"default": 0,
"description": "Skip this many matching claims (next_offset from the previous page)"
},
"known_by": {
"type": "string",
"description": "ISO date YYYY-MM-DD: count only claims a dated source published, or AsOf recorded, by this day. as_of defaults to it"
},
"predicates": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only these predicates"
},
"assertable_only": {
"type": "boolean",
"description": "Only claims the record asserts for the day. Default true for core, false for all"
}
}
}| assertable_only | boolean |
{
"type": "object",
"required": [
"query"
],
"properties": {
"kind": {
"enum": [
"all",
"entities",
"claims"
],
"type": "string",
"description": "all (default), entities or claims"
},
"limit": {
"type": "integer",
"default": 20
},
"query": {
"type": "string",
"maxLength": 300
},
"assertable_only": {
"type": "boolean",
"default": false
}
}
}| limit |
| integer |
| entity* | string |
| offset | integer | Skip this many rows, newest first (next_offset from the previous page) |
| predicates | array |
| assertable_only | boolean |
{
"type": "object",
"required": [
"entity"
],
"properties": {
"on": {
"type": "string",
"description": "Only events dated exactly this day, YYYY-MM-DD"
},
"to": {
"type": "string",
"description": "Latest date, YYYY-MM-DD"
},
"from": {
"type": "string",
"description": "Earliest date, YYYY-MM-DD"
},
"kind": {
"enum": [
"people",
"money",
"products",
"models",
"other"
],
"type": "string",
"description": "Only this kind of change"
},
"group": {
"type": "boolean",
"default": false,
"description": "Every record of the entity's company group, merged"
},
"limit": {
"type": "integer",
"default": 100
},
"entity": {
"type": "string"
},
"offset": {
"type": "integer",
"default": 0,
"description": "Skip this many rows, newest first (next_offset from the previous page)"
},
"predicates": {
"type": "array",
"items": {
"type": "string"
}
},
"assertable_only": {
"type": "boolean",
"default": false
}
}
}| Argument | Type | Description |
|---|
| limit | integer | |
| topic | string | A theme (voice_audio), a deal kind (funding_round, acquisition), model, release, update or deal; omit for the counts |
| domain | string | ai or tech; omit for both |
| offset | integer | |
| company | string | With topic: one company's claims, its records read together; a key from the counts' companies[].key (google, openai, anthropic...) |
| quarter | string | YYYY-Qn, e.g. 2026-Q3 |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 50
},
"topic": {
"type": "string",
"description": "A theme (voice_audio), a deal kind (funding_round, acquisition), model, release, update or deal; omit for the counts"
},
"domain": {
"enum": [
"ai",
"tech"
],
"type": "string",
"description": "ai or tech; omit for both"
},
"offset": {
"type": "integer",
"default": 0
},
"company": {
"type": "string",
"description": "With topic: one company's claims, its records read together; a key from the counts' companies[].key (google, openai, anthropic...)"
},
"quarter": {
"type": "string",
"description": "YYYY-Qn, e.g. 2026-Q3"
}
}
}