Skip to main content
Glama

Openmeteo Get Elevation

openmeteo_get_elevation
Read-onlyIdempotent

Terrain elevation from the Copernicus Digital Elevation Model (~90m resolution) for one or more coordinate pairs. Accepts up to 1,000 pairs and samples the first 100 in one upstream request; when more were submitted, unprocessed_count says how many remain and next_offset is where to resume — resubmit latitudes.slice(next_offset) and longitudes.slice(next_offset) of the arrays just sent, until next_offset is null. Open-Meteo counts each sampled pair as one call against its per-IP limit of 600 a minute, so a seventh full slice inside one minute comes back rate_limited — space later slices about a minute apart. Useful for geographic context, elevation-adjusted weather interpretation, or route planning. A point the DEM has no value for (latitude 90) returns elevation_m null; the other points in the call are unaffected.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "latitudes": "<latitudes>",
      "longitudes": "<longitudes>"
    },
    "name": "openmeteo_get_elevation"
  }
}

Input Schema

NameRequiredDescriptionDefault
latitudesYesArray of latitudes in decimal degrees (up to 1,000; the first 100 are sampled per call). Must be same length as longitudes.
longitudesYesArray of longitudes in decimal degrees (up to 1,000; the first 100 are sampled per call). Must be same length as latitudes.

Output Schema

NameRequiredDescriptionDefault
errorNoPresent when the call failed. Absent on success.
noticeNoPresent only when more than 100 pairs were submitted: names how many were sampled and how many remain, and the slice of the submitted arrays to resubmit for the rest.
elevationsNoElevation values for the sampled pairs (the first 100), in input order
next_offsetNoIndex to resume from: resubmit latitudes.slice(next_offset) and longitudes.slice(next_offset) of the arrays sent in this call. null when every submitted pair was sampled.
unprocessed_countNoSubmitted pairs that were not sampled in this call; 0 when 100 or fewer were submitted

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed11 schema fields changed
    • changedInput schema / properties / latitudes / description
      Previous value: -"Array of latitudes in decimal degrees (up to 100). Must be same length as longitudes."New value: +"Array of latitudes in decimal degrees (up to 1,000; the first 100 are sampled per call). Must be same length as longitudes."
    • changedInput schema / properties / latitudes / maxItems
      Previous value: -100New value: +1000
    • changedInput schema / properties / longitudes / description
      Previous value: -"Array of longitudes in decimal degrees (up to 100). Must be same length as latitudes."New value: +"Array of longitudes in decimal degrees (up to 1,000; the first 100 are sampled per call). Must be same length as latitudes."
    • changedInput schema / properties / longitudes / maxItems
      Previous value: -100New value: +1000
    • changedOutput schema / anyOf
      Previous value: -[
      -  {
      -    "not": {
      -      "required": [
      -        "error"
      -      ]
      -    },
      -    "required": [
      -      "elevations"
      -    ]
      -  },
      -  {
      -    "required": [
      -      "error"
      -    ]
      -  }
      -]New value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "elevations",
      +      "unprocessed_count",
      +      "next_offset"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • changedOutput schema / properties / elevations / description
      Previous value: -"Elevation values in input order"New value: +"Elevation values for the sampled pairs (the first 100), in input order"
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `coordinate_count_mismatch`: The latitudes and longitudes arrays have different lengths. `rate_limited`: Open-Meteo answered HTTP 429 because a free-tier request limit was reached. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `coordinate_count_mismatch`: The latitudes and longitudes arrays have different lengths. `rate_limited`: Open-Meteo answered HTTP 429 because a free-tier request limit was reached. `upstream_unavailable`: Open-Meteo was unreachable, answered with a server error, or returned an unreadable response on all three attempts. `upstream_timeout`: Open-Meteo failed on all three attempts, and the last one got no answer within 15 seconds. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "coordinate_count_mismatch",
      -  "rate_limited"
      -]New value: +[
      +  "coordinate_count_mismatch",
      +  "rate_limited",
      +  "upstream_unavailable",
      +  "upstream_timeout"
      +]
    • addedOutput schema / properties / next_offset
      Added value: +{
      +  "description": "Index to resume from: resubmit latitudes.slice(next_offset) and longitudes.slice(next_offset) of the arrays sent in this call. null when every submitted pair was sampled.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / notice
      Added value: +{
      +  "description": "Present only when more than 100 pairs were submitted: names how many were sampled and how many remain, and the slice of the submitted arrays to resubmit for the rest.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / unprocessed_count
      Added value: +{
      +  "description": "Submitted pairs that were not sampled in this call; 0 when 100 or fewer were submitted",
      +  "type": "number"
      +}
  2. Changed4 schema fields changed
    • changedOutput schema / properties / elevations / items / properties / elevation_m / description
      Previous value: -"Terrain elevation in meters above sea level"New value: +"Terrain elevation in meters above sea level; null when the DEM has no value for this point"
    • changedOutput schema / properties / elevations / items / properties / elevation_m / type
      Previous value: -"number"New value: +[
      +  "number",
      +  "null"
      +]
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `coordinate_count_mismatch`: The latitudes and longitudes arrays have different lengths. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `coordinate_count_mismatch`: The latitudes and longitudes arrays have different lengths. `rate_limited`: Open-Meteo answered HTTP 429 because a free-tier request limit was reached. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "coordinate_count_mismatch"
      -]New value: +[
      +  "coordinate_count_mismatch",
      +  "rate_limited"
      +]
  3. Changed1 schema field changed
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `coordinate_count_mismatch`: latitudes and longitudes arrays have different lengths. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `coordinate_count_mismatch`: The latitudes and longitudes arrays have different lengths. Other values are possible when a failure originates below the handler."
  4. Changed1 schema field changed
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `coordinate_count_mismatch`: latitudes and longitudes arrays have different lengths Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `coordinate_count_mismatch`: latitudes and longitudes arrays have different lengths. Other values are possible when a failure originates below the handler."
  5. Changed6 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedInput schema / additionalProperties
      Added value: +false
    • changedOutput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedOutput schema / anyOf
      Added value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "elevations"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • addedOutput schema / properties / error
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Present when the call failed. Absent on success.",
      +  "properties": {
      +    "code": {
      +      "description": "JSON-RPC error code for this failure.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "data": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "reason": {
      +          "description": "Machine-readable failure mode. Declared by this tool: `coordinate_count_mismatch`: latitudes and longitudes arrays have different lengths Other values are possible when a failure originates below the handler.",
      +          "examples": [
      +            "coordinate_count_mismatch"
      +          ],
      +          "type": "string"
      +        },
      +        "recovery": {
      +          "additionalProperties": {},
      +          "description": "Actionable next step for the caller.",
      +          "properties": {
      +            "hint": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "hint"
      +          ],
      +          "type": "object"
      +        },
      +        "retryable": {
      +          "description": "Whether retrying may succeed.",
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "message": {
      +      "description": "Human-readable description of what went wrong.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "code",
      +    "message"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / required
      Removed value: -[
      -  "elevations"
      -]
  6. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the readOnlyHint/idempotentHint annotations: discloses the 1,000-pair ceiling, that only the first 100 are sampled per upstream request, the unprocessed_count/next_offset resumption contract, and the exact rate limit (600 calls/min per IP, seventh slice returns rate_limited, space slices ~1 minute apart). It also explains partial-failure semantics (a null elevation_m at latitude 90 does not affect other points).

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 the core capability, and every sentence carries operational information (pagination, rate limit, null handling). It is a single dense paragraph that mixes three distinct topics — purpose, batching protocol, and error semantics — where light structuring would improve scannability, but there is no filler.

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?

An output schema exists, yet the description still explains the two fields that drive agent behavior (unprocessed_count/next_offset for pagination, elevation_m null for DEM gaps). Combined with the schema and annotations, nothing needed to invoke or resume correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description still adds real meaning by explaining that only the first 100 entries of the arrays are consumed and that resumption requires slicing the *same* arrays previously sent. That is a non-obvious interaction the schema alone does not convey.

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+resource ('Terrain elevation from the Copernicus Digital Elevation Model') with resolution and input shape (coordinate pairs). Clearly distinguishable from the weather-variable siblings (forecast, marine, air quality) and from openmeteo_search_locations, which geocodes rather than measures.

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

Usage Guidelines4/5

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

Gives concrete usage contexts ('geographic context, elevation-adjusted weather interpretation, or route planning') and a precise resumption procedure for large batches. It stops short of naming an alternative sibling or stating when *not* to use it, but for an unambiguous specialty endpoint that is a minor gap.

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.