Skip to main content
Glama
malkreide

meteoswiss-mcp

by malkreide

🌦️ meteoswiss-mcp

CI PyPI Python License: MIT swiss-public-data-mcp

Servidor MCP para datos meteorológicos y climáticos suizos de MeteoSwiss.

Conecta modelos de IA a la red de medición SwissMetNet (más de 160 estaciones, intervalo de 10 minutos), a los pronósticos ICON-CH1/CH2-EPS de MeteoSwiss y a las normales climáticas 1991–2020. Forma parte del portafolio swiss-public-data-mcp.

🇩🇪 Deutsche Version


Consulta de demostración (ejemplo de ancla)

How suitable is next Wednesday for the sports day at Leutschenbach school?

meteo_school_check(location="Zürich Oerlikon", activity="Sporttag") devuelve un semáforo 🟢/🟡/🔴 para cada día de la próxima semana, directamente desde el modelo ICON de MeteoSwiss.

Combinado con swiss-environment-mcp:

How were air quality and weather at Leutschenbach school yesterday?

meteo_current(station='REH') + env_nabel_current(station='ZUE') = una imagen ambiental completa. → Más casos de uso por audiencia


Related MCP server: Open-Meteo MCP Server

Herramientas (6)

Herramienta

Descripción

Fuente de datos

meteo_stations

Lista las estaciones SwissMetNet (filtrable por cantón)

Integrado

meteo_current

Observaciones actuales de 10 minutos para una estación

BGDI STAC API

meteo_forecast

Pronóstico de 1 a 16 días para un lugar o coordenadas

Open-Meteo / MeteoSwiss ICON

meteo_school_check

Semáforo 🟢/🟡/🔴 para eventos escolares al aire libre

Open-Meteo / MeteoSwiss ICON

meteo_climate_normals

Normales climáticas mensuales 1991–2020

Integrado (KLO, SMA, BER, LUG, GVE)

meteo_warnings

Avisos meteorológicos oficiales activos (tormenta, tormenta eléctrica, calor, incendio forestal, …) — en todo el país, por cantón o por PLZ

MeteoSwiss App-API + opendata.swiss

Anotaciones de herramientas (sugerencias MCP)

Todas las herramientas incluyen anotaciones MCP explícitas, relevantes para la interfaz de aprobación del cliente y para las decisiones de seguridad del LLM.

Herramienta

readOnlyHint

destructiveHint

idempotentHint

openWorldHint

meteo_stations

✗ (lista curada)

meteo_current

✗ (datos en vivo)

✅ (STAC externo)

meteo_forecast

✗ (datos en vivo)

✅ (Open-Meteo externo)

meteo_school_check

✗ (datos en vivo)

✅ (geocodificación + pronóstico)

meteo_climate_normals

✗ (normales integradas)

meteo_warnings

✗ (datos en vivo)

✅ (MeteoSwiss App-API)

Reglas de lectura: las 6 herramientas son readOnly + non-destructive — el servidor fundamentalmente no puede escribir ni eliminar nada. idempotentHint=False marca las herramientas que devuelven valores diferentes según cuándo se llaman.

Versión del protocolo MCP

Aspecto

Valor

Versiones de especificación probadas

2024-11-05, 2025-03-26, 2025-06-18 (mediante el SDK mcp[cli])

Versión del SDK de MCP

ver pyproject.tomlmcp[cli]>=2.0.0,<3 (la API MCPServer de mcp.server.mcpserver)

Política de actualización

Dependabot vigila mcp[cli]; los cambios de especificación se documentan en el CHANGELOG con un marcador "Tool Definition Changes"

→ Hoja de ruta completa y estrategia de actualización: docs/roadmap.md


Inicio rápido

Claude Desktop

{
  "mcpServers": {
    "meteoswiss": {
      "command": "uvx",
      "args": ["meteoswiss-mcp"]
    }
  }
}

Claude Desktop (desarrollo local)

{
  "mcpServers": {
    "meteoswiss": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/meteoswiss-mcp", "meteoswiss-mcp"]
    }
  }
}

Nube / Render.com (Streamable HTTP)

Configuración mediante variables ENV (las banderas CLI --http / --port N siguen funcionando como anulación):

Variable

Predeterminado

Significado

MCP_TRANSPORT

stdio

stdio o streamable-http

MCP_HOST

127.0.0.1

Dirección de enlace: no cambiarla nunca en local

MCP_PORT

8000

Puerto

MCP_ALLOW_ANY_HOST

unset

Debe establecerse en 1 para permitir que el servidor se vincule a 0.0.0.0 (solo contenedores/nube)

MCP_LOG_LEVEL

INFO

DEBUG / INFO / WARNING / ERROR: registros JSON estructurados en stderr

MCP_ALLOWED_ORIGINS

unset

Lista separada por comas de orígenes permitidos para CORS. Vacío = CORS desactivado (solo mismo origen). Mcp-Session-Id se expone automáticamente.

MCP_API_KEY

unset

Si se establece: cada petición excepto /health requiere X-API-Key: <key> o Authorization: Bearer <key>. Comparación en tiempo constante.

MCP_STATELESS_HTTP

0

1 activa el modo sin estado del SDK → cada petición HTTP abre una nueva sesión. Requisito previo para despliegues multi-réplica sin sesiones persistentes (SCALE-002/003).

OTEL_EXPORTER_OTLP_ENDPOINT

unset

Si se establece + pip install meteoswiss-mcp[otel]: los spans de OpenTelemetry por llamada a herramienta + la instrumentación automática de httpx se envían como OTLP-HTTP al recolector.

OTEL_SERVICE_NAME

meteoswiss_mcp

Nombre del servicio en los recursos de OTel

MCP_CACHE_ENABLED

1

0 desactiva por completo la caché TTL (p. ej. para pruebas de extremo a extremo)

MCP_CACHE_TTL_STAC

300

TTL en segundos para las observaciones SMN de STAC (5 min por defecto)

MCP_CACHE_TTL_OPEN_METEO

600

TTL para los pronósticos ICON (10 min por defecto)

MCP_CACHE_TTL_GEOCODING

3600

TTL para las búsquedas de geocodificación (1 h por defecto)

MCP_CACHE_TTL_OPENDATA

3600

TTL para el catálogo de opendata.swiss (1 h por defecto)

MCP_CACHE_TTL_WARNINGS

300

TTL para los avisos (App-API de MeteoSwiss / anulación estructurada; 5 min por defecto)

MCP_CLIMATE_NORMALS_PATH

unset

Ruta a un archivo JSON con normales climáticas adicionales: consulte data/climate-normals.example.json

MCP_WARNINGS_API_URL

unset

Anulación de la fuente App-API de MeteoSwiss por defecto: URL de una API estructurada de avisos de MeteoSwiss (p. ej. el futuro endpoint REST de avisos OGD). El host debe estar en la lista de permitidos de salida. Tolerante al esquema (GeoJSON features, un array warnings o items). Sin establecer → App-API en vivo.

MCP_CLIMATE_NORMALS_URL_TEMPLATE

unset

Plantilla de URL para la consulta en tiempo de ejecución de normales climáticas (para estaciones sin valores integrados o JSON). Tokens: {station} (minúsculas), {STATION} (mayúsculas), {param} (código MeteoSwiss tre200m0/rre150m0/sre000m0). Ejemplo: https://data.geo.admin.ch/.../{station}/{param}.txt. El host debe estar en la lista de permitidos de salida.

# Local test (safe, loopback only)
MCP_TRANSPORT=streamable-http meteoswiss-mcp

# Container / Render
MCP_TRANSPORT=streamable-http MCP_HOST=0.0.0.0 MCP_ALLOW_ANY_HOST=1 meteoswiss-mcp

Docker / Render

El repositorio incluye un Dockerfile multi-etapa listo para producción (usuario no root, HEALTHCHECK) y una plantilla render.yaml:

# Build + test locally
docker build -t meteoswiss-mcp .
docker run --rm -p 8000:8000 meteoswiss-mcp
curl http://127.0.0.1:8000/health   # → {"status":"ok","service":"meteoswiss-mcp"}

En Render: «New → Blueprint» → seleccione el repositorio. Los valores predeterminados (plan starter, Frankfurt, instancia única) se establecen en render.yaml.

Importante: numInstances: 1 se establece deliberadamente: el enrutamiento de sesiones persistentes para multi-réplica (auditoría SCALE-002/003) aún no está implementado.

Registro estructurado

Todas las invocaciones de herramientas, fallos de servicios ascendentes y bloqueos de salida se emiten como eventos JSON en stderr (seguro para transporte stdio). Ejemplo:

{"tool": "meteo_forecast", "days": 7, "has_coords": false, "event": "tool_invoked", "level": "info", "timestamp": "2026-05-20T07:00:00Z"}
{"tool": "meteo_forecast", "endpoint": "geocoding", "error_type": "HTTPStatusError", "event": "upstream_failed", "level": "warning", "timestamp": "..."}
{"url": "https://evil.example.com/", "method": "GET", "reason": "host not in allow-list", "event": "egress_blocked", "level": "warning", "timestamp": "..."}

Seguridad en modo HTTP

  • MCP_HOST se fija deliberadamente a 127.0.0.1 para que --http en un portátil de desarrollo no quede expuesto accidentalmente a la subred local (hallazgo de auditoría SEC-016).

  • Todas las llamadas HTTP salientes (incluidos los redireccionamientos) se validan contra una lista de permitidos: data.geo.admin.ch, api.open-meteo.com, geocoding-api.open-meteo.com, opendata.swiss. Otros hosts y direcciones IP literales (en particular 169.254.169.254, RFC1918) se rechazan con EgressBlocked (SEC-004 / SEC-021).

  • CORS: desactivado por defecto (solo mismo origen). Los clientes de navegador (p. ej. claude.ai web) necesitan MCP_ALLOWED_ORIGINS=<csv>; el encabezado Mcp-Session-Id se incluye entonces automáticamente en Access-Control-Expose-Headers (SDK-004).

  • Autenticación por clave API: desactivada por defecto. En una configuración HTTP de producción, establezca siempre MCP_API_KEY=<random>: las peticiones sin una X-API-Key válida o Authorization: Bearer … se rechazan con 401 (SEC-009 / SEC-013). /health permanece abierto para las sondas de salud del contenedor.

Ejemplo: pila HTTP de producción

# 32 bytes of randomness as the auth key
export MCP_API_KEY=$(python -c "import secrets; print(secrets.token_urlsafe(32))")

MCP_TRANSPORT=streamable-http \
MCP_HOST=0.0.0.0 \
MCP_ALLOW_ANY_HOST=1 \
MCP_ALLOWED_ORIGINS=https://app.example.com \
MCP_API_KEY="$MCP_API_KEY" \
meteoswiss-mcp

Ejemplos de consultas

Planificación escolar

Which days next week are suitable for a sports day in Zürich?
→ meteo_school_check(location="Zürich", activity="Sporttag")

What will the weather be at Leutschenbach school on Friday?
→ meteo_forecast(location="Zürich Oerlikon", days=5)

Show me current readings from the nearest MeteoSwiss station to Zürich-Schwamendingen.
→ meteo_current(station="REH")

Comparación climática

How much rain normally falls in June in Zürich?
→ meteo_climate_normals(station="KLO")

Is Lugano really much sunnier than Zürich? Show me the annual values.
→ meteo_climate_normals(station="LUG") + meteo_climate_normals(station="SMA")

Infraestructura y entorno

Are there currently any weather warnings for the canton of Zürich?
→ meteo_warnings(canton="ZH")

Show me a 10-day forecast for the Heerenschürli sports facility with hourly values.
→ meteo_forecast(location="Sportanlage Heerenschürli Zürich", days=10, hourly=True)

Arquitectura

Claude Desktop / AI agent
        │
        │ MCP (stdio / Streamable HTTP)
        ▼
meteoswiss-mcp (MCPServer)
        │
        ├── meteo_stations ──────────────── [embedded: ~20 SMN stations]
        │
        ├── meteo_current ───────────────── BGDI STAC API
        │                                   data.geo.admin.ch/api/stac/v1
        │                                   Collection: ch.meteoschweiz.ogd-smn
        │
        ├── meteo_forecast ──────────────── Open-Meteo
        ├── meteo_school_check ──────────── api.open-meteo.com/v1/meteoswiss
        │                                   (MeteoSwiss ICON-CH1/CH2-EPS, 1–2 km)
        │
        ├── meteo_climate_normals ───────── [embedded: normals 1991–2020]
        │
        └── meteo_warnings ──────────────── app-prod-ws.meteoswiss-app.ch
                                            (MeteoSwiss App-API) + opendata.swiss

Fuentes de datos

Fuente

URL

Licencia

BGDI STAC API (MeteoSwiss OGD)

data.geo.admin.ch/api/stac/v1

CC BY 4.0

Open-Meteo (MeteoSwiss ICON)

api.open-meteo.com/v1/meteoswiss

CC BY 4.0

Open-Meteo Geocoding

geocoding-api.open-meteo.com

CC BY 4.0

opendata.swiss CKAN

opendata.swiss/api/3/action

CC BY 4.0

MeteoSwiss App-API (avisos)

app-prod-ws.meteoswiss-app.ch/v1/plzDetail

CC BY 4.0


Seguridad y límites

Aspect

Details

Acceso

Solo lectura (readOnlyHint: true en todas las herramientas): el servidor no puede modificar ni eliminar ningún dato

Datos personales

No se recopilan datos personales: todas las fuentes son datos abiertos agregados y disponibles públicamente

Límites de peticiones

Límites integrados por consulta: máx. 50 resultados por llamada a la API, tiempo de espera de 30 s

Autenticación

No se requieren claves de API: todas las fuentes de datos son de acceso público

Licencias

Todos los datos bajo CC BY 4.0 (MeteoSwiss Open Government Data)

Términos de servicio

Sujeto a los términos de servicio de las respectivas fuentes de datos: MeteoSwiss OGD, Open-Meteo, opendata.swiss


Limitaciones conocidas

ID

Herramienta

Descripción

BUG-01

meteo_current

La estructura de activos STAC puede variar según la estación; se implementa un respaldo a un enlace directo

LIM-01

meteo_climate_normals

Solo 5 estaciones integradas (KLO, SMA, BER, LUG, GVE); el resto mediante un enlace de opendata.swiss

LIM-02

meteo_warnings

Las alertas en vivo provienen de la API de la app MeteoSwiss (plzDetail), pública y sin autenticación, pero no documentada (backend de la app móvil, no la API REST OGD). No existe un endpoint nacional, por lo que la vista nacional agrega un PLZ capital representativo por cantón (las alertas subregionales fuera de ese PLZ pueden perderse: limite con plz/canton). MCP_WARNINGS_API_URL lo reemplaza cuando se publique la API REST oficial de alertas OGD.

LIM-03

meteo_current

Muestra valores de 10 minutos en UTC; sin conversión automática a la hora local

Matriz de responsabilidades: nieve y precipitación (delimitación frente a swiss-environment-mcp)

Para evitar duplicar los datos de nieve y precipitación en el portafolio, las responsabilidades se dividen de la siguiente manera. meteoswiss-mcp es responsable de la precipitación atmosférica y el tiempo; swiss-environment-mcp (dominio SLF) es responsable de la nieve en el suelo y del peligro de aludes.

Datos

meteoswiss-mcp (MeteoSwiss)

swiss-environment-mcp (BAFU / SLF)

Cantidad de precipitación (mm): red de medición, pronóstico, normales climáticas

meteo_current / meteo_forecast / meteo_climate_normals

Nevada como condición meteorológica actual

meteo_current / meteo_forecast (código meteorológico)

Avisos meteorológicos (tormenta, tormenta eléctrica, calor)

meteo_warnings

Altura de nieve en el suelo (HS)

✅ SLF IMIS / parcela de estudio ¹

Nieve nueva en 24 h (HN_1D)

✅ SLF ¹

Nivel de peligro de aludes

✅ boletín de aludes SLF ¹

Avisos de peligros naturales (inundación, alud, incendio forestal)

env_flood_warnings, env_hazard_*, env_wildfire_danger

Regla: la precipitación atmosférica (lluvia/nieve en mm), junto con el tiempo, el pronóstico, los avisos y las normales climáticas, pertenecen a meteoswiss-mcp; la nieve en el suelo y el peligro de aludes pertenecen a swiss-environment-mcp (SLF). El sensor de precipitación SLF IMIS se utiliza allí solo como contexto para el manto de nieve y nunca se expone como herramienta de precipitación, por lo que no duplica a MeteoSwiss.

¹ Las herramientas SLF/nieve en swiss-environment-mcp están en preparación (sonda en vivo de la Fase 1 completada el 2026-07-19, consulte el docs/probe-slf.md de ese repositorio); la delimitación queda fijada ahora para que los dos servidores no colisionen una vez implementados.


Sinergias del portafolio

meteoswiss-mcp
    │
    ├── swiss-environment-mcp   Combine weather + air quality (NABEL)
    │                           "How were weather AND air at Leutschenbach school?"
    │
    └── zurich-opendata-mcp     School locations → weather forecast
                                "Which schools in Zürich have sports-day weather?"

Pruebas

# Unit tests (no network)
PYTHONPATH=src pytest tests/ -m "not live" -v

# Live tests (real APIs) — also run daily at 05:17 UTC via
# .github/workflows/live-tests.yml, so a format change upstream
# surfaces even though the unit tests stay green.
PYTHONPATH=src pytest tests/ -m live -v

# Linting — install the local gates once with `pre-commit install`
# to run these (and the CI guards) before every commit.
ruff check src/ tests/ scripts/
ruff format --check src/ tests/ scripts/

Desarrollo

git clone https://github.com/malkreide/meteoswiss-mcp
cd meteoswiss-mcp
pip install -e ".[dev]"

MCP Inspector (prueba local)

PYTHONPATH=src npx @modelcontextprotocol/inspector python -m meteoswiss_mcp.server

Contribuciones

Consulte las pautas de contribución (Alemán).


Seguridad

Consulte la política de seguridad (Alemán) para conocer la postura de seguridad y cómo informar de una vulnerabilidad.


Licencia

Licencia MIT: consulte LICENSE.

Datos de origen: MeteoSwiss Open Government Data (CC BY 4.0). Al utilizar los datos, cite: Fuente: MeteoSwiss.


Autor

Hayal Oezkan · github.com/malkreide


Servidores relacionados

swiss-environment-mcp zurich-opendata-mcp swiss-transport-mcp

Instalación

Ejecute mediante uvx de uv: no se necesita clonar ni instalar manualmente. Añádalo a la configuración de su cliente MCP (mcpServers para Claude Desktop, Cursor y Windsurf; use una clave servers de nivel superior para VS Code en .vscode/mcp.json):

{
  "mcpServers": {
    "meteoswiss-mcp": {
      "command": "uvx",
      "args": [
        "meteoswiss-mcp"
      ]
    }
  }
}
Install Server
A
license - permissive license
A
quality
A
maintenance

Maintenance

Maintainers
3hResponse time
2wRelease cycle
8Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    D
    quality
    D
    maintenance
    Provides Swiss weather forecast data, allowing users to search for Swiss locations and get detailed hourly and daily weather forecasts.
    2
    2
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Provides comprehensive access to Open-Meteo APIs for weather forecasts, historical data, air quality, and marine conditions. It enables LLMs to query specialized meteorological models, perform geocoding, and access advanced climate or flood projections.
    17
    668
    64
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides access to official MeteoSwiss weather data, including regional reports, daily forecasts, and website search functionality across multiple languages. It enables AI assistants to retrieve real-time weather information and documentation from MeteoSwiss using the Model Context Protocol.
    2
    Creative Commons Zero v1.0 Universal
  • A
    license
    Not graded
    quality
    C
    maintenance
    Exposes Swiss weather forecast data as MCP tools, including rainfall, sunshine, temperature, wind, and more, with local caching.
    1
    Apache 2.0

View all related MCP servers

Related MCP Connectors

  • Swiss weather data for AI assistants — forecasts, measurements, stations, pollen.

  • US weather, alerts, earthquakes and elevation for AI agents, from NWS/NOAA and USGS. No API keys.

  • Global weather via Open-Meteo: forecast, ERA5 archive, marine, air quality, geocoding, elevation.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/malkreide/meteoswiss-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server