- Language
- JavaScript
- Last commit
- 2h ago
- Forks
- 0
- Open issues
- 11
- Registry update
- Oct 13, 2026
Connect
remote$claude mcp add --transport http databutler-facts https://databutler.dev/api/mcp/factsHeaders
Nothing to configure — it works as is.
Security review
Review passedReviewed 1h ago.
- tools
- 3 tools scanned
- metadata
- scanned
No findings.
Tools
3get_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.appworks, 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 asio.github.physics-star-cat/databutler/ Smitherydrchriseames/databutlerpending 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) | Endpoint | Status |
|---|---|---|---|
| 1 | UK rates & thresholds — the "is this still true?" fact-refresh server for the numbers agents misquote most (wishlist #1) | /api/mcp/uk-rates | v1 — LIVE |
| 2 | UK exams — boards, specs, topic→paper ("is electricity paper 2 AQA"), past-paper index (unique curation edge: maintainer taught) | /api/mcp/uk-exams | v1 — LIVE |
| 3 | Provenance checker — "who really runs this domain/package?" (wishlist #2) — live RDAP/npm/PyPI, homoglyph-aware typosquat | /api/mcp/provenance | v1 — LIVE |
| 4 | Stats toolkit — exact statistics & probability (Claude's maths pick) — distributions, hypothesis tests, CIs, Bayes, regression; reference-validated | /api/mcp/stats | v1 — LIVE |
| 5 | Vehicles 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/vehicles | v1 — built 2026-10-03 |
| 6 | Take-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/tax | v1 — built 2026-10-03 |
| 7 | Software 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-eol | v1 — built 2026-10-03 |
| 8 | Policy 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-rates | v1 — built 2026-10-03 |
| 9 | US 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-rates | v1 — built 2026-10-03 |
| 10 | German 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-rates | v1 — built 2026-10-03 |
| 11 | UK 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-rules | v1 — built 2026-10-04 |
| 12 | UK 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-dates | v1 — built 2026-10-04 |
| 13 | Calendar 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/calendar | v1 — built 2026-10-04 |
| 14 | UK 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-process | v1 — built 2026-10-04 |
Planned, parked and out of scope (hand-maintained — these are not area modules):
| # | Vertical (wishlist item it serves) | Endpoint | Status |
|---|---|---|---|
| 4 | Local-services resolver — postcode → council → services/MP (wishlist #3) | /api/mcp/uk-councils | phase 2 |
| 5 | Bin collection pilot (5–10 large councils, feasibility-gated) | — | phase 2b |
| 3c | Front 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/mcp | built — deploy pending |
| 9 | Drift 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/drift | after front door |
| 10 | Volatility 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 layer | front door tool | after front door |
| 11 | Provenance, 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/provenance | after front door |
| 12c | Rates, further countries — AU/CA/IN sites 403 automated fetches (browser-only curation); US and Germany are built (roadmap above) | /api/<cc>/rates | after the source watcher proves the annual loop on us-rates/de-rates |
| 13 | Exams, global boards — IB and AP: same topic→paper query stream, same teaching moat; curation-heavy, gated on UK exams 🤖 counts | /api/mcp/exams | gated |
| 6b | UK councils phase 2 (above) | — | later |
| 7 | Current-docs for libraries (wishlist #4) | — | parked — Context7 et al. exist; only enter if a clearly underserved niche appears |
| 8 | Infra-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)
| Server | Tools | Data |
|---|---|---|
/api/mcp/uk-rates | uk_rates_lookup | data/uk/rates/<taxYear>.json, verified against gov.uk |
/api/mcp/uk-exams | exam_topic_paper, exam_spec_lookup, exam_paper_index | data/uk/exams/*.json, verified against board spec pages |
/api/mcp/provenance | domain_provenance, package_provenance | live RDAP / npm / PyPI |
/api/mcp/stats | descriptive_stats, distribution, hypothesis_test, confidence_interval, bayes_update, linear_regression | pure computation, reference-validated |
/api/mcp/vehicles | uk_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/tax | take_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-eol | support_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, react | data/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-rates | policy_rate — bank ∈ {boe, fed, ecb}, optional all: true | data/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-rates | us_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-rates | de_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-rules | uk_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-dates | uk_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/calendar | calendar_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 + nearest | data/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-process | uk_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/facts | get_fact, resolve_fact, what_changed_since — Verified Facts (verified-facts/0.2): one official figure by key, signed | 496 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:
| Surface | URL | For | Notes |
|---|---|---|---|
| Page | GET /changes (?area=, ?since=) | humans, search engines | Indexable, 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.0 | GET /changes.rss (?area=) | feed readers, Slack/Discord RSS bots | guid = https://databutler.dev/changes#<area-key-verifiedDate> (isPermaLink), link = official source, pubDate = verifiedDate. Byte-stable until the data changes. |
| Atom | GET /changes.atom (?area=) | feed readers | Same entries as RSS. |
| JSON | GET /api/changes?since=&area=&format=json | agents, scripts | Envelope unchanged; format=html|rss|atom hands off to the page/feeds. |
| MCP | what_changed_since on POST /api/mcp | agents | "Pass your training cutoff" view of the same entries. |
| Sitemap | /sitemap.xml | crawlers | /, /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:
| Artefact | Where |
|---|---|
| Discovery document | public/.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 |
| Validator | api/_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 output | GET /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.
| Artefact | Where |
|---|---|
| Get / batch / index / resolve | GET /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 index | api/_facts.js — built at cold start from the area modules' facts blocks (api/_areas/README.md), so it cannot disagree with the data |
| MCP | POST /api/mcp/facts (get_fact, resolve_fact, what_changed_since; server-facts.json); get_fact and resolve_fact also at the front door |
| Discovery | public/.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 |
| Schemas | public/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 + signature | api/_jcs.js (RFC 8785), api/_facts_sign.js (claim hash, attestation, detached EdDSA JWS, verifier) |
| Keys and signer | public/.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") |
| Verifier | node scripts/verify-fact.js <url or file> |
| Static generator (L1, sister sites) | node scripts/facts-static.js |
| Conformance checker | node scripts/facts-check.js https://<site> (spec §11) |
Iron rules (learned the hard way)
- No fabricated data, ever. Every record carries
source(official URL),verifiedDate, and where relevantspecVersion/taxYear. The seed-data-that-claimed-to-be-TÜV episode is the cautionary tale. - Copyright: index, don't host. Past papers are exam-board copyright. We serve metadata and official links, never the PDFs.
- URLs are forever. Trailing/exact endpoint URLs get baked into registry listings and agent configs — don't rename after publishing.
- 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
json-repair-mcp
io.github.robertoyanguas-ops
Repairs truncated or malformed LLM JSON outputs (trailing commas, markdown fences, unquoted keys).
Sarao
com.saraoia
Free, open, in-person AI meetups in Spain: search by city, date and topic. Read-only, no key.
AEM Content Manager (ACM)
io.github.wttech
Validate and run Groovy scripts on Adobe Experience Manager through AEM Content Manager (ACM).
AUTOGROK Desk
com.grokaiapps.desk
Pay-per-call web jobs for agents: URL probe, page extract, watch, JSON shape, researched briefs.
calc-mcp
io.github.coo-quack
21 MCP tools for math, randomness, dates, encoding, hashing, and more — deterministic and accurate.
rechtsklar24
de.rechtsklar24
German e-commerce law: obligation dates, statutory fine ceilings, unit-price calculator. Sourced.
Listing from the official MCP Registry · repository facts from GitHub, just now.