Servidor MCP

open-meteo-mcp-server

io.github.cyanheads/open-meteo-mcp-server
Datos y analítica Ciencia e ingeniería Público y accesible MCP 2025-11-25

Qué hace este MCP

Provides global weather, historical and climate data, forecasts, marine conditions, air quality, floods, elevation, ensembles, and geocoding.

openmeteo_dataframe_describe
Openmeteo Dataframe Describe
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.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['canvas_id'], 'properties': {'canvas_id': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]{10}$', 'description': '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.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['canvas_id', 'tables', 'expires_at']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['canvas_not_enabled', 'canvas_not_found'], '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.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'tables': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'kind', 'row_count', 'columns'], 'properties': {'kind': {'enum': ['table', 'view'], 'type': 'string', 'description': 'Whether this is a base table or a view.'}, 'name': {'type': 'string', 'description': 'Table name â\x80\x94 pass to openmeteo_dataframe_query.'}, 'columns': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'type', 'nullable'], 'properties': {'name': {'type': 'string', 'description': 'Column name.'}, 'type': {'type': 'string', 'description': 'DuckDB type (e.g. VARCHAR, DOUBLE, TIMESTAMP).'}, 'nullable': {'type': 'boolean', 'description': 'Whether the column allows NULL.'}}, 'description': 'A column: name, DuckDB type, and nullability.', 'additionalProperties': False}, 'description': 'Column schema.'}, 'row_count': {'type': 'number', 'description': 'Number of rows.'}}, 'description': 'A table or view on the canvas: name, kind, row count, and column schema.', 'additionalProperties': False}, 'description': 'Tables and views registered on this canvas.'}, 'canvas_id': {'type': 'string', 'description': 'Canvas ID that was inspected.'}, 'expires_at': {'type': 'string', 'description': 'ISO 8601 expiry after the sliding 24 h TTL.'}}, 'additionalProperties': False}
openmeteo_dataframe_query
Openmeteo Dataframe Query
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.
Solo lectura
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['canvas_id', 'sql'], 'properties': {'sql': {'type': 'string', 'description': "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': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]{10}$', 'description': '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.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['rows', 'row_count', 'canvas_id']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'rows': {'type': 'array', 'items': {'type': 'object', 'propertyNames': {'type': 'string'}, 'additionalProperties': {}}, 'description': 'Result rows â\x80\x94 a preview capped at 100. When row_count exceeds this, page the rest by re-issuing the SQL with LIMIT / OFFSET.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['canvas_not_enabled', 'canvas_not_found', 'system_catalog_access', 'missing_table'], '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 â\x80\x94 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.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'canvas_id': {'type': 'string', 'description': 'Canvas ID that was queried.'}, 'row_count': {'type': 'number', 'description': 'Total rows in the full result before any cap.'}}, 'additionalProperties': False}
openmeteo_get_air_quality
Openmeteo Get Air Quality
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.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['latitude', 'longitude'], 'properties': {'end_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'End date for the archive range (YYYY-MM-DD, inclusive). Must be on or after start_date. Requires start_date â\x80\x94 the pair must be sent together, and neither combines with forecast_days or past_days.'}, 'latitude': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees. Use openmeteo_search_locations to resolve a place name.'}, 'timezone': {'type': 'string', 'default': 'auto', 'description': 'IANA timezone or "auto". Default "auto".'}, 'canvas_id': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]{10}$', 'description': 'DataCanvas token for wide past_days, archive-range, or multi-variable queries. When a result is too large to return inline â\x80\x94 driven by total payload size, so a wide multi-variable pull can spill at any row count â\x80\x94 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': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees.'}, 'past_days': {'type': 'integer', 'default': 0, 'maximum': 92, 'minimum': 0, 'description': 'Include this many days of past data before today (0â\x80\x9392). 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': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': '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 â\x80\x94 the pair must be sent together, and neither combines with forecast_days or past_days.'}, 'forecast_days': {'type': 'integer', 'maximum': 7, 'minimum': 1, 'description': 'Forecast horizon in days (1â\x80\x937). Omit for the upstream default of 5. Mutually exclusive with start_date/end_date â\x80\x94 omit it entirely when pulling an archive range.'}, 'hourly_variables': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 50, 'description': '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': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 50, '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.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['latitude', 'longitude', 'timezone', 'record_count', 'data_source', 'truncated']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['invalid_variable', 'no_variables_requested', 'date_range_incomplete', 'forecast_window_conflict', 'date_order_invalid', 'invalid_timezone', 'request_too_large'], 'description': '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 â\x80\x94 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.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'hourly': {'type': 'array', 'items': {'type': 'object', 'propertyNames': {'type': 'string'}, 'additionalProperties': {}}, 'description': '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 â\x80\x94 query canvas_id for the full dataset when one is present.'}, 'notice': {'type': 'string', 'description': '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 â\x80\x94 with DataCanvas disabled â\x80\x94 why there is no canvas_id and how to reach the rows the preview omits.'}, 'current': {'type': 'object', 'required': ['time', 'interval'], 'properties': {'time': {'type': 'string', 'description': 'Timestamp of these values (ISO 8601, in the resolved timezone)'}, 'interval': {'type': 'number', 'description': 'Update cadence of the current-conditions data, in seconds (3600 = hourly on this endpoint) â\x80\x94 metadata, not a requested variable'}}, '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.', 'additionalProperties': {'type': ['string', 'number', 'null']}}, 'latitude': {'type': 'number', 'description': 'Snapped latitude'}, 'timezone': {'type': 'string', 'description': 'Resolved IANA timezone'}, 'canvas_id': {'type': 'string', 'description': 'DataCanvas token for the staged full dataset. Present only when truncated is true AND DataCanvas is enabled (CANVAS_PROVIDER_TYPE=duckdb) â\x80\x94 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': {'type': 'number', 'description': 'Snapped longitude'}, 'truncated': {'type': 'boolean', '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.'}, 'table_name': {'type': 'string', 'description': 'DuckDB table name for the staged data â\x80\x94 use as the FROM target in openmeteo_dataframe_query SQL; openmeteo_dataframe_describe lists its columns. Present only alongside canvas_id.'}, 'data_source': {'type': 'string', 'const': 'CAMS', 'description': 'Data source identifier â\x80\x94 this is modeled CAMS data, forecast or archive, not measured station data.'}, 'hourly_units': {'type': 'object', 'description': 'Variable â\x86\x92 unit string for hourly data (e.g., {"pm2_5": "μg/m³", "european_aqi": "EAQI"}).', 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'string'}}, 'record_count': {'type': 'number', 'description': 'Total number of hourly records â\x80\x94 the full upstream total when truncated is true, not the length of the hourly preview.'}, 'current_units': {'type': 'object', 'description': 'Key â\x86\x92 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'}, 'additionalProperties': {'type': 'string'}}}, 'additionalProperties': False}
openmeteo_get_climate
Openmeteo Get Climate
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.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['latitude', 'longitude', 'start_date', 'end_date'], 'properties': {'models': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 7, 'description': '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': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'End date (YYYY-MM-DD, inclusive, max 2050-12-31). Must be on or after start_date.'}, 'latitude': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees. Use openmeteo_search_locations to resolve a place name to coordinates.'}, 'timezone': {'type': 'string', 'default': 'auto', 'description': 'IANA timezone or "auto". Default "auto".'}, 'canvas_id': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]{10}$', 'description': 'DataCanvas token for multi-decade or multi-model queries. When a result is too large to return inline â\x80\x94 driven by total payload size, so a wide multi-model pull can spill at any row count â\x80\x94 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': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees.'}, 'start_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Start date (YYYY-MM-DD, e.g., "2049-01-01"). CMIP6 projections cover 1950-01-01 to 2050-12-31.'}, 'daily_variables': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 50, 'description': 'Daily climate variables to fetch (e.g., ["temperature_2m_max", "temperature_2m_min", "precipitation_sum", "wind_speed_10m_mean", "shortwave_radiation_sum"]). Required â\x80\x94 the Climate API is daily-only.'}, 'wind_speed_unit': {'enum': ['kmh', 'mph', 'ms', 'kn'], 'type': 'string', 'default': 'kmh', 'description': 'Wind speed unit. Default "kmh".'}, 'temperature_unit': {'enum': ['celsius', 'fahrenheit'], 'type': 'string', 'default': 'celsius', 'description': 'Temperature unit. Default "celsius".'}, 'precipitation_unit': {'enum': ['mm', 'inch'], 'type': 'string', 'default': 'mm', 'description': 'Precipitation unit. Default "mm".'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['latitude', 'longitude', 'elevation', 'timezone', 'date_range', 'record_count', 'daily', 'truncated']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'daily': {'type': 'array', 'items': {'type': 'object', 'propertyNames': {'type': 'string'}, 'additionalProperties': {}}, 'description': 'Per-day records with "time" (YYYY-MM-DD) + one key per requested variable â\x80\x94 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 â\x80\x94 query canvas_id for the full dataset when one is present.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['date_out_of_range', 'date_order_invalid', 'no_variables_requested', 'invalid_variable', 'invalid_timezone', 'request_too_large'], '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. `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.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'models': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Climate models requested â\x80\x94 echoes the models parameter. Absent when models was omitted (API default model; the response carries no provenance).'}, 'notice': {'type': 'string', 'description': '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 â\x80\x94 with DataCanvas disabled â\x80\x94 why there is no canvas_id and how to reach the rows the preview omits.'}, 'latitude': {'type': 'number', 'description': 'Snapped latitude (Open-Meteo snaps to nearest grid point)'}, 'timezone': {'type': 'string', 'description': 'Resolved IANA timezone'}, 'canvas_id': {'type': 'string', 'description': 'DataCanvas token for the staged full dataset. Present only when truncated is true AND DataCanvas is enabled (CANVAS_PROVIDER_TYPE=duckdb) â\x80\x94 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': {'type': 'number', 'description': 'Elevation at grid point (meters)'}, 'longitude': {'type': 'number', 'description': 'Snapped longitude'}, 'truncated': {'type': 'boolean', 'description': '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': {'type': 'object', 'required': ['start', 'end'], 'properties': {'end': {'type': 'string', 'description': 'Actual end date of returned data'}, 'start': {'type': 'string', 'description': 'Actual start date of returned data'}}, 'description': 'Date range of returned data', 'additionalProperties': False}, 'table_name': {'type': 'string', 'description': 'DuckDB table name for the staged data â\x80\x94 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': {'type': 'object', 'description': 'Column â\x86\x92 unit string for daily data (e.g., {"temperature_2m_max_CMCC_CM2_VHR4": "°C"}).', 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'string'}}, 'record_count': {'type': 'number', 'description': 'Total number of daily records â\x80\x94 the full upstream total when truncated is true, not the length of the daily preview.'}}, 'additionalProperties': False}
openmeteo_get_elevation
Openmeteo Get Elevation
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.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['latitudes', 'longitudes'], 'properties': {'latitudes': {'type': 'array', 'items': {'type': 'number', 'maximum': 90, 'minimum': -90}, 'maxItems': 100, 'minItems': 1, 'description': 'Array of latitudes in decimal degrees (up to 100). Must be same length as longitudes.'}, 'longitudes': {'type': 'array', 'items': {'type': 'number', 'maximum': 180, 'minimum': -180}, 'maxItems': 100, 'minItems': 1, 'description': 'Array of longitudes in decimal degrees (up to 100). Must be same length as latitudes.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['elevations']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['coordinate_count_mismatch'], '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.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'elevations': {'type': 'array', 'items': {'type': 'object', 'required': ['latitude', 'longitude', 'elevation_m'], 'properties': {'latitude': {'type': 'number', 'description': 'Input latitude'}, 'longitude': {'type': 'number', 'description': 'Input longitude'}, 'elevation_m': {'type': 'number', 'description': 'Terrain elevation in meters above sea level'}}, 'description': 'Elevation for a single coordinate pair', 'additionalProperties': False}, 'description': 'Elevation values in input order'}}, 'additionalProperties': False}
openmeteo_get_ensemble
Openmeteo Get Ensemble
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.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['latitude', 'longitude'], 'properties': {'models': {'type': 'string', 'description': '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â\x80\x9340, 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': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees. Use openmeteo_search_locations to resolve a place name to coordinates.'}, 'timezone': {'type': 'string', 'default': 'auto', 'description': 'IANA timezone (e.g., "America/Los_Angeles") or "auto" to use the location\'s local timezone. Default "auto".'}, 'canvas_id': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]{10}$', 'description': 'DataCanvas token for large multi-member queries. When a result is too large to return inline â\x80\x94 driven by total payload size, so a wide member fan-out can spill at any row count â\x80\x94 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': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees.'}, 'past_days': {'type': 'integer', 'default': 0, 'maximum': 92, 'minimum': 0, 'description': 'Include this many days of past ensemble data before today (0â\x80\x9392). Default 0.'}, 'forecast_days': {'type': 'integer', 'default': 7, 'maximum': 16, 'minimum': 1, 'description': 'Forecast horizon in days (1â\x80\x9316). Default 7.'}, 'daily_variables': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 50, 'description': '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, â\x80¦ Daily names only â\x80\x94 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': {'enum': ['kmh', 'mph', 'ms', 'kn'], 'type': 'string', 'default': 'kmh', 'description': 'Wind speed unit. Default "kmh".'}, 'hourly_variables': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 50, 'description': '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, â\x80¦ in the output. Hourly names only â\x80\x94 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': {'enum': ['celsius', 'fahrenheit'], 'type': 'string', 'default': 'celsius', 'description': 'Temperature unit. Default "celsius".'}, 'precipitation_unit': {'enum': ['mm', 'inch'], 'type': 'string', 'default': 'mm', 'description': 'Precipitation unit. Default "mm".'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['latitude', 'longitude', 'elevation', 'timezone', 'record_count', 'truncated']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'daily': {'type': 'array', 'items': {'type': 'object', 'propertyNames': {'type': 'string'}, 'additionalProperties': {}}, 'description': '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 â\x80\x94 query canvas_id for the full dataset when one is present.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['no_variables_requested', 'invalid_variable', 'variable_wrong_cadence', 'invalid_timezone', 'request_too_large'], '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 â\x80\x94 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.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'model': {'type': 'string', 'description': 'Ensemble model used (e.g. "ecmwf_ifs025_ensemble") â\x80\x94 echoes the requested models parameter. Absent when models was omitted (API default blend; the API reports no provenance).'}, 'hourly': {'type': 'array', 'items': {'type': 'object', 'propertyNames': {'type': 'string'}, 'additionalProperties': {}}, 'description': '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 â\x80\x94 query canvas_id for the full dataset when one is present.'}, 'notice': {'type': 'string', 'description': '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 â\x80\x94 with DataCanvas disabled â\x80\x94 why there is no canvas_id and how to reach the rows the preview omits.'}, 'latitude': {'type': 'number', 'description': 'Snapped latitude (Open-Meteo snaps to nearest grid point)'}, 'timezone': {'type': 'string', 'description': 'Resolved IANA timezone'}, 'canvas_id': {'type': 'string', 'description': 'DataCanvas token for the staged full dataset. Present only when truncated is true AND DataCanvas is enabled (CANVAS_PROVIDER_TYPE=duckdb) â\x80\x94 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': {'type': 'number', 'description': 'Terrain elevation at grid point (meters)'}, 'longitude': {'type': 'number', 'description': 'Snapped longitude'}, 'truncated': {'type': 'boolean', '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 â\x80\x94 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': {'type': 'string', 'description': 'DuckDB table name for the staged data â\x80\x94 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': {'type': 'object', 'description': 'Variable â\x86\x92 unit string for daily data. Absent when no daily_variables were requested.', 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'string'}}, 'hourly_units': {'type': 'object', 'description': 'Variable â\x86\x92 unit string for hourly data (e.g., {"temperature_2m_member01": "°C"}). Absent when no hourly_variables were requested.', 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'string'}}, 'member_count': {'type': 'number', 'description': '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': {'type': 'number', 'description': 'Total number of records (hourly + daily rows) â\x80\x94 the full upstream total when truncated is true, not the combined length of the hourly and daily previews.'}}, 'additionalProperties': False}
openmeteo_get_flood
Openmeteo Get Flood
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.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['latitude', 'longitude'], 'properties': {'end_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'End date for historical reanalysis (YYYY-MM-DD, inclusive). Must be on or after start_date. Requires start_date â\x80\x94 the pair must be sent together, and neither combines with forecast_days.'}, 'latitude': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees. Discharge is returned for the largest modeled river within 5 km of this point â\x80\x94 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': {'type': 'string', 'default': 'auto', 'description': 'IANA timezone or "auto". Default "auto".'}, 'canvas_id': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]{10}$', 'description': 'DataCanvas token for wide reanalysis queries. When a result is too large to return inline â\x80\x94 driven by total payload size, so a multi-variable pull can spill at any row count â\x80\x94 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': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees. With latitude it selects the largest modeled river within 5 km, which is not necessarily the closest one.'}, 'start_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Start date for historical reanalysis (YYYY-MM-DD, e.g., "2023-01-01"). GloFAS reanalysis covers from 1984-01-01. Requires end_date â\x80\x94 the pair must be sent together, and neither combines with forecast_days.'}, 'forecast_days': {'type': 'integer', 'maximum': 210, 'minimum': 1, 'description': 'Number of forecast days ahead (1â\x80\x93210). Mutually exclusive with start_date/end_date â\x80\x94 omit it entirely when pulling a historical range.'}, 'daily_variables': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 20, 'description': 'Daily discharge variables to fetch (e.g., ["river_discharge", "river_discharge_p25", "river_discharge_p75", "river_discharge_min", "river_discharge_max"]). Required.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['latitude', 'longitude', 'timezone', 'record_count', 'daily', 'truncated']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'daily': {'type': 'array', 'items': {'type': 'object', 'propertyNames': {'type': 'string'}, 'additionalProperties': {}}, 'description': '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 â\x80\x94 query canvas_id for the full dataset when one is present.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['no_variables_requested', 'date_range_incomplete', 'forecast_days_conflict', 'date_order_invalid', 'date_out_of_range', 'invalid_variable', 'invalid_timezone', 'request_too_large'], '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 â\x80\x94 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.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'notice': {'type': 'string', 'description': '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 â\x80\x94 with DataCanvas disabled â\x80\x94 why there is no canvas_id and how to reach the rows the preview omits.'}, 'latitude': {'type': 'number', 'description': 'Snapped latitude â\x80\x94 grid point of the selected river'}, 'timezone': {'type': 'string', 'description': 'Resolved IANA timezone'}, 'canvas_id': {'type': 'string', 'description': 'DataCanvas token for the staged full dataset. Present only when truncated is true AND DataCanvas is enabled (CANVAS_PROVIDER_TYPE=duckdb) â\x80\x94 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': {'type': 'number', 'description': 'Snapped longitude â\x80\x94 grid point of the selected river'}, 'truncated': {'type': 'boolean', 'description': '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': {'type': 'string', 'description': 'DuckDB table name for the staged data â\x80\x94 use as the FROM target in openmeteo_dataframe_query SQL; openmeteo_dataframe_describe lists its columns. Present only alongside canvas_id.'}, 'daily_units': {'type': 'object', 'description': 'Variable â\x86\x92 unit string for daily data (e.g., {"river_discharge": "m³/s"}).', 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'string'}}, 'record_count': {'type': 'number', 'description': 'Total number of daily discharge records â\x80\x94 the full staged count when truncated is true, not the length of the daily preview.'}}, 'additionalProperties': False}
openmeteo_get_forecast
Openmeteo Get Forecast
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.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['latitude', 'longitude'], 'properties': {'latitude': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees (e.g., 47.6062 for Seattle). Use openmeteo_search_locations to resolve a place name to coordinates.'}, 'timezone': {'type': 'string', 'default': 'auto', 'description': '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.'}, 'canvas_id': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]{10}$', 'description': 'DataCanvas token for wide past_days or multi-variable queries. When a result is too large to return inline â\x80\x94 driven by total payload size, so a wide multi-variable pull can spill at any row count â\x80\x94 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': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees (e.g., -122.3321 for Seattle).'}, 'past_days': {'type': 'integer', 'default': 0, 'maximum': 92, 'minimum': 0, 'description': 'Include this many days of past data before today (0â\x80\x9392). Use for recent history â\x80\x94 the archiveâ\x80\x99s ERA5 components lag by up to ~5 days. Default 0.'}, 'forecast_days': {'type': 'integer', 'default': 7, 'maximum': 16, 'minimum': 1, 'description': 'Number of forecast days (1â\x80\x9316). Default 7.'}, 'daily_variables': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 50, 'description': '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 â\x80\x94 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': {'enum': ['kmh', 'mph', 'ms', 'kn'], 'type': 'string', 'default': 'kmh', 'description': 'Wind speed unit: "kmh" (km/h), "mph", "ms" (m/s), or "kn" (knots). Default "kmh".'}, 'hourly_variables': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 50, 'description': 'Hourly variables to fetch (e.g., ["temperature_2m", "precipitation", "wind_speed_10m", "relative_humidity_2m", "cloud_cover", "uv_index", "apparent_temperature"]). Hourly names only â\x80\x94 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': {'enum': ['celsius', 'fahrenheit'], 'type': 'string', 'default': 'celsius', 'description': 'Temperature unit. Default "celsius".'}, 'current_variables': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 50, '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.'}, 'precipitation_unit': {'enum': ['mm', 'inch'], 'type': 'string', 'default': 'mm', 'description': 'Precipitation unit: "mm" or "inch". Default "mm".'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['latitude', 'longitude', 'elevation', 'timezone', 'utc_offset_seconds', 'record_count', 'truncated']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'daily': {'type': 'array', 'items': {'type': 'object', 'propertyNames': {'type': 'string'}, 'additionalProperties': {}}, 'description': '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 â\x80\x94 query canvas_id for the full dataset when one is present.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['invalid_variable', 'variable_wrong_cadence', 'no_variables_requested', 'invalid_timezone', 'request_too_large'], '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 â\x80\x94 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.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'hourly': {'type': 'array', 'items': {'type': 'object', 'propertyNames': {'type': 'string'}, 'additionalProperties': {}}, 'description': '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 â\x80\x94 query canvas_id for the full dataset when one is present.'}, 'notice': {'type': 'string', 'description': '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 â\x80\x94 with DataCanvas disabled â\x80\x94 why there is no canvas_id and how to reach the rows the preview omits.'}, 'current': {'type': 'object', 'required': ['time', 'interval'], 'properties': {'time': {'type': 'string', 'description': 'Timestamp of these values (ISO 8601, in the resolved timezone)'}, 'interval': {'type': 'number', 'description': 'Update cadence of the current-conditions data, in seconds (900 = 15 minutes) â\x80\x94 metadata, not a requested variable'}}, '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.', 'additionalProperties': {'type': ['string', 'number', 'null']}}, 'latitude': {'type': 'number', 'description': 'Snapped latitude (Open-Meteo snaps to nearest grid point)'}, 'timezone': {'type': 'string', 'description': 'Resolved IANA timezone'}, 'canvas_id': {'type': 'string', 'description': 'DataCanvas token for the staged full dataset. Present only when truncated is true AND DataCanvas is enabled (CANVAS_PROVIDER_TYPE=duckdb) â\x80\x94 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': {'type': 'number', 'description': 'Terrain elevation at grid point (meters)'}, 'longitude': {'type': 'number', 'description': 'Snapped longitude'}, 'truncated': {'type': 'boolean', '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 â\x80\x94 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': {'type': 'string', 'description': 'DuckDB table name for the staged data â\x80\x94 use as the FROM target in openmeteo_dataframe_query SQL; openmeteo_dataframe_describe lists its columns. Present only alongside canvas_id.'}, 'daily_units': {'type': 'object', 'description': 'Map of variable name â\x86\x92 unit string for daily data. Absent when no daily_variables were requested.', 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'string'}}, 'hourly_units': {'type': 'object', 'description': 'Map of variable name â\x86\x92 unit string for hourly data (e.g., {"temperature_2m": "°C", "precipitation": "mm"}). Absent when no hourly_variables were requested.', 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'string'}}, 'record_count': {'type': 'number', 'description': 'Total number of records (hourly + daily rows) â\x80\x94 the full upstream total when truncated is true, not the combined length of the hourly and daily previews.'}, 'current_units': {'type': 'object', 'description': 'Map of key â\x86\x92 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'}, 'additionalProperties': {'type': 'string'}}, 'utc_offset_seconds': {'type': 'number', 'description': 'UTC offset in seconds for this timezone at query time'}}, 'additionalProperties': False}
openmeteo_get_historical
Openmeteo Get Historical
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.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['latitude', 'longitude', 'start_date', 'end_date'], 'properties': {'models': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 8, '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 â\x80\x94 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': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': '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': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees. Use openmeteo_search_locations to resolve a place name to coordinates.'}, 'timezone': {'type': 'string', 'default': 'auto', 'description': 'IANA timezone or "auto". Default "auto".'}, 'canvas_id': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]{10}$', 'description': 'DataCanvas token for multi-year or multi-variable queries. When a result is too large to return inline â\x80\x94 driven by total payload size, so a wide multi-variable pull can spill at any row count â\x80\x94 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': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees.'}, 'start_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': '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 â\x80\x94 the ERA5 family runs about 5 days behind, IFS HRES is current.'}, 'daily_variables': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 50, 'description': 'Daily summary variables (e.g., ["temperature_2m_max", "temperature_2m_min", "precipitation_sum", "wind_speed_10m_max"]). Daily names only â\x80\x94 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': {'enum': ['kmh', 'mph', 'ms', 'kn'], 'type': 'string', 'default': 'kmh', 'description': 'Wind speed unit. Default "kmh".'}, 'hourly_variables': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 50, 'description': 'Hourly archive variables (e.g., ["temperature_2m", "precipitation", "wind_speed_10m", "relative_humidity_2m", "cloud_cover", "soil_moisture_0_to_7cm"]). Hourly names only â\x80\x94 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': {'enum': ['celsius', 'fahrenheit'], 'type': 'string', 'default': 'celsius', 'description': 'Temperature unit. Default "celsius".'}, 'precipitation_unit': {'enum': ['mm', 'inch'], 'type': 'string', 'default': 'mm', 'description': 'Precipitation unit. Default "mm".'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['latitude', 'longitude', 'elevation', 'timezone', 'date_range', 'record_count', 'truncated']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'daily': {'type': 'array', 'items': {'type': 'object', 'propertyNames': {'type': 'string'}, 'additionalProperties': {}}, 'description': 'Per-day records with "time" (YYYY-MM-DD) + variable keys. Absent when only hourly_variables were requested. When truncated, contains only a preview â\x80\x94 query canvas_id for the full dataset when one is present.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['date_out_of_range', 'date_order_invalid', 'no_variables_requested', 'invalid_variable', 'variable_wrong_cadence', 'invalid_timezone', 'request_too_large'], 'description': '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 â\x80\x94 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.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'hourly': {'type': 'array', 'items': {'type': 'object', 'propertyNames': {'type': 'string'}, 'additionalProperties': {}}, 'description': 'Per-hour records with "time" (ISO 8601) + variable keys. Absent when only daily_variables were requested. When truncated, contains only a preview â\x80\x94 query canvas_id for the full dataset when one is present.'}, 'models': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Archive models requested â\x80\x94 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': {'type': 'string', 'description': '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 â\x80\x94 with DataCanvas disabled â\x80\x94 why there is no canvas_id and how to reach the rows the preview omits.'}, 'latitude': {'type': 'number', 'description': 'Snapped latitude'}, 'timezone': {'type': 'string', 'description': 'Resolved IANA timezone'}, 'canvas_id': {'type': 'string', 'description': 'DataCanvas token for the staged full dataset. Present only when truncated is true AND DataCanvas is enabled (CANVAS_PROVIDER_TYPE=duckdb) â\x80\x94 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': {'type': 'number', 'description': 'Elevation at grid point (meters)'}, 'longitude': {'type': 'number', 'description': 'Snapped longitude'}, 'truncated': {'type': 'boolean', '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 â\x80\x94 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': {'type': 'object', 'required': ['start', 'end'], 'properties': {'end': {'type': 'string', 'description': 'Actual end date of returned data'}, 'start': {'type': 'string', 'description': 'Actual start date of returned data'}}, 'description': 'Date range of returned data', 'additionalProperties': False}, 'table_name': {'type': 'string', 'description': 'DuckDB table name for the staged data â\x80\x94 use as the FROM target in openmeteo_dataframe_query SQL; openmeteo_dataframe_describe lists its columns. Present only alongside canvas_id.'}, 'daily_units': {'type': 'object', 'description': 'Variable â\x86\x92 unit string for daily data. Absent when no daily_variables were requested.', 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'string'}}, 'hourly_units': {'type': 'object', 'description': 'Variable â\x86\x92 unit string for hourly data (e.g., {"temperature_2m": "°C", "precipitation": "mm"}). Absent when no hourly_variables were requested.', 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'string'}}, 'record_count': {'type': 'number', 'description': 'Total number of records (hourly + daily rows) â\x80\x94 the full upstream total when truncated is true, not the combined length of the hourly and daily previews.'}}, 'additionalProperties': False}
openmeteo_get_marine
Openmeteo Get Marine
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.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['latitude', 'longitude'], 'properties': {'end_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'End date for the archive range (YYYY-MM-DD, inclusive). Must be on or after start_date. Requires start_date â\x80\x94 the pair must be sent together, and neither combines with forecast_days or past_days.'}, 'latitude': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude of a coastal or ocean point. Use openmeteo_search_locations to resolve a place name. Inland points return near-zero wave values.'}, 'timezone': {'type': 'string', 'default': 'auto', 'description': 'IANA timezone or "auto". Default "auto".'}, 'canvas_id': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]{10}$', 'description': 'DataCanvas token for wide past_days, archive-range, or multi-variable queries. When a result is too large to return inline â\x80\x94 driven by total payload size, so a wide multi-variable pull can spill at any row count â\x80\x94 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': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees.'}, 'past_days': {'type': 'integer', 'default': 0, 'maximum': 92, 'minimum': 0, 'description': 'Include this many days of past data before today (0â\x80\x9392). 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': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', '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 â\x80\x94 the pair must be sent together, and neither combines with forecast_days or past_days.'}, 'forecast_days': {'type': 'integer', 'maximum': 8, 'minimum': 1, 'description': 'Forecast horizon in days (1â\x80\x938). Omit for the upstream default of 7. Mutually exclusive with start_date/end_date â\x80\x94 omit it entirely when pulling an archive range.'}, 'daily_variables': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 50, 'description': 'Daily marine summary variables (e.g., ["wave_height_max", "wave_direction_dominant", "wave_period_max"]). Daily names only â\x80\x94 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': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 50, 'description': 'Hourly marine variables (e.g., ["wave_height", "wave_direction", "wave_period", "wind_wave_height", "swell_wave_height"]). Hourly names only â\x80\x94 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.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['latitude', 'longitude', 'timezone', 'record_count', 'truncated']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'daily': {'type': 'array', 'items': {'type': 'object', 'propertyNames': {'type': 'string'}, 'additionalProperties': {}}, 'description': '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 â\x80\x94 query canvas_id for the full dataset when one is present.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['invalid_variable', 'variable_wrong_cadence', 'no_variables_requested', 'date_range_incomplete', 'forecast_window_conflict', 'date_order_invalid', 'invalid_timezone', 'request_too_large'], '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 â\x80\x94 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 â\x80\x94 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.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'hourly': {'type': 'array', 'items': {'type': 'object', 'propertyNames': {'type': 'string'}, 'additionalProperties': {}}, 'description': '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 â\x80\x94 query canvas_id for the full dataset when one is present.'}, 'notice': {'type': 'string', 'description': '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 â\x80\x94 with DataCanvas disabled â\x80\x94 why there is no canvas_id and how to reach the rows the preview omits.'}, 'latitude': {'type': 'number', 'description': 'Snapped latitude'}, 'timezone': {'type': 'string', 'description': 'Resolved IANA timezone'}, 'canvas_id': {'type': 'string', 'description': 'DataCanvas token for the staged full dataset. Present only when truncated is true AND DataCanvas is enabled (CANVAS_PROVIDER_TYPE=duckdb) â\x80\x94 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': {'type': 'number', 'description': 'Snapped longitude'}, 'truncated': {'type': 'boolean', '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 â\x80\x94 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': {'type': 'string', 'description': 'DuckDB table name for the staged data â\x80\x94 use as the FROM target in openmeteo_dataframe_query SQL; openmeteo_dataframe_describe lists its columns. Present only alongside canvas_id.'}, 'daily_units': {'type': 'object', 'description': 'Variable â\x86\x92 unit string for daily data. Absent when no daily_variables were requested.', 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'string'}}, 'hourly_units': {'type': 'object', 'description': 'Variable â\x86\x92 unit string for hourly data (e.g., {"wave_height": "m", "wave_period": "s"}). Absent when no hourly_variables were requested.', 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'string'}}, 'record_count': {'type': 'number', 'description': 'Total number of records (hourly + daily rows) â\x80\x94 the full upstream total when truncated is true, not the combined length of the hourly and daily previews.'}}, 'additionalProperties': False}
openmeteo_search_locations
Openmeteo Search Locations
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.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['name'], 'properties': {'name': {'type': 'string', 'maxLength': 100, 'minLength': 1, 'description': 'Place name to search â\x80\x94 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 ("ì\x84\x9cì\x9a¸", "大é\x98ª") needs the full administrative name ("ì\x84\x9cì\x9a¸í\x8a¹ë³\x84ì\x8b\x9c", "大é\x98ªå¸\x82") or the romanized name ("Seoul", "Osaka") â\x80\x94 see the language field. Weather tools require coordinates â\x80\x94 use the lat/lon from this result.'}, 'count': {'type': 'integer', 'default': 5, 'maximum': 10, 'minimum': 1, 'description': 'Max results to return (1â\x80\x9310). Default 5. Return more when disambiguating common names like "Springfield" or "Portland".'}, 'country': {'type': 'string', 'pattern': '^[A-Za-z]{2}$', 'description': 'ISO 3166-1 alpha-2 country code (e.g. "US", "FR") to disambiguate places that share a name. Omit for a global search.'}, 'language': {'type': 'string', 'default': 'en', 'description': '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 â\x80\x94 e.g. language "zh" for "ä¸\x8aæµ·", "ru" for "Ð\x9cоÑ\x81ква". 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 "ì\x84\x9cì\x9a¸" or "大é\x98ª" â\x80\x94 retry those with the full administrative name ("ì\x84\x9cì\x9a¸í\x8a¹ë³\x84ì\x8b\x9c", "大é\x98ªå¸\x82") 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.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['results', 'count']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'count': {'type': 'number', 'description': 'Number of results returned'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['no_results'], '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.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'notice': {'type': 'string', 'description': 'Advisory on the confidence of the top match, present only when its population is null or under 100,000 â\x80\x94 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â\x80\x99s current official name. Never changes results or count.'}, 'results': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'latitude', 'longitude', 'elevation', 'timezone', 'country', 'country_code', 'admin1', 'admin2', 'population', 'feature_code'], 'properties': {'id': {'type': 'number', 'description': 'Open-Meteo place ID â\x80\x94 stable reference for this location'}, 'name': {'type': 'string', 'description': 'Place name'}, 'admin1': {'type': ['string', 'null'], 'description': 'State, province, or region'}, 'admin2': {'type': ['string', 'null'], 'description': 'County or district'}, 'country': {'type': ['string', 'null'], 'description': 'Country name â\x80\x94 null for non-country features like continents and oceans'}, 'latitude': {'type': 'number', 'description': 'Latitude in decimal degrees'}, 'timezone': {'type': ['string', 'null'], 'description': 'IANA timezone (e.g., "America/Los_Angeles") â\x80\x94 pass to weather tools as the timezone parameter. Null when the API omits it.'}, 'elevation': {'type': ['number', 'null'], 'description': 'Elevation in meters above sea level'}, 'longitude': {'type': 'number', 'description': 'Longitude in decimal degrees'}, 'population': {'type': ['number', 'null'], 'description': 'Population (when available) â\x80\x94 useful for disambiguating same-named cities'}, 'country_code': {'type': ['string', 'null'], 'description': 'ISO 3166-1 alpha-2 country code â\x80\x94 null for non-country features like continents and oceans'}, 'feature_code': {'type': 'string', 'description': 'GeoNames feature code describing the place type (e.g., "PPLA2" = state capital city, "PPL" = populated place)'}}, 'description': 'A single geocoding result with coordinates and administrative context', 'additionalProperties': False}, 'description': 'Ranked matches (most relevant first). Never empty â\x80\x94 when nothing matches, the tool fails with no_results instead of returning an empty array.'}}, 'additionalProperties': False}
Modificado
openmeteo_dataframe_describe
23 de September de 2026 a las 02:42
Modificado
openmeteo_dataframe_query
23 de September de 2026 a las 02:42
Modificado
openmeteo_get_climate
23 de September de 2026 a las 02:42
Modificado
openmeteo_get_flood
23 de September de 2026 a las 02:42
Modificado
openmeteo_get_ensemble
23 de September de 2026 a las 02:42
Modificado
openmeteo_get_air_quality
23 de September de 2026 a las 02:42
Modificado
openmeteo_get_marine
23 de September de 2026 a las 02:42
Modificado
openmeteo_get_historical
23 de September de 2026 a las 02:42
Modificado
openmeteo_get_forecast
23 de September de 2026 a las 02:42
Modificado
openmeteo_get_elevation
23 de September de 2026 a las 02:42
Modificado
openmeteo_search_locations
23 de September de 2026 a las 02:42
Añadido
openmeteo_dataframe_describe
17 de September de 2026 a las 12:41
Añadido
openmeteo_dataframe_query
17 de September de 2026 a las 12:41
Añadido
openmeteo_get_climate
17 de September de 2026 a las 12:41
Añadido
openmeteo_get_flood
17 de September de 2026 a las 12:41
Añadido
openmeteo_get_ensemble
17 de September de 2026 a las 12:41
Añadido
openmeteo_get_air_quality
17 de September de 2026 a las 12:41
Añadido
openmeteo_get_marine
17 de September de 2026 a las 12:41
Añadido
openmeteo_get_historical
17 de September de 2026 a las 12:41
Añadido
openmeteo_get_forecast
17 de September de 2026 a las 12:41
Añadido
openmeteo_get_elevation
17 de September de 2026 a las 12:41
Añadido
openmeteo_search_locations
17 de September de 2026 a las 12:41