UK Health Security Agency (UKHSA) data dashboard MCP — keyless. Infectious-disease & public-health surveillance for the UK (COVID-19, Influenza, RSV, Measles, vaccine uptake, antimicrobial resistance, etc.) for UK geographies (Nation, NHS Region/Trust, Local Authority, Government Office Region, UKHSA Region).
Three tools with complete input schemas and descriptions. Naming follows verb_noun pattern (navigate, list_metrics, get_metric_data). Descriptions are detailed (194 - 280 chars) and explain the hierarchy model well. However, output schemas are entirely undocumented, LLMs cannot plan downstream calls or extract fields. Parameter descriptions lack format constraints (e.g., no enum for theme values, no min/max for page_size). No error handling guidance. Missing tool annotations (readOnlyHint). The navigate tool's optional parameters lack clear dependency documentation.
Pull the time series for one fully-specified UKHSA metric. Requires all six levels (theme, sub_theme, topic, geography_type, geography, metric). Returns paginated observations {count, next, previous, results[]} where each result has date, metric_value, year, month, epiweek, sex, age, stratum, geography_code, etc. Optionally filter by year and control page_size / page. Example: infectious_disease / respiratory / COVID-19 / Nation / England / COVID-19_cases_casesByDay.
Convenience shortcut: list every available metric for a fully-specified location (theme, sub_theme, topic, geography_type, geography), without walking each level. Returns metric names like "COVID-19_cases_casesByDay" or "COVID-19_deaths_ONSByDay" ready to pass to get_metric_data.
Walk the UKHSA surveillance hierarchy one level at a time to discover valid values. Pass the levels you already know (in order: theme, sub_theme, topic, geography_type, geography) and you get back the list of options for the NEXT level. With no args it lists themes (e.g. infectious_disease, immunisation, climate_and_environment, medicines). With theme="infectious_disease" it lists sub_themes (respiratory, gastrointestinal, vaccine_preventable, ...). Continue down to topics (COVID-19, Influenza, Measles, ...), geography_types (Nation, NHS Region, ...), geographies (England, ...), and finally metrics. Each item has {name, link}. Feed the chosen name into the next-level arg, then call get_metric_data once you have all six.
Output schemas completely undocumented. navigate() and list_metrics() return {name, link} arrays; get_metric_data() returns {count, next, previous, results[]} with per-result fields (date, metric_value, year, month, epiweek, sex, age, stratum, geography_code). LLMs cannot plan chaining or extract fields without this documentation.
Parameter descriptions lack format constraints. 'theme' accepts free-form strings (e.g. 'infectious_disease') but no enum is declared. 'page_size' has no min/max bounds (description says 'default 5, max ~365' but not enforced). LLMs will hallucinate invalid values.
navigate() has optional parameters with undocumented dependencies. Description says 'Requires theme' for sub_theme but schema does not enforce this. LLMs may pass sub_theme without theme, causing silent failures.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
No error handling guidance. If an invalid theme is passed, what error is returned? Can the LLM retry? Should it call navigate() to discover valid values? No recovery hints provided.
Tool annotations missing. All three tools are read-only (no state modification), but readOnlyHint is not declared. This prevents clients from optimizing caching or parallelization.