# Hermes — Air Quality Intelligence

> UK air quality MCP: live readings, historical trends, LAQM stats, WHO checks, knowledge base.

- name: com.southlondonscientific/hermes
- version: 0.2.0
- connection class: R0 (autonomous)
- trust: 76/100 flags: no-repository
- quality: 79/100 (good)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/com.southlondonscientific%2Fhermes
- tools: https://api.protogrid.dev/v1/servers/com.southlondonscientific%2Fhermes/tools

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

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "hermes": {
      "type": "http",
      "url": "https://hermes.southlondonscientific.com/mcp"
    }
  }
}
```


## Trust

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

## Quality 79/100 (good)

### protocol: 75 (weight 25)

- warn `protocol.modern`: newest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
- n/a `protocol.stateless`: only applies to 2026-07-28 servers
- pass `protocol.transport`: streamable HTTP
- n/a `protocol.list_ttl`: only applies to 2026-07-28 servers

### 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: 71 (weight 30)

- pass `tools.descriptions`: every tool has a description
- pass `tools.description_length`: descriptions are concise
- 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: kb_get_monitoring_explainer (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); kb_get_local_context (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); kb_get_guidelines (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); …
- pass `tools.token_cost`: about 3,043 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`: no npm or PyPI package

- tools: 15, about 3,043 tokens to load them all
- tool set hash: 936ceb3dda29349205d9e0cd28f64332
- badge: [![protogrid quality](https://protogrid.dev/badge/com.southlondonscientific/hermes.svg)](https://protogrid.dev/servers/com.southlondonscientific/hermes)
- 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._

## Remotes

- https://hermes.southlondonscientific.com/mcp (streamable-http, auth none, reachable true, uptime30d 1)

## Packages

_none_

## Tools (15)

- `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).

- `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).

- `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.

- `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".

- `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"].

- `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").

- `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).

- `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).

- `kb_get_local_context`: Get area-specific contextual information.

Args:
    area: "southwark", "london", or a specific neighbourhood.

Returns local context document (markdown).

- `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).

- `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).

- `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"].

- `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.

- `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).

- `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.

