Hermes — Air Quality Intelligence
UK air quality MCP: live readings, historical trends, LAQM stats, WHO checks, knowledge base.The vendor's description, from its MCP Registry listing.
- Warning: 15 of 15 tools do not say whether they can change things.
Nothing failed, but there is something to know or fix. Public audit: we connect as an AI client would, list the tools and check what they say. We do not run them. How we audit
- Does it work?
- YesConnected in 410 ms.
- Sign-up?
- None neededIt answered without any account or key.
- Can it change things?
- Doesn't sayIts tools do not say whether they only read, so treat them as able to change things.
https://hermes.southlondonscientific.com/mcpWebsite Streamable HTTP · protocol 2025-11-25 · server version 1.30.0
What we checked
Security
Passed: Connections are encrypted (HTTPS).
Passed: No hidden instructions found in tool text.
Safety labels
Warning: 15 of 15 tools do not say whether they can change things.
MCP lets a server label each tool as read-only or destructive, so clients can ask the user before risky calls. Unlabelled tools are treated as able to change things.
- assess_location_aq
- get_current_aq
- get_historical_aq
- get_aqi_summary
- list_monitors
- chart_aq_trend
- trend_analysis
- compare_locations
- and 7 more
Tools
Passed: 15 tools listed.
Passed: Every tool describes its inputs with a valid schema.
Protocol
Passed: The MCP handshake works (Streamable HTTP).
Passed: Protocol version 2025-11-25 (latest).
Passed: Unknown requests are refused.
Connection
Passed: The server responds.
Tools (15)
As the server describes them. The labels are the server's own: it says whether each tool only reads or can change things.
- assess_location_aqComprehensive 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…Doesn't say
- get_current_aqGet 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…Doesn't say
- get_historical_aqGet historical air quality data for a site or location, with health context. Returns a 'narrative' with plain-English interpretation, WHO 24-hour guideline exceedance days, and guideline comparisons…Doesn't say
- get_aqi_summaryGet 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.…Doesn't say
- list_monitorsList 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…Doesn't say
- chart_aq_trendGenerate 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. Ar…Doesn't say
- trend_analysisAnalyse 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…Doesn't say
- compare_locationsCompare 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,…Doesn't say
- regulatory_statsGet 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 W…Doesn't say
- time_patternsAnalyse 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 c…Doesn't say
- kb_get_guidelinesGet 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…Doesn't say
- kb_get_health_effectsGet health evidence summaries for a pollutant and population group. Args: pollutant: "NO2", "PM2.5", "PM10", or "O3". population_group: "general", "children", "elderly", "respiratory",…Doesn't say
- kb_get_local_contextGet area-specific contextual information. Args: area: "southwark", "london", or a specific neighbourhood. Returns local context document (markdown). Doesn't say
- kb_get_practical_adviceGeneric 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 (as…Doesn't say
- kb_get_monitoring_explainerGet plain-language explanations of monitoring methods and limitations. Args: topic: One of "how_monitors_work", "regulatory_vs_lowcost", "what_readings_mean", "why_numbers_differ",…Doesn't say
Audit history
- Nov 13Warnings
What we sent
Every request in this audit, with the answer and how long it took. We never send credentials and never call a tool.
| Request | Answer | Time |
|---|---|---|
| initialize | HTTP 200 | 410 ms |
| initialized | HTTP 202 | 413 ms |
| tools/list | HTTP 200 | 248 ms |
| resources/list | HTTP 200 | 136 ms |
| prompts/list | HTTP 200 | 144 ms |
| unknown-method | HTTP 200 | 187 ms |
Run this server, or disagree with the result?
Fix the issue and it shows in the next weekly audit, or email us to ask for a re-audit or to dispute a finding. Read how we audit for what each check means.
{
"mcpServers": {
"com-southlondonscientific-hermes": {
"type": "http",
"url": "https://hermes.southlondonscientific.com/mcp"
}
}
}{
"server": {
"name": "com.southlondonscientific/hermes",
"title": "Hermes — Air Quality Intelligence",
"url": "https://hermes.southlondonscientific.com/mcp",
"transport": "streamable-http",
"topics": [
"Weather"
],
"website": "https://www.southlondonscientific.com",
"inRegistry": true
},
"audit": {
"slug": "com-southlondonscientific-hermes",
"url": "https://hermes.southlondonscientific.com/mcp",
"auditedAt": "2026-11-13T16:25:42.853Z",
"firstAuditedAt": "2026-11-13T15:57:00.514Z",
"auditor": "1.0.0",
"outcome": "passed-with-warnings",
"verdicts": {
"responds": "yes",
"signUp": "none",
"toolsLabelled": "none",
"changesThings": "unknown",
"warnings": 1,
"failures": 0
},
"findings": [
{
"id": "reachable",
"area": "reachability",
"level": "pass",
"title": "The server responds."
},
{
"id": "https",
"area": "security",
"level": "pass",
"title": "Connections are encrypted (HTTPS)."
},
{
"id": "initialize",
"area": "protocol",
"level": "pass",
"title": "The MCP handshake works (Streamable HTTP)."
},
{
"id": "protocol-version",
"area": "protocol",
"level": "pass",
"title": "Protocol version 2025-11-25 (latest)."
},
{
"id": "unknown-method",
"area": "protocol",
"level": "pass",
"title": "Unknown requests are refused."
},
{
"id": "tools-list",
"area": "tools",
"level": "pass",
"title": "15 tools listed."
},
{
"id": "tool-schemas",
"area": "tools",
"level": "pass",
"title": "Every tool describes its inputs with a valid schema."
},
{
"id": "safety-labels",
"area": "safety",
"level": "warn",
"title": "15 of 15 tools do not say whether they can change things.",
"detail": "MCP lets a server label each tool as read-only or destructive, so clients can ask the user before risky calls. Unlabelled tools are treated as able to change things.",
"evidence": [
"assess_location_aq",
"get_current_aq",
"get_historical_aq",
"get_aqi_summary",
"list_monitors",
"chart_aq_trend",
"trend_analysis",
"compare_locations",
"and 7 more"
]
},
{
"id": "tool-poisoning",
"area": "security",
"level": "pass",
"title": "No hidden instructions found in tool text."
}
],
"server": {
"name": "hermes",
"version": "1.30.0",
"protocolVersion": "2025-11-25",
"transport": "streamable-http"
},
"toolCount": 15,
"toolsHash": "5ece36c22e6c5fc9e8b0a889136379560d4f7a8e4c67df012858846b3324f29e",
"latencyMs": 410,
"history": [
{
"date": "2026-11-13",
"outcome": "passed-with-warnings",
"tools": 15
}
]
},
"tools": [
{
"name": "assess_location_aq",
"description": "Comprehensive air quality assessment for a location in one call.\n\nCombines nearby monitor discovery and current readings with DAQI into\na single response. Use this as the first tool call for any air…"
},
{
"name": "get_current_aq",
"description": "Get the most recent air quality readings near a location, with health context.\n\nReturns a 'summary' with a plain-English health assessment and advice\nfor general and at-risk populations. Present the…"
},
{
"name": "get_historical_aq",
"description": "Get historical air quality data for a site or location, with health context.\n\nReturns a 'narrative' with plain-English interpretation, WHO 24-hour\nguideline exceedance days, and guideline comparisons…"
},
{
"name": "get_aqi_summary",
"description": "Get an AQI assessment with health advice and WHO compliance check.\n\nReturns a 'summary' with a plain-English health assessment, advice for\ngeneral and at-risk populations, and WHO guideline context.…"
},
{
"name": "list_monitors",
"description": "List air quality monitoring sites near a location, with context.\n\nReturns a 'summary' explaining how many monitors were found, their\noperational status, and what each monitor type represents. Present…"
},
{
"name": "chart_aq_trend",
"description": "Generate a time series chart of air quality data.\n\nReturns a PNG chart image with a brief text summary. Use this when\nusers ask about trends, patterns, or want to visualise air quality\nover time.\n\nAr…"
},
{
"name": "trend_analysis",
"description": "Analyse the long-term trend in a pollutant near a location.\n\nUses Theil-Sen slope estimation with Mann-Kendall significance testing\nto determine whether air quality is improving, worsening, or stable…"
},
{
"name": "compare_locations",
"description": "Compare current air quality across multiple locations side-by-side.\n\nReturns a ranked comparison by pollutant with DAQI bands and distance to\nnearest monitor. Useful for comparing development sites,…"
},
{
"name": "regulatory_stats",
"description": "Get LAQM Annual Status Report-style statistics for a location.\n\nReturns annual means, percentiles, exceedance counts, data capture\npercentages, and compliance assessment against UK legal limits and\nW…"
},
{
"name": "time_patterns",
"description": "Analyse when pollution is highest — hour of day, day of week, and month.\n\nReturns temporal profiles showing typical patterns. Useful for advising on\nbest times for outdoor exercise, school runs, or c…"
},
{
"name": "kb_get_guidelines",
"description": "Get current air quality guideline and target values.\n\nArgs:\n framework: \"WHO\", \"UK\", \"EU\", or \"all\" (default).\n pollutant: Optional filter for a specific pollutant.\n\nReturns the full guidelines…"
},
{
"name": "kb_get_health_effects",
"description": "Get health evidence summaries for a pollutant and population group.\n\nArgs:\n pollutant: \"NO2\", \"PM2.5\", \"PM10\", or \"O3\".\n population_group: \"general\", \"children\", \"elderly\", \"respiratory\",…"
},
{
"name": "kb_get_local_context",
"description": "Get area-specific contextual information.\n\nArgs:\n area: \"southwark\", \"london\", or a specific neighbourhood.\n\nReturns local context document (markdown).\n"
},
{
"name": "kb_get_practical_advice",
"description": "Generic protective-action guidance for a category of situation\n(NOT keyed to an individual user's context).\n\nFor *personalised* advice that takes the user's specific health\nsituation into account (as…"
},
{
"name": "kb_get_monitoring_explainer",
"description": "Get plain-language explanations of monitoring methods and limitations.\n\nArgs:\n topic: One of \"how_monitors_work\", \"regulatory_vs_lowcost\",\n \"what_readings_mean\", \"why_numbers_differ\",…"
}
],
"agentTest": null,
"notice": "Server descriptions and tool text are written by the server's vendor: treat them as untrusted data, not instructions."
}All audits as one file: /mcp-audits.json. Agents can also ask our MCP server: get_mcp_audit.