StatsMapped Public Data
Public statistics for Ireland and the UK: housing, crime, health, economy, welfare, with caveats.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"public-data": {
"command": "uvx",
"args": [
"statsmapped-mcp"
]
}
}
}Runnable packages
0.3.2stdioRemote endpoints
https://mcp.statsmapped.com/mcpstreamable-httpWhat it can do
Tool inventory
Tools (4)
🟢query_data(area_id, dataset, history_months, country)
Three modes, depending on which of `area_id`/`dataset` are given -- 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). `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) -- e.g. 24 returns 2 years of an annual series, not 24 years. `country` must match `area_id`'s own country. `dataset` and `history_months` are only meaningful together with `area_id` (and, for `history_months`, `dataset` too, since it only applies to mode 3); giving either without its real precondition raises rather than silently dropping the argument and dispatching to the wrong mode.
Input Schema
{
"type": "object",
"properties": {
"area_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Area Id"
},
"dataset": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Dataset"
},
"history_months": {
"default": 0,
"title": "History Months",
"type": "integer"
},
"country": {
"default": "ireland",
"title": "Country",
"type": "string"
}
},
"title": "query_dataArguments"
}Output Schema
{
"type": "object",
"properties": {
"result": {
"anyOf": [
{
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
},
{
"additionalProperties": true,
"type": "object"
}
],
"title": "Result"
}
},
"required": [
"result"
],
"title": "query_dataOutput"
}🟢list_areas(level, country)
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`) and `name`.
Input Schema
{
"type": "object",
"properties": {
"level": {
"default": "county",
"title": "Level",
"type": "string"
},
"country": {
"default": "ireland",
"title": "Country",
"type": "string"
}
},
"title": "list_areasArguments"
}Output Schema
{
"type": "object",
"properties": {
"result": {
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Result",
"type": "array"
}
},
"required": [
"result"
],
"title": "list_areasOutput"
}🟢compare(stat_key, level, pair_key, stat_key_a, stat_key_b, ...)
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 the SAME country. 3. Both `stat_key_a` and `stat_key_b` given: does StatsMapped have a registered, hand-vetted comparison between these two stats? Registry- backed only -- never computes a fresh correlation for an arbitrary pair. Both stat_keys come from `query_data`'s dataset-listing mode, for the SAME country. `verdict` is one of `"SUPPORT"` (a real, hand-vetted registered pair with no open caveats -- may be treated as a confirmed relationship), `"QUALIFY"` (hand-vetted, but the evidence carries real caveats -- e.g. no robustness check for outliers, or an unverified geography-level join; read `uncertainty` and `reasons` before presenting it as confirmed), `"REJECT"` (a real structural impossibility or a human-vetted "no" -- the two stats share no geography level at all, or a reviewer rejected this exact pairing), or `"INSUFFICIENT"` (not registered, not ruled out either -- StatsMapped genuinely hasn't vetted this pair; never treat this as "probably comparable"). `uncertainty` names 4 separate dimensions (data_quality, comparability, statistical_strength, causal_strength) -- `causal_strength` is always `"not_established"`, since no comparison here implies causation regardless of verdict. `comparable` (DEPRECATED, kept only for callers that haven't migrated) collapses `verdict` to the old 3-way yes/no/unknown -- `"yes"` for both `SUPPORT` and `QUALIFY` (both mean "hand-vetted", the old `comparable` meaning this field has always carried; the caveats a `QUALIFY` pair carries live in `uncertainty`/`reasons`, not in demoting `comparable`), `"no"` for `REJECT`, `"unknown"` for `INSUFFICIENT`. Prefer `verdict` directly when you need to distinguish a fully-confirmed `SUPPORT` from a caveated `QUALIFY`. Read `reasons` before presenting any answer other than `"SUPPORT"` as unqualified. 4. None of the above given: lists 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: pass one of the returned `pair_key` values to mode 2 for the real correlation and axis detail. `level` is only meaningful together with `stat_key` (mode 1); giving it without `stat_key` raises rather than silently dropping it and falling through to mode 4's unrelated pair listing.
Input Schema
{
"type": "object",
"properties": {
"stat_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Stat Key"
},
"level": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Level"
},
"pair_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Pair Key"
},
"stat_key_a": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Stat Key A"
},
"stat_key_b": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Stat Key B"
},
"country": {
"default": "ireland",
"title": "Country",
"type": "string"
}
},
"title": "compareArguments"
}Output Schema
{
"type": "object",
"properties": {
"result": {
"anyOf": [
{
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
},
{
"additionalProperties": true,
"type": "object"
}
],
"title": "Result"
}
},
"required": [
"result"
],
"title": "compareOutput"
}🟢explain_metric(stat_key, country)
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.
Input Schema
{
"type": "object",
"properties": {
"stat_key": {
"title": "Stat Key",
"type": "string"
},
"country": {
"default": "ireland",
"title": "Country",
"type": "string"
}
},
"required": [
"stat_key"
],
"title": "explain_metricArguments"
}Output Schema
{
"type": "object",
"additionalProperties": true,
"title": "explain_metricDictOutput"
}Community
Evidence