meteoswiss-mcp
🌦️ meteoswiss-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.
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 |
| Lista las estaciones SwissMetNet (filtrable por cantón) | Integrado |
| Observaciones actuales de 10 minutos para una estación | BGDI STAC API |
| Pronóstico de 1 a 16 días para un lugar o coordenadas | Open-Meteo / MeteoSwiss ICON |
| Semáforo 🟢/🟡/🔴 para eventos escolares al aire libre | Open-Meteo / MeteoSwiss ICON |
| Normales climáticas mensuales 1991–2020 | Integrado (KLO, SMA, BER, LUG, GVE) |
| 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 |
|
|
|
|
| ✅ | ✗ | ✅ | ✗ (lista curada) |
| ✅ | ✗ | ✗ (datos en vivo) | ✅ (STAC externo) |
| ✅ | ✗ | ✗ (datos en vivo) | ✅ (Open-Meteo externo) |
| ✅ | ✗ | ✗ (datos en vivo) | ✅ (geocodificación + pronóstico) |
| ✅ | ✗ | ✅ | ✗ (normales integradas) |
| ✅ | ✗ | ✗ (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 |
|
Versión del SDK de MCP | ver |
Política de actualización | Dependabot vigila |
→ 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 |
|
|
|
|
| Dirección de enlace: no cambiarla nunca en local |
|
| Puerto |
| unset | Debe establecerse en |
|
|
|
| unset | Lista separada por comas de orígenes permitidos para CORS. Vacío = CORS desactivado (solo mismo origen). |
| unset | Si se establece: cada petición excepto |
|
|
|
| unset | Si se establece + |
|
| Nombre del servicio en los recursos de OTel |
|
|
|
|
| TTL en segundos para las observaciones SMN de STAC (5 min por defecto) |
|
| TTL para los pronósticos ICON (10 min por defecto) |
|
| TTL para las búsquedas de geocodificación (1 h por defecto) |
|
| TTL para el catálogo de opendata.swiss (1 h por defecto) |
|
| TTL para los avisos (App-API de MeteoSwiss / anulación estructurada; 5 min por defecto) |
| unset | Ruta a un archivo JSON con normales climáticas adicionales: consulte |
| 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 |
| unset | Plantilla de URL para la consulta en tiempo de ejecución de normales climáticas (para estaciones sin valores integrados o JSON). Tokens: |
# 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-mcpDocker / 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_HOSTse fija deliberadamente a127.0.0.1para que--httpen 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 particular169.254.169.254, RFC1918) se rechazan conEgressBlocked(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 encabezadoMcp-Session-Idse incluye entonces automáticamente enAccess-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 unaX-API-Keyválida oAuthorization: Bearer …se rechazan con 401 (SEC-009 / SEC-013)./healthpermanece 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-mcpEjemplos 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.swissFuentes de datos
Fuente | URL | Licencia |
BGDI STAC API (MeteoSwiss OGD) |
| CC BY 4.0 |
Open-Meteo (MeteoSwiss ICON) |
| CC BY 4.0 |
Open-Meteo Geocoding |
| CC BY 4.0 |
opendata.swiss CKAN |
| CC BY 4.0 |
MeteoSwiss App-API (avisos) |
| CC BY 4.0 |
Seguridad y límites
Aspect | Details |
Acceso | Solo lectura ( |
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 |
| La estructura de activos STAC puede variar según la estación; se implementa un respaldo a un enlace directo |
LIM-01 |
| Solo 5 estaciones integradas (KLO, SMA, BER, LUG, GVE); el resto mediante un enlace de opendata.swiss |
LIM-02 |
| Las alertas en vivo provienen de la API de la app MeteoSwiss ( |
LIM-03 |
| 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 | ✅ | ❌ |
Nevada como condición meteorológica actual | ✅ | ❌ |
Avisos meteorológicos (tormenta, tormenta eléctrica, calor) | ✅ | ❌ |
Altura de nieve en el suelo ( | ❌ | ✅ SLF IMIS / parcela de estudio ¹ |
Nieve nueva en 24 h ( | ❌ | ✅ SLF ¹ |
Nivel de peligro de aludes | ❌ | ✅ boletín de aludes SLF ¹ |
Avisos de peligros naturales (inundación, alud, incendio forestal) | ❌ | ✅ |
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.serverContribuciones
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
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"
]
}
}
}Maintenance
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
- AlicenseDqualityDmaintenanceProvides Swiss weather forecast data, allowing users to search for Swiss locations and get detailed hourly and daily weather forecasts.22MIT
- AlicenseAqualityAmaintenanceProvides 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.1766864MIT
- AlicenseNot gradedqualityCmaintenanceProvides 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.2Creative Commons Zero v1.0 Universal
- AlicenseNot gradedqualityCmaintenanceExposes Swiss weather forecast data as MCP tools, including rainfall, sunshine, temperature, wind, and more, with local caching.1Apache 2.0
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.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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