Server definition
- Hash
- sha256:dd35444615c6107a0a51c784d4df0e4af400a4c420d88a91682d2749ede23f6a
- What it is
- What a remote MCP server returned when asked what it offers: 15 tools
The blob, as servednamed by its sha256
{
"instructions": "Hermes is an air quality information server for London, built by South London Scientific. It provides ambient monitoring data with detailed coverage of Southwark and London-wide capability.\n\n## Tool catalogue\n\n**Start here** — comprehensive single-call assessment:\n- `assess_location_aq` — one-call AQ assessment: current readings, trends, and monitor context\n\n**Live data tools** — use these for specific queries or follow-up:\n- `get_current_aq` — most recent readings near a location, with DAQI and health advice\n- `get_aqi_summary` — AQI assessment with WHO compliance check\n- `compare_locations` — side-by-side AQ comparison across multiple locations\n\n**Historical & trend tools** — use these for analysis over time:\n- `get_historical_aq` — historical data for a date range, with summary statistics\n- `trend_analysis` — long-term trend with statistical significance (Theil-Sen + Mann-Kendall)\n- `regulatory_stats` — LAQM-style annual statistics (means, percentiles, exceedances)\n- `time_patterns` — diurnal, day-of-week, and monthly pollution profiles\n\n**Visualisation:**\n- `chart_aq_trend` — time series chart as inline PNG image\n\n**Monitor discovery:**\n- `list_monitors` — find monitoring sites near a location with operational status\n\n**Knowledge base** — curated, evidence-based reference documents:\n- `kb_get_guidelines` — DAQI bands, WHO guidelines, UK legal limits\n- `kb_get_health_effects` — pollutant-specific health evidence by population group\n- `kb_get_local_context` — area-specific AQ context (Southwark, London boroughs)\n- `kb_get_practical_advice` — generic protective actions (e.g. \"should anyone exercise on a high-pollution day?\"). For *personalised* advice keyed to the user's own context (asthma, pregnancy, gas cooker, tube commute), call Clara's `contextual_advice` instead.\n- `kb_get_monitoring_explainer` — how monitors work, data interpretation\n\n## Scope\n- **Can do:** Ambient air quality data for London and UK regulatory monitoring networks. Historical trends, regulatory compliance, temporal patterns, health context.\n- **Cannot do:** Personalised health advice and personal exposure assessment (use the Clara MCP server), forecasting, indoor air quality.\n\n## Composition with Clara (personal-health questions)\nWhen the user asks a question that ties air quality to their own situation — e.g. \"I have asthma, is it safe to run outside?\", \"should I cycle today with my kid?\", \"my child has a cough, is the air bad?\" — Hermes alone is the wrong shape. The right pattern is:\n\n1. Call Hermes `get_current_aq` (or `assess_location_aq`) for the user's location to get live pm25 and no2 numbers.\n2. Pass those numbers + the user's context (audience, setting, indoor sources) to Clara's `contextual_advice` tool.\n3. Present Clara's advice, attributing the live data to Hermes and the personalised context to Clara.\n\nHermes' own `kb_get_practical_advice` is a **fallback** for when Clara is unavailable or the user wants only generic guidance, not a substitute for the composition above.\n\n## Key principle\nA monitor reading is NOT personal exposure. Always contextualise with distance, monitor type, and the difference between ambient monitoring and what people actually breathe.\n\n## Response structure\nAll tools return structured JSON with a `summary` or `narrative` field containing plain-English interpretation. Present this to users first, then use the raw data fields for detail. Error responses use `{\"error\": {\"type\": \"...\", \"message\": \"...\"}}`.\n\n## Attribution\nBuilt by South London Scientific (southlondonscientific.com). Data from UK regulatory networks (AURN, AQE, LMAM, SAQN) and Breathe London via Aeolus.",
"tools": [
{
"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 quality\nquestion about a location.\n\nFor long-term trend analysis, use the dedicated `trend_analysis` tool.\n\nReturns a structured 'summary' dict with purpose-appropriate sections.\nPresent the summary description to users first.\n\nArgs:\n location: Postcode, place name, or \"lat,lon\".\n purpose: What the user needs — \"general\" (default), \"health\"\n (safety/worry), \"exercise\" (outdoor activity), or \"planning\"\n (homebuying/school assessment/long-term).\n",
"inputSchema": {
"properties": {
"location": {
"title": "Location",
"type": "string"
},
"purpose": {
"default": "general",
"title": "Purpose",
"type": "string"
}
},
"required": [
"location"
],
"title": "assess_location_aqArguments",
"type": "object"
},
"name": "assess_location_aq",
"outputSchema": null
},
{
"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\nArgs:\n start_date: Start date (ISO format, e.g. \"2025-01-01\").\n end_date: End date (ISO format).\n location: Postcode, place name, or \"lat,lon\". Provide this or site_code.\n site_code: Direct site code. Provide this or location.\n pollutants: Optional filter, e.g. [\"NO2\", \"PM2.5\"]. Defaults to\n NO2, PM2.5, PM10, O3 if not specified.\n frequency: \"hourly\", \"daily\", or \"monthly\" (default \"daily\").\n show_who_guidelines: Show WHO guideline reference lines (default True).\n show_daqi_bands: Show DAQI band background shading (default True).\n",
"inputSchema": {
"properties": {
"end_date": {
"title": "End Date",
"type": "string"
},
"frequency": {
"default": "daily",
"title": "Frequency",
"type": "string"
},
"location": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Location"
},
"pollutants": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Pollutants"
},
"show_daqi_bands": {
"default": true,
"title": "Show Daqi Bands",
"type": "boolean"
},
"show_who_guidelines": {
"default": true,
"title": "Show Who Guidelines",
"type": "boolean"
},
"site_code": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Site Code"
},
"start_date": {
"title": "Start Date",
"type": "string"
}
},
"required": [
"start_date",
"end_date"
],
"title": "chart_aq_trendArguments",
"type": "object"
},
"name": "chart_aq_trend",
"outputSchema": null
},
{
"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, school locations,\nor residential options.\n\nArgs:\n locations: List of 2–6 locations (postcodes, place names, or \"lat,lon\").\n pollutants: Optional filter, e.g. [\"NO2\", \"PM2.5\"]. Default: all available.\n",
"inputSchema": {
"properties": {
"locations": {
"items": {
"type": "string"
},
"title": "Locations",
"type": "array"
},
"pollutants": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Pollutants"
}
},
"required": [
"locations"
],
"title": "compare_locationsArguments",
"type": "object"
},
"name": "compare_locations",
"outputSchema": null
},
{
"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. Present the\nsummary to users first. Also returns raw 'aqi' and 'who_compliance' data.\n\nArgs:\n location: Postcode, place name, or \"lat,lon\".\n index: AQI system — \"UK_DAQI\" (default), \"WHO\", or \"US_EPA\".\n period: \"current\", \"today\", \"this_week\", or \"this_month\".\n",
"inputSchema": {
"properties": {
"index": {
"default": "UK_DAQI",
"title": "Index",
"type": "string"
},
"location": {
"title": "Location",
"type": "string"
},
"period": {
"default": "current",
"title": "Period",
"type": "string"
}
},
"required": [
"location"
],
"title": "get_aqi_summaryArguments",
"type": "object"
},
"name": "get_aqi_summary",
"outputSchema": null
},
{
"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 summary to users first.\nAlso returns individual 'readings' from nearby monitors and 'metadata'\nabout data freshness and sources.\n\nArgs:\n location: Postcode, place name, or \"lat,lon\".\n radius_km: Search radius in kilometres (default 2.0).\n pollutants: Optional filter, e.g. [\"NO2\", \"PM2.5\"].\n sources: Optional filter, e.g. [\"AURN\", \"BREATHE_LONDON\"].\n",
"inputSchema": {
"properties": {
"location": {
"title": "Location",
"type": "string"
},
"pollutants": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Pollutants"
},
"radius_km": {
"default": 3.5,
"title": "Radius Km",
"type": "number"
},
"sources": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Sources"
}
},
"required": [
"location"
],
"title": "get_current_aqArguments",
"type": "object"
},
"name": "get_current_aq",
"outputSchema": null
},
{
"description": "Get historical air quality data for a site or location, with health context.\n\nReturns a 'narrative' with plain-English interpretation of trends,\nWHO guideline exceedances, and guideline comparisons. Present the\nnarrative to users first. Also returns raw 'data' and 'summary' statistics.\n\nArgs:\n start_date: Start date (ISO format, e.g. \"2025-01-01\").\n end_date: End date (ISO format).\n location: Postcode, place name, or \"lat,lon\". Provide this or site_code.\n site_code: Direct site code. Provide this or location.\n pollutants: Optional filter, e.g. [\"NO2\", \"PM2.5\"].\n frequency: \"hourly\", \"daily\", or \"monthly\" (default \"daily\").\n",
"inputSchema": {
"properties": {
"end_date": {
"title": "End Date",
"type": "string"
},
"frequency": {
"default": "daily",
"title": "Frequency",
"type": "string"
},
"location": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Location"
},
"pollutants": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Pollutants"
},
"site_code": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Site Code"
},
"start_date": {
"title": "Start Date",
"type": "string"
}
},
"required": [
"start_date",
"end_date"
],
"title": "get_historical_aqArguments",
"type": "object"
},
"name": "get_historical_aq",
"outputSchema": null
},
{
"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 document (markdown).\n",
"inputSchema": {
"properties": {
"framework": {
"default": "all",
"title": "Framework",
"type": "string"
},
"pollutant": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Pollutant"
}
},
"title": "kb_get_guidelinesArguments",
"type": "object"
},
"name": "kb_get_guidelines",
"outputSchema": {
"properties": {
"result": {
"title": "Result",
"type": "string"
}
},
"required": [
"result"
],
"title": "kb_get_guidelinesOutput",
"type": "object"
}
},
{
"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\",\n \"cardiovascular\", or \"pregnant\" (default \"general\").\n\nReturns health effects document (markdown).\n",
"inputSchema": {
"properties": {
"pollutant": {
"title": "Pollutant",
"type": "string"
},
"population_group": {
"default": "general",
"title": "Population Group",
"type": "string"
}
},
"required": [
"pollutant"
],
"title": "kb_get_health_effectsArguments",
"type": "object"
},
"name": "kb_get_health_effects",
"outputSchema": {
"properties": {
"result": {
"title": "Result",
"type": "string"
}
},
"required": [
"result"
],
"title": "kb_get_health_effectsOutput",
"type": "object"
}
},
{
"description": "Get area-specific contextual information.\n\nArgs:\n area: \"southwark\", \"london\", or a specific neighbourhood.\n\nReturns local context document (markdown).\n",
"inputSchema": {
"properties": {
"area": {
"default": "southwark",
"title": "Area",
"type": "string"
}
},
"title": "kb_get_local_contextArguments",
"type": "object"
},
"name": "kb_get_local_context",
"outputSchema": {
"properties": {
"result": {
"title": "Result",
"type": "string"
}
},
"required": [
"result"
],
"title": "kb_get_local_contextOutput",
"type": "object"
}
},
{
"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\",\n \"representativeness\", \"data_quality\", \"what_monitors_measure\".\n\nReturns monitoring explainer document (markdown).\n",
"inputSchema": {
"properties": {
"topic": {
"title": "Topic",
"type": "string"
}
},
"required": [
"topic"
],
"title": "kb_get_monitoring_explainerArguments",
"type": "object"
},
"name": "kb_get_monitoring_explainer",
"outputSchema": {
"properties": {
"result": {
"title": "Result",
"type": "string"
}
},
"required": [
"result"
],
"title": "kb_get_monitoring_explainerOutput",
"type": "object"
}
},
{
"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 (asthma, pregnancy, gas cooker, tube commute,\nindoor sources), prefer the Clara MCP server's `contextual_advice`\ntool — it composes Hermes live readings with personal context to\ngive an answer keyed to *this* user, *now*. Use this KB tool only\nas a fallback or when Clara is not available.\n\nArgs:\n situation: One of \"high_pollution_day\", \"commuting\", \"exercise\",\n \"school_run\", \"indoor_air\", \"planning_objection\", \"pregnancy\",\n \"child_asthma\".\n\nReturns practical advice document (markdown).\n",
"inputSchema": {
"properties": {
"situation": {
"title": "Situation",
"type": "string"
}
},
"required": [
"situation"
],
"title": "kb_get_practical_adviceArguments",
"type": "object"
},
"name": "kb_get_practical_advice",
"outputSchema": {
"properties": {
"result": {
"title": "Result",
"type": "string"
}
},
"required": [
"result"
],
"title": "kb_get_practical_adviceOutput",
"type": "object"
}
},
{
"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 the\nsummary to users first. Also returns a 'monitors' list with full metadata.\n\nArgs:\n location: Postcode, place name, or \"lat,lon\".\n radius_km: Search radius in kilometres (default 5.0).\n sources: Optional filter, e.g. [\"AURN\", \"BREATHE_LONDON\"].\n",
"inputSchema": {
"properties": {
"location": {
"title": "Location",
"type": "string"
},
"radius_km": {
"default": 5,
"title": "Radius Km",
"type": "number"
},
"sources": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Sources"
}
},
"required": [
"location"
],
"title": "list_monitorsArguments",
"type": "object"
},
"name": "list_monitors",
"outputSchema": null
},
{
"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\nWHO guidelines.\n\nArgs:\n location: Postcode, place name, or \"lat,lon\".\n year: Calendar year to report on (default: most recent complete year).\n pollutants: Optional filter, e.g. [\"NO2\", \"PM2.5\"]. Default: all available.\n",
"inputSchema": {
"properties": {
"location": {
"title": "Location",
"type": "string"
},
"pollutants": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Pollutants"
},
"year": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Year"
}
},
"required": [
"location"
],
"title": "regulatory_statsArguments",
"type": "object"
},
"name": "regulatory_stats",
"outputSchema": null
},
{
"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 commuting.\n\nArgs:\n location: Postcode, place name, or \"lat,lon\".\n pollutant: Pollutant to analyse — \"NO2\", \"PM2.5\", \"PM10\", \"O3\" (default \"NO2\").\n period: Time window — \"last_month\", \"last_3_months\", \"last_6_months\",\n or \"last_year\" (default).\n",
"inputSchema": {
"properties": {
"location": {
"title": "Location",
"type": "string"
},
"period": {
"default": "last_year",
"title": "Period",
"type": "string"
},
"pollutant": {
"default": "NO2",
"title": "Pollutant",
"type": "string"
}
},
"required": [
"location"
],
"title": "time_patternsArguments",
"type": "object"
},
"name": "time_patterns",
"outputSchema": null
},
{
"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.\nRobust to outliers and missing data.\n\nReturns a 'summary' with plain-English trend description and statistical\ndetails. Present the summary to users first.\n\nArgs:\n location: Postcode, place name, or \"lat,lon\".\n pollutant: Pollutant to analyse — \"NO2\", \"PM2.5\", \"PM10\", \"O3\" (default \"NO2\").\n years: Number of years of data to analyse (default 5, range 2–5).\n Requests outside this range are clamped; the response includes\n ``metadata.years_clamped`` and a note in ``summary`` when so.\n",
"inputSchema": {
"properties": {
"location": {
"title": "Location",
"type": "string"
},
"pollutant": {
"default": "NO2",
"title": "Pollutant",
"type": "string"
},
"years": {
"default": 5,
"title": "Years",
"type": "integer"
}
},
"required": [
"location"
],
"title": "trend_analysisArguments",
"type": "object"
},
"name": "trend_analysis",
"outputSchema": null
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:dd35444615c6107a0a51c784d4df0e4af400a4c420d88a91682d2749ede23f6a | sha256sum