CCM
/MCP
SkillsMCPMarketplacesDigestToolsAdvertise

This week in Claude

Every Monday: Claude Code, Agent SDK, MCP, and the Anthropic platform moves worth your time.

Skills by Category
Frontend DevelopmentBackend & APIsTesting & QASecurityDevOps & CI/CDGit & Pull RequestsDocumentationCode Review & QualityAI & Agent BuildingSkill Development
MCP Servers by Category
Sales & MarketingWeb & Browser AutomationDatabasesAI & LLM ToolsCloud & InfrastructureCommunication & MessagingDeveloper ToolsDesign & CreativeDocuments & KnowledgeSearch & Web Crawling
Marketplaces by Category
AI Agents & OrchestrationLLM IntegrationDevelopment ToolsFrontend & UIBackend & APIsDatabasesTesting & Code QualityDevOps & CloudSecurity & ComplianceGit & Version Control

Claude Code Marketplaces

Discover Claude Code plugins, extensions, and tools. Automatically updated directory of Anthropic Claude AI marketplaces with development tools, productivity plugins, and integrations.

Resources

  • Browse Skills
  • Browse MCP Servers
  • Browse Marketplaces
  • Skill index
  • MCP index
  • Marketplace index
  • Plugins Reference

Community

  • About
  • Tools
  • Feedback
  • Privacy Policy
  • Advertise

Built for the Claude Code community with Claude Code by mertbuilds.com

Independent project, not affiliated with Anthropic
cyanheads avatar

Open Meteo Mcp Server

cyanheads/open-meteo-mcp-server
210 toolsSTDIO, HTTPregistry active
Summary

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.

Install to Claude Code

verified
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.

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

CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
inference shell
inference shell
create and run specialised agents in minutes
build now →
MCP-ready Email SendingMCP-ready Email Sending
MCP-ready Email Sending
Plug Mailtrap into your AI workflow and let it handle the email.
Connect Mailtrap MCP →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →
Capacitor - Shared memory for your team’s coding agents.
Capacitor - Shared memory for your team’s coding agents.
Make coding agent sessions - Searchable, Shareable, Vendor-neutral & Scored.
Try For Free →
CodeScene MCP ServerCodeScene MCP Server
CodeScene MCP Server
Your agent targets a perfect 10 Code Health score. Deterministic. Every commit.
Try For Free →
Give your AI the whole web as clean markdownGive your AI the whole web as clean markdown
Give your AI the whole web as clean markdown
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
belt - the only tool your agent needs
belt - the only tool your agent needs
belt cli automatically finds the best tools and skills for your agent. image, video, music, tts...
one prompt install →
CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
inference shell
inference shell
create and run specialised agents in minutes
build now →
MCP-ready Email SendingMCP-ready Email Sending
MCP-ready Email Sending
Plug Mailtrap into your AI workflow and let it handle the email.
Connect Mailtrap MCP →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →
Capacitor - Shared memory for your team’s coding agents.
Capacitor - Shared memory for your team’s coding agents.
Make coding agent sessions - Searchable, Shareable, Vendor-neutral & Scored.
Try For Free →
CodeScene MCP ServerCodeScene MCP Server
CodeScene MCP Server
Your agent targets a perfect 10 Code Health score. Deterministic. Every commit.
Try For Free →
Give your AI the whole web as clean markdownGive your AI the whole web as clean markdown
Give your AI the whole web as clean markdown
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
belt - the only tool your agent needs
belt - the only tool your agent needs
belt cli automatically finds the best tools and skills for your agent. image, video, music, tts...
one prompt install →

Tools

Verified live against the running server on Jun 10, 2026.

verified live10 tools
openmeteo_geocodeResolve 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. Returns up to 10 matches ranked by population/relevance; use...3 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. Returns up to 10 matches ranked by population/relevance; use...

Parameters* required
countinteger
Max results to return (1–10). Default 5. Return more when disambiguating common names like "Springfield" or "Portland".default: 5
languagestring
Response language for place names (ISO 639-1, e.g., "en", "de", "fr"). Default "en".default: en
name*string
Place name to search. Can be a city, region, or landmark (e.g., "Seattle", "Mount Rainier"). Weather tools require coordinates — use the lat/lon from this result.
openmeteo_get_elevationTerrain elevation from the Copernicus Digital Elevation Model (~90m resolution) for one or more coordinate pairs. Accepts up to 100 pairs per call. Useful for geographic context, elevation-adjusted weather interpretation, or route planning.2 params

Terrain elevation from the Copernicus Digital Elevation Model (~90m resolution) for one or more coordinate pairs. Accepts up to 100 pairs per call. Useful for geographic context, elevation-adjusted weather interpretation, or route planning.

Parameters* required
latitudes*array
Array of latitudes in decimal degrees (up to 100). Must be same length as longitudes.
longitudes*array
Array of longitudes in decimal degrees (up to 100). 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 1–5 days, since ERA5 has a variable lag. Returns per-time...10 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 1–5 days, since ERA5 has a variable lag. Returns per-time...

Parameters* required
daily_variablesarray
Daily summary variables (e.g., ["temperature_2m_max", "temperature_2m_min", "precipitation_sum", "wind_speed_10m_max", "sunrise", "sunset", "uv_index_max"]). At least one of hourly_variables or dai...
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"]). At least one of hourly_variables...
latitude*number
Latitude in decimal degrees (e.g., 47.6062 for Seattle). Use openmeteo_geocode to resolve a place name to coordinates.
longitude*number
Longitude in decimal degrees (e.g., -122.3321 for Seattle).
past_daysinteger
Include this many days of past data before today (0–92). Use for recent history — ERA5 archive has a variable ~5-day lag. 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_geocode 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 ERA5 reanalysis archive (1940–present). Requires start_date and end_date (ISO 8601 date, e.g., "2024-07-01"). ERA5 has a variable lag of up to ~5 days — for dates within the last week, use openmeteo_get_forecast with past_days instead. Uses the same...11 params

Historical weather from the ERA5 reanalysis archive (1940–present). Requires start_date and end_date (ISO 8601 date, e.g., "2024-07-01"). ERA5 has a variable lag of up to ~5 days — for dates within the last week, use openmeteo_get_forecast with past_days instead. Uses the same...

Parameters* required
canvas_idstring
DataCanvas token for multi-year or multi-variable queries. When a query exceeds ~500 records, results spill to this canvas for SQL querying. Omit to create a fresh canvas.
daily_variablesarray
Daily summary variables (e.g., ["temperature_2m_max", "temperature_2m_min", "precipitation_sum", "wind_speed_10m_max"]). At least one of hourly_variables or daily_variables required.
end_date*string
End date (YYYY-MM-DD, inclusive). Must be on or after start_date. For dates within the last ~5 days, use openmeteo_get_forecast with past_days instead.
hourly_variablesarray
Hourly ERA5 variables (e.g., ["temperature_2m", "precipitation", "wind_speed_10m", "relative_humidity_2m", "cloud_cover", "soil_moisture_0_to_7cm"]). At least one of hourly_variables or daily_varia...
latitude*number
Latitude in decimal degrees. Use openmeteo_geocode to resolve a place name to coordinates.
longitude*number
Longitude in decimal degrees.
precipitation_unitstring
Precipitation unit. Default "mm".one of mm · inchdefault: mm
start_date*string
Start date (YYYY-MM-DD, e.g., "2024-07-01"). ERA5 covers from 1940-01-01 to approximately 5 days ago.
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 weather forecast for a coastal or ocean coordinate: wave height, wave period, wave direction, wind-wave height, swell height, sea-surface temperature. Forecast horizon up to 7 days. Returns per-timestamp records — each entry contains a "time" field plus one key per requ...6 params

Marine weather forecast for a coastal or ocean coordinate: wave height, wave period, wave direction, wind-wave height, swell height, sea-surface temperature. Forecast horizon up to 7 days. Returns per-timestamp records — each entry contains a "time" field plus one key per requ...

Parameters* required
daily_variablesarray
Daily marine summary variables (e.g., ["wave_height_max", "wave_direction_dominant", "wave_period_max"]). At least one of hourly_variables or daily_variables required.
forecast_daysinteger
Forecast horizon in days (1–7). Default 7.default: 7
hourly_variablesarray
Hourly marine variables (e.g., ["wave_height", "wave_direction", "wave_period", "wind_wave_height", "swell_wave_height"]). At least one of hourly_variables or daily_variables required.
latitude*number
Latitude of a coastal or ocean point. Use openmeteo_geocode to resolve a place name. Inland points return near-zero wave values.
longitude*number
Longitude in decimal degrees.
timezonestring
IANA timezone or "auto". Default "auto".default: auto
openmeteo_get_air_qualityModeled CAMS (Copernicus Atmosphere Monitoring Service) air quality forecast: 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 op...5 params

Modeled CAMS (Copernicus Atmosphere Monitoring Service) air quality forecast: 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 op...

Parameters* required
forecast_daysinteger
Forecast horizon in days (1–7). Default 5.default: 5
hourly_variablesarray
Hourly air quality variables (e.g., ["pm2_5", "pm10", "ozone", "nitrogen_dioxide", "european_aqi", "us_aqi"]). At least one required.
latitude*number
Latitude in decimal degrees. Use openmeteo_geocode to resolve a place name.
longitude*number
Longitude in decimal degrees.
timezonestring
IANA timezone or "auto". Default "auto".default: auto
openmeteo_get_ensembleProbabilistic ensemble weather forecast — up to 51 ensemble members, up to 16 days ahead with optional past_days (0–92). Each member's values appear as separate columns named with a member suffix (e.g. temperature_2m_member01, temperature_2m_member02). Use the spread across me...12 params

Probabilistic ensemble weather forecast — up to 51 ensemble members, up to 16 days ahead with optional past_days (0–92). Each member's values appear as separate columns named with a member suffix (e.g. temperature_2m_member01, temperature_2m_member02). Use the spread across me...

Parameters* required
canvas_idstring
DataCanvas token for large multi-member queries. When records exceed ~500, results spill to this canvas for SQL querying. Omit to create a fresh canvas.
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, … At least one...
forecast_daysinteger
Forecast horizon in days (1–16). Default 7.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_geocode to resolve a place name to coordinates.
longitude*number
Longitude in decimal degrees.
modelsstring
Ensemble model to use: "ecmwf_ifs025" (51 members, global 0.25°), "gfs025" (31 members), "icon_seamless" (40 members), "gem_global" (21 members). Omit to use the API default blend.
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) river discharge forecast and historical reanalysis. Returns daily ensemble river discharge (m³/s) for the river nearest to the given coordinates — no river ID needed, the API snaps to the nearest stream. Forecast horizon up to 210 days ah...7 params

GloFAS (Global Flood Awareness System) river discharge forecast and historical reanalysis. Returns daily ensemble river discharge (m³/s) for the river nearest to the given coordinates — no river ID needed, the API snaps to the nearest stream. Forecast horizon up to 210 days ah...

Parameters* required
daily_variables*array
Daily discharge variables to fetch (e.g., ["river_discharge", "river_discharge_p25", "river_discharge_p75", "river_discharge_min", "river_discharge_max"]). Required.
end_datestring
End date for historical reanalysis (YYYY-MM-DD, inclusive). Must be on or after start_date.
forecast_daysinteger
Number of forecast days ahead (1–210). Omit when fetching historical data only via start_date/end_date.
latitude*number
Latitude in decimal degrees. The API snaps to the nearest river — no river ID required. Use openmeteo_geocode to resolve a place name.
longitude*number
Longitude in decimal degrees.
start_datestring
Start date for historical reanalysis (YYYY-MM-DD, e.g., "2023-01-01"). GloFAS reanalysis covers from 1984-01-01.
timezonestring
IANA timezone or "auto". Default "auto".default: auto
openmeteo_dataframe_queryRun a read-only SQL SELECT against tables staged on a DataCanvas by openmeteo_get_historical. Pass the canvas_id returned when openmeteo_get_historical spills (truncated: true). Tables are named by the spillover helper (e.g. spilled_<id>); use openmeteo_dataframe_describe to l...2 params

Run a read-only SQL SELECT against tables staged on a DataCanvas by openmeteo_get_historical. Pass the canvas_id returned when openmeteo_get_historical spills (truncated: true). Tables are named by the spillover helper (e.g. spilled_<id>); use openmeteo_dataframe_describe to l...

Parameters* required
canvas_id*string
Canvas ID returned by openmeteo_get_historical when truncated: true.
sql*string
Read-only SELECT statement. Reference table names from openmeteo_dataframe_describe. Example: SELECT AVG(temperature_2m) AS avg_temp, strftime(time, '%Y-%m') AS month FROM spilled_abc123 GROUP BY m...
openmeteo_dataframe_describeList the tables and their columns on a DataCanvas staged by openmeteo_get_historical. Call this first to discover table names before querying with openmeteo_dataframe_query.1 params

List the tables and their columns on a DataCanvas staged by openmeteo_get_historical. Call this first to discover table names before querying with openmeteo_dataframe_query.

Parameters* required
canvas_id*string
Canvas ID returned by openmeteo_get_historical when truncated: true.

@cyanheads/open-meteo-mcp-server

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

11 Tools

Version License Docker MCP SDK npm TypeScript Bun

Install in Claude Desktop Install in Cursor Install in VS Code

Framework

Public Hosted Server: https://open-meteo.caseyjhand.com/mcp


Tools

Eleven tools covering geocoding, weather forecasts, historical climate, probabilistic ensemble forecasts, marine conditions, air quality, terrain elevation, river discharge, CMIP6 climate projections, and SQL analytics over large datasets:

ToolDescription
openmeteo_search_locationsResolve a place name to ranked coordinate matches with country, region, elevation, timezone, and population
openmeteo_get_forecastWeather forecast for coordinates: hourly and/or daily variables for up to 16 days, with optional recent past data; wide windows spill to DataCanvas
openmeteo_get_historicalHistorical weather from the ERA5 reanalysis archive (1940–present); large ranges spill to DataCanvas
openmeteo_get_marineMarine wave and ocean conditions for coastal or ocean coordinates: wave height, period, direction, swell, and sea-surface temperature; up to 8 forecast days, past_days, or a start_date/end_date archive range; large windows spill to DataCanvas
openmeteo_get_air_qualityModeled CAMS air quality: PM2.5, PM10, NO2, O3, CO, dust, pollen, and European/US AQI indices; up to 7 forecast days, past_days, or a start_date/end_date archive range; large windows spill to DataCanvas
openmeteo_get_elevationTerrain elevation from Copernicus DEM (~90m resolution) for up to 100 coordinate pairs per call
openmeteo_get_ensembleProbabilistic ensemble forecast: per-member hourly/daily time series (up to 51 members, 16 days) for exceedance and uncertainty analysis
openmeteo_get_floodGloFAS river discharge forecast (up to 210 days) or reanalysis (1984–present); coordinate-based, snaps to nearest river; large ranges spill to DataCanvas
openmeteo_get_climateBias-corrected daily CMIP6 climate projections (1950–2050) across up to 7 models; large ranges spill to DataCanvas
openmeteo_dataframe_describeList tables and 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
openmeteo_dataframe_queryRun a read-only SQL SELECT against tables staged on a DataCanvas

openmeteo_search_locations

Resolve a free-text place name to ranked coordinate matches. Required first step for name-based queries — all weather tools accept latitude/longitude, not place names.

  • Returns name, country, admin1/admin2, latitude, longitude, elevation, IANA timezone, population, and GeoNames feature code
  • Search by a bare place name — a city, region, or landmark ("Baoding", not "Baoding Hebei"; "Paris", not "Paris, France"); a compound "City Region" or "City, Country" string matches nothing
  • Disambiguate same-named places (e.g., "Springfield") with the optional country filter (ISO 3166-1 alpha-2, e.g. US) or by raising count (default 5, up to 10) and reading the admin1/country fields on each result — those are output fields for choosing among matches, not search inputs
  • Pass the timezone from an openmeteo_search_locations result directly to weather tools as the timezone parameter
  • Fails with a no_results error (not an empty array) when nothing matches — retry the bare place name without qualifiers, or for a physical feature/landmark search the nearest populated place instead

openmeteo_get_forecast

Weather forecast for a coordinate pair with hourly and/or daily variable selection.

  • Up to 16 forecast days ahead (forecast_days 1–16, default 7)
  • past_days (0–92) covers recent history via the forecast model — use instead of openmeteo_get_historical for dates within the last ~5 days to avoid ERA5 lag
  • Common hourly variables: temperature_2m, precipitation, wind_speed_10m, relative_humidity_2m, cloud_cover, uv_index, apparent_temperature, precipitation_probability, weather_code, surface_pressure, visibility, wind_direction_10m, wind_gusts_10m, dew_point_2m
  • Common daily variables: temperature_2m_max, temperature_2m_min, precipitation_sum, wind_speed_10m_max, sunrise, sunset, uv_index_max, precipitation_hours, weather_code
  • At least one of hourly_variables or daily_variables is required
  • Hourly and daily are separate variable sets. A variable Open-Meteo documents under the other cadence is rejected before the request, by name, with the field it belongs in and the same-cadence alternatives (cloud_cover in daily_variables → cloud_cover_max/_mean/_min). Names in neither set are passed upstream unchanged
  • Configurable temperature unit (Celsius/Fahrenheit), wind speed unit (km/h, mph, m/s, knots), and precipitation unit (mm/inch)
  • Reshapes the API's columnar response into per-timestamp records with a parallel hourly_units / daily_units map
  • A wide window (a large past_days plus many hourly variables) spills to DataCanvas when CANVAS_PROVIDER_TYPE=duckdb — output includes canvas_id and truncated: true; query with openmeteo_dataframe_query

openmeteo_get_historical

Historical weather from the ERA5 reanalysis archive, covering 1940 to approximately 5 days ago.

  • Requires start_date and end_date (YYYY-MM-DD); ERA5 has a variable ~1–5 day lag
  • Same variable vocabulary as openmeteo_get_forecast — past and forecast data are directly comparable on one schema
  • At least one of hourly_variables or daily_variables is required
  • Hourly and daily are separate variable sets; a variable documented under the other cadence is rejected before the request, by name, with the field it belongs in
  • Large date ranges (multi-year hourly queries) spill to DataCanvas when CANVAS_PROVIDER_TYPE=duckdb — output includes canvas_id and truncated: true whenever a result is too large to return inline, which a wide multi-variable pull can be at any row count
  • Spill → query workflow: call openmeteo_dataframe_describe with the canvas_id to list tables, then openmeteo_dataframe_query to run SQL SELECT against the staged data

openmeteo_get_marine

Marine wave and ocean conditions for coastal and open-ocean coordinates.

  • Up to 8 forecast days (forecast_days 1–8, upstream default 7) with optional past_days (0–92)
  • Or an archive range via start_date and end_date — real wave values go back to at least 2022
  • One window per call: a date range is mutually exclusive with forecast_days/past_days, and needs both ends — a lone start_date or end_date is rejected
  • Common hourly variables: wave_height, wave_direction, wave_period, wind_wave_height, wind_wave_direction, wind_wave_period, swell_wave_height, swell_wave_direction, swell_wave_period
  • Common daily variables: wave_height_max, wave_direction_dominant, wave_period_max
  • At least one of hourly_variables or daily_variables is required
  • Hourly and daily are separate variable sets; a variable documented under the other cadence is rejected before the request, by name, with the field it belongs in
  • Inland or sheltered-water points return near-zero wave values (physically correct); ocean_current_velocity is null for non-open-ocean coordinates
  • Wide windows spill to DataCanvas when CANVAS_PROVIDER_TYPE=duckdb — output includes canvas_id and truncated: true; query with openmeteo_dataframe_query

openmeteo_get_air_quality

Modeled CAMS air quality, forecast and archive.

  • Up to 7 forecast days (forecast_days 1–7, upstream default 5) with optional past_days (0–92)
  • Or an archive range via start_date and end_date — real CAMS values go back to at least 2022-10-01; earlier dates return rows of nulls
  • One window per call: a date range is mutually exclusive with forecast_days/past_days, and needs both ends — a lone start_date or end_date is rejected
  • Common variables: pm2_5, pm10, carbon_monoxide, nitrogen_dioxide, sulphur_dioxide, ozone, dust, european_aqi, us_aqi, alder_pollen, birch_pollen, grass_pollen, mugwort_pollen, olive_pollen, ragweed_pollen
  • At least one variable from hourly_variables is required
  • Grid-modeled data from CAMS — resolution is coarser than ground stations; for measured station readings, cross-reference openaq-mcp-server
  • Output includes data_source: "CAMS" to distinguish modeled from measured data
  • Wide windows spill to DataCanvas when CANVAS_PROVIDER_TYPE=duckdb — output includes canvas_id and truncated: true; query with openmeteo_dataframe_query

openmeteo_get_elevation

Terrain elevation from the Copernicus Digital Elevation Model (~90m resolution).

  • Accepts parallel latitudes[] and longitudes[] arrays; both must have equal length (up to 100 pairs)
  • Returns results in input order: { latitude, longitude, elevation_m }
  • Useful for geographic context, elevation-adjusted weather interpretation, or route planning

openmeteo_get_ensemble

Probabilistic ensemble weather forecast exposing all individual model member trajectories.

  • Up to 16 forecast days (forecast_days 1–16, default 7) with optional past_days (0–92)
  • Each requested variable is returned as per-member columns: temperature_2m_member01, temperature_2m_member02, … Use the spread across members to compute exceedance probabilities, interquantile ranges, and decision thresholds
  • Available ensemble models (member counts include the control run):
    • Global — ecmwf_ifs025_ensemble (51), ecmwf_aifs025_ensemble (51), google_weathernext2_ensemble (64), ncep_gefs_seamless (31), ncep_gefs025 (31), ncep_gefs05 (31, 35-day horizon), ncep_aigefs025 (31), icon_seamless_eps (20–40, global/Europe blend), icon_global_eps (40), gem_global_ensemble (21), bom_access_global_ensemble (18), ukmo_global_ensemble_20km (18)
    • Regional — ecmwf_ifs_europe_ensemble (51), ecmwf_aifs_europe_ensemble (51), icon_eu_eps (40), icon_d2_eps (20), meteoswiss_icon_ch2_ensemble (21), meteoswiss_icon_ch1_ensemble (11), ukmo_uk_ensemble_2km (3). A regional model returns no data outside the area it covers. Upstream reports that two ways — No data is available for this location from the meteoswiss_* pair, an HTTP 200 carrying nan coordinates from the rest — and both surface as a non-retryable input error naming the coverage gap, so switch to a global model rather than retrying
  • Omit models to use the API default blend. The list is not an allowlist — a model name it does not carry is still sent upstream, so a model Open-Meteo adds later keeps working
  • Response includes model (system used) and member_count (perturbed members, excluding the control run)
  • At least one of hourly_variables or daily_variables is required
  • Hourly and daily are separate variable sets; a variable documented under the other cadence is rejected before the request, by name, with the field it belongs in. The ensemble API's own catalog applies — it publishes temperature_2m_max and temperature_2m_min as 3-hourly aggregations as well as daily, so those are accepted in either field
  • Large multi-member, multi-day pulls spill to DataCanvas when CANVAS_PROVIDER_TYPE=duckdb — output includes canvas_id and truncated: true; query with openmeteo_dataframe_query
  • Configurable temperature, wind speed, and precipitation units

openmeteo_get_flood

GloFAS (Global Flood Awareness System) river discharge forecast and reanalysis via the Open-Meteo Flood API.

  • Coordinate-based — no river ID needed; the API snaps to the nearest river grid point automatically
  • Forecast horizon up to 210 days; reanalysis history from 1984-01-01 to present
  • One mode per call: forecast_days for the future outlook, or start_date and end_date together for historical analysis. The two are mutually exclusive, and a date range needs both ends — a lone start_date or end_date is rejected
  • Available daily variables: river_discharge (ensemble mean), river_discharge_mean, river_discharge_min, river_discharge_max, river_discharge_median, river_discharge_p25 (25th percentile), river_discharge_p75 (75th percentile) — all in m³/s
  • Returns null for coordinates outside GloFAS coverage (e.g., open ocean or areas without river network data)
  • Discharge values reflect the GloFAS ensemble — percentile variables expose the uncertainty spread
  • Wide reanalysis ranges spill to DataCanvas when CANVAS_PROVIDER_TYPE=duckdb — output includes canvas_id and truncated: true; query with openmeteo_dataframe_query

openmeteo_get_climate

Long-range climate projections from bias-corrected daily CMIP6 models — the future-projection counterpart to openmeteo_get_historical.

  • Coverage: 1950-01-01 to 2050-12-31, daily resolution only
  • Available models: CMCC_CM2_VHR4, FGOALS_f3_H, HiRAM_SIT_HR, MRI_AGCM3_2_S, EC_Earth3P_HR, MPI_ESM1_2_XR, NICAM16_8S. Not an allowlist — an unlisted name is still sent upstream; when upstream rejects a multi-model request, the error names only the model outside the documented set, not the whole list
  • With 2+ models, each variable appears once per model with the model name as column suffix (e.g. temperature_2m_max_CMCC_CM2_VHR4); a single or omitted model returns plain variable names
  • Common daily variables: temperature_2m_max, temperature_2m_min, temperature_2m_mean, precipitation_sum, rain_sum, snowfall_sum, wind_speed_10m_mean, wind_speed_10m_max, shortwave_radiation_sum, cloud_cover_mean, relative_humidity_2m_mean, pressure_msl_mean
  • Not all models carry all variables — missing combinations return null (e.g. CMCC_CM2_VHR4 has no shortwave_radiation_sum)
  • Multi-decade daily pulls across several models spill to DataCanvas when CANVAS_PROVIDER_TYPE=duckdb — output includes canvas_id and truncated: true; query with openmeteo_dataframe_query
  • Configurable temperature, wind speed, and precipitation units

Features

Built on @cyanheads/mcp-ts-core:

  • Declarative tool definitions — single file per tool, framework handles registration and validation
  • Unified error handling — handlers throw, framework catches, classifies, and formats
  • Pluggable auth: none, jwt, oauth
  • Swappable storage backends: in-memory, filesystem, Supabase, Cloudflare KV/R2/D1
  • Structured logging with optional OpenTelemetry tracing
  • STDIO and Streamable HTTP transports

Open-Meteo–specific:

  • No API key required for non-commercial use — zero-config out of the box
  • Self-contained geocoding: openmeteo_search_locations resolves place names so agents don't need a separate geocoder
  • ERA5 archive from 1940 to present with same variable schema as the forecast API — direct past/forecast comparisons on one schema
  • Automatic columnar-to-record reshape: Open-Meteo returns parallel time/variable arrays; handlers convert to per-timestamp records with a *_units map
  • DataCanvas spillover for openmeteo_get_forecast, openmeteo_get_historical, openmeteo_get_marine, openmeteo_get_air_quality, openmeteo_get_ensemble, openmeteo_get_flood, and openmeteo_get_climate: a result too large to return inline registers a DuckDB dataframe for SQL querying, staging every hourly and daily row with its upstream numeric type intact. With CANVAS_PROVIDER_TYPE=none (the default) the same size check still applies — those tools return a bounded preview with truncated: true and no canvas_id, never an unbounded payload claiming to be complete
  • Configurable base URLs for all eight API endpoints (forecast, archive, marine, air quality, geocoding, ensemble, flood, climate) — override for testing or self-hosted deployments
  • Attribution: Weather data by Open-Meteo.com (CC BY 4.0). Non-commercial use is free and keyless; commercial use requires Open-Meteo's paid API tier (~10,000 req/day, 5,000/hour fair-use ceiling for non-commercial)

Agent-friendly output:

  • Location-first workflow: openmeteo_search_locations returns the IANA timezone alongside coordinates — pass it directly as timezone to any weather tool
  • Recovery hints on all error contracts — invalid variable names surface correction guidance with common variable examples
  • Cadence-aware variable validation on openmeteo_get_forecast, openmeteo_get_historical, openmeteo_get_marine, and openmeteo_get_ensemble: a variable documented under the opposite cadence is rejected before the upstream call, naming the exact value and the field it belongs in, so the next attempt converges instead of re-guessing against an error that echoes the whole requested list. This is not an allowlist — a name in neither documented set goes upstream untouched
  • Unserved-variable notice on all seven weather tools: Open-Meteo answers a variable name it parses but does not serve with an all-null column and the unit "undefined" rather than an error, so the result carries a notice naming those columns instead of presenting them as a data gap. openmeteo_get_air_quality, openmeteo_get_flood, and openmeteo_get_climate take a single cadence bucket, so they carry the notice without a cadence guard
  • Coordinate snapping transparency — responses echo the snapped latitude/longitude (Open-Meteo quantizes to the nearest model grid point) so agents can reason about grid alignment
  • data_source: "CAMS" label on air quality results distinguishes modeled data from measured station readings

Getting started

Public Hosted Instance

A public instance is available at https://open-meteo.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:

{
  "mcpServers": {
    "open-meteo-mcp-server": {
      "type": "streamable-http",
      "url": "https://open-meteo.caseyjhand.com/mcp"
    }
  }
}

Self-Hosted / Local

Add the following to your MCP client configuration file.

{
  "mcpServers": {
    "open-meteo-mcp-server": {
      "type": "stdio",
      "command": "bunx",
      "args": ["@cyanheads/open-meteo-mcp-server@latest"],
      "env": {
        "MCP_TRANSPORT_TYPE": "stdio",
        "MCP_LOG_LEVEL": "info"
      }
    }
  }
}

Or with npx (no Bun required):

{
  "mcpServers": {
    "open-meteo-mcp-server": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@cyanheads/open-meteo-mcp-server@latest"],
      "env": {
        "MCP_TRANSPORT_TYPE": "stdio",
        "MCP_LOG_LEVEL": "info"
      }
    }
  }
}

Or with Docker:

{
  "mcpServers": {
    "open-meteo-mcp-server": {
      "type": "stdio",
      "command": "docker",
      "args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/open-meteo-mcp-server:latest"]
    }
  }
}

For Streamable HTTP, set the transport and start the server:

MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp

Prerequisites

  • Bun v1.3.0 or higher (or Node.js v24+).
  • No API key required. Non-commercial use is free and keyless.
  • Commercial use requires Open-Meteo's paid API tier.

Installation

  1. Clone the repository:
git clone https://github.com/cyanheads/open-meteo-mcp-server.git
  1. Navigate into the directory:
cd open-meteo-mcp-server
  1. Install dependencies:
bun install

Configuration

All configuration is validated at startup via Zod schemas. No API key is required for non-commercial use — all variables are optional.

VariableDescriptionDefault
MCP_TRANSPORT_TYPETransport: stdio or httpstdio
MCP_HTTP_PORTHTTP server port3010
MCP_HTTP_HOSTHTTP server hostlocalhost
MCP_HTTP_ENDPOINT_PATHHTTP endpoint path/mcp
MCP_HTTP_MAX_BODY_BYTESMaximum HTTP request body bytes; 0 disables the limit.1048576
MCP_PUBLIC_URLPublic origin for TLS-terminating reverse-proxy deployments—
MCP_SESSION_MODEHTTP session mode: stateful or stateless.stateful
MCP_HTTP_RESUMABILITYReplay missed SSE events for stateful HTTP sessions. No effect on stateless mode or protocol revision 2026-07-28.true
MCP_HTTP_RESUMABILITY_MAX_EVENTSEvents retained per stateful session for replay; oldest evicted first.512
MCP_HTTP_RESUMABILITY_TTL_MSHow long retained events remain replayable (ms).300000
MCP_AUTH_MODEAuth mode: none, jwt, or oauthnone
MCP_LOG_LEVELLog level (debug, info, notice, warning, error)info
MCP_LOG_RATE_LIMIT_THRESHOLDMaximum repeated emissions per level and message in each log window; 0 disables suppression.10
MCP_LOG_RATE_LIMIT_WINDOW_MSRepeated-log suppression window (ms).60000
MCP_GC_PRESSURE_INTERVAL_MSOpt-in forced-GC interval (ms, Bun only). Set to 60000 if heap growth is observed under sustained HTTP traffic.0
LOGS_DIRDirectory for log files (Node.js only)<project-root>/logs
STORAGE_PROVIDER_TYPEStorage backend: in-memory, filesystem, supabase, cloudflare-kv/r2/d1in-memory
CANVAS_PROVIDER_TYPECanvas 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: duckdb or none. At none those tools still bound an over-budget response to a preview and set truncated: true — there is just no canvas holding the rows they omitnone
OPEN_METEO_API_BASE_URLOverride for the main forecast + elevation APIhttps://api.open-meteo.com
OPEN_METEO_ARCHIVE_BASE_URLOverride for the ERA5 historical archive APIhttps://archive-api.open-meteo.com
OPEN_METEO_MARINE_BASE_URLOverride for the marine forecast APIhttps://marine-api.open-meteo.com
OPEN_METEO_AIR_QUALITY_BASE_URLOverride for the CAMS air quality APIhttps://air-quality-api.open-meteo.com
OPEN_METEO_GEOCODING_BASE_URLOverride for the geocoding APIhttps://geocoding-api.open-meteo.com
OPEN_METEO_ENSEMBLE_BASE_URLOverride for the ensemble forecast APIhttps://ensemble-api.open-meteo.com
OPEN_METEO_FLOOD_BASE_URLOverride for the GloFAS flood APIhttps://flood-api.open-meteo.com
OPEN_METEO_CLIMATE_BASE_URLOverride for the CMIP6 climate projections APIhttps://climate-api.open-meteo.com
OTEL_ENABLEDEnable OpenTelemetry tracing and metricsfalse

See .env.example for the full list of optional overrides.

Running the server

Local development

  • Build and run the production version:

    # One-time build
    bun run rebuild
    
    # Run the built server
    bun run start:http
    # or
    bun run start:stdio
    
  • Run checks and tests:

    bun run devcheck  # Lint, format, typecheck, security
    bun run test      # Vitest test suite
    

Docker

docker build -t open-meteo-mcp-server .
docker run --rm -p 3010:3010 open-meteo-mcp-server

The Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/open-meteo-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.

Project structure

DirectoryPurpose
src/index.tscreateApp() entry point — registers tools, initializes the Open-Meteo service
src/configServer-specific environment variable parsing and validation with Zod
src/mcp-server/tools/definitionsTool definitions (*.tool.ts) — one file per tool; includes dataframe-describe.tool.ts and dataframe-query.tool.ts
src/services/open-meteoOpen-Meteo HTTP client wrapping all nine endpoints with retry, error classification, and columnar reshape
src/services/canvas-accessor.tsDataCanvas accessor for openmeteo_get_forecast / openmeteo_get_historical / openmeteo_get_marine / openmeteo_get_air_quality / openmeteo_get_ensemble / openmeteo_get_flood / openmeteo_get_climate spillover
tests/Unit and integration tests mirroring src/

Development guide

See CLAUDE.md for development guidelines and architectural rules. The short version:

  • Handlers throw, framework catches — no try/catch in tool logic
  • Use ctx.log for request-scoped logging, ctx.state for tenant-scoped storage
  • Register new tools in the tools[] array in src/index.ts
  • Wrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields

Contributing

Issues and pull requests are welcome. Run checks and tests before submitting:

bun run devcheck
bun run test

License

Apache-2.0 — see LICENSE for details.


Weather data by Open-Meteo.com — licensed CC BY 4.0.

Featured
CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
inference shell
inference shell
create and run specialised agents in minutes
build now →
MCP-ready Email SendingMCP-ready Email Sending
MCP-ready Email Sending
Plug Mailtrap into your AI workflow and let it handle the email.
Connect Mailtrap MCP →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →
Capacitor - Shared memory for your team’s coding agents.
Capacitor - Shared memory for your team’s coding agents.
Make coding agent sessions - Searchable, Shareable, Vendor-neutral & Scored.
Try For Free →
CodeScene MCP ServerCodeScene MCP Server
CodeScene MCP Server
Your agent targets a perfect 10 Code Health score. Deterministic. Every commit.
Try For Free →
Give your AI the whole web as clean markdownGive your AI the whole web as clean markdown
Give your AI the whole web as clean markdown
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
belt - the only tool your agent needs
belt - the only tool your agent needs
belt cli automatically finds the best tools and skills for your agent. image, video, music, tts...
one prompt install →

Configuration

MCP_LOG_LEVELdefault: info

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

CANVAS_PROVIDER_TYPEdefault: none

Canvas engine for openmeteo_get_historical spillover. Set to 'duckdb' to enable DataCanvas and the dataframe_query / dataframe_describe tools. Default 'none' (spillover disabled).

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'.

Registryactive
Package@cyanheads/open-meteo-mcp-server
TransportSTDIO, HTTP
Tools verifiedJun 10, 2026
UpdatedJun 4, 2026
View on GitHub

More from cyanheads

  • Treasury Fiscaldata Mcp Server2
  • Usaspending Mcp Server2
  • Worldbank Mcp Server2
  • Git Mcp Server221
  • Bls Labor Mcp Server1
  • Devops Status Mcp Server1
  • Earthquake Mcp Server1
  • Eia Energy Mcp Server1
  • Eurostat Mcp Server1
  • Fcc Broadband Mcp Server1
  • Gdelt Mcp Server1
  • Onebusaway Mcp Server1
  • Openfda Mcp Server1
  • Openfec Mcp Server1
  • Openfoodfacts Mcp Server1
  • Openlibrary Mcp Server1
  • Openstates Mcp Server1
  • Orcid Mcp Server1
  • Reliefweb Mcp Server1
  • Smithsonian Mcp Server1
  • Wikidata Mcp Server1
  • Wsdot Mcp Server1
  • Noaa Cdo Mcp Server2
  • Pubchem Mcp Server9