Skip to main content
Glama

Criora: climate & disaster risk for any place

Long-term climate risk: floods, heat, drought, sea level

get_climate_profile
Read-onlyIdempotent

Long-term climate risk and environmental data of a place or property, read at the point from 55 global layers: river and coastal flood depth of a 100-year flood now and in 2050 and 2080, sea level rise, extreme heat and cold days, heavy rain, drought (SPI-12, aridity, WRI drought risk), water stress, wind and storm days, warming and rainfall change to 2050 and 2080 (CMIP6), NDVI vegetation index and leaf area, wildfire burned area, soil moisture, snow, surface water, elevation, slope, land subsidence, land cover, built-up share and the Köppen climate zone.

Use it for what a place is exposed to over years, and once per place to compare places; assess_place has only the headline layers. For this week's weather use get_forecast; for events happening now, get_hazards_near.

Narrow it with categories, or with layers by id: the resource criora://layers, or fetch catalog:layers, lists every layer with its unit, years and source. Returns each layer's readings by band with its unit, year, cell size and source (ERA5, CMIP6, WRI Aqueduct, IPCC AR6, MODIS, JRC, Copernicus DEM and others). 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
layersNoOnly these layers, by id, e.g. ndvi/annual for the NDVI vegetation index or flood_riverine/inundation for river flood depth; every id with what it measures is in the resource criora://layers. Combined with categories, both are given
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
categoriesNoOnly the layers of these categories; every layer when omitted. temperature: hottest day of the year, coldest night of the year, hot days over 35 °C, summer days, tropical nights, frost nights, ice days, mean temperature with the coldest and warmest month, UTCI felt temperature (heat and cold stress), warming to 2050 and 2080 (CMIP6), change in the warmest month's maximum to 2050 and 2080, change in the coldest month's minimum to 2050 and 2080; precipitation: heavy-rain days (10 to 100 mm) and the wettest day, precipitation with the driest and wettest month, daily rain of the wettest month, change in annual rainfall to 2050 and 2080, change in the wettest quarter's rainfall, change in the driest quarter's rainfall, drought risk (WRI Aqueduct), SPI-12 drought index, aridity index, snow cover, snow water equivalent, snowmelt, snow albedo; wind: strongest wind gust of the year, gale, storm and hurricane-force gust days, mean wind speed, CAPE, the energy of thunderstorms; water: baseline water stress (WRI Aqueduct), water stress in 2050 and 2080 (WRI Aqueduct), soil moisture, relative humidity, vapour pressure deficit, potential evaporation, surface water occurrence from 38 years of Landsat (JRC), share of lakes, rivers and wetlands, lake or wetland type, distance to the coast; flooding: river flood depth of a 100-year flood, now and in 2050 and 2080 (WRI Aqueduct), coastal flood depth of a 100-year flood, now and in 2050 and 2080 (WRI Aqueduct), GloFAS 30-day flood forecast, sea level rise to 2050 and 2100 (IPCC AR6); vegetation: NDVI vegetation index, annual mean, minimum and maximum (MODIS satellite), leaf area index of trees and shrubs, leaf area index of grass and crops, area burned by wildfire last year (GFED, satellite), area burned by wildfire each year since 2002 (GFED, satellite); terrain: elevation (Copernicus DEM), slope, terrain ruggedness, probability of land subsidence over 1 cm a year, land subsidence rate class; landcover: land cover class (MODIS satellite), built-up share of the land (JRC GHSL, Sentinel-2 and Landsat); misc: Köppen climate zone, now and in 2050 and 2080, solar radiation, solar radiation of the sunniest month, surface runoff

Output Schema

NameRequiredDescriptionDefault
notesYes
layersYes
sourcesYesEach source by name, with what its layers share
datasetsYesThe description the layers of one dataset share
locationYes
criora_urlYes
resolved_fromYesWhat a place name was resolved to; null when coordinates were given

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • changedInput schema / properties / categories / description
      Previous value: -"Only the layers of these categories, e.g. flooding for flood depth and sea level rise, temperature for heat; every layer when omitted"New value: +"Only the layers of these categories; every layer when omitted. temperature: hottest day of the year, coldest night of the year, hot days over 35 °C, summer days, tropical nights, frost nights, ice days, mean temperature with the coldest and warmest month, UTCI felt temperature (heat and cold stress), warming to 2050 and 2080 (CMIP6), change in the warmest month's maximum to 2050 and 2080, change in the coldest month's minimum to 2050 and 2080; precipitation: heavy-rain days (10 to 100 mm) and the wettest day, precipitation with the driest and wettest month, daily rain of the wettest month, change in annual rainfall to 2050 and 2080, change in the wettest quarter's rainfall, change in the driest quarter's rainfall, drought risk (WRI Aqueduct), SPI-12 drought index, aridity index, snow cover, snow water equivalent, snowmelt, snow albedo; wind: strongest wind gust of the year, gale, storm and hurricane-force gust days, mean wind speed, CAPE, the energy of thunderstorms; water: baseline water stress (WRI Aqueduct), water stress in 2050 and 2080 (WRI Aqueduct), soil moisture, relative humidity, vapour pressure deficit, potential evaporation, surface water occurrence from 38 years of Landsat (JRC), share of lakes, rivers and wetlands, lake or wetland type, distance to the coast; flooding: river flood depth of a 100-year flood, now and in 2050 and 2080 (WRI Aqueduct), coastal flood depth of a 100-year flood, now and in 2050 and 2080 (WRI Aqueduct), GloFAS 30-day flood forecast, sea level rise to 2050 and 2100 (IPCC AR6); vegetation: NDVI vegetation index, annual mean, minimum and maximum (MODIS satellite), leaf area index of trees and shrubs, leaf area index of grass and crops, area burned by wildfire last year (GFED, satellite), area burned by wildfire each year since 2002 (GFED, satellite); terrain: elevation (Copernicus DEM), slope, terrain ruggedness, probability of land subsidence over 1 cm a year, land subsidence rate class; landcover: land cover class (MODIS satellite), built-up share of the land (JRC GHSL, Sentinel-2 and Landsat); misc: Köppen climate zone, now and in 2050 and 2080, solar radiation, solar radiation of the sunniest month, surface runoff"
    • addedInput schema / properties / layers
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "enum": [
      +          "era5_extremum/temperature_max",
      +          "era5_extremum/temperature_min",
      +          "era5_extremum/climate_days",
      +          "era5_monthly/temperature",
      +          "era5_monthly/utci",
      +          "cmip6_climate_delta/tmean",
      +          "cmip6_climate_delta/tmax_warm",
      +          "cmip6_climate_delta/tmin_cold",
      +          "era5_extremum/extreme_precip",
      +          "era5_monthly/precipitation",
      +          "era5_monthly/precipitation_max",
      +          "cmip6_climate_delta/precip_annual",
      +          "cmip6_climate_delta/precip_wet",
      +          "cmip6_climate_delta/precip_dry",
      +          "aqueduct_water_stress/drr",
      +          "spi_12/observed",
      +          "aridity_index/annual",
      +          "era5_monthly/snow_cover",
      +          "era5_monthly/snow_water_equivalent",
      +          "era5_monthly/snowmelt",
      +          "era5_monthly/snow_albedo",
      +          "era5_extremum/wind_max",
      +          "era5_extremum/storm_days",
      +          "era5_monthly/wind",
      +          "era5_monthly/cape",
      +          "aqueduct_water_stress/bws",
      +          "aqueduct_water_future/ws",
      +          "era5_monthly/soil_moisture",
      +          "era5_monthly/humidity",
      +          "era5_monthly/vpd",
      +          "era5_monthly/potential_evapotranspiration",
      +          "jrc_surface_water/occurrence",
      +          "glwd/coverage",
      +          "glwd/classification",
      +          "distance_to_coast/distance",
      +          "flood_riverine/inundation",
      +          "flood_coastal/inundation",
      +          "flood_forecast/glofas",
      +          "slr_projections/projections",
      +          "ndvi/annual",
      +          "era5_monthly/lai_high",
      +          "era5_monthly/lai_low",
      +          "burned_area/annual",
      +          "burned_area/climatology_22yr",
      +          "dem/elevation",
      +          "dem/slope",
      +          "dem/tri",
      +          "subsidence/probability",
      +          "subsidence/prediction",
      +          "modis_land_cover/igbp",
      +          "ghsl_built_up/built_up",
      +          "koppen/climate",
      +          "era5_monthly/solar_radiation",
      +          "era5_monthly/solar_radiation_max",
      +          "era5_monthly/runoff"
      +        ],
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Only these layers, by id, e.g. ndvi/annual for the NDVI vegetation index or flood_riverine/inundation for river flood depth; every id with what it measures is in the resource criora://layers. Combined with categories, both are given",
      +  "title": "Layers"
      +}
    • addedOutput schema / $defs / ClimateLayer / properties / name
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "What the layer measures, in plain words",
      +  "title": "Name"
      +}
  2. Changed5 schema fields changed
    • changedInput schema / properties / categories / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "enum": [
      -        "flooding",
      -        "landcover",
      -        "misc",
      -        "precipitation",
      -        "temperature",
      -        "terrain",
      -        "vegetation",
      -        "water",
      -        "wind"
      -      ],
      -      "type": "string"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "enum": [
      +        "temperature",
      +        "precipitation",
      +        "wind",
      +        "water",
      +        "flooding",
      +        "vegetation",
      +        "misc",
      +        "terrain",
      +        "landcover"
      +      ],
      +      "type": "string"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedOutput schema / $defs
      Added value: +{
      +  "ClimateLayer": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "applicable": {
      +        "anyOf": [
      +          {
      +            "type": "boolean"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Given only on a layer without readings",
      +        "title": "Applicable"
      +      },
      +      "available": {
      +        "anyOf": [
      +          {
      +            "type": "boolean"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Given only on a layer without readings",
      +        "title": "Available"
      +      },
      +      "category": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "title": "Category"
      +      },
      +      "cell_km": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "The size of the cell the value is read on",
      +        "title": "Cell Km"
      +      },
      +      "dataset": {
      +        "title": "Dataset",
      +        "type": "string"
      +      },
      +      "description": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Absent where datasets gives it for the dataset",
      +        "title": "Description"
      +      },
      +      "note": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Note"
      +      },
      +      "read_at": {
      +        "anyOf": [
      +          {
      +            "$ref": "#/$defs/Location"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Where the value was read, when the point's own cell holds no data"
      +      },
      +      "source": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "A key of sources",
      +        "title": "Source"
      +      },
      +      "source_detail": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "What this layer's source says that its other layers' do not",
      +        "title": "Source Detail"
      +      },
      +      "unit": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "The unit every reading of the layer shares",
      +        "title": "Unit"
      +      },
      +      "values": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": {
      +              "$ref": "#/$defs/LayerValue"
      +            },
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "The readings, by band",
      +        "title": "Values"
      +      },
      +      "variant": {
      +        "title": "Variant",
      +        "type": "string"
      +      },
      +      "year": {
      +        "anyOf": [
      +          {
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "The year an ERA5 layer describes",
      +        "title": "Year"
      +      }
      +    },
      +    "required": [
      +      "dataset",
      +      "variant",
      +      "category"
      +    ],
      +    "title": "ClimateLayer",
      +    "type": "object"
      +  },
      +  "LayerValue": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "description": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Description"
      +      },
      +      "label": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "The class a categorical value names",
      +        "title": "Label"
      +      },
      +      "unit": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Given here only where the readings' units differ",
      +        "title": "Unit"
      +      },
      +      "value": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Null where the layer has no value for this band",
      +        "title": "Value"
      +      }
      +    },
      +    "required": [
      +      "value"
      +    ],
      +    "title": "LayerValue",
      +    "type": "object"
      +  },
      +  "Location": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "lat": {
      +        "title": "Lat",
      +        "type": "number"
      +      },
      +      "lon": {
      +        "title": "Lon",
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "lat",
      +      "lon"
      +    ],
      +    "title": "Location",
      +    "type": "object"
      +  },
      +  "Source": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "doi": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Doi"
      +      },
      +      "institution": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Institution"
      +      },
      +      "licence": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Licence"
      +      },
      +      "notes": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Notes"
      +      },
      +      "url": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Url"
      +      },
      +      "year": {
      +        "anyOf": [
      +          {
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Year"
      +      }
      +    },
      +    "title": "Source",
      +    "type": "object"
      +  }
      +}
    • addedOutput schema / properties
      Added value: +{
      +  "criora_url": {
      +    "title": "Criora Url",
      +    "type": "string"
      +  },
      +  "datasets": {
      +    "additionalProperties": {
      +      "type": "string"
      +    },
      +    "description": "The description the layers of one dataset share",
      +    "title": "Datasets",
      +    "type": "object"
      +  },
      +  "layers": {
      +    "items": {
      +      "$ref": "#/$defs/ClimateLayer"
      +    },
      +    "title": "Layers",
      +    "type": "array"
      +  },
      +  "location": {
      +    "$ref": "#/$defs/Location"
      +  },
      +  "notes": {
      +    "items": {
      +      "type": "string"
      +    },
      +    "title": "Notes",
      +    "type": "array"
      +  },
      +  "resolved_from": {
      +    "anyOf": [
      +      {
      +        "type": "string"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "description": "What a place name was resolved to; null when coordinates were given",
      +    "title": "Resolved From"
      +  },
      +  "sources": {
      +    "additionalProperties": {
      +      "$ref": "#/$defs/Source"
      +    },
      +    "description": "Each source by name, with what its layers share",
      +    "title": "Sources",
      +    "type": "object"
      +  }
      +}
    • addedOutput schema / required
      Added value: +[
      +  "datasets",
      +  "layers",
      +  "sources",
      +  "notes",
      +  "resolved_from",
      +  "location",
      +  "criora_url"
      +]
    • changedOutput schema / title
      Previous value: -"get_climate_profileDictOutput"New value: +"ClimateProfile"
  3. Changed4 schema fields changed
    • changedInput schema / properties / categories / description
      Previous value: -"Limit the answer to these layer categories; all of them when omitted"New value: +"Only the layers of these categories, e.g. flooding for flood depth and sea level rise, temperature for heat; every layer when omitted"
    • 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.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds genuinely useful context beyond that: the layer catalog resource (criora://layers / fetch catalog:layers), the data provenance (ERA5, CMIP6, WRI Aqueduct, IPCC AR6, MODIS, JRC, Copernicus DEM), and that readings come per band with unit, year, cell size and source.

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 correctly: purpose, then layer scope, then sibling routing, then inputs. It is long, and the enumerated layer list partially duplicates the exhaustive category descriptions already in the schema's categories enum, so some content does not strictly earn its place, but the structure is clean and every section is actionable.

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

Completeness5/5

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

For a five-parameter, layer-rich tool with an output schema already describing return values, the description covers selection criteria, alternatives, how to narrow by id or category, and where to look up ids. An agent has everything needed to call it correctly on the first attempt.

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

Parameters4/5

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

Schema description coverage is 100%, so baseline is 3; the description earns a 4 by adding meaning the schema cannot: it points to criora://layers as the authoritative id reference, explains that categories and layers combine additively, and states the coordinate-vs-place-name tradeoff. The geocoder rate limit is documented in the place param's schema, not the description.

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?

States a specific verb and resource ('Long-term climate risk and environmental data of a place or property') and immediately enumerates the concrete layer families covered (flood depth, sea level rise, heat days, drought indices, vegetation, terrain, etc.). It also distinguishes itself from siblings by naming what it is not: assess_place has 'only the headline layers'.

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

Usage Guidelines5/5

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

Explicit routing: use for multi-year exposure and cross-place comparison, with named alternatives for the other temporal scopes ('For this week's weather use get_forecast; for events happening now, get_hazards_near') and the sibling it complements (assess_place). Both when-to-use and when-not are stated.

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.