Open-Meteo MCP Server
cmer81/open-meteo-mcp · 70 stars · TypeScript · MIT
MCP server Open-Meteo MCP Server - A comprehensive Model Context Protocol server that provides AI models with complete access to Open-Meteo's free weather API. Get real-time weather forecasts, historical climate data, air quality information, marine conditions, and seasonal projections thro
Install
The repo has no one-line install. Follow its README.
Files
Open-Meteo MCP Server
Give any LLM accurate weather data: forecasts, history back to 1940, air quality, marine conditions, floods and climate projections.
Features • Getting started • Tools • Remote deployment • Configuration • Development
A Model Context Protocol server for the free Open-Meteo APIs. Plug it into Claude Desktop, Claude Code or any MCP client, then ask in plain language:
What were the temperatures in London during January 2023?
Compare the ICON and GFS ensemble forecasts for Berlin over the next 5 days.
Give me the current European AQI, UV index and pollen levels in Paris.
No API key is needed: Open-Meteo is free for non-commercial use.
Features
- 17 tools covering forecasts, ERA5 history, air quality, marine, flood, seasonal, ensemble and CMIP6 climate data, plus geocoding and elevation
- Model-specific forecasts from DWD ICON, NOAA GFS, Météo-France, ECMWF, JMA, MET Norway and Environment Canada GEM
- Built for LLMs: strict input schemas, server instructions that tell the model which tool answers which question, compact JSON responses capped at 25,000 characters
- Two transports: stdio for local clients, stateless Streamable HTTP for remote deployments, with API key auth, rate limiting and origin checks
- In-memory response cache with per-endpoint TTLs, so repeated questions don't hit Open-Meteo again
- Self-hosting friendly: every Open-Meteo endpoint can point at your own instance
Getting started
You need Node.js 22 or later. Nothing to install beforehand: npx fetches the server on first run.
Claude Desktop
Add the server to your claude_desktop_config.json:
{
"mcpServers": {
"open-meteo": {
"command": "npx",
"args": ["-y", "-p", "open-meteo-mcp-server", "open-meteo-mcp-server"]
}
}
}
Claude Code
claude mcp add open-meteo -- npx -y -p open-meteo-mcp-server open-meteo-mcp-server
Other MCP clients
Any client that launches stdio servers works with the same command: npx -y -p open-meteo-mcp-server open-meteo-mcp-server. You can also install it globally with npm install -g open-meteo-mcp-server and run open-meteo-mcp-server.
Tip
Every data tool takes coordinates. Ask with a place name and the model will call
geocodingfirst to resolve it.
Tools
| Category | Tool | What it answers |
|---|---|---|
| Core | weather_forecast |
Forecast up to 16 days, picking the best model for the location. Recent past via past_days (up to 92) |
weather_archive |
Historical weather from 1940 to yesterday (ERA5 reanalysis) | |
air_quality |
PM2.5, PM10, ozone, NO₂, pollen, European and US AQI, UV index | |
marine_weather |
Wave height, period and direction, swell, sea surface temperature | |
geocoding |
Place name or postal code to coordinates | |
elevation |
Terrain height for coordinates | |
| Models | dwd_icon_forecast |
DWD ICON (Germany, high resolution over Europe) |
gfs_forecast |
NOAA GFS (global, high resolution over North America) | |
meteofrance_forecast |
Météo-France AROME and ARPEGE | |
ecmwf_forecast |
ECMWF IFS and AIFS | |
jma_forecast |
Japan Meteorological Agency | |
metno_forecast |
MET Norway (Nordic countries) | |
gem_forecast |
Environment Canada GEM | |
| Advanced | ensemble_forecast |
Forecast uncertainty across ensemble members. models is required |
seasonal_forecast |
Outlook from a few weeks to about 7 months ahead | |
climate_projection |
CMIP6 climate projections, 1950 to 2050 | |
flood_forecast |
River discharge from GloFAS |
weather_forecast is the default choice. The model-specific tools are for when a particular model is asked for, or to compare models with one call each.
Responses
- Times are GMT unless
timezoneis set.timezone: "auto"uses the location's local time. nullin a series means the model has no value for that time, not zero.- Responses over 25,000 characters have their
hourly/daily/minutely_15arrays shortened by the same ratio, keeping series aligned, and gaintruncated: truewith atruncation_message. Narrow the date range or the variables to get everything.
The full list of variables and parameters is in each tool's input schema and in the Open-Meteo documentation.
Remote deployment
Set TRANSPORT=http to serve MCP over Streamable HTTP at /mcp instead of stdio:
TRANSPORT=http HOST=0.0.0.0 PORT=3000 API_KEY=your-secret-key npx open-meteo-mcp-server
Clients then send the key with every request, as Authorization: Bearer <key> or X-API-Key: <key>. GET /health answers {"status":"ok"} without a key, for container probes.
The transport is stateless: each POST /mcp is handled on its own, no session ID is issued, and GET / DELETE /mcp answer 405. No tool keeps state between calls, so clients lose nothing.
Important
The server binds to
127.0.0.1by default, so it is reachable only from the local machine. SetHOST=0.0.0.0to accept remote connections, and setAPI_KEYwhenever you do: without it, the server runs in open mode.
Docker
A prebuilt image is published to the GitHub Container Registry. It already binds to 0.0.0.0:
docker run -d --name open-meteo-mcp -p 3000:3000 \ -e API_KEY=your-secret-key \ ghcr.io/cmer81/open-meteo-mcp:latest
Tags follow the npm version without the v prefix: latest, 2.5.1, 2.5, 2.
The repository also has docker-compose.yml (prebuilt image) and docker-compose.dev.yml (builds from source). Copy .env.example to .env to configure them.
claude.ai traffic
Every claude.ai user reaches a remote server from Anthropic's outbound range 160.79.104.0/21. That range gets its own rate-limit pool (RATE_LIMIT_ANTHROPIC_RPM) so they don't all share one per-IP budget. Behind a reverse proxy, list the proxy in TRUSTED_PROXIES so the real client IP is seen.
Configuration
All variables are optional.
Server
| Variable | Default | Description |
|---|---|---|
TRANSPORT |
stdio | http for Streamable HTTP |
PORT |
3000 |
HTTP port |
HOST |
127.0.0.1 |
Interface to bind. 0.0.0.0 accepts remote connections |
OPEN_METEO_CACHE_MAX_BYTES |
20000000 |
Response cache size, in bytes of serialized JSON. 0 disables it |
The cache keeps forecasts and ensembles for 15 minutes, air quality and marine for 30 minutes, flood for 1 hour, seasonal for 6 hours, archive and climate for 24 hours, geocoding for 7 days and elevation for 30 days. Archive ranges ending within the last 5 days are kept for 1 hour only, since Open-Meteo is still backfilling them. Failed requests are never cached.
Note
The cache counts serialized JSON, but the parsed objects in memory take about 1.2 to 2.6 times as much. A full cache at the default size costs about 50 MB of heap.
HTTP security
| Variable | Default | Description |
|---|---|---|
API_KEY |
unset (open) | Key required on every /mcp request |
RATE_LIMIT_RPM |
60 |
Requests per minute per client IP. IPv6 clients are grouped by /56 |
RATE_LIMIT_ANTHROPIC_RPM |
600 |
Requests per minute shared by all claude.ai traffic |
TRUSTED_PROXIES |
unset | Comma-separated IPs or CIDRs whose X-Forwarded-For is trusted |
ALLOWED_ORIGINS |
empty | Comma-separated browser origins allowed. Any request with an unlisted Origin header gets 403 (DNS rebinding protection). Requests without one are unaffected |
Custom Open-Meteo instance
Each endpoint can be redirected, for example to a self-hosted Open-Meteo:
| Variable | Default |
|---|---|
OPEN_METEO_API_URL |
https://api.open-meteo.com |
OPEN_METEO_ARCHIVE_API_URL |
https://archive-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_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 |
In Claude Desktop, pass them through the env key of the server entry.
Skills
The skills/ directory holds two SKILL.md guides that help an assistant pick the right tool and parameters:
| Skill | Best for |
|---|---|
open-meteo |
Everyday weather: forecasts, history, air quality, marine, elevation |
open-meteo-advanced |
Specific models, ensemble uncertainty, seasonal outlooks, climate projections |
For Claude Code, copy them to ~/.claude/skills/:
cp -r skills/open-meteo skills/open-meteo-advanced ~/.claude/skills/
For Claude Desktop, upload the relevant SKILL.md into the conversation.
Development
git clone https://github.com/cmer81/open-meteo-mcp.git cd open-meteo-mcp npm install npm run build
| Command | Description |
|---|---|
npm run dev / npm run dev:http |
Run from source with auto-reload (stdio / HTTP) |
npm test |
Unit tests (network mocked) |
npm run typecheck / npm run lint |
Type checking and Biome linting |
npm run smoke |
Calls all 17 tools against the live API through a real MCP client. Needs a prior build |
npm run eval |
LLM-usability benchmark, see below |
To point Claude Desktop at your local build, use "command": "node" with "args": ["/path/to/open-meteo-mcp/dist/index.js"].
Evaluations
evals/evaluation.xml checks whether an LLM given only this server's tools can answer realistic questions. Its 14 questions rely on stable data (ERA5 archive, CMIP6 projections, geocoding, elevation), so the expected answers don't drift.
pip install -r evals/scripts/requirements.txt export ANTHROPIC_API_KEY=... # or put it in .env npm run build && npm run eval npm run eval -- --no-server-instructions # baseline without the server instructions
Warning
The evaluation calls the real Anthropic API for every question and consumes credits. It is a manual check, not part of CI.
Contributions are welcome: see CONTRIBUTING.md.
Facts
- Kind
- MCP server
- Group
- Uncategorized
- Stars
- 70
- License
- MIT
- Language
- TypeScript
- Last push
- 2026-10-10
- Forks
- 23
- Topics
- ai, air-quality, claude, claude-code, llm, mcp, mcp-server, open-meteo, weather, weather-api, weather-forecast, climate, ecmwf, geocoding, historical-weather, marine-weather, meteorology, model-context-protocol, typescript
- 1REAio.github.morluto/reaReverse engineer anything from your terminal or agent with one CLI and MCP server.125.3k
- 2com.browser-use/browser-usecom.browser-use/browser-useControl a real Chrome browser to complete any task: fill forms, extract data, book flights.117.7k
- 3World Monitorapp.worldmonitor/mcpLive markets, conflicts, country risk, chokepoints, energy, and China decision signals. 93 tools.88.3k
- 4Scrapling MCP Serverd4vinci/scrapling🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl! Don't be shy, join here: https://discord.gg/EMgGbDceNQ and follow here for daily tips and tricks: https://x.com/Scraplingdev86.9k
- 5Everythingmodelcontextprotocol/serversThis MCP server attempts to exercise all the features of the MCP protocol. It is not intended to be a useful server, but rather a test server for builders of MCP clients. It implements prompts, tools, resources, sampling, and more to showcase MCP capabilities.85.8k
- 6Fetchmodelcontextprotocol/serversA Model Context Protocol server that provides web content fetching capabilities. This server enables LLMs to retrieve and process content from web pages, converting HTML to markdown for easier consumption.85.8k