MCP Server

Hermes — Air Quality Intelligence

com.southlondonscientific/hermes

What this MCP does

Provides UK air-quality readings, historical and statistical analysis, trend visualizations, guideline comparisons, and health-context information.

assess_location_aq
Comprehensive air quality assessment for a location in one call. Combines nearby monitor discovery and current readings with DAQI into a single response. Use this as the first tool call for any air quality question about a location. For long-term trend analysis, use the dedicated `trend_analysis` tool. Returns a structured 'summary' dict with purpose-appropriate sections. Present the summary description to users first. Args: location: Postcode, place name, or "lat,lon". purpose: What the user needs — "general" (default), "health" (safety/worry), "exercise" (outdoor activity), or "planning" (homebuying/school assessment/long-term).
Input schema
{'type': 'object', 'title': 'assess_location_aqArguments', 'required': ['location'], 'properties': {'purpose': {'type': 'string', 'title': 'Purpose', 'default': 'general'}, 'location': {'type': 'string', 'title': 'Location'}}}
chart_aq_trend
Generate a time series chart of air quality data. Returns a PNG chart image with a brief text summary. Use this when users ask about trends, patterns, or want to visualise air quality over time. Args: start_date: Start date (ISO format, e.g. "2025-01-01"). end_date: End date (ISO format). location: Postcode, place name, or "lat,lon". Provide this or site_code. site_code: Direct site code. Provide this or location. pollutants: Optional filter, e.g. ["NO2", "PM2.5"]. Defaults to NO2, PM2.5, PM10, O3 if not specified. frequency: "hourly", "daily", or "monthly" (default "daily"). show_who_guidelines: Show WHO guideline reference lines (default True). show_daqi_bands: Show DAQI band background shading (default True).
Input schema
{'type': 'object', 'title': 'chart_aq_trendArguments', 'required': ['start_date', 'end_date'], 'properties': {'end_date': {'type': 'string', 'title': 'End Date'}, 'location': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Location', 'default': None}, 'frequency': {'type': 'string', 'title': 'Frequency', 'default': 'daily'}, 'site_code': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Site Code', 'default': None}, 'pollutants': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}}, {'type': 'null'}], 'title': 'Pollutants', 'default': None}, 'start_date': {'type': 'string', 'title': 'Start Date'}, 'show_daqi_bands': {'type': 'boolean', 'title': 'Show Daqi Bands', 'default': True}, 'show_who_guidelines': {'type': 'boolean', 'title': 'Show Who Guidelines', 'default': True}}}
compare_locations
Compare current air quality across multiple locations side-by-side. Returns a ranked comparison by pollutant with DAQI bands and distance to nearest monitor. Useful for comparing development sites, school locations, or residential options. Args: locations: List of 2–6 locations (postcodes, place names, or "lat,lon"). pollutants: Optional filter, e.g. ["NO2", "PM2.5"]. Default: all available.
Input schema
{'type': 'object', 'title': 'compare_locationsArguments', 'required': ['locations'], 'properties': {'locations': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Locations'}, 'pollutants': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}}, {'type': 'null'}], 'title': 'Pollutants', 'default': None}}}
get_aqi_summary
Get an AQI assessment with health advice and WHO compliance check. Returns a 'summary' with a plain-English health assessment, advice for general and at-risk populations, and WHO guideline context. Present the summary to users first. Also returns raw 'aqi' and 'who_compliance' data. Args: location: Postcode, place name, or "lat,lon". index: AQI system — "UK_DAQI" (default), "WHO", or "US_EPA". period: "current", "today", "this_week", or "this_month".
Input schema
{'type': 'object', 'title': 'get_aqi_summaryArguments', 'required': ['location'], 'properties': {'index': {'type': 'string', 'title': 'Index', 'default': 'UK_DAQI'}, 'period': {'type': 'string', 'title': 'Period', 'default': 'current'}, 'location': {'type': 'string', 'title': 'Location'}}}
get_current_aq
Get the most recent air quality readings near a location, with health context. Returns a 'summary' with a plain-English health assessment and advice for general and at-risk populations. Present the summary to users first. Also returns individual 'readings' from nearby monitors and 'metadata' about data freshness and sources. Args: location: Postcode, place name, or "lat,lon". radius_km: Search radius in kilometres (default 2.0). pollutants: Optional filter, e.g. ["NO2", "PM2.5"]. sources: Optional filter, e.g. ["AURN", "BREATHE_LONDON"].
Input schema
{'type': 'object', 'title': 'get_current_aqArguments', 'required': ['location'], 'properties': {'sources': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}}, {'type': 'null'}], 'title': 'Sources', 'default': None}, 'location': {'type': 'string', 'title': 'Location'}, 'radius_km': {'type': 'number', 'title': 'Radius Km', 'default': 3.5}, 'pollutants': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}}, {'type': 'null'}], 'title': 'Pollutants', 'default': None}}}
get_historical_aq
Get historical air quality data for a site or location, with health context. Returns a 'narrative' with plain-English interpretation of trends, WHO guideline exceedances, and guideline comparisons. Present the narrative to users first. Also returns raw 'data' and 'summary' statistics. Args: start_date: Start date (ISO format, e.g. "2025-01-01"). end_date: End date (ISO format). location: Postcode, place name, or "lat,lon". Provide this or site_code. site_code: Direct site code. Provide this or location. pollutants: Optional filter, e.g. ["NO2", "PM2.5"]. frequency: "hourly", "daily", or "monthly" (default "daily").
Input schema
{'type': 'object', 'title': 'get_historical_aqArguments', 'required': ['start_date', 'end_date'], 'properties': {'end_date': {'type': 'string', 'title': 'End Date'}, 'location': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Location', 'default': None}, 'frequency': {'type': 'string', 'title': 'Frequency', 'default': 'daily'}, 'site_code': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Site Code', 'default': None}, 'pollutants': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}}, {'type': 'null'}], 'title': 'Pollutants', 'default': None}, 'start_date': {'type': 'string', 'title': 'Start Date'}}}
kb_get_guidelines
Get current air quality guideline and target values. Args: framework: "WHO", "UK", "EU", or "all" (default). pollutant: Optional filter for a specific pollutant. Returns the full guidelines document (markdown).
Input schema
{'type': 'object', 'title': 'kb_get_guidelinesArguments', 'properties': {'framework': {'type': 'string', 'title': 'Framework', 'default': 'all'}, 'pollutant': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Pollutant', 'default': None}}}
Output schema
{'type': 'object', 'title': 'kb_get_guidelinesOutput', 'required': ['result'], 'properties': {'result': {'type': 'string', 'title': 'Result'}}}
kb_get_health_effects
Get health evidence summaries for a pollutant and population group. Args: pollutant: "NO2", "PM2.5", "PM10", or "O3". population_group: "general", "children", "elderly", "respiratory", "cardiovascular", or "pregnant" (default "general"). Returns health effects document (markdown).
Input schema
{'type': 'object', 'title': 'kb_get_health_effectsArguments', 'required': ['pollutant'], 'properties': {'pollutant': {'type': 'string', 'title': 'Pollutant'}, 'population_group': {'type': 'string', 'title': 'Population Group', 'default': 'general'}}}
Output schema
{'type': 'object', 'title': 'kb_get_health_effectsOutput', 'required': ['result'], 'properties': {'result': {'type': 'string', 'title': 'Result'}}}
kb_get_local_context
Get area-specific contextual information. Args: area: "southwark", "london", or a specific neighbourhood. Returns local context document (markdown).
Input schema
{'type': 'object', 'title': 'kb_get_local_contextArguments', 'properties': {'area': {'type': 'string', 'title': 'Area', 'default': 'southwark'}}}
Output schema
{'type': 'object', 'title': 'kb_get_local_contextOutput', 'required': ['result'], 'properties': {'result': {'type': 'string', 'title': 'Result'}}}
kb_get_monitoring_explainer
Get plain-language explanations of monitoring methods and limitations. Args: topic: One of "how_monitors_work", "regulatory_vs_lowcost", "what_readings_mean", "why_numbers_differ", "representativeness", "data_quality", "what_monitors_measure". Returns monitoring explainer document (markdown).
Input schema
{'type': 'object', 'title': 'kb_get_monitoring_explainerArguments', 'required': ['topic'], 'properties': {'topic': {'type': 'string', 'title': 'Topic'}}}
Output schema
{'type': 'object', 'title': 'kb_get_monitoring_explainerOutput', 'required': ['result'], 'properties': {'result': {'type': 'string', 'title': 'Result'}}}
kb_get_practical_advice
Generic protective-action guidance for a category of situation (NOT keyed to an individual user's context). For *personalised* advice that takes the user's specific health situation into account (asthma, pregnancy, gas cooker, tube commute, indoor sources), prefer the Clara MCP server's `contextual_advice` tool — it composes Hermes live readings with personal context to give an answer keyed to *this* user, *now*. Use this KB tool only as a fallback or when Clara is not available. Args: situation: One of "high_pollution_day", "commuting", "exercise", "school_run", "indoor_air", "planning_objection", "pregnancy", "child_asthma". Returns practical advice document (markdown).
Input schema
{'type': 'object', 'title': 'kb_get_practical_adviceArguments', 'required': ['situation'], 'properties': {'situation': {'type': 'string', 'title': 'Situation'}}}
Output schema
{'type': 'object', 'title': 'kb_get_practical_adviceOutput', 'required': ['result'], 'properties': {'result': {'type': 'string', 'title': 'Result'}}}
list_monitors
List air quality monitoring sites near a location, with context. Returns a 'summary' explaining how many monitors were found, their operational status, and what each monitor type represents. Present the summary to users first. Also returns a 'monitors' list with full metadata. Args: location: Postcode, place name, or "lat,lon". radius_km: Search radius in kilometres (default 5.0). sources: Optional filter, e.g. ["AURN", "BREATHE_LONDON"].
Input schema
{'type': 'object', 'title': 'list_monitorsArguments', 'required': ['location'], 'properties': {'sources': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}}, {'type': 'null'}], 'title': 'Sources', 'default': None}, 'location': {'type': 'string', 'title': 'Location'}, 'radius_km': {'type': 'number', 'title': 'Radius Km', 'default': 5.0}}}
regulatory_stats
Get LAQM Annual Status Report-style statistics for a location. Returns annual means, percentiles, exceedance counts, data capture percentages, and compliance assessment against UK legal limits and WHO guidelines. Args: location: Postcode, place name, or "lat,lon". year: Calendar year to report on (default: most recent complete year). pollutants: Optional filter, e.g. ["NO2", "PM2.5"]. Default: all available.
Input schema
{'type': 'object', 'title': 'regulatory_statsArguments', 'required': ['location'], 'properties': {'year': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Year', 'default': None}, 'location': {'type': 'string', 'title': 'Location'}, 'pollutants': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}}, {'type': 'null'}], 'title': 'Pollutants', 'default': None}}}
time_patterns
Analyse when pollution is highest — hour of day, day of week, and month. Returns temporal profiles showing typical patterns. Useful for advising on best times for outdoor exercise, school runs, or commuting. Args: location: Postcode, place name, or "lat,lon". pollutant: Pollutant to analyse — "NO2", "PM2.5", "PM10", "O3" (default "NO2"). period: Time window — "last_month", "last_3_months", "last_6_months", or "last_year" (default).
Input schema
{'type': 'object', 'title': 'time_patternsArguments', 'required': ['location'], 'properties': {'period': {'type': 'string', 'title': 'Period', 'default': 'last_year'}, 'location': {'type': 'string', 'title': 'Location'}, 'pollutant': {'type': 'string', 'title': 'Pollutant', 'default': 'NO2'}}}
trend_analysis
Analyse the long-term trend in a pollutant near a location. Uses Theil-Sen slope estimation with Mann-Kendall significance testing to determine whether air quality is improving, worsening, or stable. Robust to outliers and missing data. Returns a 'summary' with plain-English trend description and statistical details. Present the summary to users first. Args: location: Postcode, place name, or "lat,lon". pollutant: Pollutant to analyse — "NO2", "PM2.5", "PM10", "O3" (default "NO2"). years: Number of years of data to analyse (default 5, range 2–5). Requests outside this range are clamped; the response includes ``metadata.years_clamped`` and a note in ``summary`` when so.
Input schema
{'type': 'object', 'title': 'trend_analysisArguments', 'required': ['location'], 'properties': {'years': {'type': 'integer', 'title': 'Years', 'default': 5}, 'location': {'type': 'string', 'title': 'Location'}, 'pollutant': {'type': 'string', 'title': 'Pollutant', 'default': 'NO2'}}}
Added
kb_get_monitoring_explainer
Sept. 17, 2026, 12:37 p.m.
Added
kb_get_practical_advice
Sept. 17, 2026, 12:37 p.m.
Added
kb_get_local_context
Sept. 17, 2026, 12:37 p.m.
Added
kb_get_health_effects
Sept. 17, 2026, 12:37 p.m.
Added
kb_get_guidelines
Sept. 17, 2026, 12:37 p.m.
Added
time_patterns
Sept. 17, 2026, 12:37 p.m.
Added
regulatory_stats
Sept. 17, 2026, 12:37 p.m.
Added
compare_locations
Sept. 17, 2026, 12:37 p.m.
Added
trend_analysis
Sept. 17, 2026, 12:37 p.m.
Added
chart_aq_trend
Sept. 17, 2026, 12:37 p.m.
Added
list_monitors
Sept. 17, 2026, 12:37 p.m.
Added
get_aqi_summary
Sept. 17, 2026, 12:37 p.m.
Added
get_historical_aq
Sept. 17, 2026, 12:37 p.m.
Added
get_current_aq
Sept. 17, 2026, 12:37 p.m.
Added
assess_location_aq
Sept. 17, 2026, 12:37 p.m.