StatsMapped Public Data

com.statsmappedPublished by statsmapped.comOfficial publisherv0.3.2Updated Nov 7, 2026

Public statistics for Ireland and the UK: housing, crime, health, economy, welfare, with caveats.

VerifiedStreamable HTTPWeb executableWeb Search & ScrapingData & Analytics

Overview

AI-generated overview

Queries StatsMapped's public statistics for Ireland and the UK — housing, crime, health, economy and welfare — with caveats and citations.

What you can do
  • Find datasets and figures: list tracked stats, or get one area's datasets, latest values, year-on-year change and full detail with history
  • List areas: ids and names of counties, local authorities and districts at a chosen boundary level per country
  • Rank and compare: rank areas on a stat, look up registered cross-dataset comparison pairs with correlation stats, or check whether two stats are comparable
  • Explain metrics: definition, methodology and standing caveats for one stat
  • Get scene data: rows, table twin, alt text and licence block for a citable chart or short clip
  • List notable changes: statistical movements flagged as notable, newest first, optionally narrowed to one stat or area
When to use it
Useful when an assistant needs citable Irish or UK official statistics by county or local authority, or needs to explain what a metric means and how it is measured, without crawling and parsing publisher pages.
Requirements
Runs locally over stdio from the PyPI package statsmapped-mcp (installable with pip or run with uvx), or connects to the hosted Streamable HTTP endpoint. No API key or account is needed; it calls StatsMapped's public HTTPS API, so network access is required. Every tool takes a country argument, defaulting to Ireland.
Before you install
Read-only GET calls; nothing writes data. After each tool call the client sends a small usage event to StatsMapped containing the tool name, outcome, latency, identifier-shaped arguments such as stat_key or area_id, and a random install id stored in ~/.statsmapped-mcp/install_id; set STATSMAPPED_NO_LOG=1 or DO_NOT_TRACK=1 to disable it. The public API is rate-limited per source IP (600 requests/hour), and a hosted endpoint shares one egress IP across all its users. Comparison results are…

Installation

In SourceWeft

  1. Open StatsMapped Public Data in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/com.statsmapped%2Fpublic-data/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "statsmapped-public-data": {
      "type": "http",
      "url": "https://mcp.statsmapped.com/mcp"
    }
  }
}

README

statsmapped-mcp

An MCP server exposing StatsMapped's public API as tools for AI agents (Claude Desktop, Cursor, and any other MCP client).

StatsMapped tracks public data for Ireland (by county) and the UK (by local authority) — housing, crime, health, the economy and social welfare — from official publishers (CSO, PSRA, Central Bank of Ireland, DHLGH, NTPF, the Office of Government Procurement, EU Publications Office for Ireland; ONS/HM Land Registry/Nomis/DfE/DfT for the UK), each figure carrying its own caveats. This package lets an agent query that data directly as tool calls instead of crawling and parsing web pages. Every tool below takes a country argument ("ireland" or "united-kingdom", default "ireland") — the two countries track genuinely different datasets and geography levels, so call query_data/list_areas for the country you actually want rather than assume Ireland's defaults apply.

This is a thin client. It calls StatsMapped's already-public, unauthenticated HTTPS API (documented at statsmapped.com/openapi.json); no API key is needed for anything below. Runs on your own machine over stdio by default (the recommended way to use it today) -- see Why stdio for a hosted streamable-http mode this package also supports, and the real tradeoff that comes with it.

Install

Published on PyPI as statsmapped-mcp (confirmed live: https://pypi.org/project/statsmapped-mcp/):

bash
pip install statsmapped-mcp

Configure

Add to your MCP client's config (for Claude Desktop, claude_desktop_config.json; Cursor uses an equivalent mcp.json):

json
{  "mcpServers": {    "statsmapped": {      "command": "statsmapped-mcp"    }  }}

Tools

6 tools (consolidated from an original 9 -- query_data and compare are each one tool with a few modes, chosen by which arguments you give, rather than several near-identical single-purpose ones). Every tool takes a country argument ("ireland" or "united-kingdom", default "ireland") — Ireland and the UK track different datasets and geography levels, so call query_data/list_areas for the country you want rather than assume Ireland's defaults apply.

  • query_data(area_id=None, dataset=None, history_months=0, country="ireland") — three modes:
    • neither area_id nor dataset: every stat StatsMapped tracks for one country, with its key, label, and which geography levels it's published at. Start here.
    • area_id given, dataset omitted: every dataset available for one area (e.g. "county:kerry" for Ireland, "uk:lad:e09000033" for the UK), with its latest figure and year-on-year change. Caveats are projected to label + severity only, not full text — the point is deciding which datasets matter before paying for the full detail on any one of them.
    • both area_id and dataset given: full detail on one dataset in one area — a written summary, full caveat text, and (optionally, via history_months) recent history.
  • list_areas(level="county", country="ireland") — every geography at one boundary level. level defaults to Ireland's 26 counties; the UK's own primary level is "lad" (local authority districts), not "county" — other levels exist per country too (Ireland's local_authority/garda_division among them).
  • compare(stat_key=None, level=None, pair_key=None, stat_key_a=None, stat_key_b=None, country="ireland") — four modes, exactly one set of arguments at a time (mixing them raises an error):
    • stat_key alone: every area at one level, ranked by its latest figure for that stat, highest first.
    • pair_key alone: full detail for one registered comparison pair — each axis's label/unit/publisher, the correlation stats (r, rho, a leave-one-out sensitivity range), and caveats. pair_key comes from the no-argument mode below.
    • both stat_key_a and stat_key_b: does StatsMapped have a registered, hand-vetted comparison between these two stats? Registry-backed only — never computes a fresh correlation for an arbitrary pair. comparable is a string, not a bool: "yes" (a registered, hand-vetted pair; pair_key names it), "no" (the two stats share no geography level at all), or "unknown" (not registered, but not ruled out: treat as "ask a human", not "probably yes"). "unknown" is the normal result for most pairs. Compare the value explicitly (result["comparable"] == "yes"); a truthiness test is true for all three. reasons (a list) always explains the answer.
    • none of the above: every registered cross-dataset comparison pair for one country (e.g. "median sale price vs new dwelling completions per 1,000 residents"). A small, hand-curated set, not an arbitrary-pair engine.
  • explain_metric(stat_key, country="ireland") — definition, methodology and standing caveats for one stat, never a current figure. Use this when the question is about what a metric means or how it's measured, not about one area's value.
  • get_scene(scene_id="ireland-builds", purpose="analytical", vintage=None, country="ireland") — the data to draw one chart or short clip of a citable figure (rows, a table twin, alt text, the licence block, scene_hash), nothing rendered. Two scenes exist: "ireland-builds" and "county-in-motion" (one county against the county median, one row per year; pass county="county:cork" and terms="real" or "nominal"). A promotional use of a source whose licence forbids advertising is refused.
  • notable_changes(limit=8, stat_key=None, geography_id=None, country="ireland") — the statistical movements StatsMapped flagged as notable, newest first (limit 1 to 50), optionally narrowed to one stat or one area. They are movements, not verdicts on what they mean.

Citing an answer. A single-figure answer (query_data with both arguments, compare with pair_key, explain_metric) carries attribution: the publisher's own required wording when the publisher states one (for example "Source: Office for National Statistics. Contains public sector information licensed under the Open Government Licence v3.0."), otherwise StatsMapped's note. StatsMapped's note is always in attribution_note. Quote attribution where you show the figure; publisher, license and licence_class sit beside it (on each axis, for a comparison). A list of many datasets (query_data with area_id alone) has more than one publisher, so its top-level attribution is StatsMapped's note, and each entry carries its own publisher's attribution when that publisher states one. notable_changes carries only attribution_note.

Why stdio, not a hosted server, by default

StatsMapped runs on a single free-tier instance. A remote MCP endpoint hosted there would let an agent's own multi-area query pattern (calling the same tool once per area, in a loop) reproduce exactly the load pattern that has already caused timeouts on that instance under a large geography fan-out. Running over stdio means every call goes through your own network connection to the same public HTTPS API this package's tools call directly, with no shared bottleneck -- each user's own machine makes the HTTP calls, so N users' traffic is naturally spread across N source IPs, not funnelled through one.

server.py also supports a real hosted streamable-http mode (MCP_TRANSPORT=streamable-http) for a deployment that accepts that tradeoff -- StatsMapped's public API is itself rate-limited per source IP (600 requests/hour), but a hosted MCP endpoint proxies every remote user's calls through ONE shared egress IP, so all remote users of a hosted endpoint would share that one bucket rather than each getting their own. A StatsMapped-hosted endpoint is live at https://mcp.statsmapped.com/mcp (Streamable HTTP) -- confirmed responding correctly, no separate install needed for a client that speaks Streamable HTTP directly. The bare host (https://mcp.statsmapped.com, no path) redirects to the same endpoint as a courtesy.

What the client reports, and how to turn it off

After each tool call the client sends one small usage event to StatsMapped. It contains:

  • the tool name, whether the call succeeded, how it ended (answered, empty, error or unsupported) and its latency;
  • identifier-shaped arguments from a closed list, such as stat_key or area_id, and never free text;
  • a random install id kept in ~/.statsmapped-mcp/install_id.

To send nothing, set either of these in the server's environment (for example in the env block of your MCP client config):

  • STATSMAPPED_NO_LOG=1
  • DO_NOT_TRACK=1 (the cross-tool convention)

With either set, no event is sent and no install id is written.

Development

bash
cd mcp-serverpip install -e .python tests/test_client.py

The test suite runs against the real live API (https://statsmapped.com by default, or STATSMAPPED_MCP_BASE_URL if set) — read-only GETs only, nothing here writes any data or needs a key.

Licence

MIT for this package. The underlying data keeps each publisher's own licence — see statsmapped.com/ireland/sources for Ireland's own publisher/licence detail before reusing any figure outside of querying it through an agent (a UK equivalent page doesn't exist yet — check each UK tool response's own caveats/sources fields in the meantime).

Source: README.md at commit 54bf67e

Tools

5

query_data

Use when you need to find which datasets exist, which exist for one area, or the figures and history for one area and dataset (or a council planning view). For what a metric means use `explain_metric`; for how areas rank use `compare`. Three modes, depending on which of `area_id`/`dataset` are given (plus a planning mode, `council`, described last) -- consolidates what were three separate tools (list_datasets, list_area_datasets, get_dataset_for_area) behind one, since they are all really "how do I get data" at different levels of specificity: 1. Neither `area_id` nor `dataset`: lists every dataset (stat) StatsMapped tracks for one country ('ireland' or 'united-kingdom'), with its key, human label, and which geography levels it can be shown at. Ireland and the UK track genuinely different datasets -- call this first for the right country before assuming a stat_key exists there, to find the right `stat_key` for `compare`'s ranking mode. 2. `area_id` given, `dataset` omitted: lists every dataset available for that one area (e.g. "county:kerry" for Ireland, "uk:lad:e09000033" for the UK), with its latest figure, year-on-year change, and caveat labels only (not full caveat text -- use mode 3 for the full detail on any one dataset that matters). Pass `stat_key` (from mode 1) to list only that stat's series for the area: a full listing is tens of KB, one stat is a few hundred bytes. `area_id` comes from `list_areas`; `country` must match whichever country that call used, or this simply 404s ("unknown geography"). 3. Both `area_id` and `dataset` given: full detail for one dataset in one area -- the latest figure, a written summary, full caveat text, and (if `history_months` is set) recent history. `dataset` is a `series_key` from mode 2's own response. `history_months` means actual months of history (0 = everything) --

Parametersarea_idcouncilcountrydatasetstat_keyhistory_months

list_areas

Use when you need the ids and names of the areas (counties, local authorities, districts) to pass to `query_data`. List every geography at one boundary level, for one country ('ireland' or 'united-kingdom'). `level` defaults to "county" (Ireland's 26 counties); the UK's own primary level is "lad" (local authority districts), not "county". Other levels exist per country (e.g. Ireland's "local_authority", "garda_division") -- see a dataset's own `compatible_levels` from `query_data` for which levels a given stat is actually published at. Returns each area's `id` (used by `query_data`'s area-scoped modes, always paired with the SAME `country`), `name` and `level`. Slim by default; `include_parents=True` adds each area's `parents` (the regions it sits in) and Irish-language name.

Parameterslevelcountryinclude_parents

compare

Use when the question is how areas rank or compare on a stat, or whether two stats can be compared fairly. For one area's own figures use `query_data`. Four modes, depending on which arguments are given -- consolidates what were four separate tools (rank_areas, list_comparisons, get_comparison, check_comparability) behind one, since they are all really "how does this stat compare" at different scopes. Exactly one mode's arguments should be given; mixing arguments from different modes (e.g. both `stat_key` and `pair_key`, or only one of `stat_key_a`/`stat_key_b`) raises an error rather than silently guessing which mode was meant. 1. `stat_key` alone (no `pair_key`, no `stat_key_a`/`stat_key_b`): ranks every area at one geography level by its latest figure for that stat, for one country -- e.g. "which counties have the highest median sale price" (country="ireland"). `stat_key` comes from `query_data`'s dataset-listing mode, for the SAME country. `level` omitted uses this ranking's own default level; pass one of that dataset's own `compatible_levels` for a different one -- a level this ranking doesn't have registered returns an empty list rather than an error. Where the underlying stat has no honest per-area denominator (crime, homelessness, live_register and similar -- StatsMapped's own RANKING_NO_DENOMINATOR_STATS), each row's `rate_per_1000` is the real figure to rank/compare by, not `latest_value`, which is a raw count dominated by area population size. Always carry forward every entry in `caveats` when using a row in an answer. 2. `pair_key` alone: full detail for one registered comparison pair -- each axis's label, unit and publisher, the correlation stats (r, rho, and a leave-one-out sensitivity range naming the single most influential area), and caveats. `pair_key` comes from mode 4's own response, for

Parameterslevelcountrypair_keystat_keystat_key_astat_key_b

explain_metric

Use when the question is what a metric means or how it is measured; for a figure use `query_data`. Definition, methodology and standing caveats for ONE stat ('ireland' or 'united-kingdom') -- never a current figure. Call this when the question is about what a metric MEANS or how it's measured ("how is the claimant count defined", "is this a mean or a median"), not about a specific area's value -- `query_data`/`compare` already answer that. `stat_key` comes from `query_data(country=...)` for the SAME country.

Parameterscountrystat_keyrequired

get_scene

The data to DRAW one scene, nothing rendered: use it when asked for a chart, still or short clip of a figure you can cite. Today one scene exists, "ireland-builds" (Ireland's homes granted permission, with a commencement notice and completed, by quarter from 2018Q1). The licence DIFFERS BY STAGE (see `licence.stages`): a stage whose licence is unconfirmed or ShareAlike is withheld (its cells are absences, not zeros) and the licence line names its holder. You get rows, a table twin, alt text, notes, `absences` (a missing figure is a typed absence, never a zero), the licence block, `scene_hash`, a `receipt` and the canonical URL. YOU draw it, and the last frame must match the table. Print the `scene_hash` and the licence `line` in the first, middle and last frame, quote only numbers that are in `rows`, do not loop, and keep the "stages are not a cohort" note. `purpose` is "analytical" (default) or "promotional": a promotional use of a source whose licence forbids advertising is refused (licence_refused). `vintage` (ISO date) omitted = the current data; an earlier vintage is not stored and returns unknown_vintage. Example: get_scene(scene_id="ireland-builds").

Parameterscountrypurposevintagescene_id

Version history

2
  1. v0.3.2LatestOct 10, 2026
  2. v0.3.1Oct 9, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts