Open-Meteo

by cmer81

Not rated
GitHub

About

Access global weather forecasts and historical data through the Open-Meteo API.

Details

Author
cmer81
Categories
Cloud Service, Other, API

Full Configuration (with environment variables)

{ "mcpServers": { "open-meteo": { "command": "npx", "args": ["-y", "-p", "open-meteo-mcp-server", "open-meteo-mcp-server"], "env": { "OPEN_METEO_API_URL": "https://api.open-meteo.com", "OPEN_METEO_AIR_QUALITY_API_URL": "https://air-quality-api.open-meteo.com", "OPEN_METEO_MARINE_API_URL": "https://marine-api.open-meteo.com", "OPEN_METEO_ARCHIVE_API_URL": "https://archive-api.open-meteo.com", "OPEN_METEO_SEASONAL_API_URL": "https://seasonal-api.open-meteo.com", "OPEN_METEO_ENSEMBLE_API_URL": "https://ensemble-api.open-meteo.com", "OPEN_METEO_GEOCODING_API_URL": "https://geocoding-api.open-meteo.com", "OPEN_METEO_FLOOD_API_URL": "https://flood-api.open-meteo.com", "OPEN_METEO_CLIMATE_API_URL": "https://climate-api.open-meteo.com" } } } }

If you're developing locally or installed from source:

{ "mcpServers": { "open-meteo": { "command": "node", "args": ["/path/to/open-meteo-mcp/dist/index.js"], "env": { "OPEN_METEO_API_URL": "https://api.open-meteo.com", "OPEN_METEO_AIR_QUALITY_API_URL": "https://air-quality-api.open-meteo.com", "OPEN_METEO_MARINE_API_URL": "https://marine-api.open-meteo.com", "OPEN_METEO_ARCHIVE_API_URL": "https://archive-api.open-meteo.com", "OPEN_METEO_SEASONAL_API_URL": "https://seasonal-api.open-meteo.com", "OPEN_METEO_ENSEMBLE_API_URL": "https://ensemble-api.open-meteo.com", "OPEN_METEO_GEOCODING_API_URL": "https://geocoding-api.open-meteo.com", "OPEN_METEO_FLOOD_API_URL": "https://flood-api.open-meteo.com", "OPEN_METEO_CLIMATE_API_URL": "https://climate-api.open-meteo.com" } } } }

If you're using your own Open-Meteo instance:

{ "mcpServers": { "open-meteo": { "command": "npx", "args": ["-y", "-p", "open-meteo-mcp-server", "open-meteo-mcp-server"], "env": { "OPEN_METEO_API_URL": "https://your-meteo-api.example.com", "OPEN_METEO_AIR_QUALITY_API_URL": "https://air-quality-api.example.com", "OPEN_METEO_MARINE_API_URL": "https://marine-api.example.com", "OPEN_METEO_ARCHIVE_API_URL": "https://archive-api.example.com", "OPEN_METEO_SEASONAL_API_URL": "https://seasonal-api.example.com", "OPEN_METEO_ENSEMBLE_API_URL": "https://ensemble-api.example.com", "OPEN_METEO_GEOCODING_API_URL": "https://geocoding-api.example.com", "OPEN_METEO_FLOOD_API_URL": "https://flood-api.example.com", "OPEN_METEO_CLIMATE_API_URL": "https://climate-api.example.com" } } } }

The server also supports Streamable HTTP transport for remote deployments. Set theTRANSPORTenvironment variable tohttp:

TRANSPORT=http PORT=3000 npx open-meteo-mcp-server

This starts an Express server on the specified port (default: 3000) with the MCP endpoint at/mcp. The HTTP transport supports session management with unique session IDs per client.

The server binds to127.0.0.1by default, so it is reachable only from the local machine. To accept connections from other hosts, setHOST=0.0.0.0explicitly. The Docker image already does this, so published ports work without extra configuration.

For production deployments, bind to a reachable interface and enable authentication and rate limiting:

HOST=0.0.0.0 API_KEY=your-secret-key RATE_LIMIT_RPM=60 TRANSPORT=http PORT=3000 npx open-meteo-mcp-server

If a browser-based client connects to the server, list its origin inALLOWED_ORIGINS— requests carrying an unlistedOriginheader are rejected with403as DNS rebinding protection.

Clients must then include the key in every request:

Authorization: Bearer your-secret-key # or X-API-Key: your-secret-key
# Start in HTTP mode (production) npm run start:http # Development with auto-reload in HTTP mode npm run dev:http

The server can be easily deployed using Docker.

A comprehensiveModel Context Protocol (MCP)server that provides access to Open-Meteo weather APIs for use with Large Language Models.

This MCP server provides complete access to Open-Meteo APIs, including:

- Weather Forecast(weather_forecast) - Forecasts up to 16 days (7 by default) with hourly and daily resolution
- Weather Archive(weather_archive) - Historical ERA5 data from 1940 to present
- Air Quality(air_quality) - PM2.5, PM10, ozone, nitrogen dioxide, pollen, European/US AQI indices, UV index and other pollutants
- Marine Weather(marine_weather) - Wave height, wave period, wave direction and sea surface temperature
- Elevation(elevation) - Digital elevation model data for given coordinates
- Geocoding(geocoding) - Search locations worldwide by name or postal code, get coordinates and detailed location information

- DWD ICON(dwd_icon_forecast) - German weather service high-resolution model for Europe
- NOAA GFS(gfs_forecast) - US weather service global model with high-resolution North America data
- Météo-France(meteofrance_forecast) - French weather service AROME and ARPEGE models
- ECMWF(ecmwf_forecast) - European Centre for Medium-Range Weather Forecasts
- JMA(jma_forecast) - Japan Meteorological Agency high-resolution model for Asia
- MET Norway(metno_forecast) - Norwegian weather service for Nordic countries
- Environment Canada GEM(gem_forecast) - Canadian weather service model

- Flood Forecast(flood_forecast) - River discharge and flood forecasts from GloFAS (Global Flood Awareness System)
- Seasonal Forecast(seasonal_forecast) - Long-range forecasts up to ~7 months ahead
- Climate Projections(climate_projection) - CMIP6 climate change projections for different warming scenarios
- Ensemble Forecast(ensemble_forecast) - Multiple model runs showing forecast uncertainty

No installation required! The server will run directly via npx.

# Clone the repository git clone https://github.com/cmer81/open-meteo-mcp.git cd open-meteo-mcp # Install dependencies npm install # Build the project npm run build

Add the following configuration to your Claude Desktop config file:

{ "mcpServers": { "open-meteo": { "command": "npx", "args": ["-y", "-p", "open-meteo-mcp-server", "open-meteo-mcp-server"] } } }

Full Configuration (with environment variables)

{ "mcpServers": { "open-meteo": { "command": "npx", "args": ["-y", "-p", "open-meteo-mcp-server", "open-meteo-mcp-server"], "env": { "OPEN_METEO_API_URL": "https://api.open-meteo.com", "OPEN_METEO_AIR_QUALITY_API_URL": "https://air-quality-api.open-meteo.com", "OPEN_METEO_MARINE_API_URL": "https://marine-api.open-meteo.com", "OPEN_METEO_ARCHIVE_API_URL": "https://archive-api.open-meteo.com", "OPEN_METEO_SEASONAL_API_URL": "https://seasonal-api.open-meteo.com", "OPEN_METEO_ENSEMBLE_API_URL": "https://ensemble-api.open-meteo.com", "OPEN_METEO_GEOCODING_API_URL": "https://geocoding-api.open-meteo.com", "OPEN_METEO_FLOOD_API_URL": "https://flood-api.open-meteo.com", "OPEN_METEO_CLIMATE_API_URL": "https://climate-api.open-meteo.com" } } } }

If you're developing locally or installed from source:

{ "mcpServers": { "open-meteo": { "command": "node", "args": ["/path/to/open-meteo-mcp/dist/index.js"], "env": { "OPEN_METEO_API_URL": "https://api.open-meteo.com", "OPEN_METEO_AIR_QUALITY_API_URL": "https://air-quality-api.open-meteo.com", "OPEN_METEO_MARINE_API_URL": "https://marine-api.open-meteo.com", "OPEN_METEO_ARCHIVE_API_URL": "https://archive-api.open-meteo.com", "OPEN_METEO_SEASONAL_API_URL": "https://seasonal-api.open-meteo.com", "OPEN_METEO_ENSEMBLE_API_URL": "https://ensemble-api.open-meteo.com", "OPEN_METEO_GEOCODING_API_URL": "https://geocoding-api.open-meteo.com", "OPEN_METEO_FLOOD_API_URL": "https://flood-api.open-meteo.com", "OPEN_METEO_CLIMATE_API_URL": "https://climate-api.open-meteo.com" } } } }

If you're using your own Open-Meteo instance:

{ "mcpServers": { "open-meteo": { "command": "npx", "args": ["-y", "-p", "open-meteo-mcp-server", "open-meteo-mcp-server"], "env": { "OPEN_METEO_API_URL": "https://your-meteo-api.example.com", "OPEN_METEO_AIR_QUALITY_API_URL": "https://air-quality-api.example.com", "OPEN_METEO_MARINE_API_URL": "https://marine-api.example.com", "OPEN_METEO_ARCHIVE_API_URL": "https://archive-api.example.com", "OPEN_METEO_SEASONAL_API_URL": "https://seasonal-api.example.com", "OPEN_METEO_ENSEMBLE_API_URL": "https://ensemble-api.example.com", "OPEN_METEO_GEOCODING_API_URL": "https://geocoding-api.example.com", "OPEN_METEO_FLOOD_API_URL": "https://flood-api.example.com", "OPEN_METEO_CLIMATE_API_URL": "https://climate-api.example.com" } } } }

The server also supports Streamable HTTP transport for remote deployments. Set theTRANSPORTenvironment variable tohttp:

TRANSPORT=http PORT=3000 npx open-meteo-mcp-server

This starts an Express server on the specified port (default: 3000) with the MCP endpoint at/mcp. The HTTP transport supports session management with unique session IDs per client.

The server binds to127.0.0.1by default, so it is reachable only from the local machine. To accept connections from other hosts, setHOST=0.0.0.0explicitly. The Docker image already does this, so published ports work without extra configuration.

For production deployments, bind to a reachable interface and enable authentication and rate limiting:

HOST=0.0.0.0 API_KEY=your-secret-key RATE_LIMIT_RPM=60 TRANSPORT=http PORT=3000 npx open-meteo-mcp-server

If a browser-based client connects to the server, list its origin inALLOWED_ORIGINS— requests carrying an unlistedOriginheader are rejected with403as DNS rebinding protection.

Clients must then include the key in every request:

Authorization: Bearer your-secret-key # or X-API-Key: your-secret-key
# Start in HTTP mode (production) npm run start:http # Development with auto-reload in HTTP mode npm run dev:http

The server can be easily deployed using Docker.

Using Pre-built Image from GitHub Container Registry (Recommended)

# Pull the latest image docker pull ghcr.io/cmer81/open-meteo-mcp:latest # Run the container docker run -d \ --name open-meteo-mcp \ -p 3000:3000 \ ghcr.io/cmer81/open-meteo-mcp:latest # Check health curl http://localhost:3000/health

Available tags (novprefix — the git tagv2.0.0publishes the image as2.0.0):

- latest- Latest stable release
- 2.0.0- Specific version
- 2.0- Latest 2.0.x release
- 2- Latest 2.x.x release

The repository includes two Docker Compose configurations:

# Start with pre-built image from GitHub Container Registry docker compose up -d # View logs docker compose logs -f # Stop the server docker compose down
# Build and start from local source docker compose -f docker-compose.dev.yml up -d # Rebuild after code changes docker compose -f docker-compose.dev.yml up -d --build

If you prefer to build the image yourself:

# Build the image npm run docker:build # or docker build -t open-meteo-mcp-server . # Run the container npm run docker:run # or docker run -p 3000:3000 open-meteo-mcp-server

Copy.env.exampleto.envand customize as needed:

cp .env.example .env # Edit .env with your configuration

Then updatedocker-compose.ymlto use the.envfile or pass environment variables directly.

The HTTP server includes a health check endpoint:

curl http://localhost:3000/health # Response: {"status":"ok"}

This endpoint is used by Docker'sHEALTHCHECKand can be integrated with container orchestration platforms (Kubernetes, Docker Swarm, etc.).

All environment variables are optional and have sensible defaults:

- OPEN_METEO_API_URL- Base URL for Open-Meteo forecast API (default:https://api.open-meteo.com)
- OPEN_METEO_AIR_QUALITY_API_URL- Air quality API URL (default:
https://air-quality-api.open-meteo.com)
- OPEN_METEO_MARINE_API_URL- Marine weather API URL (default:
https://marine-api.open-meteo.com)
- OPEN_METEO_ARCHIVE_API_URL- Historical data API URL (default:
https://archive-api.open-meteo.com)
- OPEN_METEO_SEASONAL_API_URL- Seasonal forecast API URL (default:
https://seasonal-api.open-meteo.com)
- OPEN_METEO_ENSEMBLE_API_URL- Ensemble forecast API URL (default:
https://ensemble-api.open-meteo.com)
- OPEN_METEO_GEOCODING_API_URL- Geocoding API URL (default:
https://geocoding-api.open-meteo.com)
- OPEN_METEO_FLOOD_API_URL- Flood forecast API URL (default:
https://flood-api.open-meteo.com)
- OPEN_METEO_CLIMATE_API_URL- Climate projection API URL (default:
https://climate-api.open-meteo.com)
- TRANSPORT- Transport mode:httpfor Streamable HTTP, omit for stdio (default: stdio)
- PORT- HTTP server port when using HTTP transport (default: 3000)
- HOST- Interface the HTTP transport binds to (default:127.0.0.1, loopback only). Set to0.0.0.0to accept connections from other machines. The Docker image sets this to0.0.0.0already, so published ports work out of the box.

- API_KEY- When set, all requests to/mcpmust include this key viaAuthorization: Bearer <key>orX-API-Key: <key>. Leave unset for open access (local/dev mode). Enforced onGET,POSTandDELETEalike.
- RATE_LIMIT_RPM- Maximum requests per minute per IP (default:60). HTTP transport only.
- TRUSTED_PROXIES- Comma-separated list of trusted proxy IPs or CIDR ranges (e.g.10.0.0.0/8,172.16.0.0/12). When set,X-Forwarded-Foris honoured only for requests originating from these addresses. Leave unset to always use the direct connection IP.
- ALLOWED_ORIGINS- Comma-separated list of browser origins permitted to reach the server (e.g.http://localhost:5173,https://app.example). Protects against DNS rebinding: any request carrying anOriginheader that is not listed is rejected with403. Requests without anOriginheader — CLI clients and SDK transports — are unaffected. Empty by default.

/healthstays reachable without a key and without rate limiting, so container probes keep working.

Theskills/directory contains SKILL.md files that help AI assistants use this MCP server effectively. They act as contextual guides — the AI reads the relevant skill to know which tool to call and how to use its parameters.

Copy the skill(s) to your Claude skills directory:

cp -r skills/open-meteo ~/.claude/skills/ cp -r skills/open-meteo-advanced ~/.claude/skills/

This installs them at~/.claude/skills/open-meteo/SKILL.mdand~/.claude/skills/open-meteo-advanced/SKILL.md. Claude Code will load the relevant skill automatically when you ask weather-related questions.

Upload the SKILL.md file directly as a document in your Claude Desktop conversation:

- For everyday weather questions: uploadskills/open-meteo/SKILL.md
- For model selection, ensemble, or climate projections: uploadskills/open-meteo-advanced/SKILL.md

Upload one skill per conversation. The AI will use it as a reference guide throughout the session.

Search for locations named "Berlin" and return the top 5 results
What are the coordinates for postal code 75001?
Search for "Lyon" in France only (countryCode: FR) with results in French (language: fr)
Find all cities named "London" in the United Kingdom with English descriptions
Can you get me the weather forecast for Paris (48.8566, 2.3522) with temperature, humidity, and precipitation for the next 3 days?
What were the temperatures in London during January 2023?
What's the current air quality in Beijing with PM2.5 and ozone levels?
Give me the current European AQI, UV index, and pollen levels (birch, grass, ragweed) in Paris.
Get me the wave height and sea surface temperature for coordinates 45.0, -125.0 for the next 5 days.
Check the river discharge forecast for coordinates 52.5, 13.4 for the next 30 days.
Give me the weekly and monthly temperature outlook for Madrid over the next 4 months.
Compare the ICON and GFS ensemble forecasts for Berlin over the next 5 days and show the spread across members.
Show me temperature projections for New York from 2050 to 2070 using CMIP6 models.

- latitude: Latitude in WGS84 coordinate system (-90 to 90)
- longitude: Longitude in WGS84 coordinate system (-180 to 180)

- temperature_2m: Temperature at 2 meters
- relative_humidity_2m: Relative humidity
- precipitation: Precipitation
- wind_speed_10m: Wind speed at 10 meters
- wind_direction_10m: Wind direction
- pressure_msl: Mean sea level pressure
- cloud_cover: Cloud cover percentage
- weather_code: Weather condition code
- visibility: Visibility
- uv_index: UV index
- And many more...

- temperature_2m_max/min: Maximum/minimum temperatures
- precipitation_sum: Total precipitation
- wind_speed_10m_max: Maximum wind speed
- sunrise/sunset: Sunrise and sunset times
- weather_code: Weather condition code
- uv_index_max: Maximum UV index

- pm10: PM10 particles
- pm2_5: PM2.5 particles
- carbon_monoxide: Carbon monoxide
- nitrogen_dioxide: Nitrogen dioxide
- ozone: Ozone
- sulphur_dioxide: Sulfur dioxide
- ammonia: Ammonia
- dust: Dust particles
- alder_pollen: Alder pollen (Europe only)
- birch_pollen: Birch pollen (Europe only)
- grass_pollen: Grass pollen (Europe only)
- mugwort_pollen: Mugwort pollen (Europe only)
- olive_pollen: Olive pollen (Europe only)
- ragweed_pollen: Ragweed pollen (Europe only)
- european_aqi: European Air Quality Index
- european_aqi_pm2_5: European AQI for PM2.5
- european_aqi_pm10: European AQI for PM10
- european_aqi_nitrogen_dioxide: European AQI for NO₂
- european_aqi_ozone: European AQI for ozone
- european_aqi_sulphur_dioxide: European AQI for SO₂
- us_aqi: US Air Quality Index
- us_aqi_pm2_5: US AQI for PM2.5
- us_aqi_pm10: US AQI for PM10
- us_aqi_nitrogen_dioxide: US AQI for NO₂
- us_aqi_ozone: US AQI for ozone
- us_aqi_sulphur_dioxide: US AQI for SO₂
- us_aqi_carbon_monoxide: US AQI for CO
- uv_index: UV index
- uv_index_clear_sky: UV index under clear sky conditions

- wave_height: Wave height
- wave_direction: Wave direction
- wave_period: Wave period
- wind_wave_height: Wind wave height
- swell_wave_height: Swell wave height
- sea_surface_temperature: Sea surface temperature

- temperature_unit:celsius,fahrenheit
- wind_speed_unit:kmh,ms,mph,kn
- precipitation_unit:mm,inch
- timezone:Europe/Paris,America/New_York, etc.

- forecast_days: Number of forecast days (varies by API)
- past_days: Include past days data
- start_date/end_date: Date range for historical data (YYYY-MM-DD format)

# Development with auto-reload npm run dev # Build TypeScript npm run build # Start production server npm start # Run tests npm test # Type checking npm run typecheck # Linting npm run lint

Theevals/directory holds an LLM-usability benchmark for this server's tools — a different check thannpm test. Unit tests verify the code is correct; this verifies that an LLM givenonlythis server's tools (no other context) can actually complete realistic tasks with them.

- evals/evaluation.xml— 10 independent, read-only question/answer pairs built on stable historical data (ERA5 archive, CMIP6 projections, geocoding, elevation), so the expected answers never change over time.
- evals/scripts/evaluation.py— harness that launches the server, lets an agent answer each question using only its tools, and compares the answer against the expected one.

npm run build pip install -r evals/scripts/requirements.txt export ANTHROPIC_API_KEY=your_api_key_here npm run eval # or directly: python3 evals/scripts/evaluation.py -t stdio -c node -a dist/index.js evals/evaluation.xml

This calls the real Anthropic API for every question, so it consumes tokens/credits — it's a manual quality check for tool design, not part of CI.

When adding, removing, or renaming a tool, or materially changing a tool's description or schema, consider adding or updating aqa_pairinevals/evaluation.xmlthat exercises it.

src/ ├── index.ts # MCP server entry point ├── client.ts # HTTP client for Open-Meteo API ├── tools.ts # MCP tool definitions ├── types.ts # Zod validation schemas ├── truncation.ts # Response size capping and serialization └── security.ts # Auth, origin validation, rate limiter, IP extraction
No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.