# StatsMapped Public Data

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

- name: com.statsmapped/public-data
- version: 0.3.2
- connection class: R0 (autonomous)
- trust: 95/100
- quality: 80/100 (good)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/com.statsmapped%2Fpublic-data
- tools: https://api.protogrid.dev/v1/servers/com.statsmapped%2Fpublic-data/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

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


## Trust

- hygiene: 100
- liveness: 99
- freshness: 100
- provenance: 85
- drivers: +repository +dns-namespace +website +reachable +uptime-98% +updated-10d-ago
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 80/100 (good)

### protocol: 88 (weight 25)

- pass `protocol.modern`: supports 2026-07-28 (server/discover)
- pass `protocol.stateless`: answers without a session
- pass `protocol.transport`: streamable HTTP
- warn `protocol.list_ttl`: tools/list declares ttlMs 0, so clients re-fetch it on every use

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 64 (weight 30)

- pass `tools.descriptions`: every tool has a description
- warn `tools.description_length`: 2 tools have descriptions over 1,024 characters, which crowds the context
- pass `tools.schemas`: every tool has an object input schema
- fail `tools.annotations`: no tool declares readOnlyHint or destructiveHint, so clients cannot tell safe calls from risky ones
- fail `tools.directory_hints`: no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: query_data (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); list_areas (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); compare (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); …
- pass `tools.token_cost`: about 2,206 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 100 (weight 15)

- pass `stability.changes`: no tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: deps.dev does not know statsmapped-mcp@0.3.2

- tools: 4, about 2,206 tokens to load them all
- tool set hash: 87334268894c7edfa27c84b3297efa43
- badge: [![protogrid quality](https://protogrid.dev/badge/com.statsmapped/public-data.svg)](https://protogrid.dev/servers/com.statsmapped/public-data)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

_No tool definition changes recorded._

## Dependencies

- pypi statsmapped-mcp@0.3.2: unknown

Dependency graphs from deps.dev; advisories from OSV.dev, including the GitHub Advisory Database and the PyPI Advisory Database; all CC BY 4.0.

## Remotes

- https://mcp.statsmapped.com/mcp (streamable-http, auth none, reachable true, uptime30d 0.97619045)

## Packages

- pypi statsmapped-mcp@0.3.2

## Tools (4)

- `compare`: 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.
    
- `explain_metric`: 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.
    
- `list_areas`: 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`.
    
- `query_data`: 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.
    
