io.github.physics-star-cat/databutler-uk-gov-process
UK government service fees, steps, processing times and recent changes, read from gov.uk.
Install
Add this to your client's MCP configuration (Claude Desktop: claude_desktop_config.json; Cursor: .cursor/mcp.json; VS Code and others use the same "mcpServers" shape).
claude mcp add --transport http databutler-uk-gov-process 'https://databutler.dev/api/mcp/uk-gov-process'
{
"mcpServers": {
"databutler-uk-gov-process": {
"type": "http",
"url": "https://databutler.dev/api/mcp/uk-gov-process"
}
}
}
Documentation
From the project's README on GitHub, refreshed weekly. Links open on GitHub.
Contents
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 |
| 15 | Japan vehicle statutory costs — jp_vehicle_costs_lookup: the 法定費用 of a 車検 and the annual car taxes for the shakendata.com audience (自動車重量税 2026-05 – 2028-04 table and age rules, エコカー減税 bands, 自賠責 before and from 2026-11-01 as separate keys, 継続検査 fees from 2026-04-01 with the old amounts, 自動車税 by displacement, 軽自動車税), each with the Japanese term and the quoted official row; first non-Western country and the jp facts namespace | /api/mcp/jp-vehicle-costs | v1 — built 2026-10-24 |
| 16 | Japan daily-life official figures — jp_living_costs_lookup: the figures a resident or employer in Japan looks up (地域別最低賃金 FY2026 for all 47 prefectures with their staggered 発効日 and FY2025 amounts, 協会けんぽ rates by prefecture with 介護 and 子ども・子育て支援金, 厚生年金 / 国民年金, 雇用保険料率, 児童手当, 出産育児一時金, 高額療養費 through the 2026 and 2027 revisions, 2027 祝日, 消費税, 基礎控除 / 給与所得控除, 住民税 均等割), each with the Japanese term and the quoted official row; prefecture figures are individual facts (jp/minimum-wage/tokyo) | /api/mcp/jp-living-costs | v1 — built 2026-10-24 |
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 (34 tools, 16 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/jp-vehicle-costs | jp_vehicle_costs_lookup — category ∈ {weight-tax, weight-tax-eco, cali, inspection-fee, auto-tax, kei-tax} (omit to list) | data/jp-vehicle-costs.json (58 figures): read from the MLIT weight-tax table and エコカー減税 PDFs, the MLIT 自賠責 portal table and the FSA 第153回審議会 revision, NALTEC's fee list and fee-change notice, the Tokyo Metropolitan Tax Bureau 自動車税 page and surcharge table, MLIT's green-tax and 令和8年度 reform summaries, 総務省's 軽自動車税 overview and Kōtō City's 軽自動車税 page; every figure carries term (Japanese), label (English), quote, source, effectiveFrom/effectiveTo. Refresh every 35 days and on the change dates (docs/CURATION.md) | |||
/api/mcp/jp-living-costs | jp_living_costs_lookup — category ∈ {minimum-wage, health-insurance, pension, employment-insurance, benefits, holidays, consumption-tax, income-tax, resident-tax} (omit to list) | data/jp-living-costs.json (135 figures): read from MHLW's 令和8年度 地域別最低賃金 全国一覧 PDF, 協会けんぽ's 令和8年度 都道府県単位保険料率 table and 介護 / 支援金 pages, 日本年金機構's 保険料 pages, MHLW's 年金額改定, 雇用保険料率, 出産育児一時金 and 高額療養費 documents, こども家庭庁's 児童手当 page, 内閣府's 祝日 CSV, NTA タックスアンサー No.6303 / 1199 / 1410 and 総務省's 個人住民税 page; every figure carries term (Japanese), label (English), quote, source, effectiveFrom/effectiveTo. Refresh every 35 days and on the change dates (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 | 689 facts from the 9 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, /api/jp/vehicle-costs, /api/jp/living-costs.
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).
Frequently asked questions
What is io.github.physics-star-cat/databutler-uk-gov-process?
UK government service fees, steps, processing times and recent changes, read from gov.uk.
How do I install io.github.physics-star-cat/databutler-uk-gov-process?
It runs as a remote server. In Claude Code: claude mcp add --transport http databutler-uk-gov-process 'https://databutler.dev/api/mcp/uk-gov-process'. For other clients, paste the JSON configuration from this page into their MCP settings.
Does io.github.physics-star-cat/databutler-uk-gov-process need an API key?
Its registry entry lists no required key or secret. Some features may still need an account with the service it connects to.
Is io.github.physics-star-cat/databutler-uk-gov-process open source?
Its code is public on GitHub, but the repository does not declare a standard license.
Who maintains io.github.physics-star-cat/databutler-uk-gov-process?
It is published by physics-star-cat. AI.tn lists it but does not maintain or endorse it.
From the official MCP Registry. Listing is not an endorsement: review a server's code and permissions before giving it access to your data.