Skip to main content
Glama

Criora: climate & disaster risk for any place

7-day weather forecast and extreme-weather risk

get_forecast
Read-onlyIdempotent

This week's weather and extreme-weather risk at a place: heat waves and cold (graded on the UTCI felt temperature), storms and wind gusts, heavy rain, snow and freezing rain, by local day, with each day's risk class from Very low to Critical and the hazard behind it.

Use it for the weather or the weather risk in the next seven days. For disasters already happening use get_hazards_near; for what a place is exposed to over years, get_climate_profile.

Returns for each day the minimum and maximum temperature, peak precipitation rate, peak wind gust and the risk with its driver (the value that set the class, the class's threshold and, for heat and cold, the air temperature beside the UTCI) and an explanation in words; hourly=true adds every forecast step. Steps are hourly on the first day, then 3-hourly, then 6-hourly from the fourth day, so a day's true peak can fall between two steps; a day marked partial is cut by the forecast window. Source: Environment and Climate Change Canada GDPS model, read at its 15 km cell. Give latitude and longitude, or a place name.

Input Schema

NameRequiredDescriptionDefault
placeNoA place name or address, used only when latitude and longitude are not given. It is resolved to its best match by a geocoder shared by every user and limited to one lookup a second, so pass coordinates when you have them
hourlyNoAdd every forecast step, hour by hour where the model has them, to the daily summary
latitudeNoLatitude of the place asked about, in degrees, WGS84. Give it with longitude, or give place instead
longitudeNoLongitude of the place asked about, in degrees, WGS84. Give it with latitude, or give place instead

Output Schema

NameRequiredDescriptionDefault
runYes
daysYes
notesYes
stepsNoEvery forecast step, with hourly=true
unitsYes
issuedYes
sourceYes
locationYes
precisionYes
criora_urlYes
risk_scaleYes
resolved_fromYesWhat a place name was resolved to; null when coordinates were given

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • addedOutput schema / $defs / Driver
      Added value: +{
      +  "additionalProperties": true,
      +  "properties": {
      +    "air_temperature_max": {
      +      "anyOf": [
      +        {
      +          "type": "number"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "For heat and cold, the highest air temperature beside the UTCI; null otherwise",
      +      "title": "Air Temperature Max"
      +    },
      +    "limit": {
      +      "anyOf": [
      +        {
      +          "enum": [
      +            "at_least",
      +            "at_most"
      +          ],
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Set where the value is past the end of the ladder and is only a bound",
      +      "title": "Limit"
      +    },
      +    "threshold": {
      +      "$ref": "#/$defs/Threshold"
      +    },
      +    "unit": {
      +      "title": "Unit",
      +      "type": "string"
      +    },
      +    "value": {
      +      "description": "The value that set the class",
      +      "title": "Value",
      +      "type": "number"
      +    },
      +    "value_max": {
      +      "anyOf": [
      +        {
      +          "type": "number"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "The highest value the stored class allows; null when open",
      +      "title": "Value Max"
      +    },
      +    "value_min": {
      +      "anyOf": [
      +        {
      +          "type": "number"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "The lowest value the stored class allows; null when open",
      +      "title": "Value Min"
      +    },
      +    "variable": {
      +      "description": "utci, the felt temperature in full sun; wind_gust_10m; or precip_intensity_mmh",
      +      "title": "Variable",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "variable",
      +    "value",
      +    "value_min",
      +    "value_max",
      +    "limit",
      +    "unit",
      +    "threshold",
      +    "air_temperature_max"
      +  ],
      +  "title": "Driver",
      +  "type": "object"
      +}
    • changedOutput schema / $defs / Reading / properties / variable / description
      Previous value: -"utci, the felt temperature; gust; or the precipitation rate"New value: +"utci, the felt temperature; wind_gust_10m; or precip_intensity_mmh"
    • addedOutput schema / $defs / Risk / properties / driver
      Added value: +{
      +  "anyOf": [
      +    {
      +      "$ref": "#/$defs/Driver"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "The value, threshold and air temperature behind the class"
      +}
    • addedOutput schema / $defs / Risk / properties / explanation
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "The class in words, built from the driver",
      +  "title": "Explanation"
      +}
    • addedOutput schema / $defs / Threshold
      Added value: +{
      +  "additionalProperties": true,
      +  "properties": {
      +    "class": {
      +      "description": "The class the value falls in, as risk_scale names it",
      +      "title": "Class",
      +      "type": "string"
      +    },
      +    "from": {
      +      "anyOf": [
      +        {
      +          "type": "number"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Where the class begins",
      +      "title": "From"
      +    },
      +    "to": {
      +      "anyOf": [
      +        {
      +          "type": "number"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Where the next class begins; null at the top class",
      +      "title": "To"
      +    }
      +  },
      +  "required": [
      +    "class",
      +    "from",
      +    "to"
      +  ],
      +  "title": "Threshold",
      +  "type": "object"
      +}
  2. Changed4 schema fields changed
    • addedOutput schema / $defs
      Added value: +{
      +  "ForecastDay": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "date": {
      +        "description": "The local day",
      +        "title": "Date",
      +        "type": "string"
      +      },
      +      "partial": {
      +        "description": "True when the forecast window starts or ends inside the day",
      +        "title": "Partial",
      +        "type": "boolean"
      +      },
      +      "precipitation_rate_max": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "title": "Precipitation Rate Max"
      +      },
      +      "risk": {
      +        "$ref": "#/$defs/Risk",
      +        "description": "The day's highest risk"
      +      },
      +      "risk_by_hazard": {
      +        "additionalProperties": {
      +          "type": "string"
      +        },
      +        "title": "Risk By Hazard",
      +        "type": "object"
      +      },
      +      "step_hours": {
      +        "description": "Hours between the day's steps: 1, 3 or 6",
      +        "title": "Step Hours",
      +        "type": "integer"
      +      },
      +      "steps": {
      +        "title": "Steps",
      +        "type": "integer"
      +      },
      +      "temperature_max": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "title": "Temperature Max"
      +      },
      +      "temperature_min": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "title": "Temperature Min"
      +      },
      +      "wind_speed_max": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "title": "Wind Speed Max"
      +      }
      +    },
      +    "required": [
      +      "date",
      +      "temperature_min",
      +      "temperature_max",
      +      "precipitation_rate_max",
      +      "wind_speed_max",
      +      "risk",
      +      "risk_by_hazard",
      +      "steps",
      +      "step_hours",
      +      "partial"
      +    ],
      +    "title": "ForecastDay",
      +    "type": "object"
      +  },
      +  "ForecastSource": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "attribution": {
      +        "title": "Attribution",
      +        "type": "string"
      +      },
      +      "institution": {
      +        "title": "Institution",
      +        "type": "string"
      +      },
      +      "licence": {
      +        "title": "Licence",
      +        "type": "string"
      +      },
      +      "model": {
      +        "title": "Model",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "model",
      +      "institution",
      +      "attribution",
      +      "licence"
      +    ],
      +    "title": "ForecastSource",
      +    "type": "object"
      +  },
      +  "ForecastStep": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "local_time": {
      +        "title": "Local Time",
      +        "type": "string"
      +      },
      +      "precipitation": {
      +        "additionalProperties": {
      +          "anyOf": [
      +            {
      +              "type": "number"
      +            },
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "title": "Precipitation",
      +        "type": "object"
      +      },
      +      "risk": {
      +        "$ref": "#/$defs/Risk"
      +      },
      +      "step": {
      +        "title": "Step",
      +        "type": "integer"
      +      },
      +      "temperature": {
      +        "additionalProperties": {
      +          "anyOf": [
      +            {
      +              "type": "number"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "title": "Temperature",
      +        "type": "object"
      +      },
      +      "valid_time": {
      +        "title": "Valid Time",
      +        "type": "string"
      +      },
      +      "wind": {
      +        "additionalProperties": {
      +          "anyOf": [
      +            {
      +              "type": "number"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "title": "Wind",
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "step",
      +      "valid_time",
      +      "local_time",
      +      "temperature",
      +      "precipitation",
      +      "wind",
      +      "risk"
      +    ],
      +    "title": "ForecastStep",
      +    "type": "object"
      +  },
      +  "Location": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "lat": {
      +        "title": "Lat",
      +        "type": "number"
      +      },
      +      "lon": {
      +        "title": "Lon",
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "lat",
      +      "lon"
      +    ],
      +    "title": "Location",
      +    "type": "object"
      +  },
      +  "Reading": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "description": {
      +        "title": "Description",
      +        "type": "string"
      +      },
      +      "unit": {
      +        "title": "Unit",
      +        "type": "string"
      +      },
      +      "value": {
      +        "title": "Value",
      +        "type": "number"
      +      },
      +      "variable": {
      +        "description": "utci, the felt temperature; gust; or the precipitation rate",
      +        "title": "Variable",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "variable",
      +      "value",
      +      "unit",
      +      "description"
      +    ],
      +    "title": "Reading",
      +    "type": "object"
      +  },
      +  "Risk": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "class": {
      +        "description": "The class's place in risk_scale, from 0",
      +        "title": "Class",
      +        "type": "integer"
      +      },
      +      "hazard": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "The hazard behind the class; null at the lowest",
      +        "title": "Hazard"
      +      },
      +      "hazard_code": {
      +        "title": "Hazard Code",
      +        "type": "integer"
      +      },
      +      "level": {
      +        "description": "The class, as risk_scale names it",
      +        "title": "Level",
      +        "type": "string"
      +      },
      +      "local_time": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "When in the day the class peaks",
      +        "title": "Local Time"
      +      },
      +      "reading": {
      +        "anyOf": [
      +          {
      +            "$ref": "#/$defs/Reading"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "The physical reading behind the class"
      +      }
      +    },
      +    "required": [
      +      "class",
      +      "level",
      +      "hazard",
      +      "hazard_code"
      +    ],
      +    "title": "Risk",
      +    "type": "object"
      +  }
      +}
    • addedOutput schema / properties
      Added value: +{
      +  "criora_url": {
      +    "title": "Criora Url",
      +    "type": "string"
      +  },
      +  "days": {
      +    "items": {
      +      "$ref": "#/$defs/ForecastDay"
      +    },
      +    "title": "Days",
      +    "type": "array"
      +  },
      +  "issued": {
      +    "title": "Issued",
      +    "type": "string"
      +  },
      +  "location": {
      +    "$ref": "#/$defs/Location"
      +  },
      +  "notes": {
      +    "items": {
      +      "type": "string"
      +    },
      +    "title": "Notes",
      +    "type": "array"
      +  },
      +  "precision": {
      +    "additionalProperties": true,
      +    "title": "Precision",
      +    "type": "object"
      +  },
      +  "resolved_from": {
      +    "anyOf": [
      +      {
      +        "type": "string"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "description": "What a place name was resolved to; null when coordinates were given",
      +    "title": "Resolved From"
      +  },
      +  "risk_scale": {
      +    "items": {
      +      "type": "string"
      +    },
      +    "title": "Risk Scale",
      +    "type": "array"
      +  },
      +  "run": {
      +    "title": "Run",
      +    "type": "string"
      +  },
      +  "source": {
      +    "$ref": "#/$defs/ForecastSource"
      +  },
      +  "steps": {
      +    "anyOf": [
      +      {
      +        "items": {
      +          "$ref": "#/$defs/ForecastStep"
      +        },
      +        "type": "array"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "description": "Every forecast step, with hourly=true",
      +    "title": "Steps"
      +  },
      +  "units": {
      +    "additionalProperties": {
      +      "additionalProperties": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    "title": "Units",
      +    "type": "object"
      +  }
      +}
    • addedOutput schema / required
      Added value: +[
      +  "location",
      +  "run",
      +  "issued",
      +  "source",
      +  "units",
      +  "precision",
      +  "risk_scale",
      +  "days",
      +  "criora_url",
      +  "notes",
      +  "resolved_from"
      +]
    • changedOutput schema / title
      Previous value: -"get_forecastDictOutput"New value: +"ForecastAnswer"
  3. Changed4 schema fields changed
    • changedInput schema / properties / hourly / description
      Previous value: -"Include every forecast step, not only the daily summary"New value: +"Add every forecast step, hour by hour where the model has them, to the daily summary"
    • changedInput schema / properties / latitude / description
      Previous value: -"Latitude in degrees, WGS84"New value: +"Latitude of the place asked about, in degrees, WGS84. Give it with longitude, or give place instead"
    • changedInput schema / properties / longitude / description
      Previous value: -"Longitude in degrees, WGS84"New value: +"Longitude of the place asked about, in degrees, WGS84. Give it with latitude, or give place instead"
    • changedInput schema / properties / place / description
      Previous value: -"A place name or address, used when latitude and longitude are not given"New value: +"A place name or address, used only when latitude and longitude are not given. It is resolved to its best match by a geocoder shared by every user and limited to one lookup a second, so pass coordinates when you have them"
  4. First observed

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly/openWorld/idempotent/non-destructive, so the description is free to add operational context, and it does: data source (ECCC GDPS at a 15 km cell), degrading temporal resolution (hourly → 3-hourly → 6-hourly), the 'true peak can fall between steps' caveat, and partial days cut by the forecast window. These are real limitations an agent must know to interpret results. It does not restate the geocoder rate limit as a calling constraint beyond the schema's wording, keeping it just short of a 5.

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

Conciseness4/5

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

Front-loaded with purpose and routing before the return-value detail, and every clause about resolution caps and partial days earns its place. The returns paragraph is dense and duplicates some of what the output schema already exposes, which keeps it from a 5.

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

Completeness5/5

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

Given an output schema exists, the description need not describe return values at all, yet it still explains the risk driver and threshold structure so the agent can reason about the numbers rather than just pass them through. Combined with source, resolution limits and sibling routing, nothing needed to call or interpret this tool is missing.

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

Parameters3/5

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

Schema coverage is 100%, so all four parameters are already documented, and the description largely repeats them ('hourly=true adds every forecast step', 'Give latitude and longitude, or a place name'). It adds a little framing by tying hourly output to the step-resolution caveat, but no new syntax or precedence rules beyond what the schema states, so the baseline 3 applies.

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

Purpose5/5

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

Opens with a specific verb+resource+scope: this week's weather and extreme-weather risk at a place, enumerating the hazards covered (heat/cold on UTCI, storms, gusts, rain, snow, freezing rain) and the graded risk class. An agent can distinguish it from get_hazards_near and get_climate_profile without opening any schema.

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

Usage Guidelines5/5

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

States the selection rule explicitly ('Use it for the weather or the weather risk in the next seven days') and names both alternatives with the condition that selects each: get_hazards_near for disasters already happening, get_climate_profile for multi-year exposure. Nothing is left to inference.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.