Skip to main content
Glama

Server Details

Global weather via Open-Meteo: forecast, ERA5 archive, marine, air quality, geocoding, elevation.

Status
Healthy
Last Tested
Transport
Streamable HTTP
URL
Repository
cyanheads/open-meteo-mcp-server
GitHub Stars
2
Server Listing
open-meteo-mcp-server

Glama MCP Gateway

Connect through Glama MCP Gateway for full control over tool access and complete visibility into every call.

MCP client
Glama
MCP server

Full call logging

Every tool call is logged with complete inputs and outputs, so you can debug issues and audit what your agents are doing.

Tool access control

Enable or disable individual tools per connector, so you decide what your agents can and cannot do.

Managed credentials

Glama handles OAuth flows, token storage, and automatic rotation, so credentials never expire on your clients.

Usage analytics

See which tools your agents call, how often, and when, so you can understand usage patterns and catch anomalies.

100% free. Your data is private.
Tool DescriptionsA

Average 4.7/5 across 11 of 11 tools scored.

Server CoherenceA
Disambiguation4/5

Each get_* tool targets a distinct data domain (forecast, historical, marine, air quality, ensemble, flood, climate), and the two dataframe tools are clearly separate (describe vs query). The only potential confusion is openmeteo_get_forecast vs openmeteo_get_historical for recent past dates, but the descriptions explicitly disambiguate when to use each.

Naming Consistency4/5

All tools share the openmeteo_ prefix and use snake_case, but the pattern is not perfectly uniform: get_* verbs are dominant, while openmeteo_dataframe_describe/query and openmeteo_search_locations deviate from the get_+noun pattern. Still, the naming is predictable and readable.

Tool Count5/5

11 tools is well-scoped for a weather data server covering multiple data products (forecast, historical, marine, air quality, ensemble, flood, climate) plus supporting utilities for location search, elevation, and dataset querying. Each tool earns its place.

Completeness5/5

The tool set covers the full lifecycle for Open-Meteo: location resolution, elevation, all major data products, and handling of large result sets via DataFrame describe/query. There are no obvious gaps for the server's purpose; it supports both forecast and historical analysis across multiple domains.

Available Tools

11 tools
openmeteo_dataframe_describeOpenmeteo Dataframe DescribeA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
canvas_idYesCanvas 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

ParametersJSON Schema
NameRequiredDescription
tablesYesTables and views registered on this canvas.
canvas_idYesCanvas ID that was inspected.
expires_atYesISO 8601 expiry after the sliding 24 h TTL.
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so the description adds value by specifying the prerequisite of a DataCanvas from certain tools and the expected workflow order, without contradicting 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loaded with the action, and includes only essential information in two sentences. No redundant content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and only one simple parameter, the description covers the tool's purpose, the source of its input, and its role relative to the query tool, making it sufficiently complete for the agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema captures all parameter details (canvas_id with explanation of its origin and truncation condition). The description reinforces the context but does not add additional parameter semantics beyond the schema, warranting the baseline score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description specifies the verb 'List' and the resource 'tables and their columns on a DataCanvas staged by' specific tools, making it clear what the tool does and distinguishing it from the sibling query tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to call this tool ('Call this first to discover table names') and provides the alternative action ('before querying with openmeteo_dataframe_query'), offering clear usage guidance.

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 QueryA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sqlYesRead-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_idYesCanvas 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

ParametersJSON Schema
NameRequiredDescription
rowsYesResult rows — a preview capped at 100. When row_count exceeds this, page the rest by re-issuing the SQL with LIMIT / OFFSET.
canvas_idYesCanvas ID that was queried.
row_countYesTotal rows in the full result before any cap.
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description reinforces it with 'read-only SQL SELECT.' More importantly, it adds behavioral context not captured in annotations: the prerequisite that data must be spilled (truncated: true) and that exact table names from the staging tools must be used. It doesn't describe error handling or performance, but the output schema and annotations cover the core behavior, making this a strong but not perfect disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences long, front-loaded with the core purpose, and each sentence earns its place: purpose, usage prerequisite, and discovery alternative. There is zero fluff or redundancy with the schema. This is ideal conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with two parameters, an output schema, and clear annotations, the description covers all essential context: the data source, the exact condition for using this tool (spill), the requirement for exact table names, and a pointer to a sibling tool for discovery. It fully equips an agent to select and invoke the tool correctly without ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with both canvas_id and sql having detailed descriptions. The description adds complementary meaning by linking canvas_id to the spill event and emphasizing the need to reference the exact table_name from the tool returns, which is not fully explicit in the sql schema description. This is a meaningful enrichment beyond the structured schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise verb and resource: 'Run a read-only SQL SELECT against tables staged on a DataCanvas.' It explicitly names the sibling tools that stage the data and distinguishes itself from openmeteo_dataframe_describe by focusing on querying rather than discovery. This is a clear, specific purpose statement.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance: pass the canvas_id from a spill (truncated: true) and use the exact table_name returned. It also directs users to openmeteo_dataframe_describe as an alternative for discovering names, effectively telling when not to use this tool. This is textbook usage guidance.

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 QualityA
Read-onlyIdempotent
Inspect

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, which returns real CAMS values back to at least 2022-10-01. 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. A wide window — a large past_days or date range plus many variables — produces thousands of records; these spill to DataCanvas for SQL querying when canvas is enabled, and return a bounded preview with truncated: true when it is not.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNoEnd 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.
latitudeYesLatitude in decimal degrees. Use openmeteo_search_locations to resolve a place name.
timezoneNoIANA timezone or "auto". Default "auto".auto
canvas_idNoDataCanvas 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.
longitudeYesLongitude in decimal degrees.
past_daysNoInclude 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_dateNoStart 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.
forecast_daysNoForecast 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_variablesNoHourly air quality variables (e.g., ["pm2_5", "pm10", "ozone", "nitrogen_dioxide", "european_aqi", "us_aqi"]). At least one required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
hourlyNoPer-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.
noticeNoWarning 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.
latitudeYesSnapped latitude
timezoneYesResolved IANA timezone
canvas_idNoDataCanvas 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.
longitudeYesSnapped longitude
truncatedYesTrue 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_nameNoDuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only alongside canvas_id.
data_sourceYesData source identifier — this is modeled CAMS data, forecast or archive, not measured station data.
hourly_unitsNoVariable → unit string for hourly data (e.g., {"pm2_5": "μg/m³", "european_aqi": "EAQI"}).
record_countYesTotal number of hourly records — the full upstream total when truncated is true, not the length of the hourly preview.
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent annotations, the description discloses key behaviors: data is modeled grid data (not station readings), archive returns real CAMS values back to at least 2022-10-01, lone start/end dates are rejected, and wide windows spill to DataCanvas or return a bounded preview with truncated: true. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense paragraph, but every sentence adds essential information for a complex tool. It could be structured more scannable (e.g., bullets), but the content is efficient and front-loaded with the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (9 params, multiple modes, spilling behavior), the description covers all critical aspects: data source, valid date windows, variable lists, and output size handling. An output schema exists, so return-value details are unnecessary. It is complete for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with per-parameter descriptions, so baseline is 3. The description adds extra value by listing common variables for hourly_variables, explaining the window modes and mutual exclusivity, and clarifying the DataCanvas spilling behavior tied to canvas_id. It doesn't fully duplicate schema but enhances it with usage-level semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as providing modeled CAMS air quality data (PM2.5, PM10, etc.), which distinguishes it from measured-data tools. It explicitly mentions an alternative (openaq-mcp-server) for measured readings, further clarifying its specific purpose among siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage guidance: it contrasts modeled vs. measured data, explains the three modes (forecast, past_days, archive range), and states the mutual exclusivity and requirement for both dates in a range. It also mentions the alternative tool for measured data, satisfying the when/alternatives requirement.

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 ClimateA
Read-onlyIdempotent
Inspect

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 (ERA5, 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 DataCanvas for SQL querying when canvas is enabled, returning a bounded preview with truncated: true when it is not.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelsNoCMIP6 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_dateYesEnd date (YYYY-MM-DD, inclusive, max 2050-12-31). Must be on or after start_date.
latitudeYesLatitude in decimal degrees. Use openmeteo_search_locations to resolve a place name to coordinates.
timezoneNoIANA timezone or "auto". Default "auto".auto
canvas_idNoDataCanvas 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.
longitudeYesLongitude in decimal degrees.
start_dateYesStart date (YYYY-MM-DD, e.g., "2049-01-01"). CMIP6 projections cover 1950-01-01 to 2050-12-31.
daily_variablesNoDaily 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_unitNoWind speed unit. Default "kmh".kmh
temperature_unitNoTemperature unit. Default "celsius".celsius
precipitation_unitNoPrecipitation unit. Default "mm".mm

Output Schema

ParametersJSON Schema
NameRequiredDescription
dailyYesPer-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.
modelsNoClimate models requested — echoes the models parameter. Absent when models was omitted (API default model; the response carries no provenance).
noticeNoWarning 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.
latitudeYesSnapped latitude (Open-Meteo snaps to nearest grid point)
timezoneYesResolved IANA timezone
canvas_idNoDataCanvas 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.
elevationYesElevation at grid point (meters)
longitudeYesSnapped longitude
truncatedYesTrue 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_rangeYesDate range of returned data
table_nameNoDuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only alongside canvas_id.
daily_unitsNoColumn → unit string for daily data (e.g., {"temperature_2m_max_CMCC_CM2_VHR4": "°C"}).
record_countYesTotal number of daily records — the full upstream total when truncated is true, not the length of the daily preview.
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide readOnly and idempotent hints, and the description greatly enriches behavior: unknown model names are sent upstream, multi-model responses suffix variable names, missing model-variable combos return null, and large results spill to DataCanvas with a bounded preview and 'truncated: true' when not enabled. This goes well beyond the annotation baseline.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence conveys essential behavior or constraints; there is no fluff or repetition. It front-loads the core purpose in the first sentence and then systematically covers models, naming, nulls, and spill behavior without waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter tool with output schema present, the description covers the critical behavioral nuances—model handling, variable suffixing, null semantics, and large-result spill behavior—that are not inferable from schema or annotations. It is complete enough for an agent to select and invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even with 100% schema description coverage, the description adds significant parameter-level meaning: it explains the models parameter behavior (suffix rules, upstream pass-through, nulls), and the canvas_id spill behavior. This is additional context not fully captured in the schema's per-parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool provides long-range climate projections from bias-corrected daily CMIP6 models over 1950-2050, with an explicit purpose: answering 'what will conditions look like through 2050?'. It also distinguishes itself from openmeteo_get_historical as the 'future-projection counterpart', which disambiguates it from a key sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use context (future projections through 2050) and names the alternative openmeteo_get_historical for past ERA5 data. It also specifies 'Daily resolution only', which is a clear constraint that guides the user away from expecting hourly data and toward forecast/ensemble tools for other resolutions.

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 ElevationA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
latitudesYesArray of latitudes in decimal degrees (up to 100). Must be same length as longitudes.
longitudesYesArray of longitudes in decimal degrees (up to 100). Must be same length as latitudes.

Output Schema

ParametersJSON Schema
NameRequiredDescription
elevationsYesElevation values in input order
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide safety profile; description adds useful context (model, resolution, max pairs) without contradicting annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two efficient sentences, front-loaded with purpose, no unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Adequately covers purpose, constraints, and use cases for a simple, idempotent lookup tool with output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%; description adds value by explaining coordinate pairs, max pairs, and matching requirement.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb ('get') and resource ('elevation'), specifies model source and resolution, distinguishes from weather-focused siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Describes typical use cases (geographic context, elevation-adjusted interpretation, route planning) but lacks explicit when-not-to-use or comparison to alternatives.

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 EnsembleA
Read-onlyIdempotent
Inspect

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 DataCanvas when canvas is enabled, returning a bounded preview with truncated: true when it is not. At least one of hourly_variables or daily_variables is required.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelsNoEnsemble 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.
latitudeYesLatitude in decimal degrees. Use openmeteo_search_locations to resolve a place name to coordinates.
timezoneNoIANA timezone (e.g., "America/Los_Angeles") or "auto" to use the location's local timezone. Default "auto".auto
canvas_idNoDataCanvas 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.
longitudeYesLongitude in decimal degrees.
past_daysNoInclude this many days of past ensemble data before today (0–92). Default 0.
forecast_daysNoForecast horizon in days (1–16). Default 7.
daily_variablesNoDaily 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_unitNoWind speed unit. Default "kmh".kmh
hourly_variablesNoHourly 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_unitNoTemperature unit. Default "celsius".celsius
precipitation_unitNoPrecipitation unit. Default "mm".mm

Output Schema

ParametersJSON Schema
NameRequiredDescription
dailyNoPer-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.
modelNoEnsemble 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).
hourlyNoPer-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.
noticeNoWarning 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.
latitudeYesSnapped latitude (Open-Meteo snaps to nearest grid point)
timezoneYesResolved IANA timezone
canvas_idNoDataCanvas 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.
elevationYesTerrain elevation at grid point (meters)
longitudeYesSnapped longitude
truncatedYesTrue 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_nameNoDuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only alongside canvas_id.
daily_unitsNoVariable → unit string for daily data. Absent when no daily_variables were requested.
hourly_unitsNoVariable → unit string for hourly data (e.g., {"temperature_2m_member01": "°C"}). Absent when no hourly_variables were requested.
member_countNoNumber 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_countYesTotal number of records (hourly + daily rows) — the full upstream total when truncated is true, not the combined length of the hourly and daily previews.
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description reveals non-obvious behaviors such as regional model coverage gaps surfacing as input errors, unknown model names being forwarded upstream, and large results spilling to DataCanvas with a truncated preview. These traits go beyond the readOnlyHint and idempotentHint annotations, which already establish safety.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a clear summary but then lists all 20 available models verbatim, duplicating the same list in the schema. This makes it longer than necessary and reduces conciseness, though the behavioral notes are useful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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, many model choices, and ensemble expansion — the description covers the key scenarios: when to use it, how output is structured, how coverage errors behave, and what happens on large pulls. The output schema covers return structure, so no additional return-value documentation is needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already provides exhaustive descriptions for all 12 parameters, including member-suffix output naming and the hourly/daily requirement. The description repeats this information without adding new semantic detail, so it meets the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Probabilistic ensemble weather forecast', immediately conveying a specific verb and resource. It further clarifies by giving member counts, forecast range, and member-suffixed columns, which distinguishes it from sibling forecast tools like openmeteo_get_forecast.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says 'Use the spread across members to compute exceedance probabilities, quantify forecast uncertainty, and build decision thresholds', which is a clear when-to-use directive. It also advises on model selection (global vs regional) but does not name alternative sibling tools for deterministic forecasting, so it lacks explicit exclusions.

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 FloodA
Read-onlyIdempotent
Inspect

GloFAS (Global Flood Awareness System) river discharge forecast and historical reanalysis. Returns daily ensemble river discharge (m³/s) for the river nearest to the given coordinates — no river ID needed, the API snaps to the nearest stream. Forecast horizon up to 210 days 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 DataCanvas for SQL querying when canvas is enabled, returning a bounded preview with truncated: true when it is not.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNoEnd 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.
latitudeYesLatitude in decimal degrees. The API snaps to the nearest river — no river ID required. Use openmeteo_search_locations to resolve a place name.
timezoneNoIANA timezone or "auto". Default "auto".auto
canvas_idNoDataCanvas 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.
longitudeYesLongitude in decimal degrees.
start_dateNoStart 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_daysNoNumber of forecast days ahead (1–210). Mutually exclusive with start_date/end_date — omit it entirely when pulling a historical range.
daily_variablesNoDaily discharge variables to fetch (e.g., ["river_discharge", "river_discharge_p25", "river_discharge_p75", "river_discharge_min", "river_discharge_max"]). Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dailyYesPer-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.
noticeNoWarning 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.
latitudeYesSnapped latitude (nearest river grid point)
timezoneYesResolved IANA timezone
canvas_idNoDataCanvas 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.
longitudeYesSnapped longitude
truncatedYesTrue 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_nameNoDuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only alongside canvas_id.
daily_unitsNoVariable → unit string for daily data (e.g., {"river_discharge": "m³/s"}).
record_countYesTotal number of daily discharge records — the full staged count when truncated is true, not the length of the daily preview.
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint and idempotentHint annotations, the description discloses several important behavioral traits: automatic snapping to nearest river (no river ID needed), null returns for far coordinates, 210-day forecast horizon, reanalysis back to 1984, mutual exclusivity of modes with rejection of lone dates, and the canvas spill mechanism with truncated: true when canvas is not enabled. These details materially help an agent predict behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-structured. It opens with the core purpose, then sequentially addresses usage modes, variables, edge cases, and output spill behavior. Every sentence adds necessary information, and there is no redundant repetition of schema details. 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.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (8 parameters, two usage modes, output spill threshold), the description is complete. It covers all essential context: mode selection, variable options, null handling, coordinate snapping, and behavior for large result sets. Since an output schema exists, the description does not need to explain return structure, so no gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even though schema coverage is 100%, the description adds significant semantic value: it explains the mutual exclusivity between forecast_days and start_date/end_date, clarifies that a lone date is rejected, lists and describes the available daily variables, and explains the canvas_id behavior (spill threshold and inline truncation). This enriches the parameter meaning far beyond the schema's property descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly specifies the tool's function: retrieving GloFAS river discharge forecasts and historical reanalysis for the nearest river to given coordinates. It explicitly distinguishes this from sibling tools by naming the resource (GloFAS, river discharge) and the unique snapping behavior. The verb 'Returns' and resource are specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage guidance: it explains the two mutually exclusive modes (forecast_days vs start_date/end_date), the requirement for both date endpoints, and the fallback to openmeteo_search_locations for place name resolution. It also clarifies when the canvas spill behavior occurs, giving clear context for when to use this tool versus handling large results.

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 ForecastA
Read-onlyIdempotent
Inspect

Weather forecast for coordinates: hourly and/or daily variables for up to 16 days ahead, with optional past_days (up to 92) for recent history. Use past_days instead of openmeteo_get_historical for dates within the last 1–5 days, since ERA5 has a variable lag. Returns per-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. A wide window — a large past_days plus many hourly variables — produces thousands of records; these spill to DataCanvas for SQL querying when canvas is enabled, and return a bounded preview with truncated: true when it is not. At least one of hourly_variables or daily_variables is required.

ParametersJSON Schema
NameRequiredDescriptionDefault
latitudeYesLatitude in decimal degrees (e.g., 47.6062 for Seattle). Use openmeteo_search_locations to resolve a place name to coordinates.
timezoneNoIANA 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_idNoDataCanvas 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.
longitudeYesLongitude in decimal degrees (e.g., -122.3321 for Seattle).
past_daysNoInclude this many days of past data before today (0–92). Use for recent history — ERA5 archive has a variable ~5-day lag. Default 0.
forecast_daysNoNumber of forecast days (1–16). Default 7.
daily_variablesNoDaily 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.
wind_speed_unitNoWind speed unit: "kmh" (km/h), "mph", "ms" (m/s), or "kn" (knots). Default "kmh".kmh
hourly_variablesNoHourly 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.
temperature_unitNoTemperature unit. Default "celsius".celsius
precipitation_unitNoPrecipitation unit: "mm" or "inch". Default "mm".mm

Output Schema

ParametersJSON Schema
NameRequiredDescription
dailyNoPer-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.
hourlyNoPer-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.
noticeNoWarning 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.
latitudeYesSnapped latitude (Open-Meteo snaps to nearest grid point)
timezoneYesResolved IANA timezone
canvas_idNoDataCanvas 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.
elevationYesTerrain elevation at grid point (meters)
longitudeYesSnapped longitude
truncatedYesTrue 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_nameNoDuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only alongside canvas_id.
daily_unitsNoMap of variable name → unit string for daily data. Absent when no daily_variables were requested.
hourly_unitsNoMap of variable name → unit string for hourly data (e.g., {"temperature_2m": "°C", "precipitation": "mm"}). Absent when no hourly_variables were requested.
record_countYesTotal number of records (hourly + daily rows) — the full upstream total when truncated is true, not the combined length of the hourly and daily previews.
utc_offset_secondsYesUTC offset in seconds for this timezone at query time
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true and idempotentHint=true, and the description adds detailed behavioral context: the return format (per-timestamp records with 'time' fields), the spillover behavior to DataCanvas with bounded preview and truncated flag, and the requirement that at least one variable array must be provided. It also warns about large outputs, which the 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: it opens with the core purpose, then explains return format, lists common variables, discusses spillover behavior, and ends with a requirement note. Every sentence adds useful information without redundancy. Despite its length, it is dense and front-loaded with the most important facts.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 11 parameters and an output schema, the description provides comprehensive context: it covers the data source (ERA5 lag), return structure, handling of large results, and clear guidance for choosing between hourly and daily variables. The existence of sibling tools like openmeteo_get_historical further helps the agent place this tool in context, and the description explicitly addresses that relationship.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so each parameter is already well-documented. The description adds valuable semantics by listing common hourly and daily variables, clarifying that hourly names cannot be used in daily_variables and vice versa, and noting that daily aggregates must be used for daily summaries. This goes beyond the schema's per-property descriptions and helps the agent select valid and meaningful values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with a specific verb ('Wealther forecast for coordinates') and resource ('coordinates'), and distinguishes it from siblings by noting it covers up to 16 days ahead and can use past_days for recent history. It also explicitly contrasts with openmeteo_get_historical, making the tool's scope unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent when to use this tool: 'Use past_days instead of openmeteo_get_historical for dates within the last 1–5 days'. It also gives contextual guidance on when results spill to DataCanvas, including the trade-off between large past_days and many variables. This is clear, actionable usage direction beyond simple alternatives.

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 HistoricalA
Read-onlyIdempotent
Inspect

Historical weather from the ERA5 reanalysis archive (1940–present). Requires start_date and end_date (ISO 8601 date, e.g., "2024-07-01"). ERA5 has a variable lag of up to ~5 days — for dates within the last week, use openmeteo_get_forecast with past_days instead. Uses the same variable names as the forecast API for direct comparison. Large date ranges (multi-year hourly) produce thousands of records — these spill to DataCanvas for SQL querying when canvas is enabled, and return a bounded preview with truncated: true when it is not. At least one of hourly_variables or daily_variables is required.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateYesEnd 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.
latitudeYesLatitude in decimal degrees. Use openmeteo_search_locations to resolve a place name to coordinates.
timezoneNoIANA timezone or "auto". Default "auto".auto
canvas_idNoDataCanvas 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.
longitudeYesLongitude in decimal degrees.
start_dateYesStart date (YYYY-MM-DD, e.g., "2024-07-01"). ERA5 covers from 1940-01-01 to approximately 5 days ago.
daily_variablesNoDaily 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_unitNoWind speed unit. Default "kmh".kmh
hourly_variablesNoHourly 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.
temperature_unitNoTemperature unit. Default "celsius".celsius
precipitation_unitNoPrecipitation unit. Default "mm".mm

Output Schema

ParametersJSON Schema
NameRequiredDescription
dailyNoPer-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.
hourlyNoPer-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.
noticeNoWarning 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.
latitudeYesSnapped latitude
timezoneYesResolved IANA timezone
canvas_idNoDataCanvas 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.
elevationYesElevation at grid point (meters)
longitudeYesSnapped longitude
truncatedYesTrue 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_rangeYesDate range of returned data
table_nameNoDuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only alongside canvas_id.
daily_unitsNoVariable → unit string for daily data. Absent when no daily_variables were requested.
hourly_unitsNoVariable → unit string for hourly data (e.g., {"temperature_2m": "°C", "precipitation": "mm"}). Absent when no hourly_variables were requested.
record_countYesTotal number of records (hourly + daily rows) — the full upstream total when truncated is true, not the combined length of the hourly and daily previews.
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint and idempotentHint, but the description goes beyond by disclosing the ERA5 data lag (~5 days), the spill behavior to DataCanvas for large queries, and the bounded preview with truncated: true when canvas is not enabled. This adds significant context not captured in structured metadata.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, four sentences, and front-loaded with the core purpose. It efficiently covers usage, constraints, and edge cases without redundancy. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (11 params, 100% schema coverage, output schema present), the description provides essential context: data source, lag, spill behavior, truncation, and comparison with the forecast API. It is sufficiently complete for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides 100% coverage with detailed descriptions for all 11 parameters, so the baseline is 3. The description does not add meaning beyond the schema; it merely restates that start_date and end_date are required and that at least one variable list is needed, which is already present in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as providing historical weather from the ERA5 reanalysis archive (1940–present), which is a specific verb+resource combination. It also distinguishes itself from the forecast tool by directing users to openmeteo_get_forecast for recent dates, thereby setting it apart from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance is given: for dates within the last ~5 days, use openmeteo_get_forecast with past_days instead. It also states required parameters (start_date, end_date) and the requirement of at least one of hourly_variables or daily_variables, giving clear when-to-use and alternative tool instructions.

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 MarineA
Read-onlyIdempotent
Inspect

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 DataCanvas for SQL querying when canvas is enabled, and return a bounded preview with truncated: true when it is not.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNoEnd 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.
latitudeYesLatitude of a coastal or ocean point. Use openmeteo_search_locations to resolve a place name. Inland points return near-zero wave values.
timezoneNoIANA timezone or "auto". Default "auto".auto
canvas_idNoDataCanvas 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.
longitudeYesLongitude in decimal degrees.
past_daysNoInclude 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_dateNoStart 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_daysNoForecast 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_variablesNoDaily 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_variablesNoHourly 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

ParametersJSON Schema
NameRequiredDescription
dailyNoPer-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.
hourlyNoPer-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.
noticeNoWarning 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.
latitudeYesSnapped latitude
timezoneYesResolved IANA timezone
canvas_idNoDataCanvas 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.
longitudeYesSnapped longitude
truncatedYesTrue 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_nameNoDuckDB table name for the staged data — pass to openmeteo_dataframe_query. Present only alongside canvas_id.
daily_unitsNoVariable → unit string for daily data. Absent when no daily_variables were requested.
hourly_unitsNoVariable → unit string for hourly data (e.g., {"wave_height": "m", "wave_period": "s"}). Absent when no hourly_variables were requested.
record_countYesTotal number of records (hourly + daily rows) — the full upstream total when truncated is true, not the combined length of the hourly and daily previews.
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Even though annotations already declare readOnlyHint and idempotentHint, the description adds substantial behavioral detail: the mutually exclusive date windows, rejection of a lone start_date or end_date, per-timestamp return structure, canvas spill behavior with truncated previews, and the null ocean_current_velocity caveat. These go well beyond the annotation baseline.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but information-dense, covering purpose, parameter constraints, usage caveats, and return behavior without fluff. It is front-loaded with the main purpose sentence, and each subsequent sentence contributes a distinct operational or behavioral fact.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (10 parameters, mutually exclusive date windows, multiple variable categories, and canvas spill behavior), the description is exceptionally complete. It explains the main usage patterns, edge cases (inland points, null ocean current, lone dates), result structure, and large-result handling, so an agent has enough context to invoke it correctly even without reading the full schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides 100% coverage for all 10 parameters with descriptions, so the baseline is 3. However, the description adds value by listing common hourly and daily variable names (e.g., wave_height, swell_wave_height, wave_height_max) and clarifying the output record shape ('time' field plus one key per variable), which is not fully specified in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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,' listing concrete variables such as wave height, wave period, and sea-surface temperature. It clearly distinguishes this tool from weather, climate, air quality, and other sibling tools by focusing on marine/ocean data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when this tool is appropriate ('Best for open-ocean and coastal exposed points') and an explicit exclusion ('sheltered inland waters return near-zero wave values'). It also explains data-window selection (forecast_days, past_days, or start_date/end_date) but does not explicitly name alternative sibling tools, so it stops short of a 5.

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 LocationsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesPlace 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.
countNoMax results to return (1–10). Default 5. Return more when disambiguating common names like "Springfield" or "Portland".
countryNoISO 3166-1 alpha-2 country code (e.g. "US", "FR") to disambiguate places that share a name. Omit for a global search.
languageNoLanguage 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.en

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesNumber of results returned
resultsYesRanked matches (most relevant first). Never empty — when nothing matches, the tool fails with no_results instead of returning an empty array.
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint. The description adds behavioral details: returns up to 10 matches ranked by population/relevance, and that it is a required prerequisite. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five sentences, front-loaded with purpose, then prerequisites, then parameter usage. Every sentence adds value with no repetition or fluff. Structure is logical and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully explains the tool's role as a prerequisite, how results feed into sibling tools, and the ranking logic. With output schema present, return values need not be detailed. Complete for the use case.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% (baseline 3), but the description adds significant value: explains that 'name' should be bare, 'country' is for disambiguation, 'language' has script detection and retry logic, and 'count' is for disambiguation. These details go well beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool resolves a place name to ranked coordinate matches with country, region, elevation, timezone, and population. It distinguishes from sibling weather tools by highlighting that it is a prerequisite for name-based queries since weather tools require latitude/longitude.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance on when to use (prerequisite for name-based queries), how to use (search bare place name, use country input to disambiguate), and what not to do (never fold qualifier into name). Clear alternatives via sibling tools are implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Servers

View all MCP Servers

Try in Browser

Your Connectors

Sign in to create a connector for this server.