cyanheads avatar

Open Meteo Mcp Server

cyanheads/open-meteo-mcp-server

Wraps Open-Meteo's free weather APIs with eight MCP tools covering geocoding, 16-day forecasts, ERA5 historical climate back to 1940, marine conditions, CAMS air quality, and Copernicus terrain elevation. You geocode a place name to coordinates, then pull hourly or daily variables like temperature, precipitation, wind, wave height, or PM2.5. Historical queries over large date ranges spill to DataCanvas with SQL query tools for analysis. Supports both stdio and streamable HTTP transports, with a public hosted instance at open-meteo.caseyjhand.com. Useful when you need global weather context without API keys, or want to compare forecast models against reanalysis data in a single schema.

GitHub stars
13
tools
11
transport
STDIO, HTTP
env vars
9
last updated
Nov 10, 2026

Install

From registry metadata
$ npx add-mcp https://open-meteo.caseyjhand.com/mcp --name open-meteo

Run in your terminal. add-mcp asks which agents to add it to (Claude Code, Codex, Cursor and more). Add -g to install it for every project.

Review the command, arguments and environment values before installing. MCP servers run with your local permissions.

Other ways

Claude Code

$ claude mcp add --transport http open-meteo https://open-meteo.caseyjhand.com/mcp

Run in your terminal. Add --scope user to make it available in every project.

Tools

Verified live · 11 tools

Verified live against the running server on Nov 6, 2026.

openmeteo_search_locationsResolve a place name to ranked coordinate matches with country, region, elevation, timezone, and population. Required prerequisite for name-based queries — all weather tools take latitude/longitude, not place names. Search by a bare place name (city, region, or landmark); neve...4 params

Resolve a place name to ranked coordinate matches with country, region, elevation, timezone, and population. Required prerequisite for name-based queries — all weather tools take latitude/longitude, not place names. Search by a bare place name (city, region, or landmark); neve...

Parameters* required
countinteger
Max results to return (1–10). Default 5. Return more when disambiguating common names like "Springfield" or "Portland".default: 5
countrystring
ISO 3166-1 alpha-2 country code (e.g. "US", "FR") to disambiguate places that share a name. Omit for a global search.
languagestring
Language for matching and returning place names (ISO 639-1, e.g., "en", "de", "zh"). The API matches name against the localized index for this language, so set it to match the script of name — e.g....default: en
name*string
Place name to search — a bare city, region, or landmark ("Seattle", "Mount Rainier"). Do not fold in a region or country qualifier ("Baoding", not "Baoding Hebei"); use the country input to disambi...
openmeteo_get_elevationTerrain elevation from the Copernicus Digital Elevation Model (~90m resolution) for one or more coordinate pairs. Accepts up to 1,000 pairs and samples the first 100 in one upstream request; when more were submitted, unprocessed_count says how many remain and next_offset is wh...2 params

Terrain elevation from the Copernicus Digital Elevation Model (~90m resolution) for one or more coordinate pairs. Accepts up to 1,000 pairs and samples the first 100 in one upstream request; when more were submitted, unprocessed_count says how many remain and next_offset is wh...

Parameters* required
latitudes*array
Array of latitudes in decimal degrees (up to 1,000; the first 100 are sampled per call). Must be same length as longitudes.
longitudes*array
Array of longitudes in decimal degrees (up to 1,000; the first 100 are sampled per call). Must be same length as latitudes.
openmeteo_get_forecastWeather forecast for coordinates: hourly and/or daily variables for up to 16 days ahead, with optional past_days (up to 92) for recent history. Use past_days instead of openmeteo_get_historical for dates within the last week, since the archive’s ERA5 components lag by about a...13 params

Weather forecast for coordinates: hourly and/or daily variables for up to 16 days ahead, with optional past_days (up to 92) for recent history. Use past_days instead of openmeteo_get_historical for dates within the last week, since the archive’s ERA5 components lag by about a...

Parameters* required
canvas_idstring
DataCanvas token for wide past_days or multi-variable queries. When a result is too large to return inline — driven by total payload size, so a wide multi-variable pull can spill at any row count —...
current_variablesarray
Variables to return for the current instant (e.g., ["temperature_2m", "precipitation", "wind_speed_10m", "weather_code"]). Uses Open-Meteo's 15-minute current-conditions data, so it answers "what i...
daily_variablesarray
Daily summary variables (e.g., ["temperature_2m_max", "temperature_2m_min", "precipitation_sum", "wind_speed_10m_max", "sunrise", "sunset", "uv_index_max"]). Daily names only — an hourly name such...
forecast_daysinteger
Number of forecast days (1–16). Default 7.default: 7
hourly_variablesarray
Hourly variables to fetch (e.g., ["temperature_2m", "precipitation", "wind_speed_10m", "relative_humidity_2m", "cloud_cover", "uv_index", "apparent_temperature"]). Hourly names only — a daily aggre...
latitude*number
Latitude in decimal degrees (e.g., 47.6062 for Seattle). Use openmeteo_search_locations to resolve a place name to coordinates.
longitude*number
Longitude in decimal degrees (e.g., -122.3321 for Seattle).
modelsarray
Deterministic forecast models to read from, to compare modeling centers side by side. Documented: best_match, ecmwf_ifs, ecmwf_ifs025, ecmwf_aifs025_single, cma_grapes_global, bom_access_global, nc...
past_daysinteger
Include this many days of past data before today (0–92). Use for recent history — the archive’s ERA5 components lag by about a week. Default 0.default: 0
precipitation_unitstring
Precipitation unit: "mm" or "inch". Default "mm".one of mm · inchdefault: mm
temperature_unitstring
Temperature unit. Default "celsius".one of celsius · fahrenheitdefault: celsius
timezonestring
IANA timezone (e.g., "America/Los_Angeles") or "auto" to use the location's local timezone. Default "auto". The timezone from openmeteo_search_locations is ideal to pass here.default: auto
wind_speed_unitstring
Wind speed unit: "kmh" (km/h), "mph", "ms" (m/s), or "kn" (knots). Default "kmh".one of kmh · mph · ms · kndefault: kmh
openmeteo_get_historicalHistorical weather from the Open-Meteo reanalysis archive (1940–present). Requires start_date and end_date (ISO 8601 date, e.g., "2024-07-01"). With models omitted the archive answers from Best Match, which blends IFS HRES, ERA5, and ERA5-Land seamlessly — so the source varies...12 params

Historical weather from the Open-Meteo reanalysis archive (1940–present). Requires start_date and end_date (ISO 8601 date, e.g., "2024-07-01"). With models omitted the archive answers from Best Match, which blends IFS HRES, ERA5, and ERA5-Land seamlessly — so the source varies...

Parameters* required
canvas_idstring
DataCanvas token for multi-year or multi-variable queries. When a result is too large to return inline — driven by total payload size, so a wide multi-variable pull can spill at any row count — it...
daily_variablesarray
Daily summary variables (e.g., ["temperature_2m_max", "temperature_2m_min", "precipitation_sum", "wind_speed_10m_max"]). Daily names only — an hourly name such as cloud_cover or temperature_2m belo...
end_date*string
End date (YYYY-MM-DD, inclusive). Must be on or after start_date. For the last few days, either request models: ["ecmwf_ifs"] or use openmeteo_get_forecast with past_days.
hourly_variablesarray
Hourly archive variables (e.g., ["temperature_2m", "precipitation", "wind_speed_10m", "relative_humidity_2m", "cloud_cover", "soil_moisture_0_to_7cm"]). Hourly names only — a daily aggregate such a...
latitude*number
Latitude in decimal degrees. Use openmeteo_search_locations to resolve a place name to coordinates.
longitude*number
Longitude in decimal degrees.
modelsarray
Archive models to read from: best_match (default, blends IFS HRES + ERA5 + ERA5-Land), ecmwf_ifs (global 9 km, updated every 6 hours, no delay), ecmwf_ifs_analysis_long_window (global 9 km, daily,...
precipitation_unitstring
Precipitation unit. Default "mm".one of mm · inchdefault: mm
start_date*string
Start date (YYYY-MM-DD, e.g., "2024-07-01"). The archive covers from 1940-01-01; how close to today it reaches depends on the model — the ERA5 family runs about a week behind, IFS HRES is current.
temperature_unitstring
Temperature unit. Default "celsius".one of celsius · fahrenheitdefault: celsius
timezonestring
IANA timezone or "auto". Default "auto".default: auto
wind_speed_unitstring
Wind speed unit. Default "kmh".one of kmh · mph · ms · kndefault: kmh
openmeteo_get_marineMarine wave and ocean conditions for a coastal or ocean coordinate: wave height, wave period, wave direction, wind-wave height, swell height, sea-surface temperature. Forecast horizon up to 8 days, with optional past_days (up to 92) for recent history — or start_date and end_d...14 params

Marine wave and ocean conditions for a coastal or ocean coordinate: wave height, wave period, wave direction, wind-wave height, swell height, sea-surface temperature. Forecast horizon up to 8 days, with optional past_days (up to 92) for recent history — or start_date and end_d...

Parameters* required
canvas_idstring
DataCanvas token for wide past_days, archive-range, or multi-variable queries. When a result is too large to return inline — driven by total payload size, so a wide multi-variable pull can spill at...
current_variablesarray
Marine variables to return for the current instant (e.g., ["wave_height", "wave_period", "wave_direction", "sea_surface_temperature"]). Uses Open-Meteo's 15-minute current-conditions data, so it an...
daily_variablesarray
Daily marine summary variables (e.g., ["wave_height_max", "wave_direction_dominant", "wave_period_max"]). Daily names only — an hourly name such as wave_height belongs in hourly_variables and is re...
end_datestring
End date for the archive range (YYYY-MM-DD, inclusive). Must be on or after start_date. Requires start_date — the pair must be sent together, and neither combines with forecast_days or past_days.
forecast_daysinteger
Forecast horizon in days (1–8). Omit for the upstream default of 7. Mutually exclusive with start_date/end_date — omit it entirely when pulling an archive range.
hourly_variablesarray
Hourly marine variables (e.g., ["wave_height", "wave_direction", "wave_period", "wind_wave_height", "swell_wave_height"]). Hourly names only — a daily aggregate such as wave_height_max or wave_dire...
latitude*number
Latitude of a coastal or ocean point. Use openmeteo_search_locations to resolve a place name. Sheltered water returns near-zero wave values; a land point well inland returns null values, which the...
length_unitstring
Unit for wave, wind-wave, and swell heights and sea_level_height_msl: "metric" (m) or "imperial" (ft). Periods stay in seconds and directions in degrees. Default "metric".one of metric · imperialdefault: metric
longitude*number
Longitude in decimal degrees.
past_daysinteger
Include this many days of past data before today (0–92). Use for recent history instead of a start_date/end_date range. Default 0. Must stay 0 when start_date/end_date are used.default: 0
start_datestring
Start date for the archive range (YYYY-MM-DD, e.g., "2024-07-01"). Real wave values go back to at least 2022. Requires end_date — the pair must be sent together, and neither combines with forecast_...
temperature_unitstring
Unit for sea_surface_temperature: "celsius" or "fahrenheit". Default "celsius".one of celsius · fahrenheitdefault: celsius
timezonestring
IANA timezone or "auto". Default "auto".default: auto
wind_speed_unitstring
Unit for ocean_current_velocity: "kmh" (km/h), "mph" (labelled "mp/h" in the units maps), "ms" (m/s), or "kn" (knots). Default "kmh".one of kmh · mph · ms · kndefault: kmh
openmeteo_get_air_qualityModeled CAMS (Copernicus Atmosphere Monitoring Service) air quality: PM2.5, PM10, nitrogen dioxide, sulphur dioxide, ozone, carbon monoxide, dust, pollen, and European/US AQI indices. This is modeled grid data, not measured station readings — for measured data, use openaq-mcp-...10 params

Modeled CAMS (Copernicus Atmosphere Monitoring Service) air quality: PM2.5, PM10, nitrogen dioxide, sulphur dioxide, ozone, carbon monoxide, dust, pollen, and European/US AQI indices. This is modeled grid data, not measured station readings — for measured data, use openaq-mcp-...

Parameters* required
canvas_idstring
DataCanvas token for wide past_days, archive-range, or multi-variable queries. When a result is too large to return inline — driven by total payload size, so a wide multi-variable pull can spill at...
current_variablesarray
Air quality variables to return for the current instant (e.g., ["pm2_5", "pm10", "european_aqi", "us_aqi"]). Uses Open-Meteo's current-conditions data, so it answers "what is the AQI now?" without...
end_datestring
End date for the archive range (YYYY-MM-DD, inclusive). Must be on or after start_date. Requires start_date — the pair must be sent together, and neither combines with forecast_days or past_days.
forecast_daysinteger
Forecast horizon in days (1–7). Omit for the upstream default of 5. Mutually exclusive with start_date/end_date — omit it entirely when pulling an archive range.
hourly_variablesarray
Hourly air quality variables (e.g., ["pm2_5", "pm10", "ozone", "nitrogen_dioxide", "european_aqi", "us_aqi"]). At least one of current_variables or hourly_variables is required.
latitude*number
Latitude in decimal degrees. Use openmeteo_search_locations to resolve a place name.
longitude*number
Longitude in decimal degrees.
past_daysinteger
Include this many days of past data before today (0–92). Use for recent history instead of a start_date/end_date range. Default 0. Must stay 0 when start_date/end_date are used.default: 0
start_datestring
Start date for the archive range (YYYY-MM-DD, e.g., "2024-07-01"). The CAMS global archive begins in August 2022; earlier dates return rows of nulls, and us_aqi starts a day later than the pollutan...
timezonestring
IANA timezone or "auto". Default "auto".default: auto
openmeteo_get_ensembleProbabilistic ensemble weather forecast — up to 64 ensemble members, up to 35 days ahead with optional past_days (0–92). Most models end within 16 days; a model's columns are null past its horizon, and the response notice names where its data ends. Each member's values appear...12 params

Probabilistic ensemble weather forecast — up to 64 ensemble members, up to 35 days ahead with optional past_days (0–92). Most models end within 16 days; a model's columns are null past its horizon, and the response notice names where its data ends. Each member's values appear...

Parameters* required
canvas_idstring
DataCanvas token for large multi-member queries. When a result is too large to return inline — driven by total payload size, so a wide member fan-out can spill at any row count — it spills to this...
daily_variablesarray
Daily variables to fetch across all ensemble members (e.g., ["temperature_2m_max", "temperature_2m_min", "precipitation_sum"]). Each variable appears as temperature_2m_max_member01, … Daily names o...
forecast_daysinteger
Forecast horizon in days (1–35). Default 7. Most ensemble models end within 16 days; past a model's horizon its columns come back null and the response notice names where its data ends.default: 7
hourly_variablesarray
Hourly variables to fetch across all ensemble members (e.g., ["temperature_2m", "precipitation", "wind_speed_10m"]). Each variable appears as temperature_2m_member01, temperature_2m_member02, … in...
latitude*number
Latitude in decimal degrees. Use openmeteo_search_locations to resolve a place name to coordinates.
longitude*number
Longitude in decimal degrees.
modelsstring
Ensemble model to use, one name: ecmwf_ifs025_ensemble (51 members, global 0.25°), ecmwf_aifs025_ensemble (51, global 0.25°), ecmwf_ifs_europe_ensemble (51, Europe 9 km), ecmwf_aifs_europe_ensemble...
past_daysinteger
Include this many days of past ensemble data before today (0–92). Default 0.default: 0
precipitation_unitstring
Precipitation unit. Default "mm".one of mm · inchdefault: mm
temperature_unitstring
Temperature unit. Default "celsius".one of celsius · fahrenheitdefault: celsius
timezonestring
IANA timezone (e.g., "America/Los_Angeles") or "auto" to use the location's local timezone. Default "auto".default: auto
wind_speed_unitstring
Wind speed unit. Default "kmh".one of kmh · mph · ms · kndefault: kmh
openmeteo_get_floodGloFAS (Global Flood Awareness System) daily river discharge (m³/s) from the GloFAS 0.05° grid cell nearest the given coordinates — no river ID needed. The response's latitude and longitude name that cell. It is not reliably on the river intended: a point near a confluence, a...9 params

GloFAS (Global Flood Awareness System) daily river discharge (m³/s) from the GloFAS 0.05° grid cell nearest the given coordinates — no river ID needed. The response's latitude and longitude name that cell. It is not reliably on the river intended: a point near a confluence, a...

Parameters* required
canvas_idstring
DataCanvas token for wide date-range queries. When a result is too large to return inline — driven by total payload size, so a multi-variable pull can spill at any row count — it spills to this can...
daily_variablesarray
Daily discharge variables to fetch (e.g., ["river_discharge", "river_discharge_p25", "river_discharge_p75", "river_discharge_min", "river_discharge_max"]). Required. river_discharge is the daily di...
end_datestring
End of the date range (YYYY-MM-DD, inclusive). Must be on or after start_date. Days from 2023-08-05 are forecast-run discharge under the default seamless_v4; consolidated_v4 reanalysis ends 2025-05...
forecast_daysinteger
Number of forecast days ahead (1–210). The API accepts up to 210, but the current GloFAS run sets how far the data reaches (about six months); later days come back null. consolidated_v4 serves no f...
latitude*number
Latitude in decimal degrees. Discharge is returned for the GloFAS 0.05° grid cell nearest this point — no river ID required, and that cell is not reliably on the river intended. When the value is f...
longitude*number
Longitude in decimal degrees. With latitude it selects the nearest GloFAS 0.05° grid cell, which is not reliably on the river intended.
modelsarray
GloFAS models to read from: seamless_v4 (default — consolidated_v4 reanalysis before 2023-08-05, forecast_v4 runs from 2023-08-05 into the live forecast), consolidated_v4 (reanalysis from 1984 thro...
start_datestring
Start of a date range (YYYY-MM-DD, e.g., "2023-01-01"), from 1984-01-01. Under the default seamless_v4 a range holds consolidated_v4 reanalysis before 2023-08-05 and forecast-run discharge from 202...
timezonestring
IANA timezone or "auto". Default "auto".default: auto
openmeteo_get_climateLong-range climate projections from bias-corrected daily CMIP6 models, covering 1950-01-01 to 2050-12-31 at any coordinate. Answers "what will conditions look like through 2050?" — the future-projection counterpart to openmeteo_get_historical (the observed archive, what happen...11 params

Long-range climate projections from bias-corrected daily CMIP6 models, covering 1950-01-01 to 2050-12-31 at any coordinate. Answers "what will conditions look like through 2050?" — the future-projection counterpart to openmeteo_get_historical (the observed archive, what happen...

Parameters* required
canvas_idstring
DataCanvas token for multi-decade or multi-model queries. When a result is too large to return inline — driven by total payload size, so a wide multi-model pull can spill at any row count — it spil...
daily_variablesarray
Daily climate variables to fetch (e.g., ["temperature_2m_max", "temperature_2m_min", "precipitation_sum", "wind_speed_10m_mean", "shortwave_radiation_sum"]). Required — the Climate API is daily-only.
end_date*string
End date (YYYY-MM-DD, inclusive, max 2050-12-31). Must be on or after start_date.
latitude*number
Latitude in decimal degrees. Use openmeteo_search_locations to resolve a place name to coordinates.
longitude*number
Longitude in decimal degrees.
modelsarray
CMIP6 models to include: CMCC_CM2_VHR4, FGOALS_f3_H, HiRAM_SIT_HR, MRI_AGCM3_2_S, EC_Earth3P_HR, MPI_ESM1_2_XR, NICAM16_8S. With 2+ models each variable column is suffixed with the model name (e.g....
precipitation_unitstring
Precipitation unit. Default "mm".one of mm · inchdefault: mm
start_date*string
Start date (YYYY-MM-DD, e.g., "2049-01-01"). CMIP6 projections cover 1950-01-01 to 2050-12-31.
temperature_unitstring
Temperature unit. Default "celsius".one of celsius · fahrenheitdefault: celsius
timezonestring
IANA timezone or "auto". Default "auto".default: auto
wind_speed_unitstring
Wind speed unit. Default "kmh".one of kmh · mph · ms · kndefault: kmh
openmeteo_dataframe_queryRun a read-only SQL SELECT against tables staged on a DataCanvas by openmeteo_get_forecast, openmeteo_get_historical, openmeteo_get_marine, openmeteo_get_air_quality, openmeteo_get_ensemble, openmeteo_get_flood, or openmeteo_get_climate. Pass the canvas_id returned when any of...2 params

Run a read-only SQL SELECT against tables staged on a DataCanvas by openmeteo_get_forecast, openmeteo_get_historical, openmeteo_get_marine, openmeteo_get_air_quality, openmeteo_get_ensemble, openmeteo_get_flood, or openmeteo_get_climate. Pass the canvas_id returned when any of...

Parameters* required
canvas_id*string
Canvas ID returned by openmeteo_get_forecast, openmeteo_get_historical, openmeteo_get_marine, openmeteo_get_air_quality, openmeteo_get_ensemble, openmeteo_get_flood, or openmeteo_get_climate when t...
sql*string
Read-only SELECT statement. Reference table names from openmeteo_dataframe_describe; in the examples below, replace <table_name> with a staged table and <column> with one of its columns. time is IS...
openmeteo_dataframe_describeList the tables and their columns on a DataCanvas staged by openmeteo_get_forecast, openmeteo_get_historical, openmeteo_get_marine, openmeteo_get_air_quality, openmeteo_get_ensemble, openmeteo_get_flood, or openmeteo_get_climate. Call this first to discover table names before...1 params

List the tables and their columns on a DataCanvas staged by openmeteo_get_forecast, openmeteo_get_historical, openmeteo_get_marine, openmeteo_get_air_quality, openmeteo_get_ensemble, openmeteo_get_flood, or openmeteo_get_climate. Call this first to discover table names before...

Parameters* required
canvas_id*string
Canvas ID returned by openmeteo_get_forecast, openmeteo_get_historical, openmeteo_get_marine, openmeteo_get_air_quality, openmeteo_get_ensemble, openmeteo_get_flood, or openmeteo_get_climate when t...

Sponsors

Configuration

MCP_LOG_LEVELdefault: info

Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').

CANVAS_PROVIDER_TYPEdefault: duckdb

Canvas engine for openmeteo_get_forecast / openmeteo_get_historical / openmeteo_get_marine / openmeteo_get_air_quality / openmeteo_get_ensemble / openmeteo_get_flood / openmeteo_get_climate spillover. Default 'duckdb' enables DataCanvas and the dataframe_query / dataframe_describ

OPENMETEO_DATAFRAME_DROP_ENABLEDdefault: false

Set to 'true' to make openmeteo_dataframe_drop callable — it removes one staged table or view from a DataCanvas. Default 'false' lists the tool as disabled. Has no effect unless CANVAS_PROVIDER_TYPE=duckdb.

OPENMETEO_CLAMP_LIMITSdefault: true

Default 'true': an openmeteo_dataframe_query limit above the per-call cap (10,000 rows, or CANVAS_DEFAULT_ROW_LIMIT when that is lower) returns the cap and a notice saying so. Set to 'false' to advertise the cap as the limit maximum and reject a larger value instead.

MCP_TRANSPORT_TYPEdefault: http

Selects the HTTP transport.

MCP_HTTP_HOSTdefault: 127.0.0.1

The hostname for the HTTP server.

MCP_HTTP_PORTdefault: 3010

The port to run the HTTP server on.

MCP_HTTP_ENDPOINT_PATHdefault: /mcp

The endpoint path for the MCP server.

MCP_AUTH_MODEdefault: none

Authentication mode to use: 'none', 'jwt', or 'oauth'.

Readme

@cyanheads/open-meteo-mcp-server

Geocode places, fetch global weather forecasts, historical climate, marine conditions, air quality, and terrain elevation via MCP. STDIO or Streamable HTTP.

12 Tools

Details

Repository
github.com/cyanheads/open-meteo-mcp-server
Package
@cyanheads/open-meteo-mcp-server
Transport
STDIO, HTTP
Registry
MCP registry, active
Resources
1
Tools verified
Nov 6, 2026

More from cyanheads