io.github.physics-star-cat/databutler-facts·Utilities

databutler-facts

Official thresholds, rates and fees by key, with source, verified date and signature.

Stars
0
Version
1.0.0
License
—
Review
Passed
Language
JavaScript
Last commit
2h ago
Forks
0
Open issues
11
Registry update
Oct 13, 2026

Connect

remote
Terminal
$claude mcp add --transport http databutler-facts https://databutler.dev/api/mcp/facts

Headers

Nothing to configure — it works as is.

Security review

Review passed

Reviewed 1h ago.

tools
3 tools scanned
metadata
scanned

No findings.

Tools

3
  • get_fact

    The current value of one official figure by key — a tax threshold, rate, allowance, fee, deadline, limit or policy rate — with the date it was verified, the official source URL, the period it applies to and a signature. Keys are `<country>/<topic>/<fact>`, e.g. `uk/income-tax/personal-allowance`, `uk/national-insurance/primary-threshold`, `us/social-security/wage-base`, `de/income-tax/grundfreibetrag`, `uk/bank-rate`, `eu/ecb/deposit-facility`, `uk/gov/passport-renewal-adult/fee-online-uk`. A loose key is resolved when unambiguous; otherwise the answer lists candidate keys. `max_age` (e.g. `30d`) marks the answer `stale` when the verification is older than that. Several keys separated by commas return a batch. Covers UK, US and German rates and thresholds, UK vehicle tax and MOT rules, UK government service fees, UK exam dates and central-bank policy rates; `coverage` lists the rest.

  • resolve_fact

    Ranked canonical fact keys for a plain-language question or a guessed key — "NI primary threshold", "ECB deposit rate", "passport renewal fee" — each with label, unit, period and verification date, and the full record of the top match when it is unambiguous. The keys feed `get_fact`. Filter by `namespace` (`uk`, `us`, `de`, `eu`).

  • what_changed_since

    What has changed in Data Butler's verified datasets since a date — pass your training-cutoff date to learn which UK tax/NI/benefit thresholds, exam-spec facts, official vehicle datasets (UK DVSA, French RappelConso and Japanese MLIT recalls), software end-of-life dates (Node.js, Python, Ubuntu, Debian, Android, iOS, macOS, Windows, Java, Go, Ruby, PHP, PostgreSQL, React — cycles that reached end of life or whose dates moved), central-bank policy rates (Bank of England, Fed, ECB), US federal tax thresholds (IRS inflation adjustments, Social Security wage base, retirement and HSA limits), German tax and social-insurance thresholds (Grundfreibetrag, Beitragsbemessungsgrenzen, Zusatzbeitrag, Mindestlohn, Kindergeld), UK vehicle tax (VED) rates and MOT rules, UK exam dates (results days, summer timetable paper dates, entry deadlines and late-fee dates, announced specification changes), calendar facts (public holidays for the UK, US, Germany and France; tax-year and daylight-saving rules for

Data Butler (databutler.dev)

An agent honeypot: clean, verified UK public data served to AI agents via MCP and REST. Not an SEO play — no GSC ambitions. The customer is an AI assistant answering a human's question; the product is being the source that is right, with provenance on every number.

  • Planned domain: databutler.dev (until purchased/connected, the Vercel default databutler.vercel.app works, but registry listings must NOT be published until the final domain is live — listings bake in URLs).
  • Status: LIVE (launched 2026-08-31): https://databutler.dev — REST + MCP serving, domain attached, listed on Smithery (drchriseames/databutler-uk-exams, -uk-rates) and the official MCP Registry (io.github.physics-star-cat/databutler-uk-exams, -uk-rates). Tracking LIVE (GA4 property 552213153, verified in realtime; monitored by webmon 🤖 column). PulseMCP will auto-ingest from the official registry. Front door POST /api/mcp — built 2026-09-01 on branch feat/front-door; listing as io.github.physics-star-cat/databutler / Smithery drchriseames/databutler pending deploy.
  • Born 2026-08-31 out of the agent-API work on whatbreaks.uk (MOT data) and lowriskquotes.com (Monte Carlo) — full history in ../docs/AUDIT_2026-08-30_five-sites.md §3b–3e and ../docs/MONETISATION-DECISION.md.

The model (one brand, many focused servers)

There is no domain authority in MCP registries — discovery is per-listing. So this is NOT one mega-server (tool-list bloat kills those); it is one domain/repo/brand hosting separate, focused MCP endpoints, each listed individually under one namespace, cross-referencing each other:

Front door (2026-09): POST /api/mcp lists the five high-frequency tools directly plus what_changed_since, coverage, catalogue, call. It is still not a mega-server — everything else stays behind call, capped at 9 listed tools by test. The focused servers remain live and listed.

The roadmap is ordered by (value to an AI agent) × (likelihood we can build it well). It deliberately includes the maintainer-Claude wishlist — this product is designed with Claude as the end user, by Claude:

#Vertical (wishlist item it serves)EndpointStatus
1UK rates & thresholds — the "is this still true?" fact-refresh server for the numbers agents misquote most (wishlist #1)/api/mcp/uk-ratesv1 — LIVE
2UK exams — boards, specs, topic→paper ("is electricity paper 2 AQA"), past-paper index (unique curation edge: maintainer taught)/api/mcp/uk-examsv1 — LIVE
3Provenance checker — "who really runs this domain/package?" (wishlist #2) — live RDAP/npm/PyPI, homoglyph-aware typosquat/api/mcp/provenancev1 — LIVE
4Stats toolkit — exact statistics & probability (Claude's maths pick) — distributions, hypothesis tests, CIs, Bayes, regression; reference-validated/api/mcp/statsv1 — LIVE
5Vehicles hub — UK MOT failure data (live proxy to whatbreaks.uk), UK safety recalls (DVSA, 4,876 recalls since 2016), French recalls (RappelConso, 1,663 fiches), Japanese recalls + owner complaints (MLIT, 75 models); EU Safety Gate stub/api/mcp/vehiclesv1 — built 2026-10-03
6Take-home pay — take_home_pay for us, uk, ca, au, in, br, de, fr, pl (+ es listed, covered:false): live proxy to the LifeByNumbers salary calculators (same operator), uniform shape (gross/net/deductions annual + monthly, typed breakdown, taxYear, assumptions). Listed at the front door — the highest-frequency money question after rates/api/mcp/taxv1 — built 2026-10-03
7Software end-of-life — "is this version still supported, and until when" for the 14 runtimes/OSes agents are asked about most (Node.js, Python, Ubuntu, Debian, Android, iOS, macOS, Windows, Oracle JDK, Go, Ruby, PHP, PostgreSQL, React): committed monthly snapshot of endoflife.date open data (MIT, 340 cycles), version → cycle resolution, days remaining/since, changelog entries when a cycle reaches EOL or a date moves/api/mcp/software-eolv1 — built 2026-10-03
8Policy rates — policy_rate: the three most-asked central-bank rates (BoE Bank Rate, Fed federal funds target range, ECB key rates) as committed, changelogged, source-watched data; the first global step of the "is this still true?" layer (#9, #12). Freshness due after 45 days; eight decisions a year each/api/mcp/policy-ratesv1 — built 2026-10-03
9US federal rates & thresholds — us_rates_lookup: tax year 2026 income-tax schedules and standard deduction, Social Security wage base, Medicare, retirement-plan/IRA, HSA and estate-gift figures read from the IRS revenue procedures, notices and SSA's Federal Register notice, each with the quoted sentence and prior-year value (wishlist #12, "Rates, country #2 = US"); first country after the UK on the "is this still true?" layer/api/mcp/us-ratesv1 — built 2026-10-03
10German rates & thresholds — de_rates_lookup: Veranlagungszeitraum 2026 Einkommensteuertarif (§ 32a) and Solidaritätszuschlag, Sozialversicherung Beitragsbemessungsgrenzen, Rechengrößen and Beitragssätze, Mindestlohn (2026 and the fixed 2027 step), Geringfügigkeitsgrenze, Kindergeld, Kinderfreibetrag, Pauschbeträge and Entfernungspauschale, read from the consolidated statutes and the Bundesgesetzblatt with German term + English label, quoted sentence and prior value; country #3 on the "is this still true?" layer/api/mcp/de-ratesv1 — built 2026-10-03
11UK vehicle tax (VED) and MOT rules — uk_vehicle_rules_lookup: the car-tax and MOT numbers the four car sites' users ask about and that change every 1 April (first-year CO2 bands, standard rate, expensive car supplement incl. the £50,000 EV threshold, 2001–2017 bands, pre-2001 rates, electric-car rules, historic 40-year exemptions, MOT fees/retests/penalties), each with the quoted gov.uk line and its 2025-26 value; calendar-driven refresh/api/mcp/uk-vehicle-rulesv1 — built 2026-10-04
12UK exam dates and spec changes — results days, the summer 2027 timetable (JCQ window + the most-asked papers at AQA, Pearson Edexcel, Cambridge OCR and WJEC/Eduqas, all final), entry deadlines with each board's late-fee dates, Scotland's results day, announced spec changes; every date quoted from the JCQ/board/regulator document with the summer-2026 date as previous/api/mcp/uk-exam-datesv1 — built 2026-10-04
13Calendar facts — the boring dates a training cutoff hides: public holidays for the UK (3 nations), US federal, Germany (16 Länder) and France (2 zones) from the official lists; tax-year starts/ends for 9 countries with the statute quoted; daylight-saving rules and computed switch dates for 6 countries — 2026–2028, monthly snapshot, changelog when a year is published or a holiday moves/api/mcp/calendarv1 — built 2026-10-04
14UK government services — uk_gov_process: the gov.uk services assistants get wrong after a fee or rule change (passport fees UK/overseas, ETA fee and enforcement, driving licence renewal, SORN, voter registration, birth/death registration, Blue Badge, Self Assessment and Making Tax Digital, NI number, Universal Credit, EU Settlement Scheme, BRP → eVisa), each with the official start URL, the quoted gov.uk sentence and dated changes/api/mcp/uk-gov-processv1 — built 2026-10-04

Planned, parked and out of scope (hand-maintained — these are not area modules):

#Vertical (wishlist item it serves)EndpointStatus
4Local-services resolver — postcode → council → services/MP (wishlist #3)/api/mcp/uk-councilsphase 2
5Bin collection pilot (5–10 large councils, feasibility-gated)—phase 2b
3cFront door — single POST /api/mcp hub: direct high-frequency tools + what_changed_since (changelog vs. your training cutoff), coverage, catalogue/call; freshness + citation permalink on every response; weekly gov.uk source watcher (spec: docs/superpowers/specs/2026-09-01-front-door-design.md)/api/mcpbuilt — deploy pending
9Drift facts (global) — facts that move on a calendar and agents misquote: tax-year boundaries by country, public holidays, DST transitions, currency/country codes, headline VAT/sales-tax rates. Cheap to curate, low rot, feeds what_changed_since/api/mcp/driftafter front door
10Volatility tool — volatility(topic): how often a class of fact changes and when it last did, so an agent knows whether to trust memory at all. Curated table, no per-country data; Claude's own top pick for the global layerfront door toolafter front door
11Provenance, widened — crates.io, RubyGems, Go modules, Docker Hub, GitHub Actions, browser extensions; then MCP-server provenance (cross-check a registry listing's claimed domain, repo and publisher — the hub that vets other hubs)/api/mcp/provenanceafter front door
12cRates, further countries — AU/CA/IN sites 403 automated fetches (browser-only curation); US and Germany are built (roadmap above)/api/<cc>/ratesafter the source watcher proves the annual loop on us-rates/de-rates
13Exams, global boards — IB and AP: same topic→paper query stream, same teaching moat; curation-heavy, gated on UK exams 🤖 counts/api/mcp/examsgated
6bUK councils phase 2 (above)—later
7Current-docs for libraries (wishlist #4)—parked — Context7 et al. exist; only enter if a clearly underserved niche appears
8Infra-config/auth broker (wishlist #5)—out of scope — VC-scale product, documented so we stop re-litigating it

Global direction (added 2026-09-01): the niche is verified reference facts with provenance and change history — not docs, not search. Provenance and stats are already country-free; the country-prefixed paths take more countries without renames. Rule: no vertical that depends on scraping sites that block bots until the source watcher (#3c) has proven the maintenance loop.

Rationale for the order: #1 is the highest-frequency, lowest-build-cost, most correctness-critical item — every agent answering UK money questions needs it weekly and gets it wrong from memory. #2 has the strongest curation moat (domain expertise) and a huge natural query stream. #3–#5 each need real engineering programmes; they wait for evidence of demand (agent_* event counts) from #1/#2.

Existing family members on their own domains: whatbreaks.uk /api/mcp (MOT reliability), lowriskquotes.com /api/mcp/ (Monte Carlo), and lifebynumbers.net (the Flask/Lambda salary calculators behind take_home_pay).

Tool catalogue (32 tools, 14 focused servers + front door)

ServerToolsData
/api/mcp/uk-ratesuk_rates_lookupdata/uk/rates/<taxYear>.json, verified against gov.uk
/api/mcp/uk-examsexam_topic_paper, exam_spec_lookup, exam_paper_indexdata/uk/exams/*.json, verified against board spec pages
/api/mcp/provenancedomain_provenance, package_provenancelive RDAP / npm / PyPI
/api/mcp/statsdescriptive_stats, distribution, hypothesis_test, confidence_interval, bayes_update, linear_regressionpure computation, reference-validated
/api/mcp/vehiclesuk_mot_reliability, uk_mot_vehicle_search (live proxy → whatbreaks.uk, 8 s timeout, UA databutler-hub/1.0); uk_recalls_for_model, uk_recalls_search (data/vehicles/uk-recalls.json, DVSA bulk CSV, Open Government Licence v3.0, recalls launched in the last ten calendar years); fr_recalls_for_model, fr_recalls_search (data/vehicles/fr-recalls.json, RappelConso V2 open data, Licence Ouverte 2.0); jp_recalls_for_model, jp_complaints_summary (data/vehicles/jp-recalls.json, MLIT); eu_safety_gate_recalls (stub)regenerate with node scripts/vehicles.js — FR/JP from the sibling car_websites/ repos after their fetchers run, UK straight from DVSA (node scripts/vehicles.js uk)
/api/mcp/taxtake_home_pay — country ∈ {us, uk, ca, au, in, br, de, es, fr, pl}, gross (annual, or monthly with period), optional state/filingStatus (US), province (CA), region (UK)live proxy → LifeByNumbers Lambda POST /calculate {calculatorId:'<cc>-salary', input} (8 s timeout, UA databutler-hub/1.0); contract + per-country fields + tax years documented in api/_tax.js. Spain returns covered:false — lifebynumbers.net computes it client-side, no backend calculator. Tax years are hard-coded upstream and mirrored in _tax.js COUNTRIES[].taxYear: re-check when LBN updates rates
/api/mcp/software-eolsupport_status {product, version} — resolves "18", "18.19.0", "3.11", "22.04", "bookworm", "1.8.0_392", "11-24h2-w" to its release cycle; supported true|false as of today, eol date, days remaining/since, active/extended-support ends, LTS, latest release, newest supported (LTS) cycle, plain-statement recommendation; support_timeline {product} — every cycle. Products: nodejs, python, ubuntu, debian, android, ios, macos, windows, oracle-jdk (java/jdk alias; the site has no "java" product — /java redirects to its java-distribution tag), go, ruby, php, postgresql, reactdata/software-eol.json (65 KB, 340 cycles): monthly snapshot of endoflife.date /api/<product>.json, MIT License, upstreamProvenance on every result; regenerate with node scripts/software-eol.js (appends software-eol changelog entries: first derivation → <product>/dataset; afterwards <product>/<cycle> when an eol date moves, a cycle reaches end of life between snapshots, or a new cycle appears)
/api/mcp/policy-ratespolicy_rate — bank ∈ {boe, fed, ecb}, optional all: truedata/policy-rates.json: Bank of England Bank Rate, Fed federal funds target range (lower/upper bound), ECB deposit facility / main refinancing / marginal lending — current level, effectiveFrom, decisionDate + meeting, previous level, latest decision (may be a hold), next scheduled decision, the bank's own page as source and the decision press release. Committed data, not a live proxy, verified against the banks' pages; freshness turns due 45 days after verifiedDate; the three source pages sit in data/sources.json for the weekly watcher. Refresh: edit the file against the pages, node scripts/changelog.js (docs/CURATION.md)
/api/mcp/us-ratesus_rates_lookup — category ∈ {income-tax, social-security, medicare, retirement, hsa, estate-gift} (omit to list)data/us-rates.json (tax year 2026, 43 figures): read from Rev. Proc. 2025-32, Notice 2025-67, Rev. Proc. 2025-19, SSA's Federal Register notice 2025-19763, Publication 15 and Tax Topic 751; every figure carries quote (the sentence or table row) and previous (the prior-year value). Rate schedules are bracket rows. Committed data, not a live proxy; freshness turns due at the IRS release window set by hand in nextScheduledRefresh. Refresh annually: edit against the new Rev. Proc./Notice, node scripts/changelog.js (docs/CURATION.md)
/api/mcp/de-ratesde_rates_lookup — category ∈ {income-tax, social-insurance, minimum-wage, minijob, kindergeld, kinderfreibetrag, sparer-pauschbetrag, arbeitnehmer-pauschbetrag, entfernungspauschale} (omit to list)data/de-rates.json (Veranlagungszeitraum 2026, 44 figures): read from § 32a/§ 9/§ 9a/§ 20/§ 32/§ 66 EStG, §§ 3–4 SolzG, SV-Rechengrößen-VO 2026 (BGBl. 2025 I Nr. 278), § 241 SGB V, § 341 SGB III, § 55 SGB XI + PBAV 2025, § 8 SGB IV, MiLoV5 and the BMG/DRV/BMAS/BMFSFJ/Minijob-Zentrale pages; every figure carries term (German), label (English), quote and previous; social-insurance rates carry employeeShare/employerShare. Committed data, not a live proxy; freshness turns due at the hand-set nextScheduledRefresh (mid-December, when the next year's Verordnung and Zusatzbeitrag are final). Refresh: edit against the BGBl/statutes, node scripts/changelog.js (docs/CURATION.md)
/api/mcp/uk-vehicle-rulesuk_vehicle_rules_lookup — category ∈ {ved-first-year, ved-standard, ved-expensive-car, ved-2001-2017, ved-pre-2001, ved-electric, historic, mot, penalties}data/uk-vehicle-rules/<taxYear>.json (one file per VED year from 1 April; 2026-27 now): every figure verified against the gov.uk page in its source (vehicle-tax-rate-tables, getting-an-mot, historic-vehicles, vehicle-tax-direct-debit, vehicle-exempt-from-vehicle-tax, HMRC ECS policy paper) with the quoted row/sentence, effectiveFrom and the previous year's value read from the National Archives capture of the same page. Refresh each 1 April: new file, node scripts/changelog.js --only uk-vehicle-rules (docs/CURATION.md)
/api/mcp/uk-exam-datesuk_exam_dates {kind: results|timetable|deadlines|spec-changes, board?, qualification?} — results days (A-level 12 Aug, GCSE 19 Aug 2027; Nov 2026 resits 13 Jan 2027; Scotland 10 Aug 2027), JCQ common window and contingency day, GCSE Maths/English Language/Combined Science and A-level Maths paper dates per board, entry deadline 21 Feb 2027 and each board's late/very-late fee dates and multipliers, spec changes (DfE reform timetable, Ofqual decisions, new AQA/Pearson/OCR/WJEC specs)data/uk-exam-dates.json (91 figures), read from the JCQ key-dates PDFs, each board's final timetable and fee documents, Qualifications Scotland and gov.uk; refreshed when the next summer's finals publish
/api/mcp/calendarcalendar_facts {country, kind: holidays|tax-year|dst, year?, region?} — holidays by region (UK nations, US federal with OPM observed dates, German Länder incl. partial/Gemeinde-scoped days, French metropole/Alsace-Moselle), tax-year periods with the statute quoted, DST rule + transitions; next_holiday {country, from?, region?} — the next public holiday after a date. Country names, Land names and kind synonyms resolve; unknowns answer covered:false + nearestdata/calendar.json (98 KB compact, 2026/2027/2028): gov.uk bank-holidays.json (OGL v3), OPM federal holiday tables (US Government work), calendrier.api.gouv.fr (Licence Ouverte 2.0), merged with data/calendar/manual.json (German Länder rules, tax years, DST rules — each with the official page and sentence quoted; nonOfficial: true where a page could not be re-fetched); regenerate with node scripts/calendar.js (appends calendar changelog entries)
/api/mcp/uk-gov-processuk_gov_process {service ∈ passport-renewal-adult, passport-child, driving-licence-renewal, provisional-licence, change-address, vehicle-tax-sorn, register-to-vote, register-birth, register-death, blue-badge, self-assessment, national-insurance-number, universal-credit, eu-settlement-scheme, evisa, eta; aliases e.g. passport, brp, sorn}data/uk-gov-process.json: every figure read from the gov.uk content API with the quoted sentence and source URL; per service the start URL, page update date and dated changes since 2025; previous values from National Archives captures, Home Office announcements and SI 2026/311 / SI 2026/148. Re-verified every 30 days (docs/CURATION.md)
/api/mcp/factsget_fact, resolve_fact, what_changed_since — Verified Facts (verified-facts/0.2): one official figure by key, signed496 facts from the 7 facts areas (facts blocks); also GET /f/<key>
/api/mcp (front door)the five high-frequency tools above (uk_rates_lookup, exam_topic_paper, domain_provenance, package_provenance, take_home_pay) + what_changed_since, get_fact, resolve_fact, coverage, catalogue, call—

REST mirrors: /api/uk/rates, /api/uk/exams/topic, /api/uk/exams/specs, /api/uk/exams/papers, /api/provenance/domain, /api/provenance/package, /api/stats, /api/vehicles/uk/mot, /api/vehicles/uk/search, /api/vehicles/uk/recalls, /api/vehicles/uk/recalls-search, /api/vehicles/fr/recalls, /api/vehicles/fr/search, /api/vehicles/jp/recalls, /api/vehicles/jp/complaints, /api/vehicles/eu/safety-gate, /api/tax/take-home, /api/software-eol/status, /api/software-eol/timeline, /api/policy-rates, /api/us/rates, /api/de/rates, /api/uk/vehicle-rules, /api/uk/exam-dates, /api/calendar, /api/calendar/next, /api/uk/gov-process.

Every tool carries title and MCP annotations (readOnlyHint: true, destructiveHint: false, openWorldHint true only for live fetches). Privacy statement: /privacy.

Adding an area

Every curated area is one module under api/_areas/ (contract: api/_areas/README.md) plus its data file, its test and a CURATION section; registry, routes, coverage, freshness, changelog, /api, llms.txt, sitemap, discovery document and this README's tables all derive from it. Start with node scripts/new-area.js <slug> --title "…" --cadence "…" and follow docs/ADDING_AN_AREA.md. node scripts/sync-areas.js --check tells you when a generated block here is stale.

The changelog is a product

"What changed in the official facts" is served in its own right, not only as a tool an agent calls. One data file (data/changelog.json, script-generated, maintainer-noted) feeds every surface:

SurfaceURLForNotes
PageGET /changes (?area=, ?since=)humans, search enginesIndexable, canonical + rel=alternate to the feeds; newest first, grouped by month; each entry shows area, from → to, effectiveFrom, official source, maintainer note, verifiedDate. Cache-Control: public, max-age=300, s-maxage=3600; bad filter → 400, no-store.
RSS 2.0GET /changes.rss (?area=)feed readers, Slack/Discord RSS botsguid = https://databutler.dev/changes#<area-key-verifiedDate> (isPermaLink), link = official source, pubDate = verifiedDate. Byte-stable until the data changes.
AtomGET /changes.atom (?area=)feed readersSame entries as RSS.
JSONGET /api/changes?since=&area=&format=jsonagents, scriptsEnvelope unchanged; format=html|rss|atom hands off to the page/feeds.
MCPwhat_changed_since on POST /api/mcpagents"Pass your training cutoff" view of the same entries.
Sitemap/sitemap.xmlcrawlers/, /changes, the four ?area= views, /privacy, /api.

The Verified Changes protocol (v0.1)

The shape above is written down as an open convention any site can publish and any assistant can consume — docs/CHANGES_PROTOCOL.md, served indexable at /protocol (?format=md for the markdown; handler api/_routes/protocol.js, renderer api/_markdown.js). Data Butler is the reference implementation:

ArtefactWhere
Discovery documentpublic/.well-known/changes.json → /.well-known/changes.json (areas, cadence, endpoints, schema, licence, contact)
JSON Schemas (draft 2020-12)public/schema/changes.v0.json (document + $defs/entry), public/schema/well-known-changes.v0.json
Validatorapi/_schema_check.js — hand-rolled subset (type/required/enum/pattern/format/$ref), no dependencies; tests/protocol.test.js validates data/changelog.json, the discovery document and the live /api/changes output against the schemas
Conforming outputGET /api/changes and what_changed_since carry protocol, schema, publisher, generated

Bumping the version: change PROTOCOL in api/_changelog.js, add a new schema file (keep the old one — URLs are forever), update the const in both schemas and the discovery document, and the spec's Versioning section.

Handlers: api/_routes/changes-page.js, api/_routes/changes-feed.js (routes changes-page, changes-feed in api/router.js; rewrites in vercel.json ahead of the generic /api/(.+) one). Rendering is pure in api/_changes_render.js; api/_changelog.js exposes listEntries and entryId. How entries get written: docs/CURATION.md → "How to add a changelog entry when a dataset is refreshed".

Verified Facts (v0.2)

The facts layer of the same protocol: one short key per official figure, one compact, dated, sourced, signed answer back — docs/FACTS_PROTOCOL.md, served at /protocol/facts. Data Butler serves it at conformance level L3 (server-filtered, signed), all through api/router.js (no new functions):

Status: built 2026-10-12 on feat/facts-protocol-v02 (496 keys, key db-2026-10); not yet deployed or listed in any registry.

ArtefactWhere
Get / batch / index / resolveGET /f/<key>?max_age=30d (json · ?format=txt · ?format=html, indexable with JSON-LD Claim), GET /f?keys= / POST /f, GET /f (Dataset JSON-LD on ?format=html), GET /f/resolve?q= — api/_routes/f.js, renderers api/_facts_render.js
The indexapi/_facts.js — built at cold start from the area modules' facts blocks (api/_areas/README.md), so it cannot disagree with the data
MCPPOST /api/mcp/facts (get_fact, resolve_fact, what_changed_since; server-facts.json); get_fact and resolve_fact also at the front door
Discoverypublic/.well-known/facts.json, public/openapi.json, public/.well-known/ai-catalog.json + /api/mcp/<server>/server-card (all generated by scripts/sync-areas.js); two lines in llms.txt; every fact page in the sitemap
Schemaspublic/schema/fact.v0.json (record + $defs miss/batch/index/resolve), public/schema/well-known-facts.v0.json; the v0.1 schemas gained the optional §12 fields
Hash + signatureapi/_jcs.js (RFC 8785), api/_facts_sign.js (claim hash, attestation, detached EdDSA JWS, verifier)
Keys and signerpublic/.well-known/jwks.json; scripts/facts-keygen.js, scripts/sign-facts.js → data/facts-signatures.json (build time; the private key never reaches Vercel — docs/CURATION.md "Signing and key rotation")
Verifiernode scripts/verify-fact.js <url or file>
Static generator (L1, sister sites)node scripts/facts-static.js
Conformance checkernode scripts/facts-check.js https://<site> (spec §11)

Iron rules (learned the hard way)

  1. No fabricated data, ever. Every record carries source (official URL), verifiedDate, and where relevant specVersion/taxYear. The seed-data-that-claimed-to-be-TÜV episode is the cautionary tale.
  2. Copyright: index, don't host. Past papers are exam-board copyright. We serve metadata and official links, never the PDFs.
  3. URLs are forever. Trailing/exact endpoint URLs get baked into registry listings and agent configs — don't rename after publishing.
  4. Track from day one. GA4 Measurement Protocol events (agent_*), anonymous, reported by ../webmon/.

Key docs

  • docs/SPEC.md — full design: architecture, tool schemas, data model, curation workflow, rollout checklist, monetisation posture.
  • ../docs/MONETISATION-DECISION.md — when/how the x402 switch gets flipped (requires the paid domain on Cloudflare; impossible on *.vercel.app).

From the server's repository — third-party content, read it before running anything it suggests.

More in Utilities

Listing from the official MCP Registry · repository facts from GitHub, just now.