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. Since 2026-10-31 the Vercel firewall answers 403 for
every focused server except /api/mcp/facts and /api/mcp/uk-rates: point
clients at the front door, whose call runs any tool by name.
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:
Planned, parked and out of scope (hand-maintained — these are not area modules):
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 (36 tools: the front door, /api/mcp/facts and /api/mcp/uk-rates, /api/mcp/uk-inflation, /api/mcp/us-inflation)
Every tool is reached through the front door POST /api/mcp: listed there, or by name through call (catalogue lists them all). The other 15 focused /api/mcp/<area> servers answer 403 at the Vercel firewall since 2026-10-31.
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, /api/uk-inflation, /api/us/inflation.
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:
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:
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.
Iron rules (learned the hard way)
- 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.
- 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).