io.github.cyanheads/open-meteo-mcp-server
REMOTE · OPEN-METEO.CASEYJHAND.COM · 2 COMPONENTS
Global weather via Open-Meteo: forecast, historical, marine, air quality, geocoding, elevation.
Available components
Last scanned (5 hours ago)
Scores higher than 95% of remote servers
Reachable. Last reached 6 Nov 2026.
Category Maps and Location
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security83
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- No authorisation is required to call this server. Nothing on it is marked destructive, but we can't show that an anonymous caller can only read: full credit needs the server to list at least one tool and every tool to be verifiably read-only. We use a best-effort check of tool names and descriptions to tell read-only tools from tools that change things, so some genuinely read-only tools may not get full credit. Names that start with a read verb (get, list, read, search and similar) and accurate readOnlyHint annotations help. Meet that to earn full credit, or require authorisation. See how to fix → View diagnostics → Partial
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability73
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 12207 tokens (~1017/item across 12 items; 11 tools + 1 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 11 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 13 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Checks we ran (13)
- TLS certificate
- Authorization
- HTTPS
- HSTS header
- DNSSEC
- Transport
- Schema quality
- Stability
- Tool coverage
- Injection markers
- Destructive annotations
- Judged manipulation
- MCP protocol
Does not apply to this hosted endpoint (2)
- Supply Chain SecurityScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.
- Provenance & TransparencyScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.
The score does not measure everything. What the score does not measure →
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 6 Nov 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 28 Oct 26 +2
- The server rewrote its instructions, which are the text every model session reads security
- Tool “openmeteo_get_historical” rewrote its description, which is the text the model reads security
- Tool “openmeteo_get_flood” rewrote its description, which is the text the model reads security
- Tool “openmeteo_get_forecast” rewrote its description, which is the text the model reads security
- Tool “openmeteo_get_marine” rewrote its description, which is the text the model reads security
- Schema quality: unverified → 100 ▲ functional
- New resource “open-meteo-guide” functional
- Server version: 0.4.2 → 0.5.0 functional
- “openmeteo_get_historical” reworded the description of “models” cosmetic
- “openmeteo_get_flood” reworded the description of “latitude” cosmetic
- “openmeteo_get_historical” reworded the description of “start_date” cosmetic
- “openmeteo_get_marine” reworded the description of “latitude” cosmetic
- “openmeteo_get_forecast” reworded the description of “past_days” cosmetic
- “openmeteo_get_flood” reworded the description of “longitude” cosmetic
- 24 Oct 26 0
- The server rewrote its instructions, which are the text every model session reads security
- Tool “openmeteo_get_flood” rewrote its description, which is the text the model reads security
- Tool “openmeteo_get_marine” rewrote its description, which is the text the model reads security
- Tool “openmeteo_get_forecast” rewrote its description, which is the text the model reads security
- Tool “openmeteo_get_elevation” rewrote its description, which is the text the model reads security
- Schema quality: 864 → 1085 ▼ functional
- Server version: 0.4.1 → 0.4.2 functional
- “openmeteo_get_marine” added an optional parameter “wind_speed_unit” cosmetic
- “openmeteo_get_marine” added an optional parameter “temperature_unit” cosmetic
- “openmeteo_get_marine” added an optional parameter “length_unit” cosmetic
- “openmeteo_get_marine” added an optional parameter “current_variables” cosmetic
- “openmeteo_get_forecast” added an optional parameter “models” cosmetic
- “openmeteo_get_flood” added an optional parameter “models” cosmetic
- “openmeteo_get_marine” reworded the description of “hourly_variables” cosmetic
- “openmeteo_get_marine” reworded the description of “daily_variables” cosmetic
- “openmeteo_get_historical” reworded the description of “models” cosmetic
- “openmeteo_get_flood” reworded the description of “start_date” cosmetic
- “openmeteo_get_flood” reworded the description of “forecast_days” cosmetic
- “openmeteo_get_flood” reworded the description of “end_date” cosmetic
- “openmeteo_get_flood” reworded the description of “daily_variables” cosmetic
- “openmeteo_get_flood” reworded the description of “canvas_id” cosmetic
- “openmeteo_get_elevation” reworded the description of “longitudes” cosmetic
- “openmeteo_get_elevation” reworded the description of “latitudes” cosmetic
- “openmeteo_dataframe_query” reworded the description of “sql” cosmetic
- 13 Oct 26 0
- The server rewrote its instructions, which are the text every model session reads security
- Tool “openmeteo_get_ensemble” rewrote its description, which is the text the model reads security
- Tool “openmeteo_get_elevation” rewrote its description, which is the text the model reads security
- Tool “openmeteo_get_air_quality” rewrote its description, which is the text the model reads security
- Tool “openmeteo_dataframe_query” rewrote its description, which is the text the model reads security
- Tool “openmeteo_get_marine” rewrote its description, which is the text the model reads security
- Tool “openmeteo_get_flood” rewrote its description, which is the text the model reads security
- Server version: 0.4.0 → 0.4.1 functional
- “openmeteo_get_ensemble” reworded the description of “models” cosmetic
- “openmeteo_get_ensemble” reworded the description of “forecast_days” cosmetic
- “openmeteo_get_air_quality” reworded the description of “current_variables” cosmetic
- “openmeteo_search_locations” reworded the description of “language” cosmetic
- “openmeteo_get_marine” reworded the description of “latitude” cosmetic
- “openmeteo_get_flood” reworded the description of “daily_variables” cosmetic
- 4 Oct 26 0
- Server version: 0.3.11 → 0.4.0 functional
- 28 Sept 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 25 Sept 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 22 Sept 26 0
- Server version: 0.3.10 → 0.3.11 functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 6 Nov 2026 · Probed https://open-meteo.caseyjhand.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=caseyjhand.com | CN=WE1,O=Google Trust Services,C=US | 2 Nov 2026 | 31 Jan 2027 | ECDSA 256 | ECDSA-SHA256 | 995a30681ab772540e934241ca1d576c |
| SANs: caseyjhand.com, *.caseyjhand.com | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC secure
Validation of open-meteo.caseyjhand.com. — Secure
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | Trust anchor | 20326, 38696 | 8, 8 | Verified |
| com. | DS published | 19718 | 13 | Verified |
| caseyjhand.com. | DS published | 2371 | 13 | Verified |
| open-meteo.caseyjhand.com. | Verified address RRset verified with the apex keys |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=63072000; includeSubDomains; preload |
| x-content-type-options | nosniff |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://open-meteo.caseyjhand.com/mcp | Verified | 200 | |
| http (plaintext) | http://open-meteo.caseyjhand.com/mcp | HTTPS enforced | 301 | https://open-meteo.caseyjhand.com/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
openmeteo_dataframe_describe Openmeteo Dataframe Describe ~155
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 querying with openmeteo_dataframe_query.
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | yes | 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 tru… |
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | – | Canvas ID that was inspected. |
| error | object | – | Present when the call failed. Absent on success. |
| expires_at | string | – | ISO 8601 expiry after the sliding 24 h TTL. |
| tables | array | – | Tables and views registered on this canvas. |
No examples provided.
openmeteo_dataframe_query Openmeteo Dataframe Query ~542
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 those tools spills (truncated: true), and reference the exact table_name those tools return alongside it. Call openmeteo_dataframe_describe to list staged tables and their columns when you need to discover names. Returns up to 100 leading rows — fewer when wide rows would pass the 80,000-character inline ceiling — plus row_count — exact, or a lower bound flagged by count_error when counting fails or runs past 5 seconds; page the rest with LIMIT / OFFSET.
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | yes | 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 tru… |
| sql | string | yes | 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 ISO… |
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | – | Canvas ID that was queried. |
| count_error | string | – | Present only when counting the full result failed after its rows were read — the failure reason (e.g. sql_execution_error, or count_timeout when counting ran past 5 seconds). The rows are still valid… |
| error | object | – | Present when the call failed. Absent on success. |
| row_count | number | – | Exact number of rows in the full result. When count_error is present, the total could not be counted and this is a lower bound: the rows the query confirmed exist. |
| rows | array | – | Leading result rows: at most 100, and fewer when the next row would take the response past its 80,000-character inline ceiling. Values are never cut. When row_count exceeds rows.length, continue by r… |
No examples provided.
openmeteo_get_air_quality Openmeteo Get Air Quality ~937
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-server. Forecast horizon up to 7 days, with optional past_days (up to 92) for recent history — or start_date and end_date together for an archive range; the CAMS global archive begins in August 2022, and earlier dates return rows of nulls. One window per call: a date range is mutually exclusive with forecast_days and 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. Pollen is modeled for Europe only, and only in pollen season — elsewhere the pollen values come back null, and the notice names them. Set current_variables for pollutant and AQI values at this instant — returned as a current object plus a current_units map, and enough on its own without hourly_variables; the block’s interval field is its aggregation interval in seconds (3600 on this endpoint). A wide window — a large past_days or date range plus many variables — produces thousands of records; these spill to a DataCanvas when canvas is enabled, returning canvas_id and table_name with truncated: true — inspect the staged columns with openmeteo_dataframe_describe, then query the full set with openmeteo_dataframe_query. With canvas disabled they return a bounded preview instead.
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | – | 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 a… |
| current_variables | array | – | 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 re… |
| end_date | string | – | 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_days | integer | – | 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_variables | array | – | 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 | yes | Latitude in decimal degrees. Use openmeteo_search_locations to resolve a place name. |
| longitude | number | yes | Longitude in decimal degrees. |
| past_days | integer | – | 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. |
| start_date | string | – | 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 pollutant… |
| timezone | string | – | IANA timezone or "auto". Default "auto". |
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | – | DataCanvas token for the staged full dataset. Present only when truncated is true AND DataCanvas is enabled (CANVAS_PROVIDER_TYPE=duckdb) — absent otherwise, in which case the preview is all this res… |
| current | object | – | Pollutant and index values at a single instant: one key per requested current variable alongside time and interval. Units are in the current_units map. Absent when current_variables was not requested. |
| current_units | object | – | Key → unit string for the current block, covering time and interval as well as each requested variable (e.g., {"interval": "seconds", "pm2_5": "μg/m³"}). Absent when no current_variables were request… |
| data_source | string | – | Data source identifier — this is modeled CAMS data, forecast or archive, not measured station data. |
| error | object | – | Present when the call failed. Absent on success. |
| hourly | array | – | Per-hour records with "time" (ISO 8601) + one key per requested variable. Units: pm2_5/pm10/dust in μg/m³, carbon_monoxide in μg/m³, nitrogen_dioxide/sulphur_dioxide/ozone in μg/m³, european_aqi/us_a… |
| hourly_units | object | – | Variable → unit string for hourly data (e.g., {"pm2_5": "μg/m³", "european_aqi": "EAQI"}). |
| latitude | number | – | Snapped latitude |
| longitude | number | – | Snapped longitude |
| notice | string | – | Everything this response needs to say beyond the data, composed into one advisory: columns the endpoint returned with the unit "undefined" (a name it parsed but does not serve); current values that a… |
| record_count | number | – | Total number of hourly records — the full upstream total when truncated is true, not the length of the hourly preview. |
| table_name | string | – | DuckDB table name for the staged data — use as the FROM target in openmeteo_dataframe_query SQL; openmeteo_dataframe_describe lists its columns. Present only alongside canvas_id. |
| timezone | string | – | Resolved IANA timezone |
| truncated | boolean | – | True when the response was too large to return inline, so hourly carries a bounded preview rather than the full set. With DataCanvas enabled the complete data is staged at canvas_id. With it disabled… |
No examples provided.
openmeteo_get_climate Openmeteo Get Climate ~781
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 happened). 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. A model name outside that list is sent upstream rather than rejected here, so a model Open-Meteo adds later still works; if upstream rejects the request, the error names the offending model on its own rather than the whole requested list. With 2+ models each variable appears once per model with the model name as suffix (e.g. temperature_2m_max_CMCC_CM2_VHR4); a single or omitted model returns plain variable names. Not all models carry all variables — missing combinations return null. Multi-decade daily pulls across several models produce thousands of records and spill to a DataCanvas when canvas is enabled, returning canvas_id and table_name with truncated: true — inspect the staged columns with openmeteo_dataframe_describe, then query the full set with openmeteo_dataframe_query. With canvas disabled they return a bounded preview instead.
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | – | 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 spills… |
| daily_variables | array | – | 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 | yes | End date (YYYY-MM-DD, inclusive, max 2050-12-31). Must be on or after start_date. |
| latitude | number | yes | Latitude in decimal degrees. Use openmeteo_search_locations to resolve a place name to coordinates. |
| longitude | number | yes | Longitude in decimal degrees. |
| models | array | – | 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. t… |
| precipitation_unit | string | – | Precipitation unit. Default "mm". |
| start_date | string | yes | Start date (YYYY-MM-DD, e.g., "2049-01-01"). CMIP6 projections cover 1950-01-01 to 2050-12-31. |
| temperature_unit | string | – | Temperature unit. Default "celsius". |
| timezone | string | – | IANA timezone or "auto". Default "auto". |
| wind_speed_unit | string | – | Wind speed unit. Default "kmh". |
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | – | DataCanvas token for the staged full dataset. Present only when truncated is true AND DataCanvas is enabled (CANVAS_PROVIDER_TYPE=duckdb) — absent otherwise, in which case the preview is all this res… |
| daily | array | – | Per-day records with "time" (YYYY-MM-DD) + one key per requested variable — per-model suffixed keys when 2+ models were requested (e.g. temperature_2m_max_CMCC_CM2_VHR4). Null values mean the model d… |
| daily_units | object | – | Column → unit string for daily data (e.g., {"temperature_2m_max_CMCC_CM2_VHR4": "°C"}). |
| date_range | object | – | Date range of returned data |
| elevation | number | – | Elevation at grid point (meters) |
| error | object | – | Present when the call failed. Absent on success. |
| latitude | number | – | Snapped latitude (Open-Meteo snaps to nearest grid point) |
| longitude | number | – | Snapped longitude |
| models | array | – | Climate models requested — echoes the models parameter. Absent when models was omitted (API default model; the response carries no provenance). |
| notice | string | – | Everything this response needs to say beyond the data, composed into one advisory: columns the endpoint returned with the unit "undefined" (a name it parsed but does not serve); recognized variables… |
| record_count | number | – | Total number of daily records — the full upstream total when truncated is true, not the length of the daily preview. |
| table_name | string | – | DuckDB table name for the staged data — use as the FROM target in openmeteo_dataframe_query SQL; openmeteo_dataframe_describe lists its columns, which is the only way to learn the per-model suffixes… |
| timezone | string | – | Resolved IANA timezone |
| truncated | boolean | – | True when the response was too large to return inline, so daily carries a bounded preview rather than the full set. With DataCanvas enabled the complete data is staged at canvas_id. With it disabled… |
No examples provided.
openmeteo_get_elevation Openmeteo Get Elevation ~266
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 where to resume — resubmit latitudes.slice(next_offset) and longitudes.slice(next_offset) of the arrays just sent, until next_offset is null. Open-Meteo counts each sampled pair as one call against its per-IP limit of 600 a minute, so a seventh full slice inside one minute comes back rate_limited — space later slices about a minute apart. Useful for geographic context, elevation-adjusted weather interpretation, or route planning. A point the DEM has no value for (latitude 90) returns elevation_m null; the other points in the call are unaffected.
| Name | Type | Req | Description |
|---|---|---|---|
| latitudes | array | yes | 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 | yes | Array of longitudes in decimal degrees (up to 1,000; the first 100 are sampled per call). Must be same length as latitudes. |
| Name | Type | Req | Description |
|---|---|---|---|
| elevations | array | – | Elevation values for the sampled pairs (the first 100), in input order |
| error | object | – | Present when the call failed. Absent on success. |
| next_offset | number|null | – | Index to resume from: resubmit latitudes.slice(next_offset) and longitudes.slice(next_offset) of the arrays sent in this call. null when every submitted pair was sampled. |
| notice | string | – | Present only when more than 100 pairs were submitted: names how many were sampled and how many remain, and the slice of the submitted arrays to resubmit for the rest. |
| unprocessed_count | number | – | Submitted pairs that were not sampled in this call; 0 when 100 or fewer were submitted |
No examples provided.
openmeteo_get_ensemble Openmeteo Get Ensemble ~1,461
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 as separate columns named with a member suffix (e.g. temperature_2m_member01, temperature_2m_member02). Use the spread across members to compute exceedance probabilities, quantify forecast uncertainty, and build decision thresholds. Available models: 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 (51, Europe 31 km), google_weathernext2_ensemble (64, global 0.25°), ncep_gefs_seamless (31, global blend), ncep_gefs025 (31, global 0.25°), ncep_gefs05 (31, global 50 km, 35 days), ncep_aigefs025 (31, global 0.25°), icon_seamless_eps (20–40, global/Europe blend), icon_global_eps (40, global 26 km), icon_eu_eps (40, Europe 13 km), icon_d2_eps (20, Central Europe 2 km), gem_global_ensemble (21, global 0.25°), bom_access_global_ensemble (18, global 40 km), ukmo_global_ensemble_20km (18, global 20 km), ukmo_uk_ensemble_2km (3, UK 2 km), meteoswiss_icon_ch1_ensemble (11, Central Europe 1 km), meteoswiss_icon_ch2_ensemble (21, Central Europe 2 km). Omit models to use ecmwf_ifs025_ensemble. A regional model returns no data outside the area it covers; that comes back as an input error naming the coverage gap, not a transient failure, so pick a global model or move the coordinate inside the region rather than retrying. A model name this list does not carry is still sent upstream, so a newly added one keeps working. Large multi-member, multi-day pulls produce thousands of records and spill to a DataCanvas when canvas is enabled, returning canvas_id and table_name with truncated: true — inspect the staged columns with openmeteo_dataframe_describe, then query the full set with openmeteo_dataframe…
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | – | 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 ca… |
| daily_variables | array | – | 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 onl… |
| forecast_days | integer | – | 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. |
| hourly_variables | array | – | 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 th… |
| latitude | number | yes | Latitude in decimal degrees. Use openmeteo_search_locations to resolve a place name to coordinates. |
| longitude | number | yes | Longitude in decimal degrees. |
| models | string | – | 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_days | integer | – | Include this many days of past ensemble data before today (0–92). Default 0. |
| precipitation_unit | string | – | Precipitation unit. Default "mm". |
| temperature_unit | string | – | Temperature unit. Default "celsius". |
| timezone | string | – | IANA timezone (e.g., "America/Los_Angeles") or "auto" to use the location's local timezone. Default "auto". |
| wind_speed_unit | string | – | Wind speed unit. Default "kmh". |
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | – | DataCanvas token for the staged full dataset. Present only when truncated is true AND DataCanvas is enabled (CANVAS_PROVIDER_TYPE=duckdb) — absent otherwise, in which case the preview is all this res… |
| daily | array | – | Per-day records with "time" (YYYY-MM-DD) + per-member columns (e.g., temperature_2m_max_member01). Absent when only hourly_variables were requested. When truncated, contains a preview only — query ca… |
| daily_units | object | – | Variable → unit string for daily data. Absent when no daily_variables were requested. |
| elevation | number | – | Terrain elevation at grid point (meters) |
| error | object | – | Present when the call failed. Absent on success. |
| hourly | array | – | Per-hour records with "time" (ISO 8601) + per-member columns for each requested variable (e.g., temperature_2m_member01, temperature_2m_member02). Absent when only daily_variables were requested. Whe… |
| hourly_units | object | – | Variable → unit string for hourly data (e.g., {"temperature_2m_member01": "°C"}). Absent when no hourly_variables were requested. |
| latitude | number | – | Snapped latitude (Open-Meteo snaps to nearest grid point) |
| longitude | number | – | Snapped longitude |
| member_count | number | – | Number of distinct perturbed ensemble members in the response, counted from the _memberNN column suffixes. The unsuffixed base column (the control run) is not included in this count. |
| model | string | – | Ensemble model used — echoes the requested models parameter, or ecmwf_ifs025_ensemble when models was omitted or blank. |
| notice | string | – | Everything this response needs to say beyond the data, composed into one advisory: variables the endpoint returned with the unit "undefined" across every member (a name the selected model does not ca… |
| record_count | number | – | Total number of records (hourly + daily rows) — the full upstream total when truncated is true, not the combined length of the hourly and daily previews. |
| table_name | string | – | DuckDB table name for the staged data — use as the FROM target in openmeteo_dataframe_query SQL; openmeteo_dataframe_describe lists its columns, which is the only way to learn the per-member suffixes… |
| timezone | string | – | Resolved IANA timezone |
| truncated | boolean | – | True when the response was too large to return inline, so hourly and daily carry a bounded preview rather than the full set. With DataCanvas enabled the complete data is staged at canvas_id — every h… |
No examples provided.
openmeteo_get_flood Openmeteo Get Flood ~1,542
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 pair of parallel channels, or a bank can resolve to a cell with little flow. When the value is far below what the named river carries, step the coordinate 0.05° across the channel and compare the values. One mode per call: forecast_days for the outlook, or start_date and end_date together for a date range from 1984-01-01. The two modes are mutually exclusive, and a date range needs both ends — a lone start_date or end_date is rejected. forecast_days accepts up to 210, but the current GloFAS run sets how far the data reaches (about six months ahead); later days come back null and the notice names where the data ends. What a date range holds depends on the model. Omitting models reads seamless_v4: consolidated_v4 reanalysis before 2023-08-05, then forecast-run discharge from 2023-08-05 on, so a range crossing that date changes source mid-series. Set models to pin a source: 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 through 2025-05-31; null after it and on every forecast_days call), forecast_v4 (forecast runs from 2023-06-01 into the live forecast; null before). consolidated_v4 is the only way to read reanalysis for 2023-08-05 through 2025-05-31. With 2+ models every daily column is suffixed with the model name (river_discharge_consolidated_v4). Available daily variables: "river_discharge" (the daily discharge value; the mean across ensemble members is "river_discharge_mean"), and the ensemble statistics "river_discharge_mean", "river_discharge_median", "river_discharge_min", "river_discharge_max", "river_discharge_p25" (25th percentile), and "river_discharge_p75" (75th percen…
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | – | 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 canva… |
| 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. river_discharge is the daily disc… |
| end_date | string | – | 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-3… |
| forecast_days | integer | – | 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 for… |
| latitude | number | yes | 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 far… |
| longitude | number | yes | Longitude in decimal degrees. With latitude it selects the nearest GloFAS 0.05° grid cell, which is not reliably on the river intended. |
| models | array | – | 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 throug… |
| start_date | string | – | 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 2023-… |
| timezone | string | – | IANA timezone or "auto". Default "auto". |
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | – | DataCanvas token for the staged full dataset. Present only when truncated is true AND DataCanvas is enabled (CANVAS_PROVIDER_TYPE=duckdb) — absent otherwise, in which case the preview is all this res… |
| daily | array | – | Per-day records with "time" (YYYY-MM-DD) + one key per requested variable containing discharge in m³/s — per model, suffixed with the model name (river_discharge_consolidated_v4), when 2+ models were… |
| daily_units | object | – | Variable → unit string for daily data (e.g., {"river_discharge": "m³/s"}), model-suffixed like the records when 2+ models were requested. |
| error | object | – | Present when the call failed. Absent on success. |
| latitude | number | – | Snapped latitude — the GloFAS grid cell the discharge comes from |
| longitude | number | – | Snapped longitude — the GloFAS grid cell the discharge comes from |
| models | array | – | GloFAS models requested — echoes the models parameter. Absent when models was omitted, which means the data came from seamless_v4: consolidated_v4 reanalysis before 2023-08-05, forecast_v4 runs from… |
| notice | string | – | Everything this response needs to say beyond the data, composed into one advisory: columns GloFAS returned with the unit "undefined" (a name it parsed but does not serve); recognized columns whose re… |
| record_count | number | – | Total number of daily discharge records — the full staged count when truncated is true, not the length of the daily preview. |
| table_name | string | – | DuckDB table name for the staged data — use as the FROM target in openmeteo_dataframe_query SQL; openmeteo_dataframe_describe lists its columns. Present only alongside canvas_id. |
| timezone | string | – | Resolved IANA timezone |
| truncated | boolean | – | True when the response was too large to return inline, so daily carries a bounded preview rather than the full set. With DataCanvas enabled the complete data is staged at canvas_id. With it disabled… |
No examples provided.
openmeteo_get_forecast Openmeteo Get Forecast ~1,750
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 week. Returns per-timestamp records — each hourly entry contains a "time" field (ISO 8601) plus one key per requested variable; each daily entry contains a "time" field (YYYY-MM-DD) plus requested variables. 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. Set current_variables for conditions at this instant — Open-Meteo serves those from 15-minute model data, which is more precise than picking the nearest hourly row, and the response carries a current object plus a current_units map. Set models to compare deterministic models side by side (e.g., ["ncep_gfs_seamless", "ecmwf_ifs025", "dwd_icon_seamless"]) — where they disagree, the forecast is uncertain. With 2+ models every hourly and daily key carries the model name as a suffix (temperature_2m_ecmwf_ifs025); with models omitted the data is Open-Meteo’s best_match blend. A wide window — a large past_days plus many hourly variables — produces thousands of records; these spill to a DataCanvas when canvas is enabled, returning canvas_id and table_name with truncated: true — inspect the staged columns with openmeteo_dataframe_describe, then query the full set with openmeteo_dataframe_query. With canvas disabled they return a bounded preview instead. At least one of current_variables, hourly_variables, or daily_variables is required.
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | – | 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 — i… |
| current_variables | array | – | 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 is… |
| daily_variables | array | – | 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 as… |
| forecast_days | integer | – | Number of forecast days (1–16). Default 7. |
| hourly_variables | array | – | 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 aggrega… |
| latitude | number | yes | Latitude in decimal degrees (e.g., 47.6062 for Seattle). Use openmeteo_search_locations to resolve a place name to coordinates. |
| longitude | number | yes | Longitude in decimal degrees (e.g., -122.3321 for Seattle). |
| models | array | – | 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, ncep… |
| past_days | integer | – | 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. |
| precipitation_unit | string | – | Precipitation unit: "mm" or "inch". Default "mm". |
| temperature_unit | string | – | Temperature unit. Default "celsius". |
| timezone | string | – | 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. |
| wind_speed_unit | string | – | Wind speed unit: "kmh" (km/h), "mph", "ms" (m/s), or "kn" (knots). Default "kmh". |
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | – | DataCanvas token for the staged full dataset. Present only when truncated is true AND DataCanvas is enabled (CANVAS_PROVIDER_TYPE=duckdb) — absent otherwise, in which case the preview is all this res… |
| current | object | – | Conditions at a single instant: one key per requested current variable alongside time and interval. Units are in the current_units map. Absent when current_variables was not requested. |
| current_units | object | – | Map of key → unit string for the current block, covering time and interval as well as each requested variable (e.g., {"interval": "seconds", "temperature_2m": "°C"}). Absent when no current_variables… |
| daily | array | – | Per-day records. Each object has a "time" field (YYYY-MM-DD) plus one key per requested variable with its value — per model, suffixed with the model name, when 2+ models were requested. Units are in… |
| daily_units | object | – | Map of variable name → unit string for daily data, model-suffixed like the records when 2+ models were requested. Absent when no daily_variables were requested. |
| elevation | number | – | Terrain elevation at grid point (meters) |
| error | object | – | Present when the call failed. Absent on success. |
| hourly | array | – | Per-hour records. Each object has a "time" field (ISO 8601) plus one key per requested variable with its value — one key per variable per model, suffixed with the model name (temperature_2m_ecmwf_ifs… |
| hourly_units | object | – | Map of variable name → unit string for hourly data (e.g., {"temperature_2m": "°C", "precipitation": "mm"}), keyed by the same model-suffixed names as the records when 2+ models were requested. Absent… |
| latitude | number | – | Snapped latitude (Open-Meteo snaps to nearest grid point — with models set, the grid of the first listed model that covers the coordinate) |
| longitude | number | – | Snapped longitude (with models set, the grid of the first listed model that covers the coordinate) |
| models | array | – | Forecast models requested — echoes the models parameter. Absent when models was omitted, which means the data came from Open-Meteo's best_match blend. |
| notice | string | – | Everything this response needs to say beyond the data, composed into one advisory: columns the endpoint returned with the unit "undefined" (a name it parsed but does not serve in the requested cadenc… |
| record_count | number | – | Total number of records (hourly + daily rows) — the full upstream total when truncated is true, not the combined length of the hourly and daily previews. |
| table_name | string | – | DuckDB table name for the staged data — use as the FROM target in openmeteo_dataframe_query SQL; openmeteo_dataframe_describe lists its columns. Present only alongside canvas_id. |
| timezone | string | – | Resolved IANA timezone |
| truncated | boolean | – | True when the response was too large to return inline, so hourly and daily carry a bounded preview rather than the full set. With DataCanvas enabled the complete data is staged at canvas_id — every h… |
| utc_offset_seconds | number | – | UTC offset in seconds for this timezone at query time |
No examples provided.
openmeteo_get_historical Openmeteo Get Historical ~1,187
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 by date and no single update lag describes the response. Set models to pin a consistent source for a multi-decade series: the ERA5 family updates daily with about a week of delay, while IFS HRES has none, so for the last week either request models: ["ecmwf_ifs"] or use openmeteo_get_forecast with past_days. Available models: 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, 2 days delay), era5_seamless (ERA5 and ERA5-Land combined), era5 (global 0.25° (~25 km), daily, about a week delay), era5_land (global 0.1° (~11 km), daily, about a week delay), era5_ensemble (global 0.5° (~55 km), daily, about a week delay), cerra (Europe only, 5 km, no real-time updates). Uses the same variable names as the forecast API for direct comparison. Large date ranges (multi-year hourly) produce thousands of records — these spill to a DataCanvas when canvas is enabled, returning canvas_id and table_name with truncated: true; inspect the staged columns with openmeteo_dataframe_describe, then query the full set with openmeteo_dataframe_query. With canvas disabled they return a bounded preview instead. At least one of hourly_variables or daily_variables is required.
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | – | 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 sp… |
| daily_variables | array | – | 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 belong… |
| end_date | string | yes | 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_variables | array | – | 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 as… |
| latitude | number | yes | Latitude in decimal degrees. Use openmeteo_search_locations to resolve a place name to coordinates. |
| longitude | number | yes | Longitude in decimal degrees. |
| models | array | – | 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, 2… |
| precipitation_unit | string | – | Precipitation unit. Default "mm". |
| start_date | string | yes | 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_unit | string | – | Temperature unit. Default "celsius". |
| timezone | string | – | IANA timezone or "auto". Default "auto". |
| wind_speed_unit | string | – | Wind speed unit. Default "kmh". |
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | – | DataCanvas token for the staged full dataset. Present only when truncated is true AND DataCanvas is enabled (CANVAS_PROVIDER_TYPE=duckdb) — absent otherwise, in which case the preview is all this res… |
| daily | array | – | Per-day records with "time" (YYYY-MM-DD) + variable keys. Absent when only hourly_variables were requested. When truncated, contains only a preview — query canvas_id for the full dataset when one is… |
| daily_units | object | – | Variable → unit string for daily data. Absent when no daily_variables were requested. |
| date_range | object | – | Date range of returned data |
| elevation | number | – | Elevation at grid point (meters) |
| error | object | – | Present when the call failed. Absent on success. |
| hourly | array | – | Per-hour records with "time" (ISO 8601) + variable keys. Absent when only daily_variables were requested. When truncated, contains only a preview — query canvas_id for the full dataset when one is pr… |
| hourly_units | object | – | Variable → unit string for hourly data (e.g., {"temperature_2m": "°C", "precipitation": "mm"}). Absent when no hourly_variables were requested. |
| latitude | number | – | Snapped latitude |
| longitude | number | – | Snapped longitude |
| models | array | – | Archive models requested — echoes the models parameter. Absent when models was omitted, which means the data came from Open-Meteo Best Match (IFS HRES + ERA5 + ERA5-Land) and the source varies by dat… |
| notice | string | – | Everything this response needs to say beyond the data, composed into one advisory: columns the archive returned with the unit "undefined" (a name it parsed but does not serve in the requested cadence… |
| record_count | number | – | Total number of records (hourly + daily rows) — the full upstream total when truncated is true, not the combined length of the hourly and daily previews. |
| table_name | string | – | DuckDB table name for the staged data — use as the FROM target in openmeteo_dataframe_query SQL; openmeteo_dataframe_describe lists its columns. Present only alongside canvas_id. |
| timezone | string | – | Resolved IANA timezone |
| truncated | boolean | – | True when the response was too large to return inline, so hourly and daily carry a bounded preview rather than the full set. With DataCanvas enabled the complete data is staged at canvas_id — every h… |
No examples provided.
openmeteo_get_marine Openmeteo Get Marine ~1,294
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_date together for an archive range, which returns real wave values back to at least 2022. One window per call: a date range is mutually exclusive with forecast_days and past_days, and needs both ends — a lone start_date or end_date is rejected. Returns per-timestamp records — each entry contains a "time" field plus one key per requested variable. Best for open-ocean and coastal exposed points — sheltered water such as a sound or bay returns near-zero wave values, and a land point well inland returns null values, which the notice reports. A land point near the coast is answered from a nearby sea cell with real values and no notice, so check the response latitude and longitude is the water you meant. 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: wave_height_max, wave_direction_dominant, wave_period_max. Note: ocean_current_velocity is null for non-open-ocean coordinates. Set current_variables for conditions at this instant — Open-Meteo serves those from 15-minute model data, and the response carries a current object plus a current_units map, alongside either window. length_unit "imperial" returns heights in ft, wind_speed_unit sets the ocean_current_velocity unit, and temperature_unit the sea_surface_temperature unit — converted upstream, with every unit read from the *_units maps. A wide window — a large past_days or date range plus many variables — produces thousands of records; these spill to a DataCanvas when canvas is enabled, returning canvas_id and table_name with truncated: true — inspect the staged columns with openmeteo_dataframe_describ…
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | – | 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 a… |
| current_variables | array | – | 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 answ… |
| daily_variables | array | – | 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 reje… |
| end_date | string | – | 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_days | integer | – | 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_variables | array | – | 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_direct… |
| latitude | number | yes | 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 no… |
| length_unit | string | – | 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". |
| longitude | number | yes | Longitude in decimal degrees. |
| past_days | integer | – | 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. |
| start_date | string | – | 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_da… |
| temperature_unit | string | – | Unit for sea_surface_temperature: "celsius" or "fahrenheit". Default "celsius". |
| timezone | string | – | IANA timezone or "auto". Default "auto". |
| wind_speed_unit | string | – | Unit for ocean_current_velocity: "kmh" (km/h), "mph" (labelled "mp/h" in the units maps), "ms" (m/s), or "kn" (knots). Default "kmh". |
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | – | DataCanvas token for the staged full dataset. Present only when truncated is true AND DataCanvas is enabled (CANVAS_PROVIDER_TYPE=duckdb) — absent otherwise, in which case the preview is all this res… |
| current | object | – | Conditions at a single instant: one key per requested current variable alongside time and interval. Units are in the current_units map. Absent when current_variables was not requested. |
| current_units | object | – | Key → unit string for the current block, covering time and interval as well as each requested variable (e.g., {"interval": "seconds", "wave_height": "ft"}). Absent when no current_variables were requ… |
| daily | array | – | Per-day summary records with "time" (YYYY-MM-DD) + variable keys (e.g., wave_height_max, wave_direction_dominant, wave_period_max). Units are in the daily_units map; heights follow length_unit. Absen… |
| daily_units | object | – | Variable → unit string for daily data. Absent when no daily_variables were requested. |
| error | object | – | Present when the call failed. Absent on success. |
| hourly | array | – | Per-hour records with "time" (ISO 8601) + one key per requested variable (e.g., wave_height, wave_direction, wave_period). Units are in the hourly_units map: heights follow length_unit, ocean_current… |
| hourly_units | object | – | Variable → unit string for hourly data, as Open-Meteo labels it (e.g., {"wave_height": "ft", "wave_period": "s"} under length_unit "imperial"). Absent when no hourly_variables were requested. |
| latitude | number | – | Snapped latitude |
| longitude | number | – | Snapped longitude |
| notice | string | – | Everything this response needs to say beyond the data, composed into one advisory: columns the endpoint returned with the unit "undefined" (a name it parsed but does not serve); current values that a… |
| record_count | number | – | Total number of records (hourly + daily rows) — the full upstream total when truncated is true, not the combined length of the hourly and daily previews. |
| table_name | string | – | DuckDB table name for the staged data — use as the FROM target in openmeteo_dataframe_query SQL; openmeteo_dataframe_describe lists its columns. Present only alongside canvas_id. |
| timezone | string | – | Resolved IANA timezone |
| truncated | boolean | – | True when the response was too large to return inline, so hourly and daily carry a bounded preview rather than the full set. With DataCanvas enabled the complete data is staged at canvas_id — every h… |
No examples provided.
openmeteo_search_locations Openmeteo Search Locations ~586
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); never fold a qualifier into it — pass "Baoding", not "Baoding Hebei", and "Paris", not "Paris, France". To disambiguate places that share a name, set the country input (ISO 3166-1 alpha-2, e.g. "US") and/or read the admin1 and country fields on each ranked result — admin1 is a result field for choosing among matches, not a search input. Returns up to 10 matches ranked by population/relevance.
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | Max results to return (1–10). Default 5. Return more when disambiguating common names like "Springfield" or "Portland". |
| country | string | – | ISO 3166-1 alpha-2 country code (e.g. "US", "FR") to disambiguate places that share a name. Omit for a global search. |
| language | string | – | 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. l… |
| name | string | yes | 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 disambigu… |
| Name | Type | Req | Description |
|---|---|---|---|
| count | number | – | Number of results returned |
| effective_language | string | – | ISO 639-1 language the results were matched in, present only when the query missed under the default "en" and the retry with a language inferred from its script found them. The results’ name, country… |
| error | object | – | Present when the call failed. Absent on success. |
| notice | string | – | Advisory on the confidence of the top match, present only when its population is null or under 100,000 — the shape a historic or colonial exonym returns, where the upstream index answers with an unre… |
| results | array | – | Ranked matches (most relevant first). Never empty — when nothing matches, the tool fails with no_results instead of returning an empty array. |
No examples provided.
How do I install the io.github.cyanheads/open-meteo-mcp-server server?
io.github.cyanheads/open-meteo-mcp-server is a hosted endpoint at https://open-meteo.caseyjhand.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · open-meteo.caseyjhand.com
claude mcp add --transport http cyanheads-open-meteo-mcp-server 'https://open-meteo.caseyjhand.com/mcp'
What is the io.github.cyanheads/open-meteo-mcp-server server?
io.github.cyanheads/open-meteo-mcp-server is listed in the public MCP registry as io.github.cyanheads/open-meteo-mcp-server. Global weather via Open-Meteo: forecast, historical, marine, air quality, geocoding, elevation. This page covers its hosted endpoint (https://open-meteo.caseyjhand.com/mcp).
Is the io.github.cyanheads/open-meteo-mcp-server server safe to use?
io.github.cyanheads/open-meteo-mcp-server scores 88 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the io.github.cyanheads/open-meteo-mcp-server server expose?
io.github.cyanheads/open-meteo-mcp-server exposes 11 tools: openmeteo_search_locations, openmeteo_get_elevation, openmeteo_get_forecast, openmeteo_get_historical, openmeteo_get_marine, and 6 more. Their descriptions and schemas cost roughly 10,501 tokens of context every time the server is loaded.
Does the io.github.cyanheads/open-meteo-mcp-server server require authentication?
No. We connected to io.github.cyanheads/open-meteo-mcp-server without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the io.github.cyanheads/open-meteo-mcp-server server still maintained?
io.github.cyanheads/open-meteo-mcp-server is still listed as active in the MCP registry. We last reached this channel on 6 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What did VerifyMCP test on the io.github.cyanheads/open-meteo-mcp-server server?
VerifyMCP ran 13 checks on io.github.cyanheads/open-meteo-mcp-server, covering TLS certificate, Authorization, HTTPS, HSTS header and 9 more. Supply Chain Security and Provenance & Transparency do not apply to a hosted endpoint, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.