open-meteo-mcp-server
Server Details
Global weather via Open-Meteo: forecast, historical, marine, air quality, geocoding, elevation.
- Status
- Healthy
- Uptime
- 100.0% over 46 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- cyanheads/open-meteo-mcp-server
- GitHub Stars
- 8
- Server Listing
- open-meteo-mcp-server
TDQS
Scored across 11 tools
Each weather data tool targets a distinct domain (forecast, historical, marine, air quality, ensemble, flood, climate, elevation, location search), while the two dataframe tools are clearly complementary for inspecting and querying staged results. The separation is unambiguous, even where forecast and historical overlap in time ranges, as descriptions clearly delineate their roles.
All tools follow a consistent 'openmeteo_<verb>_<noun>' pattern, with clear action verbs like get_ and search_, and two dataframe tools using dataframe_describe/query. This creates a predictable structure that makes tool selection straightforward.
With 11 tools, the server is well-scoped for a weather data API. Each tool covers a distinct data source or capability, and the count is within the ideal range for a focused server, avoiding both redundancy and bloat.
The tool surface covers the full range of weather data retrieval needs: forecast, historical, marine, air quality, ensemble, flood, climate, elevation, and location search. It also includes dataframe inspection/query for handling large result sets, making it functionally complete for the stated purpose.
Available Tools
11 toolsopenmeteo_dataframe_describeOpenmeteo Dataframe DescribeARead-onlyIdempotentInspect
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 | Required | Description | Default |
|---|---|---|---|
| canvas_id | 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 truncated: true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| tables | No | Tables and views registered on this canvas. |
| canvas_id | No | Canvas ID that was inspected. |
| expires_at | No | ISO 8601 expiry after the sliding 24 h TTL. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and idempotentHint=true, so the description is not required to restate those. It adds behavioral context by explaining that this is a discovery step and that the tool returns table/column listings, which is more than the annotations provide. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no filler. The first sentence states the action and resource, the second gives the usage directive. The essential information is front-loaded and every word contributes value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple describe tool with one parameter, complete schema documentation, an output schema, and read-only/idempotent annotations, the description covers what it does, when to use it, and the prerequisite tools. Nothing essential is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the canvas_id parameter has a detailed description mentioning which tools return it when truncated: true. The description adds no further parameter-specific meaning beyond restating the staging tools, which is already partially in the schema. With high schema coverage, the baseline is 3, and the description doesn't exceed it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and a specific resource ('tables and their columns on a DataCanvas'), and it enumerates the exact staging tools that produce the DataCanvas. This clearly distinguishes it from the sibling query tool and any getter tool, leaving no ambiguity about what it does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly instructs the agent to 'Call this first to discover table names before querying with openmeteo_dataframe_query.' This gives a clear when-to-use directive and names the follow-up tool, providing strong usage guidance without needing to spell out when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openmeteo_dataframe_queryOpenmeteo Dataframe QueryARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | 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 month ORDER BY month | |
| canvas_id | 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 truncated: true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | No | Result rows — a preview capped at 100. When row_count exceeds this, page the rest by re-issuing the SQL with LIMIT / OFFSET. |
| error | No | Present when the call failed. Absent on success. |
| canvas_id | No | Canvas ID that was queried. |
| row_count | No | Total rows in the full result before any cap. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description reinforces this with 'read-only SQL SELECT', so there is no contradiction. The description adds meaningful context beyond the annotation by specifying that the canvas_id must come from tools that returned truncation (truncated: true), and that the table_name must match exactly. This is useful behavioral information about prerequisites and usage constraints. It doesn't cover error handling or limits, but given the read-only annotation, the description is sufficiently transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each with a distinct purpose: the first states the primary action and source of data, the second explains the two required inputs (canvas_id and table_name), and the third points to the sibling tool for discovery. Front-loaded with the core purpose, no fluff, and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool that runs SQL on staged tables, the description covers the essential workflow: where the data comes from (the listed openmeteo_get_* tools), the prerequisite (canvas_id when truncated: true), how to reference tables (exact table_name), and how to discover names (via describe). The output schema exists, so return values need not be described. Nothing critical for an agent to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with both parameters having detailed descriptions in the schema itself. The sql parameter description includes an example query and reference to describe, and canvas_id description mentions the tools and truncation condition. The tool description largely echoes these points without adding new parameter-level semantics. The baseline of 3 applies because the schema already carries the explanatory weight; the description adds minimal extra meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource: 'Run a read-only SQL SELECT against tables staged on a DataCanvas'. It also names the specific tools that stage the tables, which distinguishes it from the sibling openmeteo_dataframe_describe (which lists tables) and the various openmeteo_get_* tools (which fetch data). The purpose is unambiguous and specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly routes the agent to the alternative tool when needed: 'Call openmeteo_dataframe_describe to list staged tables and their columns when you need to discover names.' This clearly separates discovery (describe) from querying (this tool). It also implies the prerequisite (canvas_id from truncated spills) and the condition for using this tool. No ambiguity about when to use it versus siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openmeteo_get_air_qualityOpenmeteo Get Air QualityARead-onlyIdempotentInspect
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. 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 reports how often that value updates (3600 seconds 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 | Required | Description | Default |
|---|---|---|---|
| end_date | No | 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. | |
| latitude | Yes | Latitude in decimal degrees. Use openmeteo_search_locations to resolve a place name. | |
| timezone | No | IANA timezone or "auto". Default "auto". | auto |
| canvas_id | No | 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 any row count — it spills to this canvas: pass the returned token to openmeteo_dataframe_describe to list the staged table and its columns, then to openmeteo_dataframe_query to run SQL against it. Omit to create a fresh canvas. | |
| longitude | Yes | Longitude in decimal degrees. | |
| past_days | No | 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 | No | 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 series (european_aqi starts with it). Requires end_date — the pair must be sent together, and neither combines with forecast_days or past_days. | |
| forecast_days | No | 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 | No | 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. | |
| current_variables | No | 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 requesting an hourly series and picking a row; the returned interval reports the update cadence, 3600 seconds on this endpoint. Satisfies the variable requirement on its own. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| hourly | No | 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_aqi as index values. When truncated, contains only a preview — query canvas_id for the full dataset when one is present. |
| notice | No | 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 whose requested window falls outside the CAMS archive, with the timestamps that do carry values; and, when the result spilled, either the canvas and table holding the full row set plus the two dataframe tools that read it, or — with DataCanvas disabled — why there is no canvas_id and how to reach the rows the preview omits. |
| current | No | 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. |
| latitude | No | Snapped latitude |
| timezone | No | Resolved IANA timezone |
| canvas_id | No | 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 response carries. Pass to openmeteo_dataframe_describe to list the staged table and its columns, then to openmeteo_dataframe_query to run SQL against it. |
| longitude | No | Snapped longitude |
| truncated | No | 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 there is no canvas_id, and the omitted rows are reached only by narrowing the request. |
| table_name | No | 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. |
| data_source | No | Data source identifier — this is modeled CAMS data, forecast or archive, not measured station data. |
| hourly_units | No | Variable → unit string for hourly data (e.g., {"pm2_5": "μg/m³", "european_aqi": "EAQI"}). |
| record_count | No | Total number of hourly records — the full upstream total when truncated is true, not the length of the hourly preview. |
| current_units | No | 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 requested. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint, idempotentHint) already establish the safety profile, so the description's job is to add behavioral context — and it does, extensively: modeled-not-measured data, nulls before August 2022, us_aqi lagging a day, lone date rejection, current_variables returning a current object plus current_units with a 3600-second interval, and the spill-to-DataCanvas behavior with truncated: true and bounded-preview fallback. This goes well beyond the annotation hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long (~250 words) but every sentence earns its place — no filler. The most important facts (what it returns, modeled-vs-measured, window modes) are front-loaded, and the spill behavior is saved for later. It loses one point for being one undifferentiated wall of text; the density is justified, but bullet or paragraph breaks would improve scannability for an agent parsing it at runtime.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter tool with three window modes, two variable categories, a spill mechanism, and an existing output schema, the description covers everything an agent needs to select and invoke it correctly: data provenance, temporal constraints, archive boundaries, variable vocabulary, current-conditions semantics, and large-result handling. Error cases are even documented. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, setting the baseline at 3. The description still adds meaning: it enumerates the full 'common variables' list beyond the schema's abbreviated examples, explains that current_variables alone satisfies the requirement without hourly_variables, and clarifies the interval field's semantic. This is genuine added value over the schema, though the schema already carries the core constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb-resource pairing with an exhaustive list of what it returns ('Modeled CAMS air quality: PM2.5, PM10, nitrogen dioxide...'). It cleanly separates this tool from siblings like openmeteo_get_marine or openmeteo_get_flood by naming the exact domain (air quality) and the data source (CAMS). An agent can identify what this tool does within one sentence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when/when-not guidance: 'for measured data, use openaq-mcp-server' names the alternative and the condition selecting it; the three mutually exclusive time-window modes (forecast_days, past_days, start_date/end_date) are explained with their rejection semantics; and it routes spill scenarios to openmeteo_dataframe_describe/openmeteo_dataframe_query. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openmeteo_get_climateOpenmeteo Get ClimateARead-onlyIdempotentInspect
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 | Required | Description | Default |
|---|---|---|---|
| models | No | 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. temperature_2m_max_MRI_AGCM3_2_S). Omit to use the API default (a single model, unsuffixed columns). A name outside this list is sent upstream rather than rejected here. | |
| end_date | Yes | End date (YYYY-MM-DD, inclusive, max 2050-12-31). Must be on or after start_date. | |
| latitude | Yes | Latitude in decimal degrees. Use openmeteo_search_locations to resolve a place name to coordinates. | |
| timezone | No | IANA timezone or "auto". Default "auto". | auto |
| canvas_id | No | 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 to this canvas: pass the returned token to openmeteo_dataframe_describe to list the staged table and its per-model columns, then to openmeteo_dataframe_query to run SQL against it. Omit to create a fresh canvas. | |
| longitude | Yes | Longitude in decimal degrees. | |
| start_date | Yes | Start date (YYYY-MM-DD, e.g., "2049-01-01"). CMIP6 projections cover 1950-01-01 to 2050-12-31. | |
| daily_variables | No | 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. | |
| wind_speed_unit | No | Wind speed unit. Default "kmh". | kmh |
| temperature_unit | No | Temperature unit. Default "celsius". | celsius |
| precipitation_unit | No | Precipitation unit. Default "mm". | mm |
Output Schema
| Name | Required | Description |
|---|---|---|
| daily | No | 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 does not carry that variable. When truncated, contains only a preview — query canvas_id for the full dataset when one is present. |
| error | No | Present when the call failed. Absent on success. |
| models | No | Climate models requested — echoes the models parameter. Absent when models was omitted (API default model; the response carries no provenance). |
| notice | No | 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 a selected model carries no values for, with the dates that do carry values; and, when the result spilled, either the canvas and table holding the full row set plus the two dataframe tools that read it, or — with DataCanvas disabled — why there is no canvas_id and how to reach the rows the preview omits. |
| latitude | No | Snapped latitude (Open-Meteo snaps to nearest grid point) |
| timezone | No | Resolved IANA timezone |
| canvas_id | No | 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 response carries. Pass to openmeteo_dataframe_describe to list the staged table and its per-model columns, then to openmeteo_dataframe_query to run SQL against it. |
| elevation | No | Elevation at grid point (meters) |
| longitude | No | Snapped longitude |
| truncated | No | 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 there is no canvas_id, and the omitted rows are reached only by narrowing the request. |
| date_range | No | Date range of returned data |
| table_name | No | 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 this request produced. Present only alongside canvas_id. |
| daily_units | No | Column → unit string for daily data (e.g., {"temperature_2m_max_CMCC_CM2_VHR4": "°C"}). |
| record_count | No | Total number of daily records — the full upstream total when truncated is true, not the length of the daily preview. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only state readOnlyHint and idempotentHint, but the description goes far beyond: unknown model names are passed upstream rather than rejected, per-model variable suffixes, nulls for missing combinations, DataCanvas spill behavior with truncated: true, and bounded preview when canvas is disabled. This is rich behavioral context that fully compensates for what annotations do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but every sentence earns its place. It is front-loaded with the core purpose, then progressively covers models, variable naming, edge cases, and spill behavior. No filler or repetition of schema information is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 11 parameters, an output schema, and sibling tools, the description is complete: it covers the temporal range, resolution, model list, naming conventions, null behavior, error handling, and the spill-to-DataCanvas pathway. Nothing an agent needs to invoke the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers all parameters, but the description adds meaningful semantics: it explains what happens with 2+ models versus a single model, clarifies that daily_variables is required because the Climate API is daily-only, and details the canvas_id spill workflow. This goes well beyond the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource – 'Long-range climate projections from bias-corrected daily CMIP6 models' – and immediately distinguishes itself from openmeteo_get_historical ('future-projection counterpart'). It also states the date coverage and resolution, so an agent can clearly identify what this tool does and how it differs from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent when to use this tool: to answer 'what will conditions look like through 2050?', and contrasts it with openmeteo_get_historical for observed events. It further provides a follow-up workflow for large results (openmeteo_dataframe_describe and openmeteo_dataframe_query), giving clear operational context beyond mere selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openmeteo_get_elevationOpenmeteo Get ElevationARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| latitudes | Yes | Array of latitudes in decimal degrees (up to 100). Must be same length as longitudes. | |
| longitudes | Yes | Array of longitudes in decimal degrees (up to 100). Must be same length as latitudes. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| elevations | No | Elevation values in input order |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the call as read-only and idempotent. The description adds a meaningful batch constraint ('up to 100 pairs per call') and specifies the underlying model resolution (~90m), which are useful behavioral/quality traits. It does not contradict annotations and needs no side-effect disclosure since none exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, with the core definition first, a concrete limit second, and use cases last. Every sentence earns its place and the description is tight enough for quick agent parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and read-only/idempotent annotations, the description covers source, resolution, input shape, batch limit, and typical use cases. Nothing an agent needs to decide when to call or how to size a request is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully documents both arrays, their ranges, item limits, and the same-length requirement (100% coverage). The description adds only the 'coordinate pairs' framing and the 100-pair limit already present in the schema, so it provides no significant new parameter meaning; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific resource (terrain elevation from the Copernicus Digital Elevation Model) and a clear action ('Get Elevation'), making the tool's function unambiguous. It stands apart from weather/air-quality siblings by naming the data source and resolution. No ambiguity or tautology.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description lists concrete use cases (geographic context, elevation-adjusted weather interpretation, route planning), which tells an agent when this tool is relevant. It does not explicitly contrast with sibling tools or state when not to use it, so not a 5, but the intended usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openmeteo_get_ensembleOpenmeteo Get EnsembleARead-onlyIdempotentInspect
Probabilistic ensemble weather forecast — up to 64 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 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 the API default blend. 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_query. With canvas disabled they return a bounded preview instead. At least one of hourly_variables or daily_variables is required.
| Name | Required | Description | Default |
|---|---|---|---|
| models | No | 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 (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). Member counts include the control run. Omit to use the API default blend. A name outside this list is sent upstream rather than rejected here, so a model Open-Meteo adds later still works. | |
| latitude | Yes | Latitude in decimal degrees. Use openmeteo_search_locations to resolve a place name to coordinates. | |
| timezone | No | IANA timezone (e.g., "America/Los_Angeles") or "auto" to use the location's local timezone. Default "auto". | auto |
| canvas_id | No | 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 canvas: pass the returned token to openmeteo_dataframe_describe to list the staged table and its per-member columns, then to openmeteo_dataframe_query to run SQL against it. Omit to create a fresh canvas. | |
| longitude | Yes | Longitude in decimal degrees. | |
| past_days | No | Include this many days of past ensemble data before today (0–92). Default 0. | |
| forecast_days | No | Forecast horizon in days (1–16). Default 7. | |
| daily_variables | No | 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 only — an hourly name such as precipitation or temperature_2m belongs in hourly_variables and is rejected here; for a daily summary use its published aggregate (precipitation_sum, temperature_2m_max). At least one of hourly_variables or daily_variables required. | |
| wind_speed_unit | No | Wind speed unit. Default "kmh". | kmh |
| hourly_variables | No | 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 the output. Hourly names only — a daily-only aggregate such as precipitation_sum or wind_speed_10m_max belongs in daily_variables and is rejected here; temperature_2m_max and temperature_2m_min are an exception, published here as 3-hourly aggregations as well as daily. At least one of hourly_variables or daily_variables required. | |
| temperature_unit | No | Temperature unit. Default "celsius". | celsius |
| precipitation_unit | No | Precipitation unit. Default "mm". | mm |
Output Schema
| Name | Required | Description |
|---|---|---|
| daily | No | 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 canvas_id for the full dataset when one is present. |
| error | No | Present when the call failed. Absent on success. |
| model | No | Ensemble model used (e.g. "ecmwf_ifs025_ensemble") — echoes the requested models parameter. Absent when models was omitted (API default blend; the API reports no provenance). |
| hourly | No | 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. When truncated, contains a preview only — query canvas_id for the full dataset when one is present. |
| notice | No | 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 carry); recognized variables whose requested window runs past the model's horizon, with the timestamps that do carry values; and, when the result spilled, either the canvas and table holding the full row set plus the two dataframe tools that read it, or — with DataCanvas disabled — why there is no canvas_id and how to reach the rows the preview omits. |
| latitude | No | Snapped latitude (Open-Meteo snaps to nearest grid point) |
| timezone | No | Resolved IANA timezone |
| canvas_id | No | 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 response carries. Pass to openmeteo_dataframe_describe to list the staged table and its per-member columns, then to openmeteo_dataframe_query to run SQL against it. |
| elevation | No | Terrain elevation at grid point (meters) |
| longitude | No | Snapped longitude |
| truncated | No | 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 hourly and daily row, including any column the preview omits. With it disabled there is no canvas_id, and the omitted rows are reached only by narrowing the request. |
| table_name | No | 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 this request produced. Present only alongside canvas_id. |
| daily_units | No | Variable → unit string for daily data. Absent when no daily_variables were requested. |
| hourly_units | No | Variable → unit string for hourly data (e.g., {"temperature_2m_member01": "°C"}). Absent when no hourly_variables were requested. |
| member_count | No | 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. |
| record_count | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and idempotentHint=true, and the description adds substantial behavioral context beyond that: the member-suffix column naming convention, the coverage-gap error behavior (input error, not transient failure, so don't retry), the spill-to-DataCanvas behavior with truncated: true and canvas_id/table_name, the bounded preview when canvas is disabled, and the requirement that at least one of hourly_variables or daily_variables be present. It also discloses that unknown model names are passed upstream rather than rejected. This is rich, non-obvious behavioral disclosure that an agent needs to call the tool correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but information-dense, and every sentence earns its place: the member-suffix format, the model list with member counts and coverage, the coverage-gap error semantics, the unknown-model passthrough, the DataCanvas spill behavior, and the variable requirement. The most important facts (what it is, member count, horizon, past_days) are front-loaded. It loses one point because the model list is duplicated almost verbatim in the schema's models parameter description, and the description could have compressed that repetition without losing value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (12 parameters, 19 model options, multi-member output, spill behavior) and the presence of a rich output schema, the description covers everything an agent needs to select and invoke it correctly: the required variables constraint, the model coverage caveat, the large-result spill path with named sibling tools, and the error semantics. The output schema exists, so the description needn't enumerate return fields. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds value beyond the schema by explaining the member-suffix output format for variables, the distinction between hourly and daily variable names (including the temperature_2m_max/min exception), and the coverage-gap behavior tied to model choice. It also explains the canvas_id spill mechanism in more operational detail than the schema. The description doesn't add much beyond the schema for latitude/longitude/timezone/units, but the schema already covers those well. A 4 is warranted because the description meaningfully compensates for the most complex parameters (models, hourly_variables, daily_variables, canvas_id).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Probabilistic ensemble weather forecast' and immediately distinguishes it from siblings by stating the ensemble-member structure and the use case (exceedance probabilities, uncertainty quantification). It names the sibling openmeteo_get_forecast implicitly by being the ensemble variant, and the model list plus member-suffix column format makes the tool's identity unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: use the spread across members for exceedance probabilities and uncertainty quantification. It also gives explicit when-not-to-use guidance: regional models return no data outside their coverage and should not be retried; pick a global model or move the coordinate. It names the sibling tools openmeteo_dataframe_describe and openmeteo_dataframe_query for large results, and openmeteo_search_locations is referenced in the schema for resolving coordinates. This is comprehensive routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openmeteo_get_floodOpenmeteo Get FloodARead-onlyIdempotentInspect
GloFAS (Global Flood Awareness System) river discharge forecast and historical reanalysis. Returns daily ensemble river discharge (m³/s) for the largest modeled river within 5 km of the given coordinates — no river ID needed. That river is not always the closest one: at 5 km resolution a point near a confluence or a pair of parallel channels can resolve to an unintended reach. When the returned discharge looks unrepresentative for the intended river, Open-Meteo suggests varying the coordinate by about 0.1° and comparing the values. Forecast horizon up to 210 days ahead; reanalysis history back to 1984-01-01. One mode per call: forecast_days for the future outlook, or start_date and end_date together for reanalysis history. The two modes 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). Returns null for coordinates far from any river or in areas without GloFAS coverage. A wide reanalysis range produces thousands of daily records and spills 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 it returns a bounded preview instead.
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | No | End date for historical reanalysis (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. | |
| latitude | Yes | Latitude in decimal degrees. Discharge is returned for the largest modeled river within 5 km of this point — no river ID required, and not necessarily the closest river. Vary the coordinate by about 0.1° and compare when the result looks unrepresentative. Use openmeteo_search_locations to resolve a place name. | |
| timezone | No | IANA timezone or "auto". Default "auto". | auto |
| canvas_id | No | DataCanvas token for wide reanalysis 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 canvas: pass the returned token to openmeteo_dataframe_describe to list the staged table and its columns, then to openmeteo_dataframe_query to run SQL against it. Omit to create a fresh canvas. | |
| longitude | Yes | Longitude in decimal degrees. With latitude it selects the largest modeled river within 5 km, which is not necessarily the closest one. | |
| start_date | No | Start date for historical reanalysis (YYYY-MM-DD, e.g., "2023-01-01"). GloFAS reanalysis covers from 1984-01-01. Requires end_date — the pair must be sent together, and neither combines with forecast_days. | |
| forecast_days | No | Number of forecast days ahead (1–210). Mutually exclusive with start_date/end_date — omit it entirely when pulling a historical range. | |
| daily_variables | No | Daily discharge variables to fetch (e.g., ["river_discharge", "river_discharge_p25", "river_discharge_p75", "river_discharge_min", "river_discharge_max"]). Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| daily | No | Per-day records with "time" (YYYY-MM-DD) + one key per requested variable containing discharge in m³/s, or null for coordinates outside GloFAS coverage. When truncated, contains only a preview — query canvas_id for the full dataset when one is present. |
| error | No | Present when the call failed. Absent on success. |
| notice | No | 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 variables whose requested range falls outside the coordinate's discharge record, with the dates that do carry values; and, when the result spilled, either the canvas and table holding the full row set plus the two dataframe tools that read it, or — with DataCanvas disabled — why there is no canvas_id and how to reach the rows the preview omits. |
| latitude | No | Snapped latitude — grid point of the selected river |
| timezone | No | Resolved IANA timezone |
| canvas_id | No | 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 response carries. Pass to openmeteo_dataframe_describe to list the staged table and its columns, then to openmeteo_dataframe_query to run SQL against it. |
| longitude | No | Snapped longitude — grid point of the selected river |
| truncated | No | 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 there is no canvas_id, and the omitted rows are reached only by narrowing the request. |
| table_name | No | 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. |
| daily_units | No | Variable → unit string for daily data (e.g., {"river_discharge": "m³/s"}). |
| record_count | No | Total number of daily discharge records — the full staged count when truncated is true, not the length of the daily preview. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint and idempotentHint, and the description adds substantial behavioral context beyond those: the modeled river is not necessarily the closest, results can be null for uncovered areas, horizon limits and reanalysis start year, mutual-exclusion rejection, and the DataCanvas spill behavior with truncated: true, canvas_id, and table_name. There is no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place: core output first, then the subtle river-selection caveat, mode rules, variables, null behavior, and spill handling. It is logically sequenced and contains no filler or boilerplate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 8-parameter complexity, an output schema, and rich sibling tools, the description covers everything an agent needs: mode exclusivity, variable meanings, null cases, forecast/reanalysis limits, and the large-result DataCanvas workflow. The output schema handles return-shape details, so the description does not need to repeat them.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the schema already documents each parameter thoroughly. The description adds a useful summary of the variable set and mode constraints, but mostly restates semantics already present in the input schema rather than contributing new per-parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'GloFAS river discharge forecast and historical reanalysis,' and states exactly what is returned: 'daily ensemble river discharge (m³/s)'. The 5 km river-selection behavior and the list of available discharge variables distinguish this tool from sibling weather, climate, and air-quality getters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly describes the two mutually exclusive calling modes (forecast_days vs start_date/end_date), states that a lone date is rejected, and gives concrete follow-up guidance: inspect spilled results with openmeteo_dataframe_describe and query them with openmeteo_dataframe_query. It also suggests varying coordinates by ~0.1° when the selected river looks unrepresentative, and the schema points to openmeteo_search_locations for place-name resolution.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openmeteo_get_forecastOpenmeteo Get ForecastARead-onlyIdempotentInspect
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 the archive’s ERA5 components lag by up to ~5 days. 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. 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 | Required | Description | Default |
|---|---|---|---|
| latitude | Yes | Latitude in decimal degrees (e.g., 47.6062 for Seattle). Use openmeteo_search_locations to resolve a place name to coordinates. | |
| timezone | No | 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. | auto |
| canvas_id | No | 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 — it spills to this canvas: pass the returned token to openmeteo_dataframe_describe to list the staged table and its columns, then to openmeteo_dataframe_query to run SQL against it. Omit to create a fresh canvas. | |
| longitude | Yes | Longitude in decimal degrees (e.g., -122.3321 for Seattle). | |
| past_days | No | Include this many days of past data before today (0–92). Use for recent history — the archive’s ERA5 components lag by up to ~5 days. Default 0. | |
| forecast_days | No | Number of forecast days (1–16). Default 7. | |
| daily_variables | No | 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 cloud_cover or temperature_2m belongs in hourly_variables and is rejected here; for a daily summary of an hourly variable use its published aggregate (cloud_cover_max, cloud_cover_mean, cloud_cover_min). At least one of current_variables, hourly_variables, or daily_variables is required. | |
| wind_speed_unit | No | Wind speed unit: "kmh" (km/h), "mph", "ms" (m/s), or "kn" (knots). Default "kmh". | kmh |
| hourly_variables | No | 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 aggregate such as temperature_2m_max or precipitation_sum belongs in daily_variables and is rejected here. At least one of current_variables, hourly_variables, or daily_variables is required. | |
| temperature_unit | No | Temperature unit. Default "celsius". | celsius |
| current_variables | No | 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 it doing right now?" without requesting an hourly series and picking a row. Takes the hourly variable names; a daily-only name such as temperature_2m_max comes back null with the unit "undefined" and is reported in the notice. Satisfies the variable requirement on its own. | |
| precipitation_unit | No | Precipitation unit: "mm" or "inch". Default "mm". | mm |
Output Schema
| Name | Required | Description |
|---|---|---|
| daily | No | Per-day records. Each object has a "time" field (YYYY-MM-DD) plus one key per requested variable with its value. Units are in the daily_units map. Absent when only hourly_variables were requested. When truncated, contains only a preview — query canvas_id for the full dataset when one is present. |
| error | No | Present when the call failed. Absent on success. |
| hourly | No | Per-hour records. Each object has a "time" field (ISO 8601) plus one key per requested variable with its value. Units are in the hourly_units map. Absent when only daily_variables were requested. When truncated, contains only a preview — query canvas_id for the full dataset when one is present. |
| notice | No | 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 cadence); recognized variables whose requested window falls outside the data's coverage, with the timestamps that do carry values; and, when the result spilled, either the canvas and table holding the full row set plus the two dataframe tools that read it, or — with DataCanvas disabled — why there is no canvas_id and how to reach the rows the preview omits. |
| current | No | 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. |
| latitude | No | Snapped latitude (Open-Meteo snaps to nearest grid point) |
| timezone | No | Resolved IANA timezone |
| canvas_id | No | 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 response carries. Pass to openmeteo_dataframe_describe to list the staged table and its columns, then to openmeteo_dataframe_query to run SQL against it. |
| elevation | No | Terrain elevation at grid point (meters) |
| longitude | No | Snapped longitude |
| truncated | No | 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 hourly and daily row, including any column the preview omits. With it disabled there is no canvas_id, and the omitted rows are reached only by narrowing the request. |
| table_name | No | 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. |
| daily_units | No | Map of variable name → unit string for daily data. Absent when no daily_variables were requested. |
| hourly_units | No | Map of variable name → unit string for hourly data (e.g., {"temperature_2m": "°C", "precipitation": "mm"}). Absent when no hourly_variables were requested. |
| record_count | No | 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. |
| current_units | No | 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 were requested. |
| utc_offset_seconds | No | UTC offset in seconds for this timezone at query time |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is known. The description adds substantial behavioral detail: the per-timestamp record format, the exact spill behavior with truncated:true and canvas_id/table_name, the note that daily-only names in current_variables return null with 'undefined' unit and are reported in the notice, and the precision advantage of 15-minute current data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place. It fronts the core purpose, then flows logically through usage guidance, return format, variable lists, current conditions, canvas behavior, and the mandatory requirement. No redundancy or filler; the length is justified by the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter tool with output schema and canvas integration, the description covers all essential aspects: return structure, spill handling, variable groupings, unit defaults (left to schema), and the requirement of at least one variable group. It also references the sibling tools needed to continue the workflow, leaving no gap an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds meaning well beyond the schema. It explains the ERA5 lag for past_days, the rejection of hourly names in daily_variables (and vice versa) with guidance to use aggregates, the canvas token usage for wide queries, and the null/notice behavior for invalid current_variables. This is far more than restating the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise statement of the tool's function: '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.' It names the verb (get forecast), the resource (coordinates), and the scope (variables and time range), clearly distinguishing it from siblings like openmeteo_get_historical and openmeteo_get_climate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly routes the agent: 'Use past_days instead of openmeteo_get_historical for dates within the last 1–5 days, since the archive’s ERA5 components lag by up to ~5 days.' It also explains when to leverage the canvas spill and the follow-up tools (openmeteo_dataframe_describe/query), and clarifies that current_variables is preferable to picking an hourly row for instantaneous conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openmeteo_get_historicalOpenmeteo Get HistoricalARead-onlyIdempotentInspect
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 5-day delay, while IFS HRES has none, so for the last few days 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, 5 days delay), era5_land (global 0.1° (~11 km), daily, 5 days delay), era5_ensemble (global 0.5° (~55 km), daily, 5 days 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 | Required | Description | Default |
|---|---|---|---|
| models | No | 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 days delay), era5_seamless (ERA5 and ERA5-Land combined), era5 (global 0.25° (~25 km), daily, 5 days delay), era5_land (global 0.1° (~11 km), daily, 5 days delay), era5_ensemble (global 0.5° (~55 km), daily, 5 days delay), cerra (Europe only, 5 km, no real-time updates). Omit to use Open-Meteo's Best Match default, which blends IFS HRES, ERA5, and ERA5-Land — pin a model instead when a consistent source matters across the range. With 2+ models each variable column is suffixed with the model name. cerra covers Europe only and is rejected as a coverage gap elsewhere. A name outside this list is sent upstream rather than rejected here. | |
| end_date | 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. | |
| latitude | Yes | Latitude in decimal degrees. Use openmeteo_search_locations to resolve a place name to coordinates. | |
| timezone | No | IANA timezone or "auto". Default "auto". | auto |
| canvas_id | No | 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 spills to this canvas: pass the returned token to openmeteo_dataframe_describe to list the staged table and its columns, then to openmeteo_dataframe_query to run SQL against it. Omit to create a fresh canvas. | |
| longitude | Yes | Longitude in decimal degrees. | |
| start_date | 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 5 days behind, IFS HRES is current. | |
| daily_variables | No | 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 belongs in hourly_variables and is rejected here; for a daily summary of an hourly variable use its published aggregate (cloud_cover_max, cloud_cover_mean, cloud_cover_min). At least one of hourly_variables or daily_variables required. | |
| wind_speed_unit | No | Wind speed unit. Default "kmh". | kmh |
| hourly_variables | No | 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 temperature_2m_max or precipitation_sum belongs in daily_variables and is rejected here. At least one of hourly_variables or daily_variables required. | |
| temperature_unit | No | Temperature unit. Default "celsius". | celsius |
| precipitation_unit | No | Precipitation unit. Default "mm". | mm |
Output Schema
| Name | Required | Description |
|---|---|---|
| daily | No | 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 present. |
| error | No | Present when the call failed. Absent on success. |
| hourly | No | 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 present. |
| models | No | 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 date. |
| notice | No | 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); recognized variables whose requested window falls outside the data's coverage, with the timestamps that do carry values; and, when the result spilled, either the canvas and table holding the full row set plus the two dataframe tools that read it, or — with DataCanvas disabled — why there is no canvas_id and how to reach the rows the preview omits. |
| latitude | No | Snapped latitude |
| timezone | No | Resolved IANA timezone |
| canvas_id | No | 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 response carries. Pass to openmeteo_dataframe_describe to list the staged table and its columns, then to openmeteo_dataframe_query to run SQL against it. |
| elevation | No | Elevation at grid point (meters) |
| longitude | No | Snapped longitude |
| truncated | No | 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 hourly and daily row, including any column the preview omits. With it disabled there is no canvas_id, and the omitted rows are reached only by narrowing the request. |
| date_range | No | Date range of returned data |
| table_name | No | 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. |
| daily_units | No | Variable → unit string for daily data. Absent when no daily_variables were requested. |
| hourly_units | No | Variable → unit string for hourly data (e.g., {"temperature_2m": "°C", "precipitation": "mm"}). Absent when no hourly_variables were requested. |
| record_count | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses behavioral traits beyond annotations: it explains that omitting models results in Best Match blending sources with variable update lags, describes the canvas spill mechanism and truncation behavior, and details model update frequencies and delays. It also notes that cerra is rejected outside Europe. This aligns with readOnlyHint and idempotentHint, with no contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but densely packed with useful information, structured logically from purpose to requirements to model details to canvas behavior. It front-loads the core purpose and requirements, and while verbose, the complexity of the tool justifies the length. No wasted sentences, but it could be tightened slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (12 parameters, 8 models, canvas spill behavior), the description is remarkably complete. It covers return behavior (canvas vs. preview), model selection guidance, coverage limits, and required parameters. The presence of an output schema also helps, but the description itself covers all critical usage scenarios, including edge cases like recent data and wide multi-variable pulls.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds extra semantics: it emphasizes the requirement of at least one of hourly_variables or daily_variables (not in schema's required list), explains the consequence of omitting models (Best Match blending), and provides guidance on pinning models for consistency. This elevates it above baseline, but much of the model detail is duplicated from the schema, so it doesn't earn a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it provides historical weather from the Open-Meteo reanalysis archive (1940–present), specifying the verb (get historical weather) and resource. It also differentiates from siblings by noting it uses the same variable names as the forecast API, making it easy to distinguish from openmeteo_get_forecast and others.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly gives usage guidance: requires start_date and end_date, at least one of hourly_variables or daily_variables, and offers a clear alternative for recent data ('for the last few days either request models: ["ecmwf_ifs"] or use openmeteo_get_forecast with past_days'). It also explains when canvas spilling occurs and how to handle it, and mentions model-specific coverage constraints like cerra being Europe-only.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openmeteo_get_marineOpenmeteo Get MarineARead-onlyIdempotentInspect
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 inland waters return near-zero wave values. 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. 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 | Required | Description | Default |
|---|---|---|---|
| end_date | No | 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. | |
| latitude | Yes | Latitude of a coastal or ocean point. Use openmeteo_search_locations to resolve a place name. Inland points return near-zero wave values. | |
| timezone | No | IANA timezone or "auto". Default "auto". | auto |
| canvas_id | No | 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 any row count — it spills to this canvas: pass the returned token to openmeteo_dataframe_describe to list the staged table and its columns, then to openmeteo_dataframe_query to run SQL against it. Omit to create a fresh canvas. | |
| longitude | Yes | Longitude in decimal degrees. | |
| past_days | No | 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 | No | 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_days or past_days. | |
| forecast_days | No | 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. | |
| daily_variables | No | 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 rejected here; for a daily summary use its published aggregate (wave_height_max). At least one of hourly_variables or daily_variables required. | |
| hourly_variables | No | 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_direction_dominant belongs in daily_variables and is rejected here. At least one of hourly_variables or daily_variables required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| daily | No | Per-day summary records with "time" (YYYY-MM-DD) + variable keys (e.g., wave_height_max in meters, wave_direction_dominant in degrees, wave_period_max in seconds). Absent when only hourly_variables were requested. When truncated, contains only a preview — query canvas_id for the full dataset when one is present. |
| error | No | Present when the call failed. Absent on success. |
| hourly | No | Per-hour records with "time" (ISO 8601) + one key per requested variable (e.g., wave_height in meters, wave_direction in degrees, wave_period in seconds). Absent when only daily_variables were requested. When truncated, contains only a preview — query canvas_id for the full dataset when one is present. |
| notice | No | 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 whose requested window falls outside the data's coverage, with the timestamps that do carry values; and, when the result spilled, either the canvas and table holding the full row set plus the two dataframe tools that read it, or — with DataCanvas disabled — why there is no canvas_id and how to reach the rows the preview omits. |
| latitude | No | Snapped latitude |
| timezone | No | Resolved IANA timezone |
| canvas_id | No | 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 response carries. Pass to openmeteo_dataframe_describe to list the staged table and its columns, then to openmeteo_dataframe_query to run SQL against it. |
| longitude | No | Snapped longitude |
| truncated | No | 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 hourly and daily row, including any column the preview omits. With it disabled there is no canvas_id, and the omitted rows are reached only by narrowing the request. |
| table_name | No | 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. |
| daily_units | No | Variable → unit string for daily data. Absent when no daily_variables were requested. |
| hourly_units | No | Variable → unit string for hourly data (e.g., {"wave_height": "m", "wave_period": "s"}). Absent when no hourly_variables were requested. |
| record_count | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the bar is partially met, and the description adds substantial behavioral detail beyond that: date range and forecast_days are mutually exclusive, a lone start_date or end_date is rejected, wide results spill to a DataCanvas with truncated: true, and bounded previews appear when canvas is disabled. It also discloses that ocean_current_velocity is null for non-open-ocean coordinates and that inland points return near-zero values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence carries operational value for a complex 10-parameter tool, and it is front-loaded with the core purpose. Structure could be improved with clearer separation of windows, variables, and spill behavior, but the density is justified by the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complex parameter interactions, output spill behavior, and sibling tools for post-processing, the description covers everything an agent needs: date-window rules, variable families, output record shape, open-ocean applicability, and the DataCanvas workflow. It is complete even though an output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, and the description adds meaningful conceptual semantics on top: it groups common hourly vs daily variables, explains the archive window behavior, and ties canvas_id to the spill mechanism. It avoids repeating every schema field while reinforcing the most important parameter relationships.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Marine wave and ocean conditions for a coastal or ocean coordinate,' and lists concrete variables such as wave height, wave period, and sea-surface temperature. It clearly distinguishes this marine domain from the sibling air-quality, climate, and forecast tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear when-to-use guidance: 'Best for open-ocean and coastal exposed points — sheltered inland waters return near-zero wave values.' It also explains when to use archive ranges vs past_days vs forecast_days and when a spill to openmeteo_dataframe_describe/query occurs. It does not explicitly name a domain alternative tool, but the usage conditions are otherwise strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openmeteo_search_locationsOpenmeteo Search LocationsARead-onlyIdempotentInspect
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 | Required | Description | Default |
|---|---|---|---|
| name | 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 disambiguate. A one- or two-character native-script name ("서울", "大阪") needs the full administrative name ("서울특별시", "大阪市") or the romanized name ("Seoul", "Osaka") — see the language field. Weather tools require coordinates — use the lat/lon from this result. | |
| count | No | Max results to return (1–10). Default 5. Return more when disambiguating common names like "Springfield" or "Portland". | |
| country | No | ISO 3166-1 alpha-2 country code (e.g. "US", "FR") to disambiguate places that share a name. Omit for a global search. | |
| language | No | 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. language "zh" for "上海", "ru" for "Москва". This resolves a native-script name of three or more characters, which is matched by normalized prefix; a one- or two-character name must equal an index entry exactly, so setting language alone will not find "서울" or "大阪" — retry those with the full administrative name ("서울특별시", "大阪市") or the romanized name ("Seoul", "Osaka"). Default "en"; a query in a recognized non-Latin script (CJK, Hangul, Cyrillic, Arabic, Greek, Hebrew, Thai, Devanagari) that misses under "en" is retried once with the language inferred from its script. | en |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | Number of results returned |
| error | No | Present when the call failed. Absent on success. |
| notice | No | 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 unrelated small feature and never surfaces the modern city. Names the returned place, country, and feature_code, and asks the caller to verify the coordinates or retry with the place’s current official name. Never changes results or count. |
| results | No | Ranked matches (most relevant first). Never empty — when nothing matches, the tool fails with no_results instead of returning an empty array. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation already declares readOnlyHint and idempotentHint, and the description goes well beyond that by explaining matching behavior: returns up to 10 ranked matches, normalized-prefix matching for 3+ character names, exact-match requirements for 1-2 character names, a single automatic retry with inferred language for non-Latin scripts, and the role of admin1 as a result field rather than an input.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: it leads with purpose and prerequisite status, then covers the critical usage rule, disambiguation strategy, and language edge cases. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema is present downstreamable and annotations already cover safety, the description provides all the operational context needed to invoke the tool correctly: when it is required, how to avoid common naming mistakes, how to disambiguate, and how language affects matching. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with highly detailed parameter descriptions, so the baseline is 3. The tool description adds incremental meaning by clearly stating that admin1 is only a result field for selecting among matches, never a search input, and by underscoring that the country input is the correct disambiguation mechanism rather than folding qualifiers into name. This is meaningful, though much of the parameter guidance already lives in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Resolve a place name to ranked coordinate matches with country, region, elevation, timezone, and population.' It also distinguishes this tool from the weather siblings by noting all weather tools take coordinates rather than place names, making its role unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly frames this tool as a 'Required prerequisite for name-based queries' and states that all weather tools take latitude/longitude, not place names. It gives concrete do/don't guidance for the main parameter ('Baoding', not 'Baoding Hebei'; 'Paris', not 'Paris, France'), and explains when to use country, count, and language to disambiguate or handle native scripts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
- Changed
openmeteo_dataframe_describe2 fields changed- added
Input schema / properties / canvas_id / patternAdded value: +"^[A-Za-z0-9_-]{10}$" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `canvas_not_enabled`: CANVAS_PROVIDER_TYPE is not set to duckdb `canvas_not_found`: The canvas_id is unknown or has expired (TTL is 24 h sliding) Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `canvas_not_enabled`: CANVAS_PROVIDER_TYPE is not set to duckdb. `canvas_not_found`: The canvas_id is unknown or has expired (TTL is 24 h sliding). Other values are possible when a failure originates below the handler."
- Changed
openmeteo_dataframe_query2 fields changed- added
Input schema / properties / canvas_id / patternAdded value: +"^[A-Za-z0-9_-]{10}$" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `canvas_not_enabled`: CANVAS_PROVIDER_TYPE is not set to duckdb `canvas_not_found`: The canvas_id is unknown or has expired (TTL is 24 h sliding) `system_catalog_access`: The SQL references a system catalog (information_schema, sqlite_master, pg_catalog, or a duckdb_*() function) `missing_table`: The SQL references a table that is not staged on this canvas — a mistyped name, or one that expired (24 h sliding TTL) or was dropped Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `canvas_not_enabled`: CANVAS_PROVIDER_TYPE is not set to duckdb. `canvas_not_found`: The canvas_id is unknown or has expired (TTL is 24 h sliding). `system_catalog_access`: The SQL references a system catalog (information_schema, sqlite_master, pg_catalog, or a duckdb_*() function). `missing_table`: The SQL references a table that is not staged on this canvas — a mistyped name, or one that expired (24 h sliding TTL) or was dropped. Other values are possible when a failure originates below the handler."
- Changed
openmeteo_get_air_quality2 fields changed- added
Input schema / properties / canvas_id / patternAdded value: +"^[A-Za-z0-9_-]{10}$" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_variable`: An unknown air quality variable name was requested `no_variables_requested`: Neither current_variables nor hourly_variables was provided `date_range_incomplete`: Only one of start_date / end_date was provided — the CAMS archive requires the pair together `forecast_window_conflict`: forecast_days or a non-zero past_days was combined with start_date or end_date `date_order_invalid`: end_date is before start_date `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone `request_too_large`: Open-Meteo refused the request as asking for too much data in one call Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_variable`: An unknown air quality variable name was requested. `no_variables_requested`: Neither current_variables nor hourly_variables was provided. `date_range_incomplete`: Only one of start_date / end_date was provided — the CAMS archive requires the pair together. `forecast_window_conflict`: forecast_days or a non-zero past_days was combined with start_date or end_date. `date_order_invalid`: end_date is before start_date. `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone. `request_too_large`: Open-Meteo refused the request as asking for too much data in one call. Other values are possible when a failure originates below the handler."
- Changed
openmeteo_get_climate2 fields changed- added
Input schema / properties / canvas_id / patternAdded value: +"^[A-Za-z0-9_-]{10}$" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `date_out_of_range`: start_date predates 1950-01-01 or end_date is after 2050-12-31 `date_order_invalid`: end_date is before start_date `no_variables_requested`: daily_variables was not provided or is empty `invalid_variable`: An unknown variable name or unsupported climate model was requested `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone `request_too_large`: Open-Meteo refused the request as asking for too much data in one call Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `date_out_of_range`: start_date predates 1950-01-01 or end_date is after 2050-12-31. `date_order_invalid`: end_date is before start_date. `no_variables_requested`: daily_variables was not provided or is empty. `invalid_variable`: An unknown variable name or unsupported climate model was requested. `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone. `request_too_large`: Open-Meteo refused the request as asking for too much data in one call. Other values are possible when a failure originates below the handler."
- Changed
openmeteo_get_elevation1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `coordinate_count_mismatch`: latitudes and longitudes arrays have different lengths Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `coordinate_count_mismatch`: latitudes and longitudes arrays have different lengths. Other values are possible when a failure originates below the handler."
- Changed
openmeteo_get_ensemble2 fields changed- added
Input schema / properties / canvas_id / patternAdded value: +"^[A-Za-z0-9_-]{10}$" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_variables_requested`: Neither hourly_variables nor daily_variables was provided `invalid_variable`: An unknown variable name or unsupported model was requested `variable_wrong_cadence`: A variable the ensemble API documents under one cadence was passed in the other cadence field — for example precipitation_sum in hourly_variables, or precipitation in daily_variables `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone `request_too_large`: Open-Meteo refused the request as asking for too much data in one call Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_variables_requested`: Neither hourly_variables nor daily_variables was provided. `invalid_variable`: An unknown variable name or unsupported model was requested. `variable_wrong_cadence`: A variable the ensemble API documents under one cadence was passed in the other cadence field — for example precipitation_sum in hourly_variables, or precipitation in daily_variables. `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone. `request_too_large`: Open-Meteo refused the request as asking for too much data in one call. Other values are possible when a failure originates below the handler."
- Changed
openmeteo_get_flood2 fields changed- added
Input schema / properties / canvas_id / patternAdded value: +"^[A-Za-z0-9_-]{10}$" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_variables_requested`: daily_variables was not provided or is empty `date_range_incomplete`: Only one of start_date / end_date was provided — GloFAS requires the pair together `forecast_days_conflict`: forecast_days was combined with start_date or end_date `date_order_invalid`: end_date is before start_date `date_out_of_range`: start_date predates 1984-01-01 or date range is otherwise invalid `invalid_variable`: An unknown discharge variable name was requested `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone `request_too_large`: Open-Meteo refused the request as asking for too much data in one call Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_variables_requested`: daily_variables was not provided or is empty. `date_range_incomplete`: Only one of start_date / end_date was provided — GloFAS requires the pair together. `forecast_days_conflict`: forecast_days was combined with start_date or end_date. `date_order_invalid`: end_date is before start_date. `date_out_of_range`: start_date predates 1984-01-01 or date range is otherwise invalid. `invalid_variable`: An unknown discharge variable name was requested. `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone. `request_too_large`: Open-Meteo refused the request as asking for too much data in one call. Other values are possible when a failure originates below the handler."
- Changed
openmeteo_get_forecast2 fields changed- added
Input schema / properties / canvas_id / patternAdded value: +"^[A-Za-z0-9_-]{10}$" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_variable`: An unknown variable name was requested `variable_wrong_cadence`: A variable Open-Meteo documents under one cadence was passed in the other cadence field — for example cloud_cover in daily_variables, or temperature_2m_max in hourly_variables `no_variables_requested`: None of current_variables, hourly_variables, or daily_variables was provided `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone `request_too_large`: Open-Meteo refused the request as asking for too much data in one call Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_variable`: An unknown variable name was requested. `variable_wrong_cadence`: A variable Open-Meteo documents under one cadence was passed in the other cadence field — for example cloud_cover in daily_variables, or temperature_2m_max in hourly_variables. `no_variables_requested`: None of current_variables, hourly_variables, or daily_variables was provided. `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone. `request_too_large`: Open-Meteo refused the request as asking for too much data in one call. Other values are possible when a failure originates below the handler."
- Changed
openmeteo_get_historical2 fields changed- added
Input schema / properties / canvas_id / patternAdded value: +"^[A-Za-z0-9_-]{10}$" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `date_out_of_range`: start_date predates 1940-01-01, or the requested dates fall outside the coverage of the selected model `date_order_invalid`: end_date is before start_date `no_variables_requested`: Neither hourly_variables nor daily_variables was provided `invalid_variable`: An unknown variable name or unsupported archive model was requested `variable_wrong_cadence`: A variable Open-Meteo documents under one cadence was passed in the other cadence field — for example cloud_cover in daily_variables, or temperature_2m_max in hourly_variables `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone `request_too_large`: Open-Meteo refused the request as asking for too much data in one call Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `date_out_of_range`: start_date predates 1940-01-01, or the requested dates fall outside the coverage of the selected model. `date_order_invalid`: end_date is before start_date. `no_variables_requested`: Neither hourly_variables nor daily_variables was provided. `invalid_variable`: An unknown variable name or unsupported archive model was requested. `variable_wrong_cadence`: A variable Open-Meteo documents under one cadence was passed in the other cadence field — for example cloud_cover in daily_variables, or temperature_2m_max in hourly_variables. `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone. `request_too_large`: Open-Meteo refused the request as asking for too much data in one call. Other values are possible when a failure originates below the handler."
- Changed
openmeteo_get_marine2 fields changed- added
Input schema / properties / canvas_id / patternAdded value: +"^[A-Za-z0-9_-]{10}$" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_variable`: An unknown marine variable name was requested `variable_wrong_cadence`: A variable Open-Meteo documents under one cadence was passed in the other cadence field — for example wave_height in daily_variables, or wave_height_max in hourly_variables `no_variables_requested`: Neither hourly_variables nor daily_variables was provided `date_range_incomplete`: Only one of start_date / end_date was provided — the marine archive requires the pair together `forecast_window_conflict`: forecast_days or a non-zero past_days was combined with start_date or end_date `date_order_invalid`: end_date is before start_date `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone `request_too_large`: Open-Meteo refused the request as asking for too much data in one call Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_variable`: An unknown marine variable name was requested. `variable_wrong_cadence`: A variable Open-Meteo documents under one cadence was passed in the other cadence field — for example wave_height in daily_variables, or wave_height_max in hourly_variables. `no_variables_requested`: Neither hourly_variables nor daily_variables was provided. `date_range_incomplete`: Only one of start_date / end_date was provided — the marine archive requires the pair together. `forecast_window_conflict`: forecast_days or a non-zero past_days was combined with start_date or end_date. `date_order_invalid`: end_date is before start_date. `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone. `request_too_large`: Open-Meteo refused the request as asking for too much data in one call. Other values are possible when a failure originates below the handler."
- Changed
openmeteo_search_locations1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_results`: The search returned no matching places Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_results`: The search returned no matching places. Other values are possible when a failure originates below the handler."
5 tool updates
- Changed
openmeteo_get_air_quality5 fields changed- added
Input schema / properties / current_variablesAdded value: +{ + "description": "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 requesting an hourly series and picking a row; the returned interval reports the update cadence, 3600 seconds on this endpoint. Satisfies the variable requirement on its own.", + "items": { + "type": "string" + }, + "maxItems": 50, + "type": "array" +} - changed
Input schema / properties / hourly_variables / descriptionPrevious value: -"Hourly air quality variables (e.g., [\"pm2_5\", \"pm10\", \"ozone\", \"nitrogen_dioxide\", \"european_aqi\", \"us_aqi\"]). At least one required."New value: +"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." - added
Output schema / properties / currentAdded value: +{ + "additionalProperties": { + "type": [ + "string", + "number", + "null" + ] + }, + "description": "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.", + "properties": { + "interval": { + "description": "Update cadence of the current-conditions data, in seconds (3600 = hourly on this endpoint) — metadata, not a requested variable", + "type": "number" + }, + "time": { + "description": "Timestamp of these values (ISO 8601, in the resolved timezone)", + "type": "string" + } + }, + "required": [ + "time", + "interval" + ], + "type": "object" +} - added
Output schema / properties / current_unitsAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "description": "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 requested.", + "propertyNames": { + "type": "string" + }, + "type": "object" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_variable`: An unknown air quality variable name was requested `no_variables_requested`: hourly_variables was not provided or is empty `date_range_incomplete`: Only one of start_date / end_date was provided — the CAMS archive requires the pair together `forecast_window_conflict`: forecast_days or a non-zero past_days was combined with start_date or end_date `date_order_invalid`: end_date is before start_date `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone `request_too_large`: Open-Meteo refused the request as asking for too much data in one call Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_variable`: An unknown air quality variable name was requested `no_variables_requested`: Neither current_variables nor hourly_variables was provided `date_range_incomplete`: Only one of start_date / end_date was provided — the CAMS archive requires the pair together `forecast_window_conflict`: forecast_days or a non-zero past_days was combined with start_date or end_date `date_order_invalid`: end_date is before start_date `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone `request_too_large`: Open-Meteo refused the request as asking for too much data in one call Other values are possible when a failure originates below the handler."
- Changed
openmeteo_get_flood4 fields changed- changed
Input schema / properties / latitude / descriptionPrevious value: -"Latitude in decimal degrees. The API snaps to the nearest river — no river ID required. Use openmeteo_search_locations to resolve a place name."New value: +"Latitude in decimal degrees. Discharge is returned for the largest modeled river within 5 km of this point — no river ID required, and not necessarily the closest river. Vary the coordinate by about 0.1° and compare when the result looks unrepresentative. Use openmeteo_search_locations to resolve a place name." - changed
Input schema / properties / longitude / descriptionPrevious value: -"Longitude in decimal degrees."New value: +"Longitude in decimal degrees. With latitude it selects the largest modeled river within 5 km, which is not necessarily the closest one." - changed
Output schema / properties / latitude / descriptionPrevious value: -"Snapped latitude (nearest river grid point)"New value: +"Snapped latitude — grid point of the selected river" - changed
Output schema / properties / longitude / descriptionPrevious value: -"Snapped longitude"New value: +"Snapped longitude — grid point of the selected river"
- Changed
openmeteo_get_forecast7 fields changed- added
Input schema / properties / current_variablesAdded value: +{ + "description": "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 it doing right now?\" without requesting an hourly series and picking a row. Takes the hourly variable names; a daily-only name such as temperature_2m_max comes back null with the unit \"undefined\" and is reported in the notice. Satisfies the variable requirement on its own.", + "items": { + "type": "string" + }, + "maxItems": 50, + "type": "array" +} - changed
Input schema / properties / daily_variables / descriptionPrevious value: -"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 cloud_cover or temperature_2m belongs in hourly_variables and is rejected here; for a daily summary of an hourly variable use its published aggregate (cloud_cover_max, cloud_cover_mean, cloud_cover_min). At least one of hourly_variables or daily_variables is required."New value: +"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 cloud_cover or temperature_2m belongs in hourly_variables and is rejected here; for a daily summary of an hourly variable use its published aggregate (cloud_cover_max, cloud_cover_mean, cloud_cover_min). At least one of current_variables, hourly_variables, or daily_variables is required." - changed
Input schema / properties / hourly_variables / descriptionPrevious value: -"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 aggregate such as temperature_2m_max or precipitation_sum belongs in daily_variables and is rejected here. At least one of hourly_variables or daily_variables is required."New value: +"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 aggregate such as temperature_2m_max or precipitation_sum belongs in daily_variables and is rejected here. At least one of current_variables, hourly_variables, or daily_variables is required." - changed
Input schema / properties / past_days / descriptionPrevious value: -"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."New value: +"Include this many days of past data before today (0–92). Use for recent history — the archive’s ERA5 components lag by up to ~5 days. Default 0." - added
Output schema / properties / currentAdded value: +{ + "additionalProperties": { + "type": [ + "string", + "number", + "null" + ] + }, + "description": "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.", + "properties": { + "interval": { + "description": "Update cadence of the current-conditions data, in seconds (900 = 15 minutes) — metadata, not a requested variable", + "type": "number" + }, + "time": { + "description": "Timestamp of these values (ISO 8601, in the resolved timezone)", + "type": "string" + } + }, + "required": [ + "time", + "interval" + ], + "type": "object" +} - added
Output schema / properties / current_unitsAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "description": "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 were requested.", + "propertyNames": { + "type": "string" + }, + "type": "object" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_variable`: An unknown variable name was requested `variable_wrong_cadence`: A variable Open-Meteo documents under one cadence was passed in the other cadence field — for example cloud_cover in daily_variables, or temperature_2m_max in hourly_variables `no_variables_requested`: Neither hourly_variables nor daily_variables was provided `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone `request_too_large`: Open-Meteo refused the request as asking for too much data in one call Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_variable`: An unknown variable name was requested `variable_wrong_cadence`: A variable Open-Meteo documents under one cadence was passed in the other cadence field — for example cloud_cover in daily_variables, or temperature_2m_max in hourly_variables `no_variables_requested`: None of current_variables, hourly_variables, or daily_variables was provided `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone `request_too_large`: Open-Meteo refused the request as asking for too much data in one call Other values are possible when a failure originates below the handler."
- Changed
openmeteo_get_historical6 fields changed- changed
Input schema / properties / end_date / descriptionPrevious value: -"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."New value: +"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." - changed
Input schema / properties / hourly_variables / descriptionPrevious value: -"Hourly ERA5 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 temperature_2m_max or precipitation_sum belongs in daily_variables and is rejected here. At least one of hourly_variables or daily_variables required."New value: +"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 temperature_2m_max or precipitation_sum belongs in daily_variables and is rejected here. At least one of hourly_variables or daily_variables required." - added
Input schema / properties / modelsAdded value: +{ + "description": "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 days delay), era5_seamless (ERA5 and ERA5-Land combined), era5 (global 0.25° (~25 km), daily, 5 days delay), era5_land (global 0.1° (~11 km), daily, 5 days delay), era5_ensemble (global 0.5° (~55 km), daily, 5 days delay), cerra (Europe only, 5 km, no real-time updates). Omit to use Open-Meteo's Best Match default, which blends IFS HRES, ERA5, and ERA5-Land — pin a model instead when a consistent source matters across the range. With 2+ models each variable column is suffixed with the model name. cerra covers Europe only and is rejected as a coverage gap elsewhere. A name outside this list is sent upstream rather than rejected here.", + "items": { + "type": "string" + }, + "maxItems": 8, + "type": "array" +} - changed
Input schema / properties / start_date / descriptionPrevious value: -"Start date (YYYY-MM-DD, e.g., \"2024-07-01\"). ERA5 covers from 1940-01-01 to approximately 5 days ago."New value: +"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 5 days behind, IFS HRES is current." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `date_out_of_range`: start_date predates 1940-01-01 or end_date is within the ERA5 lag window `date_order_invalid`: end_date is before start_date `no_variables_requested`: Neither hourly_variables nor daily_variables was provided `invalid_variable`: An unknown variable name was requested `variable_wrong_cadence`: A variable Open-Meteo documents under one cadence was passed in the other cadence field — for example cloud_cover in daily_variables, or temperature_2m_max in hourly_variables `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone `request_too_large`: Open-Meteo refused the request as asking for too much data in one call Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `date_out_of_range`: start_date predates 1940-01-01, or the requested dates fall outside the coverage of the selected model `date_order_invalid`: end_date is before start_date `no_variables_requested`: Neither hourly_variables nor daily_variables was provided `invalid_variable`: An unknown variable name or unsupported archive model was requested `variable_wrong_cadence`: A variable Open-Meteo documents under one cadence was passed in the other cadence field — for example cloud_cover in daily_variables, or temperature_2m_max in hourly_variables `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone `request_too_large`: Open-Meteo refused the request as asking for too much data in one call Other values are possible when a failure originates below the handler." - added
Output schema / properties / modelsAdded value: +{ + "description": "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 date.", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
openmeteo_search_locations1 field changed- added
Output schema / properties / noticeAdded value: +{ + "description": "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 unrelated small feature and never surfaces the modern city. Names the returned place, country, and feature_code, and asks the caller to verify the coordinates or retry with the place’s current official name. Never changes results or count.", + "type": "string" +}
7 tool updates
- Changed
openmeteo_get_air_quality3 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_variable`: An unknown air quality variable name was requested `no_variables_requested`: hourly_variables was not provided or is empty `date_range_incomplete`: Only one of start_date / end_date was provided — the CAMS archive requires the pair together `forecast_window_conflict`: forecast_days or a non-zero past_days was combined with start_date or end_date `date_order_invalid`: end_date is before start_date `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_variable`: An unknown air quality variable name was requested `no_variables_requested`: hourly_variables was not provided or is empty `date_range_incomplete`: Only one of start_date / end_date was provided — the CAMS archive requires the pair together `forecast_window_conflict`: forecast_days or a non-zero past_days was combined with start_date or end_date `date_order_invalid`: end_date is before start_date `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone `request_too_large`: Open-Meteo refused the request as asking for too much data in one call Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_variable", - "no_variables_requested", - "date_range_incomplete", - "forecast_window_conflict", - "date_order_invalid", - "invalid_timezone" -]New value: +[ + "invalid_variable", + "no_variables_requested", + "date_range_incomplete", + "forecast_window_conflict", + "date_order_invalid", + "invalid_timezone", + "request_too_large" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"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 whose requested window falls outside the CAMS archive, with the timestamps that do carry values; and, when the result spilled, the canvas and table holding the full row set plus the two dataframe tools that read it."New value: +"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 whose requested window falls outside the CAMS archive, with the timestamps that do carry values; and, when the result spilled, either the canvas and table holding the full row set plus the two dataframe tools that read it, or — with DataCanvas disabled — why there is no canvas_id and how to reach the rows the preview omits."
- Changed
openmeteo_get_climate3 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `date_out_of_range`: start_date predates 1950-01-01 or end_date is after 2050-12-31 `date_order_invalid`: end_date is before start_date `no_variables_requested`: daily_variables was not provided or is empty `invalid_variable`: An unknown variable name or unsupported climate model was requested `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `date_out_of_range`: start_date predates 1950-01-01 or end_date is after 2050-12-31 `date_order_invalid`: end_date is before start_date `no_variables_requested`: daily_variables was not provided or is empty `invalid_variable`: An unknown variable name or unsupported climate model was requested `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone `request_too_large`: Open-Meteo refused the request as asking for too much data in one call Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "date_out_of_range", - "date_order_invalid", - "no_variables_requested", - "invalid_variable", - "invalid_timezone" -]New value: +[ + "date_out_of_range", + "date_order_invalid", + "no_variables_requested", + "invalid_variable", + "invalid_timezone", + "request_too_large" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"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 a selected model carries no values for, with the dates that do carry values; and, when the result spilled, the canvas and table holding the full row set plus the two dataframe tools that read it."New value: +"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 a selected model carries no values for, with the dates that do carry values; and, when the result spilled, either the canvas and table holding the full row set plus the two dataframe tools that read it, or — with DataCanvas disabled — why there is no canvas_id and how to reach the rows the preview omits."
- Changed
openmeteo_get_ensemble3 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_variables_requested`: Neither hourly_variables nor daily_variables was provided `invalid_variable`: An unknown variable name or unsupported model was requested `variable_wrong_cadence`: A variable the ensemble API documents under one cadence was passed in the other cadence field — for example precipitation_sum in hourly_variables, or precipitation in daily_variables `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_variables_requested`: Neither hourly_variables nor daily_variables was provided `invalid_variable`: An unknown variable name or unsupported model was requested `variable_wrong_cadence`: A variable the ensemble API documents under one cadence was passed in the other cadence field — for example precipitation_sum in hourly_variables, or precipitation in daily_variables `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone `request_too_large`: Open-Meteo refused the request as asking for too much data in one call Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_variables_requested", - "invalid_variable", - "variable_wrong_cadence", - "invalid_timezone" -]New value: +[ + "no_variables_requested", + "invalid_variable", + "variable_wrong_cadence", + "invalid_timezone", + "request_too_large" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"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 carry); recognized variables whose requested window runs past the model's horizon, with the timestamps that do carry values; and, when the result spilled, the canvas and table holding the full row set plus the two dataframe tools that read it."New value: +"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 carry); recognized variables whose requested window runs past the model's horizon, with the timestamps that do carry values; and, when the result spilled, either the canvas and table holding the full row set plus the two dataframe tools that read it, or — with DataCanvas disabled — why there is no canvas_id and how to reach the rows the preview omits."
- Changed
openmeteo_get_flood3 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_variables_requested`: daily_variables was not provided or is empty `date_range_incomplete`: Only one of start_date / end_date was provided — GloFAS requires the pair together `forecast_days_conflict`: forecast_days was combined with start_date or end_date `date_order_invalid`: end_date is before start_date `date_out_of_range`: start_date predates 1984-01-01 or date range is otherwise invalid `invalid_variable`: An unknown discharge variable name was requested `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_variables_requested`: daily_variables was not provided or is empty `date_range_incomplete`: Only one of start_date / end_date was provided — GloFAS requires the pair together `forecast_days_conflict`: forecast_days was combined with start_date or end_date `date_order_invalid`: end_date is before start_date `date_out_of_range`: start_date predates 1984-01-01 or date range is otherwise invalid `invalid_variable`: An unknown discharge variable name was requested `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone `request_too_large`: Open-Meteo refused the request as asking for too much data in one call Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_variables_requested", - "date_range_incomplete", - "forecast_days_conflict", - "date_order_invalid", - "date_out_of_range", - "invalid_variable", - "invalid_timezone" -]New value: +[ + "no_variables_requested", + "date_range_incomplete", + "forecast_days_conflict", + "date_order_invalid", + "date_out_of_range", + "invalid_variable", + "invalid_timezone", + "request_too_large" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"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 variables whose requested range falls outside the coordinate's discharge record, with the dates that do carry values; and, when the result spilled, the canvas and table holding the full row set plus the two dataframe tools that read it."New value: +"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 variables whose requested range falls outside the coordinate's discharge record, with the dates that do carry values; and, when the result spilled, either the canvas and table holding the full row set plus the two dataframe tools that read it, or — with DataCanvas disabled — why there is no canvas_id and how to reach the rows the preview omits."
- Changed
openmeteo_get_forecast3 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_variable`: An unknown variable name was requested `variable_wrong_cadence`: A variable Open-Meteo documents under one cadence was passed in the other cadence field — for example cloud_cover in daily_variables, or temperature_2m_max in hourly_variables `no_variables_requested`: Neither hourly_variables nor daily_variables was provided `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_variable`: An unknown variable name was requested `variable_wrong_cadence`: A variable Open-Meteo documents under one cadence was passed in the other cadence field — for example cloud_cover in daily_variables, or temperature_2m_max in hourly_variables `no_variables_requested`: Neither hourly_variables nor daily_variables was provided `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone `request_too_large`: Open-Meteo refused the request as asking for too much data in one call Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_variable", - "variable_wrong_cadence", - "no_variables_requested", - "invalid_timezone" -]New value: +[ + "invalid_variable", + "variable_wrong_cadence", + "no_variables_requested", + "invalid_timezone", + "request_too_large" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"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 cadence); recognized variables whose requested window falls outside the data's coverage, with the timestamps that do carry values; and, when the result spilled, the canvas and table holding the full row set plus the two dataframe tools that read it."New value: +"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 cadence); recognized variables whose requested window falls outside the data's coverage, with the timestamps that do carry values; and, when the result spilled, either the canvas and table holding the full row set plus the two dataframe tools that read it, or — with DataCanvas disabled — why there is no canvas_id and how to reach the rows the preview omits."
- Changed
openmeteo_get_historical3 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `date_out_of_range`: start_date predates 1940-01-01 or end_date is within the ERA5 lag window `date_order_invalid`: end_date is before start_date `no_variables_requested`: Neither hourly_variables nor daily_variables was provided `invalid_variable`: An unknown variable name was requested `variable_wrong_cadence`: A variable Open-Meteo documents under one cadence was passed in the other cadence field — for example cloud_cover in daily_variables, or temperature_2m_max in hourly_variables `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `date_out_of_range`: start_date predates 1940-01-01 or end_date is within the ERA5 lag window `date_order_invalid`: end_date is before start_date `no_variables_requested`: Neither hourly_variables nor daily_variables was provided `invalid_variable`: An unknown variable name was requested `variable_wrong_cadence`: A variable Open-Meteo documents under one cadence was passed in the other cadence field — for example cloud_cover in daily_variables, or temperature_2m_max in hourly_variables `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone `request_too_large`: Open-Meteo refused the request as asking for too much data in one call Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "date_out_of_range", - "date_order_invalid", - "no_variables_requested", - "invalid_variable", - "variable_wrong_cadence", - "invalid_timezone" -]New value: +[ + "date_out_of_range", + "date_order_invalid", + "no_variables_requested", + "invalid_variable", + "variable_wrong_cadence", + "invalid_timezone", + "request_too_large" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"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); recognized variables whose requested window falls outside the data's coverage, with the timestamps that do carry values; and, when the result spilled, the canvas and table holding the full row set plus the two dataframe tools that read it."New value: +"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); recognized variables whose requested window falls outside the data's coverage, with the timestamps that do carry values; and, when the result spilled, either the canvas and table holding the full row set plus the two dataframe tools that read it, or — with DataCanvas disabled — why there is no canvas_id and how to reach the rows the preview omits."
- Changed
openmeteo_get_marine4 fields changed- changed
Output schema / properties / daily / descriptionPrevious value: -"Per-day summary records with \"time\" (YYYY-MM-DD) + variable keys (e.g., wave_height_max in meters, wave_direction_dominant in degrees, wave_period_max in seconds). When truncated, contains only a preview — query canvas_id for the full dataset when one is present."New value: +"Per-day summary records with \"time\" (YYYY-MM-DD) + variable keys (e.g., wave_height_max in meters, wave_direction_dominant in degrees, wave_period_max in seconds). Absent when only hourly_variables were requested. When truncated, contains only a preview — query canvas_id for the full dataset when one is present." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_variable`: An unknown marine variable name was requested `variable_wrong_cadence`: A variable Open-Meteo documents under one cadence was passed in the other cadence field — for example wave_height in daily_variables, or wave_height_max in hourly_variables `no_variables_requested`: Neither hourly_variables nor daily_variables was provided `date_range_incomplete`: Only one of start_date / end_date was provided — the marine archive requires the pair together `forecast_window_conflict`: forecast_days or a non-zero past_days was combined with start_date or end_date `date_order_invalid`: end_date is before start_date `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_variable`: An unknown marine variable name was requested `variable_wrong_cadence`: A variable Open-Meteo documents under one cadence was passed in the other cadence field — for example wave_height in daily_variables, or wave_height_max in hourly_variables `no_variables_requested`: Neither hourly_variables nor daily_variables was provided `date_range_incomplete`: Only one of start_date / end_date was provided — the marine archive requires the pair together `forecast_window_conflict`: forecast_days or a non-zero past_days was combined with start_date or end_date `date_order_invalid`: end_date is before start_date `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone `request_too_large`: Open-Meteo refused the request as asking for too much data in one call Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_variable", - "variable_wrong_cadence", - "no_variables_requested", - "date_range_incomplete", - "forecast_window_conflict", - "date_order_invalid", - "invalid_timezone" -]New value: +[ + "invalid_variable", + "variable_wrong_cadence", + "no_variables_requested", + "date_range_incomplete", + "forecast_window_conflict", + "date_order_invalid", + "invalid_timezone", + "request_too_large" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"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 whose requested window falls outside the data's coverage, with the timestamps that do carry values; and, when the result spilled, the canvas and table holding the full row set plus the two dataframe tools that read it."New value: +"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 whose requested window falls outside the data's coverage, with the timestamps that do carry values; and, when the result spilled, either the canvas and table holding the full row set plus the two dataframe tools that read it, or — with DataCanvas disabled — why there is no canvas_id and how to reach the rows the preview omits."
7 tool updates
- Changed
openmeteo_get_air_quality5 fields changed- changed
Input schema / properties / canvas_id / descriptionPrevious value: -"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 any row count — it spills to this canvas for SQL querying. Omit to create a fresh canvas."New value: +"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 any row count — it spills to this canvas: pass the returned token to openmeteo_dataframe_describe to list the staged table and its columns, then to openmeteo_dataframe_query to run SQL against it. Omit to create a fresh canvas." - changed
Input schema / properties / start_date / descriptionPrevious value: -"Start date for the archive range (YYYY-MM-DD, e.g., \"2024-07-01\"). Real CAMS values go back to at least 2022-10-01; earlier dates return rows of nulls. Requires end_date — the pair must be sent together, and neither combines with forecast_days or past_days."New value: +"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 series (european_aqi starts with it). Requires end_date — the pair must be sent together, and neither combines with forecast_days or past_days." - changed
Output schema / properties / canvas_id / descriptionPrevious value: -"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 response carries. Query with SQL using this token."New value: +"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 response carries. Pass to openmeteo_dataframe_describe to list the staged table and its columns, then to openmeteo_dataframe_query to run SQL against it." - changed
Output schema / properties / notice / descriptionPrevious value: -"Warning that a requested variable came back with no data — names each column whose unit is \"undefined\", which is how the endpoint reports a name it parsed but does not serve."New value: +"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 whose requested window falls outside the CAMS archive, with the timestamps that do carry values; and, when the result spilled, the canvas and table holding the full row set plus the two dataframe tools that read it." - changed
Output schema / properties / table_name / descriptionPrevious value: -"DuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only alongside canvas_id."New value: +"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."
- Changed
openmeteo_get_climate4 fields changed- changed
Input schema / properties / canvas_id / descriptionPrevious value: -"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 to this canvas for SQL querying. Omit to create a fresh canvas."New value: +"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 to this canvas: pass the returned token to openmeteo_dataframe_describe to list the staged table and its per-model columns, then to openmeteo_dataframe_query to run SQL against it. Omit to create a fresh canvas." - changed
Output schema / properties / canvas_id / descriptionPrevious value: -"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 response carries. Query with SQL using this token."New value: +"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 response carries. Pass to openmeteo_dataframe_describe to list the staged table and its per-model columns, then to openmeteo_dataframe_query to run SQL against it." - changed
Output schema / properties / notice / descriptionPrevious value: -"Warning that a requested variable came back with no data — names each column whose unit is \"undefined\", which is how the endpoint reports a name it parsed but does not serve."New value: +"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 a selected model carries no values for, with the dates that do carry values; and, when the result spilled, the canvas and table holding the full row set plus the two dataframe tools that read it." - changed
Output schema / properties / table_name / descriptionPrevious value: -"DuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only alongside canvas_id."New value: +"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 this request produced. Present only alongside canvas_id."
- Changed
openmeteo_get_ensemble4 fields changed- changed
Input schema / properties / canvas_id / descriptionPrevious value: -"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 canvas for SQL querying. Omit to create a fresh canvas."New value: +"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 canvas: pass the returned token to openmeteo_dataframe_describe to list the staged table and its per-member columns, then to openmeteo_dataframe_query to run SQL against it. Omit to create a fresh canvas." - changed
Output schema / properties / canvas_id / descriptionPrevious value: -"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 response carries. Query with SQL using this token."New value: +"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 response carries. Pass to openmeteo_dataframe_describe to list the staged table and its per-member columns, then to openmeteo_dataframe_query to run SQL against it." - changed
Output schema / properties / notice / descriptionPrevious value: -"Warning that a requested variable came back with no data across every member — names each variable whose unit is \"undefined\", which is how the endpoint reports a name the selected model does not carry."New value: +"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 carry); recognized variables whose requested window runs past the model's horizon, with the timestamps that do carry values; and, when the result spilled, the canvas and table holding the full row set plus the two dataframe tools that read it." - changed
Output schema / properties / table_name / descriptionPrevious value: -"DuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only alongside canvas_id."New value: +"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 this request produced. Present only alongside canvas_id."
- Changed
openmeteo_get_flood4 fields changed- changed
Input schema / properties / canvas_id / descriptionPrevious value: -"DataCanvas token for wide reanalysis 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 canvas for SQL querying. Omit to create a fresh canvas."New value: +"DataCanvas token for wide reanalysis 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 canvas: pass the returned token to openmeteo_dataframe_describe to list the staged table and its columns, then to openmeteo_dataframe_query to run SQL against it. Omit to create a fresh canvas." - changed
Output schema / properties / canvas_id / descriptionPrevious value: -"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 response carries. Query with SQL using this token."New value: +"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 response carries. Pass to openmeteo_dataframe_describe to list the staged table and its columns, then to openmeteo_dataframe_query to run SQL against it." - changed
Output schema / properties / notice / descriptionPrevious value: -"Warning that a requested variable came back with no data — names each column whose unit is \"undefined\", which is how the endpoint reports a name it parsed but does not serve."New value: +"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 variables whose requested range falls outside the coordinate's discharge record, with the dates that do carry values; and, when the result spilled, the canvas and table holding the full row set plus the two dataframe tools that read it." - changed
Output schema / properties / table_name / descriptionPrevious value: -"DuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only alongside canvas_id."New value: +"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."
- Changed
openmeteo_get_forecast4 fields changed- changed
Input schema / properties / canvas_id / descriptionPrevious value: -"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 — it spills to this canvas for SQL querying. Omit to create a fresh canvas."New value: +"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 — it spills to this canvas: pass the returned token to openmeteo_dataframe_describe to list the staged table and its columns, then to openmeteo_dataframe_query to run SQL against it. Omit to create a fresh canvas." - changed
Output schema / properties / canvas_id / descriptionPrevious value: -"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 response carries. Query with SQL using this token."New value: +"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 response carries. Pass to openmeteo_dataframe_describe to list the staged table and its columns, then to openmeteo_dataframe_query to run SQL against it." - changed
Output schema / properties / notice / descriptionPrevious value: -"Warning that a requested variable came back with no data — names each column whose unit is \"undefined\", which is how the endpoint reports a name it parsed but does not serve in the requested cadence."New value: +"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 cadence); recognized variables whose requested window falls outside the data's coverage, with the timestamps that do carry values; and, when the result spilled, the canvas and table holding the full row set plus the two dataframe tools that read it." - changed
Output schema / properties / table_name / descriptionPrevious value: -"DuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only alongside canvas_id."New value: +"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."
- Changed
openmeteo_get_historical4 fields changed- changed
Input schema / properties / canvas_id / descriptionPrevious value: -"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 spills to this canvas for SQL querying. Omit to create a fresh canvas."New value: +"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 spills to this canvas: pass the returned token to openmeteo_dataframe_describe to list the staged table and its columns, then to openmeteo_dataframe_query to run SQL against it. Omit to create a fresh canvas." - changed
Output schema / properties / canvas_id / descriptionPrevious value: -"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 response carries. Query with SQL using this token."New value: +"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 response carries. Pass to openmeteo_dataframe_describe to list the staged table and its columns, then to openmeteo_dataframe_query to run SQL against it." - changed
Output schema / properties / notice / descriptionPrevious value: -"Warning that a requested variable came back with no data — names each column whose unit is \"undefined\", which is how the archive reports a name it parsed but does not serve in the requested cadence."New value: +"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); recognized variables whose requested window falls outside the data's coverage, with the timestamps that do carry values; and, when the result spilled, the canvas and table holding the full row set plus the two dataframe tools that read it." - changed
Output schema / properties / table_name / descriptionPrevious value: -"DuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only alongside canvas_id."New value: +"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."
- Changed
openmeteo_get_marine4 fields changed- changed
Input schema / properties / canvas_id / descriptionPrevious value: -"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 any row count — it spills to this canvas for SQL querying. Omit to create a fresh canvas."New value: +"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 any row count — it spills to this canvas: pass the returned token to openmeteo_dataframe_describe to list the staged table and its columns, then to openmeteo_dataframe_query to run SQL against it. Omit to create a fresh canvas." - changed
Output schema / properties / canvas_id / descriptionPrevious value: -"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 response carries. Query with SQL using this token."New value: +"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 response carries. Pass to openmeteo_dataframe_describe to list the staged table and its columns, then to openmeteo_dataframe_query to run SQL against it." - changed
Output schema / properties / notice / descriptionPrevious value: -"Warning that a requested variable came back with no data — names each column whose unit is \"undefined\", which is how the endpoint reports a name it parsed but does not serve."New value: +"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 whose requested window falls outside the data's coverage, with the timestamps that do carry values; and, when the result spilled, the canvas and table holding the full row set plus the two dataframe tools that read it." - changed
Output schema / properties / table_name / descriptionPrevious value: -"DuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only alongside canvas_id."New value: +"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."
8 tool updates
- Changed
openmeteo_get_air_quality2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_variable`: An unknown air quality variable name was requested `no_variables_requested`: hourly_variables was not provided or is empty `date_range_incomplete`: Only one of start_date / end_date was provided — the CAMS archive requires the pair together `forecast_window_conflict`: forecast_days or a non-zero past_days was combined with start_date or end_date Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_variable`: An unknown air quality variable name was requested `no_variables_requested`: hourly_variables was not provided or is empty `date_range_incomplete`: Only one of start_date / end_date was provided — the CAMS archive requires the pair together `forecast_window_conflict`: forecast_days or a non-zero past_days was combined with start_date or end_date `date_order_invalid`: end_date is before start_date `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_variable", - "no_variables_requested", - "date_range_incomplete", - "forecast_window_conflict" -]New value: +[ + "invalid_variable", + "no_variables_requested", + "date_range_incomplete", + "forecast_window_conflict", + "date_order_invalid", + "invalid_timezone" +]
- Changed
openmeteo_get_climate2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `date_out_of_range`: start_date predates 1950-01-01 or end_date is after 2050-12-31 `date_order_invalid`: end_date is before start_date `no_variables_requested`: daily_variables was not provided or is empty `invalid_variable`: An unknown variable name or unsupported climate model was requested Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `date_out_of_range`: start_date predates 1950-01-01 or end_date is after 2050-12-31 `date_order_invalid`: end_date is before start_date `no_variables_requested`: daily_variables was not provided or is empty `invalid_variable`: An unknown variable name or unsupported climate model was requested `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "date_out_of_range", - "date_order_invalid", - "no_variables_requested", - "invalid_variable" -]New value: +[ + "date_out_of_range", + "date_order_invalid", + "no_variables_requested", + "invalid_variable", + "invalid_timezone" +]
- Changed
openmeteo_get_ensemble2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_variables_requested`: Neither hourly_variables nor daily_variables was provided `invalid_variable`: An unknown variable name or unsupported model was requested `variable_wrong_cadence`: A variable the ensemble API documents under one cadence was passed in the other cadence field — for example precipitation_sum in hourly_variables, or precipitation in daily_variables Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_variables_requested`: Neither hourly_variables nor daily_variables was provided `invalid_variable`: An unknown variable name or unsupported model was requested `variable_wrong_cadence`: A variable the ensemble API documents under one cadence was passed in the other cadence field — for example precipitation_sum in hourly_variables, or precipitation in daily_variables `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_variables_requested", - "invalid_variable", - "variable_wrong_cadence" -]New value: +[ + "no_variables_requested", + "invalid_variable", + "variable_wrong_cadence", + "invalid_timezone" +]
- Changed
openmeteo_get_flood2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_variables_requested`: daily_variables was not provided or is empty `date_range_incomplete`: Only one of start_date / end_date was provided — GloFAS requires the pair together `forecast_days_conflict`: forecast_days was combined with start_date or end_date `date_order_invalid`: end_date is before start_date `date_out_of_range`: start_date predates 1984-01-01 or date range is otherwise invalid `invalid_variable`: An unknown discharge variable name was requested Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_variables_requested`: daily_variables was not provided or is empty `date_range_incomplete`: Only one of start_date / end_date was provided — GloFAS requires the pair together `forecast_days_conflict`: forecast_days was combined with start_date or end_date `date_order_invalid`: end_date is before start_date `date_out_of_range`: start_date predates 1984-01-01 or date range is otherwise invalid `invalid_variable`: An unknown discharge variable name was requested `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_variables_requested", - "date_range_incomplete", - "forecast_days_conflict", - "date_order_invalid", - "date_out_of_range", - "invalid_variable" -]New value: +[ + "no_variables_requested", + "date_range_incomplete", + "forecast_days_conflict", + "date_order_invalid", + "date_out_of_range", + "invalid_variable", + "invalid_timezone" +]
- Changed
openmeteo_get_forecast2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_variable`: An unknown variable name was requested `variable_wrong_cadence`: A variable Open-Meteo documents under one cadence was passed in the other cadence field — for example cloud_cover in daily_variables, or temperature_2m_max in hourly_variables `no_variables_requested`: Neither hourly_variables nor daily_variables was provided Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_variable`: An unknown variable name was requested `variable_wrong_cadence`: A variable Open-Meteo documents under one cadence was passed in the other cadence field — for example cloud_cover in daily_variables, or temperature_2m_max in hourly_variables `no_variables_requested`: Neither hourly_variables nor daily_variables was provided `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_variable", - "variable_wrong_cadence", - "no_variables_requested" -]New value: +[ + "invalid_variable", + "variable_wrong_cadence", + "no_variables_requested", + "invalid_timezone" +]
- Changed
openmeteo_get_historical2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `date_out_of_range`: start_date predates 1940-01-01 or end_date is within the ERA5 lag window `date_order_invalid`: end_date is before start_date `no_variables_requested`: Neither hourly_variables nor daily_variables was provided `invalid_variable`: An unknown variable name was requested `variable_wrong_cadence`: A variable Open-Meteo documents under one cadence was passed in the other cadence field — for example cloud_cover in daily_variables, or temperature_2m_max in hourly_variables Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `date_out_of_range`: start_date predates 1940-01-01 or end_date is within the ERA5 lag window `date_order_invalid`: end_date is before start_date `no_variables_requested`: Neither hourly_variables nor daily_variables was provided `invalid_variable`: An unknown variable name was requested `variable_wrong_cadence`: A variable Open-Meteo documents under one cadence was passed in the other cadence field — for example cloud_cover in daily_variables, or temperature_2m_max in hourly_variables `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "date_out_of_range", - "date_order_invalid", - "no_variables_requested", - "invalid_variable", - "variable_wrong_cadence" -]New value: +[ + "date_out_of_range", + "date_order_invalid", + "no_variables_requested", + "invalid_variable", + "variable_wrong_cadence", + "invalid_timezone" +]
- Changed
openmeteo_get_marine2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_variable`: An unknown marine variable name was requested `variable_wrong_cadence`: A variable Open-Meteo documents under one cadence was passed in the other cadence field — for example wave_height in daily_variables, or wave_height_max in hourly_variables `no_variables_requested`: Neither hourly_variables nor daily_variables was provided `date_range_incomplete`: Only one of start_date / end_date was provided — the marine archive requires the pair together `forecast_window_conflict`: forecast_days or a non-zero past_days was combined with start_date or end_date Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_variable`: An unknown marine variable name was requested `variable_wrong_cadence`: A variable Open-Meteo documents under one cadence was passed in the other cadence field — for example wave_height in daily_variables, or wave_height_max in hourly_variables `no_variables_requested`: Neither hourly_variables nor daily_variables was provided `date_range_incomplete`: Only one of start_date / end_date was provided — the marine archive requires the pair together `forecast_window_conflict`: forecast_days or a non-zero past_days was combined with start_date or end_date `date_order_invalid`: end_date is before start_date `invalid_timezone`: timezone was blank, or upstream did not recognize the requested time zone Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_variable", - "variable_wrong_cadence", - "no_variables_requested", - "date_range_incomplete", - "forecast_window_conflict" -]New value: +[ + "invalid_variable", + "variable_wrong_cadence", + "no_variables_requested", + "date_range_incomplete", + "forecast_window_conflict", + "date_order_invalid", + "invalid_timezone" +]
- Changed
openmeteo_search_locations16 fields changed- changed
Input schema / properties / language / descriptionPrevious value: -"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. language \"zh\" for \"上海\", \"ru\" for \"Москва\". Default \"en\"; a query in a recognized non-Latin script (CJK, Hangul, Cyrillic, Arabic, Greek, Hebrew, Thai, Devanagari) that misses under \"en\" is retried once with the language inferred from its script."New value: +"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. language \"zh\" for \"上海\", \"ru\" for \"Москва\". This resolves a native-script name of three or more characters, which is matched by normalized prefix; a one- or two-character name must equal an index entry exactly, so setting language alone will not find \"서울\" or \"大阪\" — retry those with the full administrative name (\"서울특별시\", \"大阪市\") or the romanized name (\"Seoul\", \"Osaka\"). Default \"en\"; a query in a recognized non-Latin script (CJK, Hangul, Cyrillic, Arabic, Greek, Hebrew, Thai, Devanagari) that misses under \"en\" is retried once with the language inferred from its script." - changed
Input schema / properties / name / descriptionPrevious value: -"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 disambiguate. Weather tools require coordinates — use the lat/lon from this result."New value: +"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 disambiguate. A one- or two-character native-script name (\"서울\", \"大阪\") needs the full administrative name (\"서울특별시\", \"大阪市\") or the romanized name (\"Seoul\", \"Osaka\") — see the language field. Weather tools require coordinates — use the lat/lon from this result." - removed
Output schema / properties / results / items / properties / admin1 / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / admin1 / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / results / items / properties / admin2 / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / admin2 / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / results / items / properties / country / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / country / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / results / items / properties / country_code / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / country_code / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / results / items / properties / elevation / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / elevation / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / results / items / properties / population / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / population / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / results / items / properties / timezone / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / timezone / typeAdded value: +[ + "string", + "null" +]
11 tool updates
- Changed
openmeteo_dataframe_describe6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "canvas_id", + "tables", + "expires_at" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `canvas_not_enabled`: CANVAS_PROVIDER_TYPE is not set to duckdb `canvas_not_found`: The canvas_id is unknown or has expired (TTL is 24 h sliding) Other values are possible when a failure originates below the handler.", + "examples": [ + "canvas_not_enabled", + "canvas_not_found" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "canvas_id", - "tables", - "expires_at" -]
- Changed
openmeteo_dataframe_query6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "rows", + "row_count", + "canvas_id" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `canvas_not_enabled`: CANVAS_PROVIDER_TYPE is not set to duckdb `canvas_not_found`: The canvas_id is unknown or has expired (TTL is 24 h sliding) `system_catalog_access`: The SQL references a system catalog (information_schema, sqlite_master, pg_catalog, or a duckdb_*() function) `missing_table`: The SQL references a table that is not staged on this canvas — a mistyped name, or one that expired (24 h sliding TTL) or was dropped Other values are possible when a failure originates below the handler.", + "examples": [ + "canvas_not_enabled", + "canvas_not_found", + "system_catalog_access", + "missing_table" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "rows", - "row_count", - "canvas_id" -]
- Changed
openmeteo_get_air_quality6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "latitude", + "longitude", + "timezone", + "record_count", + "data_source", + "truncated" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `invalid_variable`: An unknown air quality variable name was requested `no_variables_requested`: hourly_variables was not provided or is empty `date_range_incomplete`: Only one of start_date / end_date was provided — the CAMS archive requires the pair together `forecast_window_conflict`: forecast_days or a non-zero past_days was combined with start_date or end_date Other values are possible when a failure originates below the handler.", + "examples": [ + "invalid_variable", + "no_variables_requested", + "date_range_incomplete", + "forecast_window_conflict" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "latitude", - "longitude", - "timezone", - "record_count", - "data_source", - "truncated" -]
- Changed
openmeteo_get_climate6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "latitude", + "longitude", + "elevation", + "timezone", + "date_range", + "record_count", + "daily", + "truncated" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `date_out_of_range`: start_date predates 1950-01-01 or end_date is after 2050-12-31 `date_order_invalid`: end_date is before start_date `no_variables_requested`: daily_variables was not provided or is empty `invalid_variable`: An unknown variable name or unsupported climate model was requested Other values are possible when a failure originates below the handler.", + "examples": [ + "date_out_of_range", + "date_order_invalid", + "no_variables_requested", + "invalid_variable" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "latitude", - "longitude", - "elevation", - "timezone", - "date_range", - "record_count", - "daily", - "truncated" -]
- Changed
openmeteo_get_elevation6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "elevations" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `coordinate_count_mismatch`: latitudes and longitudes arrays have different lengths Other values are possible when a failure originates below the handler.", + "examples": [ + "coordinate_count_mismatch" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "elevations" -]
- Changed
openmeteo_get_ensemble6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "latitude", + "longitude", + "elevation", + "timezone", + "record_count", + "truncated" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `no_variables_requested`: Neither hourly_variables nor daily_variables was provided `invalid_variable`: An unknown variable name or unsupported model was requested `variable_wrong_cadence`: A variable the ensemble API documents under one cadence was passed in the other cadence field — for example precipitation_sum in hourly_variables, or precipitation in daily_variables Other values are possible when a failure originates below the handler.", + "examples": [ + "no_variables_requested", + "invalid_variable", + "variable_wrong_cadence" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "latitude", - "longitude", - "elevation", - "timezone", - "record_count", - "truncated" -]
- Changed
openmeteo_get_flood6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "latitude", + "longitude", + "timezone", + "record_count", + "daily", + "truncated" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `no_variables_requested`: daily_variables was not provided or is empty `date_range_incomplete`: Only one of start_date / end_date was provided — GloFAS requires the pair together `forecast_days_conflict`: forecast_days was combined with start_date or end_date `date_order_invalid`: end_date is before start_date `date_out_of_range`: start_date predates 1984-01-01 or date range is otherwise invalid `invalid_variable`: An unknown discharge variable name was requested Other values are possible when a failure originates below the handler.", + "examples": [ + "no_variables_requested", + "date_range_incomplete", + "forecast_days_conflict", + "date_order_invalid", + "date_out_of_range", + "invalid_variable" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "latitude", - "longitude", - "timezone", - "record_count", - "daily", - "truncated" -]
- Changed
openmeteo_get_forecast6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "latitude", + "longitude", + "elevation", + "timezone", + "utc_offset_seconds", + "record_count", + "truncated" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `invalid_variable`: An unknown variable name was requested `variable_wrong_cadence`: A variable Open-Meteo documents under one cadence was passed in the other cadence field — for example cloud_cover in daily_variables, or temperature_2m_max in hourly_variables `no_variables_requested`: Neither hourly_variables nor daily_variables was provided Other values are possible when a failure originates below the handler.", + "examples": [ + "invalid_variable", + "variable_wrong_cadence", + "no_variables_requested" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "latitude", - "longitude", - "elevation", - "timezone", - "utc_offset_seconds", - "record_count", - "truncated" -]
- Changed
openmeteo_get_historical6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "latitude", + "longitude", + "elevation", + "timezone", + "date_range", + "record_count", + "truncated" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `date_out_of_range`: start_date predates 1940-01-01 or end_date is within the ERA5 lag window `date_order_invalid`: end_date is before start_date `no_variables_requested`: Neither hourly_variables nor daily_variables was provided `invalid_variable`: An unknown variable name was requested `variable_wrong_cadence`: A variable Open-Meteo documents under one cadence was passed in the other cadence field — for example cloud_cover in daily_variables, or temperature_2m_max in hourly_variables Other values are possible when a failure originates below the handler.", + "examples": [ + "date_out_of_range", + "date_order_invalid", + "no_variables_requested", + "invalid_variable", + "variable_wrong_cadence" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "latitude", - "longitude", - "elevation", - "timezone", - "date_range", - "record_count", - "truncated" -]
- Changed
openmeteo_get_marine6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "latitude", + "longitude", + "timezone", + "record_count", + "truncated" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `invalid_variable`: An unknown marine variable name was requested `variable_wrong_cadence`: A variable Open-Meteo documents under one cadence was passed in the other cadence field — for example wave_height in daily_variables, or wave_height_max in hourly_variables `no_variables_requested`: Neither hourly_variables nor daily_variables was provided `date_range_incomplete`: Only one of start_date / end_date was provided — the marine archive requires the pair together `forecast_window_conflict`: forecast_days or a non-zero past_days was combined with start_date or end_date Other values are possible when a failure originates below the handler.", + "examples": [ + "invalid_variable", + "variable_wrong_cadence", + "no_variables_requested", + "date_range_incomplete", + "forecast_window_conflict" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "latitude", - "longitude", - "timezone", - "record_count", - "truncated" -]
- Changed
openmeteo_search_locations6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "results", + "count" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `no_results`: The search returned no matching places Other values are possible when a failure originates below the handler.", + "examples": [ + "no_results" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "results", - "count" -]
2 tool updates
- Changed
openmeteo_get_climate1 field changed- changed
Input schema / properties / models / descriptionPrevious value: -"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. temperature_2m_max_MRI_AGCM3_2_S). Omit to use the API default (a single model, unsuffixed columns)."New value: +"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. temperature_2m_max_MRI_AGCM3_2_S). Omit to use the API default (a single model, unsuffixed columns). A name outside this list is sent upstream rather than rejected here."
- Changed
openmeteo_get_ensemble2 fields changed- changed
Input schema / properties / models / descriptionPrevious value: -"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."New value: +"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 (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). Member counts include the control run. Omit to use the API default blend. A name outside this list is sent upstream rather than rejected here, so a model Open-Meteo adds later still works." - changed
Output schema / properties / model / descriptionPrevious value: -"Ensemble model used (e.g. \"ecmwf_ifs025\") — echoes the requested models parameter. Absent when models was omitted (API default blend; the API reports no provenance)."New value: +"Ensemble model used (e.g. \"ecmwf_ifs025_ensemble\") — echoes the requested models parameter. Absent when models was omitted (API default blend; the API reports no provenance)."
9 tool updates
- Changed
openmeteo_dataframe_describe1 field changed- changed
Input schema / properties / canvas_id / descriptionPrevious value: -"Canvas ID returned by openmeteo_get_forecast, openmeteo_get_historical, openmeteo_get_ensemble, openmeteo_get_flood, or openmeteo_get_climate when truncated: true."New value: +"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 truncated: true."
- Changed
openmeteo_dataframe_query1 field changed- changed
Input schema / properties / canvas_id / descriptionPrevious value: -"Canvas ID returned by openmeteo_get_forecast, openmeteo_get_historical, openmeteo_get_ensemble, openmeteo_get_flood, or openmeteo_get_climate when truncated: true."New value: +"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 truncated: true."
- Changed
openmeteo_get_air_quality14 fields changed- added
Input schema / properties / canvas_idAdded value: +{ + "description": "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 any row count — it spills to this canvas for SQL querying. Omit to create a fresh canvas.", + "type": "string" +} - added
Input schema / properties / end_dateAdded value: +{ + "description": "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.", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - removed
Input schema / properties / forecast_days / defaultRemoved value: -5 - changed
Input schema / properties / forecast_days / descriptionPrevious value: -"Forecast horizon in days (1–7). Default 5."New value: +"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." - added
Input schema / properties / past_daysAdded value: +{ + "default": 0, + "description": "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.", + "maximum": 92, + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / start_dateAdded value: +{ + "description": "Start date for the archive range (YYYY-MM-DD, e.g., \"2024-07-01\"). Real CAMS values go back to at least 2022-10-01; earlier dates return rows of nulls. Requires end_date — the pair must be sent together, and neither combines with forecast_days or past_days.", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - added
Output schema / properties / canvas_idAdded value: +{ + "description": "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 response carries. Query with SQL using this token.", + "type": "string" +} - changed
Output schema / properties / data_source / descriptionPrevious value: -"Data source identifier — this is modeled forecast data from CAMS, not measured station data."New value: +"Data source identifier — this is modeled CAMS data, forecast or archive, not measured station data." - changed
Output schema / properties / hourly / descriptionPrevious value: -"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_aqi as index values."New value: +"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_aqi as index values. When truncated, contains only a preview — query canvas_id for the full dataset when one is present." - added
Output schema / properties / noticeAdded value: +{ + "description": "Warning that a requested variable came back with no data — names each column whose unit is \"undefined\", which is how the endpoint reports a name it parsed but does not serve.", + "type": "string" +} - added
Output schema / properties / record_countAdded value: +{ + "description": "Total number of hourly records — the full upstream total when truncated is true, not the length of the hourly preview.", + "type": "number" +} - added
Output schema / properties / table_nameAdded value: +{ + "description": "DuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only alongside canvas_id.", + "type": "string" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "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 there is no canvas_id, and the omitted rows are reached only by narrowing the request.", + "type": "boolean" +} - changed
Output schema / requiredPrevious value: -[ - "latitude", - "longitude", - "timezone", - "data_source" -]New value: +[ + "latitude", + "longitude", + "timezone", + "record_count", + "data_source", + "truncated" +]
- Changed
openmeteo_get_climate1 field changed- added
Output schema / properties / noticeAdded value: +{ + "description": "Warning that a requested variable came back with no data — names each column whose unit is \"undefined\", which is how the endpoint reports a name it parsed but does not serve.", + "type": "string" +}
- Changed
openmeteo_get_ensemble3 fields changed- changed
Input schema / properties / daily_variables / descriptionPrevious value: -"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 of hourly_variables or daily_variables required."New value: +"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 only — an hourly name such as precipitation or temperature_2m belongs in hourly_variables and is rejected here; for a daily summary use its published aggregate (precipitation_sum, temperature_2m_max). At least one of hourly_variables or daily_variables required." - changed
Input schema / properties / hourly_variables / descriptionPrevious value: -"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 the output. At least one of hourly_variables or daily_variables required."New value: +"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 the output. Hourly names only — a daily-only aggregate such as precipitation_sum or wind_speed_10m_max belongs in daily_variables and is rejected here; temperature_2m_max and temperature_2m_min are an exception, published here as 3-hourly aggregations as well as daily. At least one of hourly_variables or daily_variables required." - added
Output schema / properties / noticeAdded value: +{ + "description": "Warning that a requested variable came back with no data across every member — names each variable whose unit is \"undefined\", which is how the endpoint reports a name the selected model does not carry.", + "type": "string" +}
- Changed
openmeteo_get_flood1 field changed- added
Output schema / properties / noticeAdded value: +{ + "description": "Warning that a requested variable came back with no data — names each column whose unit is \"undefined\", which is how the endpoint reports a name it parsed but does not serve.", + "type": "string" +}
- Changed
openmeteo_get_forecast3 fields changed- changed
Input schema / properties / daily_variables / descriptionPrevious value: -"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 daily_variables is required."New value: +"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 cloud_cover or temperature_2m belongs in hourly_variables and is rejected here; for a daily summary of an hourly variable use its published aggregate (cloud_cover_max, cloud_cover_mean, cloud_cover_min). At least one of hourly_variables or daily_variables is required." - changed
Input schema / properties / hourly_variables / descriptionPrevious value: -"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 or daily_variables is required."New value: +"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 aggregate such as temperature_2m_max or precipitation_sum belongs in daily_variables and is rejected here. At least one of hourly_variables or daily_variables is required." - added
Output schema / properties / noticeAdded value: +{ + "description": "Warning that a requested variable came back with no data — names each column whose unit is \"undefined\", which is how the endpoint reports a name it parsed but does not serve in the requested cadence.", + "type": "string" +}
- Changed
openmeteo_get_historical3 fields changed- changed
Input schema / properties / daily_variables / descriptionPrevious value: -"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."New value: +"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 belongs in hourly_variables and is rejected here; for a daily summary of an hourly variable use its published aggregate (cloud_cover_max, cloud_cover_mean, cloud_cover_min). At least one of hourly_variables or daily_variables required." - changed
Input schema / properties / hourly_variables / descriptionPrevious value: -"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_variables required."New value: +"Hourly ERA5 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 temperature_2m_max or precipitation_sum belongs in daily_variables and is rejected here. At least one of hourly_variables or daily_variables required." - added
Output schema / properties / noticeAdded value: +{ + "description": "Warning that a requested variable came back with no data — names each column whose unit is \"undefined\", which is how the archive reports a name it parsed but does not serve in the requested cadence.", + "type": "string" +}
- Changed
openmeteo_get_marine17 fields changed- added
Input schema / properties / canvas_idAdded value: +{ + "description": "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 any row count — it spills to this canvas for SQL querying. Omit to create a fresh canvas.", + "type": "string" +} - changed
Input schema / properties / daily_variables / descriptionPrevious value: -"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."New value: +"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 rejected here; for a daily summary use its published aggregate (wave_height_max). At least one of hourly_variables or daily_variables required." - added
Input schema / properties / end_dateAdded value: +{ + "description": "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.", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - removed
Input schema / properties / forecast_days / defaultRemoved value: -7 - changed
Input schema / properties / forecast_days / descriptionPrevious value: -"Forecast horizon in days (1–7). Default 7."New value: +"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." - changed
Input schema / properties / forecast_days / maximumPrevious value: -7New value: +8 - changed
Input schema / properties / hourly_variables / descriptionPrevious value: -"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."New value: +"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_direction_dominant belongs in daily_variables and is rejected here. At least one of hourly_variables or daily_variables required." - added
Input schema / properties / past_daysAdded value: +{ + "default": 0, + "description": "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.", + "maximum": 92, + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / start_dateAdded value: +{ + "description": "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_days or past_days.", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - added
Output schema / properties / canvas_idAdded value: +{ + "description": "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 response carries. Query with SQL using this token.", + "type": "string" +} - changed
Output schema / properties / daily / descriptionPrevious value: -"Per-day summary records with \"time\" (YYYY-MM-DD) + variable keys (e.g., wave_height_max in meters, wave_direction_dominant in degrees, wave_period_max in seconds)."New value: +"Per-day summary records with \"time\" (YYYY-MM-DD) + variable keys (e.g., wave_height_max in meters, wave_direction_dominant in degrees, wave_period_max in seconds). When truncated, contains only a preview — query canvas_id for the full dataset when one is present." - changed
Output schema / properties / hourly / descriptionPrevious value: -"Per-hour records with \"time\" (ISO 8601) + one key per requested variable (e.g., wave_height in meters, wave_direction in degrees, wave_period in seconds). Absent when only daily_variables were requested."New value: +"Per-hour records with \"time\" (ISO 8601) + one key per requested variable (e.g., wave_height in meters, wave_direction in degrees, wave_period in seconds). Absent when only daily_variables were requested. When truncated, contains only a preview — query canvas_id for the full dataset when one is present." - added
Output schema / properties / noticeAdded value: +{ + "description": "Warning that a requested variable came back with no data — names each column whose unit is \"undefined\", which is how the endpoint reports a name it parsed but does not serve.", + "type": "string" +} - added
Output schema / properties / record_countAdded value: +{ + "description": "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.", + "type": "number" +} - added
Output schema / properties / table_nameAdded value: +{ + "description": "DuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only alongside canvas_id.", + "type": "string" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "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 hourly and daily row, including any column the preview omits. With it disabled there is no canvas_id, and the omitted rows are reached only by narrowing the request.", + "type": "boolean" +} - changed
Output schema / requiredPrevious value: -[ - "latitude", - "longitude", - "timezone" -]New value: +[ + "latitude", + "longitude", + "timezone", + "record_count", + "truncated" +]
11 tool updates
- Changed
openmeteo_dataframe_describe1 field changed- changed
Input schema / properties / canvas_id / descriptionPrevious value: -"Canvas ID returned by openmeteo_get_historical, openmeteo_get_ensemble, openmeteo_get_flood, or openmeteo_get_climate when truncated: true."New value: +"Canvas ID returned by openmeteo_get_forecast, openmeteo_get_historical, openmeteo_get_ensemble, openmeteo_get_flood, or openmeteo_get_climate when truncated: true."
- Changed
openmeteo_dataframe_query1 field changed- changed
Input schema / properties / canvas_id / descriptionPrevious value: -"Canvas ID returned by openmeteo_get_historical, openmeteo_get_ensemble, openmeteo_get_flood, or openmeteo_get_climate when truncated: true."New value: +"Canvas ID returned by openmeteo_get_forecast, openmeteo_get_historical, openmeteo_get_ensemble, openmeteo_get_flood, or openmeteo_get_climate when truncated: true."
- Removed
openmeteo_geocode - Changed
openmeteo_get_air_quality1 field changed- changed
Input schema / properties / latitude / descriptionPrevious value: -"Latitude in decimal degrees. Use openmeteo_geocode to resolve a place name."New value: +"Latitude in decimal degrees. Use openmeteo_search_locations to resolve a place name."
- Changed
openmeteo_get_climate6 fields changed- changed
Input schema / properties / latitude / descriptionPrevious value: -"Latitude in decimal degrees. Use openmeteo_geocode to resolve a place name to coordinates."New value: +"Latitude in decimal degrees. Use openmeteo_search_locations to resolve a place name to coordinates." - changed
Output schema / properties / canvas_id / descriptionPrevious value: -"DataCanvas token — present only when truncated is true (data spilled). Query with SQL using this token."New value: +"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 response carries. Query with SQL using this token." - changed
Output schema / properties / daily / descriptionPrevious value: -"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 does not carry that variable. When truncated, contains only a preview; query canvas_id for the full dataset."New value: +"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 does not carry that variable. When truncated, contains only a preview — query canvas_id for the full dataset when one is present." - changed
Output schema / properties / record_count / descriptionPrevious value: -"Total number of daily records in this response"New value: +"Total number of daily records — the full upstream total when truncated is true, not the length of the daily preview." - changed
Output schema / properties / table_name / descriptionPrevious value: -"DuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only when truncated is true."New value: +"DuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only alongside canvas_id." - changed
Output schema / properties / truncated / descriptionPrevious value: -"True when the response was too large to return inline and data spilled to canvas_id. Query the canvas for the full dataset."New value: +"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 there is no canvas_id, and the omitted rows are reached only by narrowing the request."
- Changed
openmeteo_get_ensemble7 fields changed- changed
Input schema / properties / latitude / descriptionPrevious value: -"Latitude in decimal degrees. Use openmeteo_geocode to resolve a place name to coordinates."New value: +"Latitude in decimal degrees. Use openmeteo_search_locations to resolve a place name to coordinates." - changed
Output schema / properties / canvas_id / descriptionPrevious value: -"DataCanvas token — present only when truncated is true (data spilled). Query with SQL using this token."New value: +"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 response carries. Query with SQL using this token." - changed
Output schema / properties / daily / descriptionPrevious value: -"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 canvas_id for the full dataset."New value: +"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 canvas_id for the full dataset when one is present." - changed
Output schema / properties / hourly / descriptionPrevious value: -"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. When truncated, contains a preview only; query canvas_id for the full dataset."New value: +"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. When truncated, contains a preview only — query canvas_id for the full dataset when one is present." - changed
Output schema / properties / record_count / descriptionPrevious value: -"Total number of records (hourly + daily rows) in this response"New value: +"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." - changed
Output schema / properties / table_name / descriptionPrevious value: -"DuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only when truncated is true."New value: +"DuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only alongside canvas_id." - changed
Output schema / properties / truncated / descriptionPrevious value: -"True when the response was too large to return inline and data spilled to canvas_id. Query the canvas for the full dataset — it holds every hourly and daily row, including any column the preview omits."New value: +"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 hourly and daily row, including any column the preview omits. With it disabled there is no canvas_id, and the omitted rows are reached only by narrowing the request."
- Changed
openmeteo_get_flood5 fields changed- changed
Input schema / properties / latitude / descriptionPrevious value: -"Latitude in decimal degrees. The API snaps to the nearest river — no river ID required. Use openmeteo_geocode to resolve a place name."New value: +"Latitude in decimal degrees. The API snaps to the nearest river — no river ID required. Use openmeteo_search_locations to resolve a place name." - changed
Output schema / properties / canvas_id / descriptionPrevious value: -"DataCanvas token — present only when truncated is true (data spilled). Query with SQL using this token."New value: +"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 response carries. Query with SQL using this token." - changed
Output schema / properties / daily / descriptionPrevious value: -"Per-day records with \"time\" (YYYY-MM-DD) + one key per requested variable containing discharge in m³/s, or null for coordinates outside GloFAS coverage. When truncated, contains only a preview; query canvas_id for the full dataset."New value: +"Per-day records with \"time\" (YYYY-MM-DD) + one key per requested variable containing discharge in m³/s, or null for coordinates outside GloFAS coverage. When truncated, contains only a preview — query canvas_id for the full dataset when one is present." - changed
Output schema / properties / table_name / descriptionPrevious value: -"DuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only when truncated is true."New value: +"DuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only alongside canvas_id." - changed
Output schema / properties / truncated / descriptionPrevious value: -"True when the response was too large to return inline and data spilled to canvas_id. Query the canvas for the full dataset."New value: +"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 there is no canvas_id, and the omitted rows are reached only by narrowing the request."
- Changed
openmeteo_get_forecast10 fields changed- added
Input schema / properties / canvas_idAdded value: +{ + "description": "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 — it spills to this canvas for SQL querying. Omit to create a fresh canvas.", + "type": "string" +} - changed
Input schema / properties / latitude / descriptionPrevious value: -"Latitude in decimal degrees (e.g., 47.6062 for Seattle). Use openmeteo_geocode to resolve a place name to coordinates."New value: +"Latitude in decimal degrees (e.g., 47.6062 for Seattle). Use openmeteo_search_locations to resolve a place name to coordinates." - changed
Input schema / properties / timezone / descriptionPrevious value: -"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."New value: +"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." - added
Output schema / properties / canvas_idAdded value: +{ + "description": "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 response carries. Query with SQL using this token.", + "type": "string" +} - changed
Output schema / properties / daily / descriptionPrevious value: -"Per-day records. Each object has a \"time\" field (YYYY-MM-DD) plus one key per requested variable with its value. Units are in the daily_units map. Absent when only hourly_variables were requested."New value: +"Per-day records. Each object has a \"time\" field (YYYY-MM-DD) plus one key per requested variable with its value. Units are in the daily_units map. Absent when only hourly_variables were requested. When truncated, contains only a preview — query canvas_id for the full dataset when one is present." - changed
Output schema / properties / hourly / descriptionPrevious value: -"Per-hour records. Each object has a \"time\" field (ISO 8601) plus one key per requested variable with its value. Units are in the hourly_units map. Absent when only daily_variables were requested."New value: +"Per-hour records. Each object has a \"time\" field (ISO 8601) plus one key per requested variable with its value. Units are in the hourly_units map. Absent when only daily_variables were requested. When truncated, contains only a preview — query canvas_id for the full dataset when one is present." - added
Output schema / properties / record_countAdded value: +{ + "description": "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.", + "type": "number" +} - added
Output schema / properties / table_nameAdded value: +{ + "description": "DuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only alongside canvas_id.", + "type": "string" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "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 hourly and daily row, including any column the preview omits. With it disabled there is no canvas_id, and the omitted rows are reached only by narrowing the request.", + "type": "boolean" +} - changed
Output schema / requiredPrevious value: -[ - "latitude", - "longitude", - "elevation", - "timezone", - "utc_offset_seconds" -]New value: +[ + "latitude", + "longitude", + "elevation", + "timezone", + "utc_offset_seconds", + "record_count", + "truncated" +]
- Changed
openmeteo_get_historical7 fields changed- changed
Input schema / properties / latitude / descriptionPrevious value: -"Latitude in decimal degrees. Use openmeteo_geocode to resolve a place name to coordinates."New value: +"Latitude in decimal degrees. Use openmeteo_search_locations to resolve a place name to coordinates." - changed
Output schema / properties / canvas_id / descriptionPrevious value: -"DataCanvas token — present only when truncated is true (data spilled). Query with SQL using this token."New value: +"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 response carries. Query with SQL using this token." - changed
Output schema / properties / daily / descriptionPrevious value: -"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."New value: +"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 present." - changed
Output schema / properties / hourly / descriptionPrevious value: -"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."New value: +"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 present." - changed
Output schema / properties / record_count / descriptionPrevious value: -"Total number of records (hourly or daily rows) in this response"New value: +"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." - changed
Output schema / properties / table_name / descriptionPrevious value: -"DuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only when truncated is true."New value: +"DuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only alongside canvas_id." - changed
Output schema / properties / truncated / descriptionPrevious value: -"True when the response was too large to return inline and data spilled to canvas_id. Query the canvas for the full dataset — it holds every hourly and daily row, including any column the preview omits."New value: +"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 hourly and daily row, including any column the preview omits. With it disabled there is no canvas_id, and the omitted rows are reached only by narrowing the request."
- Changed
openmeteo_get_marine1 field changed- changed
Input schema / properties / latitude / descriptionPrevious value: -"Latitude of a coastal or ocean point. Use openmeteo_geocode to resolve a place name. Inland points return near-zero wave values."New value: +"Latitude of a coastal or ocean point. Use openmeteo_search_locations to resolve a place name. Inland points return near-zero wave values."
- Added
openmeteo_search_locations
3 tool updates
- Changed
openmeteo_dataframe_describe1 field changed- changed
Input schema / properties / canvas_id / descriptionPrevious value: -"Canvas ID returned by openmeteo_get_historical, openmeteo_get_ensemble, or openmeteo_get_climate when truncated: true."New value: +"Canvas ID returned by openmeteo_get_historical, openmeteo_get_ensemble, openmeteo_get_flood, or openmeteo_get_climate when truncated: true."
- Changed
openmeteo_dataframe_query1 field changed- changed
Input schema / properties / canvas_id / descriptionPrevious value: -"Canvas ID returned by openmeteo_get_historical, openmeteo_get_ensemble, or openmeteo_get_climate when truncated: true."New value: +"Canvas ID returned by openmeteo_get_historical, openmeteo_get_ensemble, openmeteo_get_flood, or openmeteo_get_climate when truncated: true."
- Changed
openmeteo_get_flood10 fields changed- added
Input schema / properties / canvas_idAdded value: +{ + "description": "DataCanvas token for wide reanalysis 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 canvas for SQL querying. Omit to create a fresh canvas.", + "type": "string" +} - changed
Input schema / properties / end_date / descriptionPrevious value: -"End date for historical reanalysis (YYYY-MM-DD, inclusive). Must be on or after start_date."New value: +"End date for historical reanalysis (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." - changed
Input schema / properties / forecast_days / descriptionPrevious value: -"Number of forecast days ahead (1–210). Omit when fetching historical data only via start_date/end_date."New value: +"Number of forecast days ahead (1–210). Mutually exclusive with start_date/end_date — omit it entirely when pulling a historical range." - changed
Input schema / properties / start_date / descriptionPrevious value: -"Start date for historical reanalysis (YYYY-MM-DD, e.g., \"2023-01-01\"). GloFAS reanalysis covers from 1984-01-01."New value: +"Start date for historical reanalysis (YYYY-MM-DD, e.g., \"2023-01-01\"). GloFAS reanalysis covers from 1984-01-01. Requires end_date — the pair must be sent together, and neither combines with forecast_days." - added
Output schema / properties / canvas_idAdded value: +{ + "description": "DataCanvas token — present only when truncated is true (data spilled). Query with SQL using this token.", + "type": "string" +} - changed
Output schema / properties / daily / descriptionPrevious value: -"Per-day records with \"time\" (YYYY-MM-DD) + one key per requested variable containing discharge in m³/s, or null for coordinates outside GloFAS coverage."New value: +"Per-day records with \"time\" (YYYY-MM-DD) + one key per requested variable containing discharge in m³/s, or null for coordinates outside GloFAS coverage. When truncated, contains only a preview; query canvas_id for the full dataset." - added
Output schema / properties / record_countAdded value: +{ + "description": "Total number of daily discharge records — the full staged count when truncated is true, not the length of the daily preview.", + "type": "number" +} - added
Output schema / properties / table_nameAdded value: +{ + "description": "DuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only when truncated is true.", + "type": "string" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when the response was too large to return inline and data spilled to canvas_id. Query the canvas for the full dataset.", + "type": "boolean" +} - changed
Output schema / requiredPrevious value: -[ - "latitude", - "longitude", - "timezone", - "daily" -]New value: +[ + "latitude", + "longitude", + "timezone", + "record_count", + "daily", + "truncated" +]
3 tool updates
- Changed
openmeteo_get_climate2 fields changed- changed
Input schema / properties / canvas_id / descriptionPrevious value: -"DataCanvas token for multi-decade or multi-model queries. When a query exceeds ~500 records, results spill to this canvas for SQL querying. Omit to create a fresh canvas."New value: +"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 to this canvas for SQL querying. Omit to create a fresh canvas." - changed
Output schema / properties / truncated / descriptionPrevious value: -"True when the response exceeded inline record limit and data spilled to canvas_id. Query the canvas for the full dataset."New value: +"True when the response was too large to return inline and data spilled to canvas_id. Query the canvas for the full dataset."
- Changed
openmeteo_get_ensemble2 fields changed- changed
Input schema / properties / canvas_id / descriptionPrevious value: -"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."New value: +"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 canvas for SQL querying. Omit to create a fresh canvas." - changed
Output schema / properties / truncated / descriptionPrevious value: -"True when the response exceeded the inline record limit and data spilled to canvas_id. Query the canvas for the full dataset."New value: +"True when the response was too large to return inline and data spilled to canvas_id. Query the canvas for the full dataset — it holds every hourly and daily row, including any column the preview omits."
- Changed
openmeteo_get_historical2 fields changed- changed
Input schema / properties / canvas_id / descriptionPrevious value: -"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."New value: +"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 spills to this canvas for SQL querying. Omit to create a fresh canvas." - changed
Output schema / properties / truncated / descriptionPrevious value: -"True when the response exceeded inline record limit and data spilled to canvas_id. Query the canvas for the full dataset."New value: +"True when the response was too large to return inline and data spilled to canvas_id. Query the canvas for the full dataset — it holds every hourly and daily row, including any column the preview omits."
5 tool updates
- Changed
openmeteo_dataframe_query1 field changed- changed
Output schema / properties / rows / descriptionPrevious value: -"Result rows (capped at the canvas row limit, default 10 000)."New value: +"Result rows — a preview capped at 100. When row_count exceeds this, page the rest by re-issuing the SQL with LIMIT / OFFSET."
- Changed
openmeteo_get_climate3 fields changed- removed
Input schema / properties / daily_variables / minItemsRemoved value: -1 - changed
Input schema / requiredPrevious value: -[ - "latitude", - "longitude", - "start_date", - "end_date", - "daily_variables" -]New value: +[ + "latitude", + "longitude", + "start_date", + "end_date" +] - added
Output schema / properties / table_nameAdded value: +{ + "description": "DuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only when truncated is true.", + "type": "string" +}
- Changed
openmeteo_get_ensemble1 field changed- added
Output schema / properties / table_nameAdded value: +{ + "description": "DuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only when truncated is true.", + "type": "string" +}
- Changed
openmeteo_get_flood2 fields changed- removed
Input schema / properties / daily_variables / minItemsRemoved value: -1 - changed
Input schema / requiredPrevious value: -[ - "latitude", - "longitude", - "daily_variables" -]New value: +[ + "latitude", + "longitude" +]
- Changed
openmeteo_get_historical1 field changed- added
Output schema / properties / table_nameAdded value: +{ + "description": "DuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only when truncated is true.", + "type": "string" +}
1 tool update
- Changed
openmeteo_geocode2 fields changed- added
Input schema / properties / countryAdded value: +{ + "description": "ISO 3166-1 alpha-2 country code (e.g. \"US\", \"FR\") to disambiguate places that share a name. Omit for a global search.", + "pattern": "^[A-Za-z]{2}$", + "type": "string" +} - changed
Input schema / properties / name / descriptionPrevious value: -"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."New value: +"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 disambiguate. Weather tools require coordinates — use the lat/lon from this result."
3 tool updates
- Changed
openmeteo_dataframe_describe1 field changed- changed
Input schema / properties / canvas_id / descriptionPrevious value: -"Canvas ID returned by openmeteo_get_historical or openmeteo_get_ensemble when truncated: true."New value: +"Canvas ID returned by openmeteo_get_historical, openmeteo_get_ensemble, or openmeteo_get_climate when truncated: true."
- Changed
openmeteo_dataframe_query1 field changed- changed
Input schema / properties / canvas_id / descriptionPrevious value: -"Canvas ID returned by openmeteo_get_historical or openmeteo_get_ensemble when truncated: true."New value: +"Canvas ID returned by openmeteo_get_historical, openmeteo_get_ensemble, or openmeteo_get_climate when truncated: true."
- Added
openmeteo_get_climate
5 tool updates
- Changed
openmeteo_dataframe_describe1 field changed- changed
Input schema / properties / canvas_id / descriptionPrevious value: -"Canvas ID returned by openmeteo_get_historical when truncated: true."New value: +"Canvas ID returned by openmeteo_get_historical or openmeteo_get_ensemble when truncated: true."
- Changed
openmeteo_dataframe_query1 field changed- changed
Input schema / properties / canvas_id / descriptionPrevious value: -"Canvas ID returned by openmeteo_get_historical when truncated: true."New value: +"Canvas ID returned by openmeteo_get_historical or openmeteo_get_ensemble when truncated: true."
- Changed
openmeteo_geocode11 fields changed- changed
Input schema / properties / language / descriptionPrevious value: -"Response language for place names (ISO 639-1, e.g., \"en\", \"de\", \"fr\"). Default \"en\"."New value: +"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. language \"zh\" for \"上海\", \"ru\" for \"Москва\". Default \"en\"; a query in a recognized non-Latin script (CJK, Hangul, Cyrillic, Arabic, Greek, Hebrew, Thai, Devanagari) that misses under \"en\" is retried once with the language inferred from its script." - changed
Output schema / properties / results / descriptionPrevious value: -"Ranked matches (most relevant first). Empty when no results match."New value: +"Ranked matches (most relevant first). Never empty — when nothing matches, the tool fails with no_results instead of returning an empty array." - added
Output schema / properties / results / items / properties / country / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / results / items / properties / country / descriptionPrevious value: -"Country name"New value: +"Country name — null for non-country features like continents and oceans" - removed
Output schema / properties / results / items / properties / country / typeRemoved value: -"string" - added
Output schema / properties / results / items / properties / country_code / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / results / items / properties / country_code / descriptionPrevious value: -"ISO 3166-1 alpha-2 country code"New value: +"ISO 3166-1 alpha-2 country code — null for non-country features like continents and oceans" - removed
Output schema / properties / results / items / properties / country_code / typeRemoved value: -"string" - added
Output schema / properties / results / items / properties / timezone / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / results / items / properties / timezone / descriptionPrevious value: -"IANA timezone (e.g., \"America/Los_Angeles\") — pass to weather tools as the timezone parameter"New value: +"IANA timezone (e.g., \"America/Los_Angeles\") — pass to weather tools as the timezone parameter. Null when the API omits it." - removed
Output schema / properties / results / items / properties / timezone / typeRemoved value: -"string"
- Changed
openmeteo_get_ensemble3 fields changed- changed
Output schema / properties / canvas_id / descriptionPrevious value: -"DataCanvas token — present when record_count exceeded inline limit. Query with SQL using this token."New value: +"DataCanvas token — present only when truncated is true (data spilled). Query with SQL using this token." - changed
Output schema / properties / member_count / descriptionPrevious value: -"Number of ensemble members in the response"New value: +"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." - changed
Output schema / properties / model / descriptionPrevious value: -"Ensemble model used (e.g. \"ecmwf_ifs025\")"New value: +"Ensemble model used (e.g. \"ecmwf_ifs025\") — echoes the requested models parameter. Absent when models was omitted (API default blend; the API reports no provenance)."
- Changed
openmeteo_get_historical1 field changed- changed
Output schema / properties / canvas_id / descriptionPrevious value: -"DataCanvas token — present when record_count exceeded inline limit. Query with SQL using this token."New value: +"DataCanvas token — present only when truncated is true (data spilled). Query with SQL using this token."
Related MCP Connectors
Global weather API: forecasts, historical data, marine, ski, astronomy and timezone.
Open-Meteo MCP — weather forecast + historical reanalysis + sister APIs
Weather forecasts from MET Norway (Yr): geocoding plus hourly forecasts worldwide.
Weather MCP — wraps Open-Meteo API (free, no auth)
Related MCP Servers
- FlicenseBqualityDmaintenanceProvides current weather conditions and forecasts for any location using the Open-Meteo API.2-
- FlicenseNot gradedqualityDmaintenanceProvides real-time weather forecasts, air quality data, and timezone information via Open-Meteo API, with no API key required.-
- AlicenseNot gradedqualityDmaintenanceProvides real-time and historical weather data for any city worldwide, including forecasts, air quality, and marine conditions, using the free Open-Meteo API.10 npmMIT
- AlicenseAqualityDmaintenanceProvides comprehensive access to Open-Meteo weather APIs, including forecasts, historical data, air quality, marine weather, and geocoding, enabling LLMs to retrieve weather information and location data.173,055 npm1MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.