geospatial-mcp
Uses OpenStreetMap-derived data for geocoding, place search, and routing capabilities.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@geospatial-mcpHow long to drive from the depot to the customer?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
geospatial-mcp
An MCP server for geospatial work: coordinates, geocoding, routing, terrain, weather and radio links. 22 tools, no API key required for any of them.
Built for logistics, telecom, agriculture, insurance, real estate, utilities, emergency response, surveying and mapping — anywhere a question starts with where.
"How long to drive from the depot to the customer?" route_directions
"Everywhere a van can reach in 20 minutes" route_isochrone
"Which depot is closest by road to each of today's jobs?" route_matrix
"How steep is this section of the trail?" terrain_profile
"How far will a 1800 MHz cell reach over suburban ground?" rf_link_budget
"What's the area of this field in hectares?" geom_measure
"Convert this grid reference the survey crew gave me" coord_convertInstall
Nothing to clone or build. Every client below runs the server with uvx.
claude mcp add geospatial -- uvx geospatial-mcp{
"mcpServers": {
"geospatial": {
"command": "uvx",
"args": ["geospatial-mcp"]
}
}
}[mcp_servers.geospatial]
command = "uvx"
args = ["geospatial-mcp"]{
"mcpServers": {
"geospatial": {
"command": "uvx",
"args": ["geospatial-mcp"]
}
}
}{
"servers": {
"geospatial": {
"type": "stdio",
"command": "uvx",
"args": ["geospatial-mcp"]
}
}
}{
"context_servers": {
"geospatial": {
"command": { "path": "uvx", "args": ["geospatial-mcp"] }
}
}
}docker run -p 8000:8000 ghcr.io/ystoneman/geospatial-mcp --transport httpThe HTTP transport binds 127.0.0.1 unless PORT is set by the platform. Put
it behind a reverse proxy with authentication before exposing it publicly.
Related MCP server: mapsi-mcp
Tools
Every tool taking a location accepts any of these, interchangeably:
48.8584, 2.2945 decimal degrees (canonical, latitude first)
48°51'30"N 2°17'40"E degrees / minutes / seconds
31UDQ4825211954 USNG / MGRS grid reference
u09tunquc geohash
891fb46741bffff H3 cell
8FW4V75V+9R6 Plus Code
Eiffel Tower, Paris a place name, geocoded for youcore — 20 tools, always on
Tool | What it answers | Offline |
| This position in every notation at once | ● |
| Is this a valid coordinate, and how precise? | ● |
| Between EPSG systems, with an accuracy figure | ● |
| Distance, bearing, area, perimeter, centroid | ● |
| Buffer, simplify, hull, centroid, repair | ● |
| Intersection, union, difference | ● |
| Point-in-polygon, overlap, nearest distance | ● |
| Address or place name → coordinates | ○ |
| Coordinates → address | ○ |
| Fuel, hospitals, chargers, warehouses nearby | ○ |
| Driving, cycling, walking, HGV directions | ○ |
| Everywhere reachable in N minutes | ○ |
| Travel times between many origins and destinations | ○ |
| Height above sea level | ○ |
| Elevation along a path, ascent and descent | ○ |
| Current conditions and forecast | ○ |
| Sunrise, twilight, golden hour, shadow length | ● |
| Time zone, local time, next DST change | ● |
| GeoJSON ⇄ WKT ⇄ KML ⇄ GPX ⇄ CSV ⇄ polyline | ● |
| What is enabled, and how to enable more | ● |
rf — 2 tools, always on
Tool | What it answers | Offline |
| Path-loss budget and cell radius | ● |
| Known cell towers nearby | ○ |
analysis — 2 tools, opt-in (pip install 'geospatial-mcp[stats]')
Tool | What it answers | Offline |
| Where do these points concentrate? | ● |
| Bin points into H3 or geohash cells | ● |
● runs with no network at all. ○ calls a free public API.
Link budgets are an everyday tool for mobile operators, wireless ISPs, utilities running SCADA telemetry and IoT fleets: how far a radio reaches for a given power, frequency and environment.
This is one server among many. If you are working out which to use, Sparkgeo's geo-mcp-servers is a curated, machine-checked index of the geospatial MCP field, kept current and marked for liveness — a better place to compare coverage than any claim this README could make about itself. docs/REFERENCES.md lists the servers, standards and research this project leans on or points at.
Selecting toolsets
uvx geospatial-mcp --toolsets core # 20 tools, drops the RF set
uvx geospatial-mcp --toolsets all # adds the analysis toolset (needs [stats])
GEO_TOOLSETS=offline uvx geospatial-mcp # 13 tools that never touch the network
uvx geospatial-mcp --list-tools # print the catalogue and exitoffline is for field use with no signal. It keeps only tools that make no
network call under any input, so it excludes geom_measure and the place
tools — those accept a place name, which means they may geocode.
Toolset | Tools | Needs |
| 20 | nothing |
| 2 | nothing |
| 2 |
|
Configuration
No API key is needed for anything. Every keyed provider has a keyless default.
Variable | Purpose |
|
|
| Response cache location (default |
|
|
| Override the User-Agent sent to providers |
| Point at self-hosted instances |
| Optional routing upgrade over the keyless default |
| Optional; larger cell-tower database |
| Required for commercial weather use (see below) |
Data sources and licensing
Results carry the attribution their licence requires in meta.attribution —
pass it through when you display them. Two obligations worth knowing before you
build on this: OpenStreetMap-derived data (geocoding, places, routing) is
ODbL 1.0 and requires attribution, and Open-Meteo's free tier is
non-commercial, so commercial deployments need OPEN_METEO_API_KEY or a
self-hosted instance.
The public instances are free and shared. This server caches aggressively and
rate-limits per host to stay inside their usage policies; for heavy use,
self-host and set the corresponding *_URL. See
Sources and credits for the complete list.
What it gets right that is easy to get wrong
Distances and areas are geodesic. Karney's algorithm on the WGS84 ellipsoid, accurate to millimetres at any distance. Not
111.32 km/degree, which is 0.25% out at 60° latitude and worse further north.Buffers are circles on the ground. Buffering in degrees produces an ellipse stretched by 1/cos(latitude) — 2× wrong at 60°, 5× at 78°. Every buffer here is projected to an azimuthal equidistant plane first.
Grid references truncate, they never round. A reference names the square a position falls in, so dropping digits must move the point to the coarser square's corner. Rounding would hand back a neighbouring square — a kilometre away at four digits, and confidently wrong.
DEM gaps stay gaps. A missing elevation is reported as
null, never substituted with zero. Substituting sea level flattens a ridge into an entirely plausible plain, and every statistic downstream inherits it.Place names are never silently guessed. "Springfield" matches cities of near-equal prominence 1,500 km apart, so a tool asked about it lists them and asks, rather than quietly answering for Illinois. When a name is clear enough to use,
meta.notessays exactly which place it was taken to mean, and names any others that share it.Errors are errors. Failures raise, so the MCP response is marked
isError. A tool that returns{"status": "error"}is reported to the model as a success, and it will proceed on invented data.Empirical models report their limits. COST231-Hata outside 1500–2000 MHz still returns a number;
meta.notestells you it is out of range.CRS transforms admit their accuracy. Every transform names the operation PROJ used for that point and its published accuracy. When a better operation needs a grid file that is not installed, the response names the file; when no published transformation exists at all, it says the datum shift was ignored.
Development
git clone https://github.com/ystoneman/geospatial-mcp && cd geospatial-mcp
uv sync --all-extras
make check # lint, types, tests — exactly what CI runs
make test-network # additionally hit the live APIs
make evals # tool-selection eval suiteSee AGENTS.md for the layout and conventions, and CONTRIBUTING.md to add a tool.
Sources and credits
Almost none of the geospatial computation here is ours. This package is an integration layer: it chooses which established libraries, published algorithms and public data services to expose to a language model, wires them together, and tries hard to get the units, datums and error handling right. The interesting work was done by the projects below, and this section exists so you can see exactly which ones you are depending on.
To put a number on it — of the Python that ships when you install this package,
1.0% is ours and 99.0% is dependencies (6,912 lines against 654,791), inside
a 150 MB installation of which 109 MB is compiled native libraries and 9 MB is
the EPSG registry. Counted by installing the package with no extras into an
empty environment and measuring site-packages.
Runtime dependencies
Everything below is permissively licensed. Licences were read from each
package's own LICENSE file, not from its classifiers — the two disagree more
often than you would expect.
Package | Version | Licence | What it provides here |
2.0.0 | MIT | The Model Context Protocol SDK: tool registration, transports, schemas | |
2.12.5 | MIT | Tool input and output schemas, response validation | |
2.4.2 | BSD-3-Clause and others | Terrain arrays, profile statistics, hillshade kernels | |
2.1.2 | BSD-3-Clause | All polygon geometry — buffer, union, hulls, predicates | |
3.7.2 | MIT | CRS transforms and every geodesic distance, bearing and area | |
26.8.18 | MIT | Rhumb lines, great-circle intersections, cross-track distance, USNG/MGRS grid references | |
4.5.0 | Apache-2.0 | Uber's hexagonal hierarchical spatial index | |
1.6.0 | BSD-3-Clause | Geohash encoding and decoding | |
2022.1.3 | Apache-2.0 | Open Location Code (Plus Codes) | |
1.2.1 | BSD-3-Clause | XYZ tile and quadkey arithmetic | |
3.2 | Apache-2.0 | Sun and moon position, twilight, golden hour | |
1.3.3 | MIT | Offline timezone lookup from coordinates | |
2.1.1 | MIT | Typed GeoJSON models | |
2.0.4 | MIT | Google encoded polyline format | |
3.1.6 | MIT | Shapefile reading and writing without GDAL |
Optional extras: pillow (MIT-CMU),
sgp4 and
skyfield (MIT),
scikit-learn, esda and
libpysal (BSD-3-Clause),
fast-tsp (MIT),
staticmap (Apache-2.0),
rasterio and
rio-tiler (BSD),
pystac-client (Apache-2.0),
morecantile (MIT).
Native libraries bundled inside those wheels
Library | Licence | Reached through |
LGPL-2.1-or-later |
| |
MIT |
|
GEOS is the one copyleft component in the tree. It is unavoidable — it sits under Shapely, GeoPandas, OGR, PostGIS and DuckDB-spatial alike, and there is no permissive replacement with equivalent overlay correctness.
Live data services
None require an API key. Results carry the attribution their licence demands in
meta.attribution; pass it through when you display them.
Service | Provides | Data licence |
Geocoding, reverse geocoding | OpenStreetMap, ODbL 1.0 | |
Points of interest by category | OpenStreetMap, ODbL 1.0 | |
Routing, isochrones, matrices | OpenStreetMap, ODbL 1.0 | |
Weather, elevation, air quality | CC-BY 4.0 — free tier is non-commercial | |
Copernicus GLO-90 DEM | Elevation, via Open-Meteo | © DLR e.V. 2010–2014, © Airbus Defence and Space GmbH 2014–2018 |
Cell towers (keyless default) | Public domain (CC0) | |
Cell towers (optional, keyed) | CC-BY-SA 4.0 — share-alike on derived databases |
Algorithms, and where they come from
Every computation in this package traces to a library, a published formula or a public service. None of it was invented here, and the literature is cited so you can check the implementation against the source.
Capability | Implemented by | Source |
Geodesic distance, bearing, area | PROJ, via | Karney, C. F. F. (2013), "Algorithms for geodesics", Journal of Geodesy 87(1), 43–55 |
Datum and projection transforms | PROJ | The EPSG Geodetic Parameter Dataset |
USNG / MGRS grid references |
| FGDC-STD-011-2001, the United States National Grid; the same squares are MGRS outside the US |
Polygon overlay, buffering, hulls | GEOS, via | The OGC Simple Features specification |
Line simplification | GEOS | Douglas, D. H. & Peucker, T. K. (1973), The Canadian Cartographer 10(2), 112–122 |
Hexagonal spatial index |
| Uber H3 |
Geohash |
| Niemeyer, G. (2008) |
Plus Codes |
| Google Open Location Code specification |
Free-space path loss | this package | ITU-R P.525, "Calculation of free-space attenuation" |
Okumura-Hata path loss | this package | Hata, M. (1980), IEEE Trans. Veh. Technol. 29(3), 317–325; after Okumura et al. (1968) |
COST 231-Hata path loss | this package | COST Action 231 final report (1999), ch. 4 |
Two-ray ground reflection | this package | Standard textbook propagation model |
Slope, aspect, hillshade | this package | Horn, B. K. P. (1981), "Hill shading and the reflectance map", Proc. IEEE 69(1), 14–47 |
Terrarium DEM decode | this package | Mapzen Terrain Tiles published encoding |
Sun and moon position |
| Standard astronomical almanac formulae |
DBSCAN clustering |
| Ester, M. et al. (1996), KDD-96 |
HDBSCAN clustering |
| Campello, R. J. G. B. et al. (2013), PAKDD |
"Implemented by: this package" means the formula was written out from the cited
publication in geo/rf.py or
geo/terrain.py, because no permissively
licensed Python library implements it. The mathematics is not ours; only the
transcription is.
What this package actually adds
Given the above, it is worth being plain about what is left:
The composition — which capabilities belong in one server, and what the tool surface should look like for a model rather than a human.
Correct units and datums at the seams. Geodesic buffering via an azimuthal equidistant reprojection, geodesic path sampling, geodesic area — the places where naive degree arithmetic silently gives wrong answers.
A shared HTTP layer with per-host rate limiting, a disk cache, bounded retries and mirror failover, so the free public services are used within their stated policies.
Error design — tools raise rather than returning an error payload, and every message names the input, the problem and a valid example.
Attribution plumbing, so licence obligations travel with the data.
Tests and evals — 293 tests and a 31-case tool-selection eval library.
Full licence texts and obligations are in THIRD_PARTY_NOTICES.md. If you spot a missing or incorrect attribution, please open an issue — that is a bug.
Licence
MIT — see LICENSE.
Available Tools
22 toolscoord_convertARead-onlyIdempotent
Convert a position between every common coordinate notation at once.
Detects the input format automatically and returns decimal degrees, DMS, USNG/MGRS, UTM, geohash, H3, Plus Code, quadkey and GeoJSON together, so one call answers any "what is this in X?" question.
Use this for format conversion. For a different datum or projection (British National Grid, State Plane, Web Mercator) use coord_transform_crs. To check whether a string is a valid coordinate without converting it, use coord_describe.
| Name | Required | Description | Default |
|---|---|---|---|
| location | Yes | A position in any supported notation: decimal degrees '48.8584,2.2945'; DMS '48°51'30"N 2°17'40"E'; USNG/MGRS '31UDQ4825211954'; geohash 'u09tunquc'; H3 '891fb46741bffff'; Plus Code '8FW4V75V+9R6'; or a place name to geocode. | |
| tile_zoom | No | Web-map zoom for the quadkey. | |
| grid_digits | No | Digits in the USNG/MGRS reference: 10 gives 1 m, 8 gives 10 m, 4 gives 1 km. | |
| h3_resolution | No | H3 resolution. | |
| geohash_length | No | Geohash characters. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | Yes | |
| input | Yes | |
| formats | Yes | |
| detected_format | Yes | |
| input_precision_m | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, covering the safety profile. The description adds valuable behavioral context: it auto-detects input format, returns a comprehensive set of notations, and accepts place names for geocoding. These are traits not evident from annotations or schema alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: it opens with the core purpose, explains the auto-detection and output scope in the second sentence, and then delivers usage guidance concisely. Every sentence earns its place, with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (multi-format conversion), the presence of an output schema, and annotations covering safety, the description is sufficiently complete. It explains the auto-detection, lists output formats, includes geocoding capability, and routes to alternatives, leaving nothing an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with detailed parameter descriptions (e.g., grid_digits precision mapping, location examples). The description adds no additional parameter-specific meaning beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool converts a position between all common coordinate notations, with a specific verb and resource. It distinguishes itself from siblings by naming coord_transform_crs for datum/projection conversion and coord_describe for validation, making its unique role obvious.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides when-to-use and when-not-to-use guidance, naming two alternatives (coord_transform_crs and coord_describe) with clear conditions for each. This fully removes ambiguity about tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
coord_describeARead-onlyIdempotent
Check whether a string is a valid coordinate and report its precision.
Identifies which notation it is, normalises it, and states the ground accuracy the notation implies -- a grid reference with four digits names a 1 km square, not a point, and a 5-character geohash is about 5 km wide. Returns is_valid=false with an explanation rather than failing, so it is safe to use for validating user input before acting on it.
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes | The coordinate string to inspect. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | Yes | |
| input | Yes | |
| problem | No | |
| is_valid | Yes | |
| latitude | No | |
| longitude | No | |
| normalized | No | |
| detected_format | No | |
| implied_precision_m | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the description doesn't need to repeat that. It adds value by explaining that the tool normalizes input and returns an explanation for invalid input, which is useful context beyond the safety hints. However, it doesn't describe the exact output structure or the precision levels returned, but given annotations cover safety, a 3 is reasonable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured, starting with the primary purpose, then explaining the normalization and precision implications, and ending with error behavior. Each sentence serves a purpose, and the use of a concrete example (4-digit grid reference, 5-char geohash) makes it informative without being verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description doesn't need to detail return values. It covers the tool's validation purpose, normalization behavior, and precision implications, which is sufficient for a single-parameter tool. A minor gap is not describing the exact output format, but that's covered by the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (the only parameter 'value' is described as 'The coordinate string to inspect.'). The description adds context about what the tool does with the value, but doesn't add new parameter-specific semantics beyond what the schema already provides. Hence baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it checks if a string is a valid coordinate and reports its precision. It specifies the resource (coordinate strings) and the operation (validate, normalize, state precision), distinguishing it from sibling tools that convert, transform, or measure.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly mentions it is safe to use for validating user input before acting on it, and explains error behavior (returns is_valid=false rather than failing). This gives clear guidance on when to use it versus other tools, though it doesn't name alternatives explicitly, the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
coord_transform_crsARead-onlyIdempotent
Transform coordinates between any two coordinate reference systems.
For national grids (EPSG:27700 British National Grid, EPSG:2154 Lambert-93, State Plane), Web Mercator (EPSG:3857) and any other EPSG-registered CRS.
Reports the transformation PROJ used for this point and its published accuracy. ballpark=true means no published transformation links the two datums, so the shift was ignored: expect tens to hundreds of metres of error. When a more accurate transformation needs a grid file that is not installed, missing_grids names it.
Inputs and outputs are always x/easting first, y/northing second, regardless of the axis order the CRS authority declares.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | Easting or longitude, in the source CRS units. | |
| y | Yes | Northing or latitude, in the source CRS units. | |
| source_crs | No | Source CRS, e.g. 'EPSG:4326'. | EPSG:4326 |
| target_crs | No | Target CRS, e.g. 'EPSG:27700'. | EPSG:3857 |
Output Schema
| Name | Required | Description |
|---|---|---|
| x | Yes | |
| y | Yes | |
| meta | Yes | |
| source | Yes | |
| target | Yes | |
| ballpark | Yes | |
| pipeline | Yes | |
| accuracy_m | Yes | |
| source_info | Yes | |
| target_info | Yes | |
| missing_grids | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the annotations: it discloses that the tool reports the exact PROJ transformation and accuracy, explains what ballpark=true means in practical error terms, and reveals that missing_grids identifies unavailable grid files. It also documents the always-x/y axis-order convention, which is valuable operational information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: purpose, supported systems, accuracy caveats, and axis-order rule. It is front-loaded with the primary action and avoids filler or redundant restatement of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, idempotent transform tool with an output schema, the description covers all important operational concerns: supported CRS scope, transformation accuracy, missing-grid behavior, and axis order. Nothing critical appears missing for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by clarifying that inputs and outputs are always x/easting first and y/northing second regardless of CRS axis order, which directly informs how x and y parameters must be supplied. This lifts it above the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the core action with a specific verb and resource: 'Transform coordinates between any two coordinate reference systems.' It names supported CRS families and 'any other EPSG-registered CRS,' but it does not explicitly distinguish this tool from the sibling coord_convert, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use this tool: whenever coordinates need transforming between CRSs, with national grids, Web Mercator, and any EPSG-registered system named as examples. It does not provide explicit exclusions or name alternatives for when not to use it, so it earns a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
data_convertARead-onlyIdempotent
Convert geospatial data between GeoJSON, WKT, WKB, KML, GPX, CSV and polyline.
Detects the input format automatically and validates the result, reporting specific problems (self-intersections, out-of-range coordinates, the removed RFC 7946 'crs' member) rather than a bare pass/fail.
Handles the everyday format wrangling of real work: a customer sends KML, the routing engine wants an encoded polyline, the warehouse system exports CSV, the web map needs GeoJSON. Runs entirely offline.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | The geometry or dataset to convert: GeoJSON (object or string), WKT, WKB hex, an encoded polyline, KML, GPX, or CSV with latitude/longitude columns. | |
| to_format | No | Output format. | geojson |
| from_format | No | Input format; 'auto' detects it. | auto |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | Yes | |
| output | Yes | |
| validation | No | |
| input_format | Yes | |
| measurements | Yes | |
| output_format | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description reveals meaningful behavior: automatic input detection, validation of results, and specific error reporting (self-intersections, out-of-range coordinates, removed RFC 7946 'crs' member). It also notes offline execution, which is useful operational context not present in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, starts with the core conversion action, and every sentence carries distinct value: format list, validation behavior, and real-world use cases. No filler or redundant restatement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter tool with full schema coverage and an output schema present, the description covers input formats, output format flexibility, validation behavior, offline operation, and typical usage scenarios. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents data, to_format, and from_format thoroughly. The description adds general context about auto-detection and validation, but does not add parameter-level detail beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Convert') with a clear resource ('geospatial data') and enumerates the supported formats, which immediately distinguishes this tool from coordinate-focused siblings like coord_convert and geometry-operation tools like geom_transform. The scope is precise and actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear applicable scenarios with concrete examples ('a customer sends KML, the routing engine wants an encoded polyline'), making it easy to know when to call this tool. It does not explicitly name sibling tools to avoid, but the format-conversion focus is distinct enough among the listed siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
env_weatherARead-onlyIdempotent
Get current weather and a multi-day forecast for a location.
Returns temperature, precipitation, wind, cloud cover, humidity and visibility from Open-Meteo -- no API key needed.
Useful for delivery and field-work scheduling, construction and outdoor event planning, agricultural spray windows, and travel decisions.
Note the free Open-Meteo tier is licensed for non-commercial use; set OPEN_METEO_API_KEY and OPEN_METEO_BASE_URL for commercial deployments.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Forecast days to return. | |
| location | Yes | Position, as coordinates or a place name. | |
| include_hourly | No | Include an hourly breakdown for the first 24 hours. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | Yes | |
| daily | No | |
| current | No | |
| latitude | Yes | |
| timezone | No | |
| longitude | Yes | |
| hourly_summary | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and non-destructive behavior. The description adds context about the free tier licensing and the need to set OPEN_METEO_API_KEY and OPEN_METEO_BASE_URL for commercial use, which goes beyond the annotations. It also notes no API key is needed for the free tier, adding useful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is five sentences, with the purpose stated upfront. It is concise and each sentence adds value, though it could be slightly trimmed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a weather tool with a full output schema and comprehensive annotations, the description is complete. It covers the API provider, licensing, use cases, and data returned. No critical missing information is apparent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides descriptions for all three parameters (location, days, include_hourly) with 100% coverage, so the description adds no additional parameter guidance. The baseline of 3 is appropriate as the schema carries the semantic load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (Get) and resource (current weather and multi-day forecast) for a location. It lists the specific data fields returned (temperature, precipitation, wind, cloud cover, humidity, visibility) and names the provider (Open-Meteo), distinguishing it from sibling tools like sun_moon or terrain_elevation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit use cases such as delivery scheduling, field work, construction, outdoor events, agricultural spray windows, and travel decisions. However, it does not mention when not to use the tool or name alternative tools, so it lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
geo_capabilitiesARead-onlyIdempotent
List which geospatial toolsets are enabled and what else is available.
Call this when a capability seems to be missing, before telling the user something is impossible -- the tool they need may simply be in a toolset that is switched off, and this returns the exact command to enable it.
Also reports which optional API keys are configured and where the response cache lives.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | Yes | |
| cache | Yes | |
| version | Yes | |
| api_keys | Yes | |
| toolsets | Yes | |
| how_to_enable | Yes | |
| enabled_toolsets | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=true, idempotentHint=true, destructiveHint=false), the description discloses concrete outputs: the exact enable command, which optional API keys are configured, and where the response cache lives. This adds meaningful behavioral context that the annotations do not capture, fully informing the agent of what to expect from the call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short paragraphs, front-loaded with the core purpose, then usage guidance, then additional output details. Every sentence earns its place, with no filler or redundancy. The structure guides the reader from what → when → what else, which is optimal for agent comprehension.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the zero-parameter interface, safe annotations, and existence of an output schema, the description is fully sufficient. It explains the purpose, the trigger condition, and the expected outputs, leaving nothing an agent needs to decide whether and when to call it. No gaps are apparent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, and the schema coverage is 100% (vacuously). Per the rubric, the baseline is 4 for zero-parameter tools. The description does not need to elaborate on parameters, and it doesn't; it focuses on purpose and output, which is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: 'List which geospatial toolsets are enabled and what else is available.' This clearly distinguishes it from the sibling geospatial tools, which perform specific operations; this tool is a meta-capability probe. The purpose is unambiguous and immediately actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent when to invoke it: 'Call this when a capability seems to be missing, before telling the user something is impossible.' It also explains the rationale and what the tool returns (the exact command to enable a toolset), leaving no doubt about its appropriate use. No alternative tools are needed, but the condition is specific.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
geom_measureARead-onlyIdempotent
Measure geodesic distance and bearing between points, or a geometry's area.
Distances use Karney's algorithm on the WGS84 ellipsoid, accurate to millimetres at any distance including near-antipodal pairs. Areas are computed on the ellipsoid, not in degree space.
This is straight-line ("as the crow flies") distance. For travel distance and time along real roads, use route_directions instead -- road distance is typically 20-40% longer.
| Name | Required | Description | Default |
|---|---|---|---|
| origin | Yes | Start position, in any coordinate notation or as a place name. | |
| geojson | No | A GeoJSON or WKT geometry to measure instead of a point pair. Accepts a JSON object or a string. Returns geodesic area, perimeter, length, centroid and bounding box. | |
| destination | No | End position. Omit when measuring a geometry supplied in `geojson` instead. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | Yes | |
| compass | No | |
| geometry | No | |
| midpoint | No | |
| distance_m | No | |
| distance_km | No | |
| distance_miles | No | |
| final_bearing_deg | No | |
| initial_bearing_deg | No | |
| distance_nautical_miles | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive behavior. The description adds valuable context beyond that: the use of Karney's algorithm on WGS84, millimetre accuracy, near-antipodal robustness, and ellipsoidal area computation. It also clarifies that results are straight-line, which is a key behavioral trait not captured in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: it front-loads the purpose, then provides algorithm details, and ends with a usage alternative. Every sentence adds value, with no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a rich output schema (as indicated by 'Has output schema: true'), so the description need not explain return values. It covers the core computational behavior, accuracy, and the key distinction from route_directions, which is essential for correct usage. The parameter schema covers parameter semantics, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters (origin, geojson, destination). The description does not add parameter-specific meaning beyond what the schema provides, so the baseline of 3 is appropriate. It mentions area and distance but does not tie them to parameters beyond what the schema already does.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('measure') and resource ('geodesic distance and bearing between points, or a geometry's area'), which clearly distinguishes it from sibling tools like route_directions. It also explicitly notes this is straight-line distance, making the tool's role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to use this tool vs. an alternative: 'For travel distance and time along real roads, use route_directions instead.' This is a clear exclusionary condition, and it also implies the intended use for geodesic/straight-line measurements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
geom_overlayARead-onlyIdempotent
Combine two geometries with a set operation, reporting the resulting area.
The workhorse of overlay analysis: how much of this delivery zone falls inside that flood extent (intersection), what is the combined footprint of these service areas (union), which part of a territory is not yet covered (difference).
Invalid input geometries are repaired automatically before the operation, since self-intersecting polygons are common in real data.
| Name | Required | Description | Default |
|---|---|---|---|
| geojson_a | Yes | First geometry, as GeoJSON (object or string) or WKT. | |
| geojson_b | Yes | Second geometry, as GeoJSON (object or string) or WKT. | |
| operation | No | The set operation to apply. | intersection |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | Yes | |
| geometry | Yes | |
| measurements | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds a valuable behavioral detail: invalid geometries are auto-repaired before the operation, which is beyond the annotations and helps set expectations. It also clarifies the output is the resulting area, which is useful. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences: the core function is front-loaded, followed by illustrative use cases, then a note on auto-repair. Every sentence earns its place with no redundancy. It is concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema (per context signals), so return values are covered externally. The description covers purpose, use cases, and an important behavioral nuance (auto-repair). It does not explicitly mention symmetric_difference, but the schema lists it, so the description is complete enough for a 3-parameter tool with an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% per the context signals, so the schema already documents all three parameters with descriptions and enums. The description does not add parameter-specific details beyond what the schema provides, but it does mention the operation types in examples. Since the schema is thorough, the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Combine two geometries with a set operation, reporting the resulting area.' It provides concrete examples (intersection, union, difference) and clearly differentiates this overlay tool from siblings like geom_measure or geom_relate. The verb+resource+outcome are specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives real-world scenarios (delivery zone vs. flood extent, service area footprints, uncovered territory) that illustrate when to use this tool. However, it does not explicitly mention when NOT to use it or name alternative tools, so it falls short of a 5 but is still clear on context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
geom_relateARead-onlyIdempotent
Test the spatial relationship between two geometries.
Answers point-in-polygon, overlap, containment and adjacency in one call, plus the shortest geodesic distance between them and the nearest point on each. Use this for geofence checks ("is this vehicle inside the zone?"), territory assignment and proximity screening.
| Name | Required | Description | Default |
|---|---|---|---|
| geojson_a | Yes | First geometry, as GeoJSON (object or string) or WKT. | |
| geojson_b | Yes | Second geometry, as GeoJSON (object or string) or WKT. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | Yes | |
| distance_m | Yes | |
| relationships | Yes | |
| nearest_points | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds behavioral value by disclosing that the tool returns multiple relationship types plus geodesic distance and nearest points in one call, which is beyond what annotations provide. It doesn't mention error behavior or edge cases, but the annotations carry the main safety burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero waste. The core purpose is front-loaded, the output scope is summarized in the second sentence, and concrete use cases close it out. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a read-only relationship-testing tool with a rich output schema. It covers what the tool does, what it returns, and when to use it. The only minor gap is not mentioning whether the input geometries must be in the same CRS or how invalid geometries are handled, but the output schema and annotations cover most operational needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters as GeoJSON or WKT. The description adds the semantic context that these are two geometries being tested for relationships, but doesn't add format details beyond the schema. Baseline 3 is appropriate since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('test') and resource ('spatial relationship between two geometries'), then enumerates the exact relationship types (point-in-polygon, overlap, containment, adjacency) plus distance and nearest-point outputs. This clearly distinguishes it from sibling tools like geom_measure (measurement) and geom_overlay (spatial operations).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly lists use cases: geofence checks, territory assignment, and proximity screening. It also implicitly distinguishes from siblings by focusing on relationship testing rather than coordinate conversion, transformation, or measurement. The 'Use this for' phrasing gives concrete when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
geom_transformARead-onlyIdempotent
Reshape a geometry: buffer, simplify, hull, centroid, repair or bounding box.
All distances are true ground metres. Buffering projects to an azimuthal equidistant plane centred on the geometry, so a 5 km buffer is 5 km on the ground at every latitude -- not an ellipse stretched by longitude convergence, which is what buffering in degrees produces.
concave_hull traces the real outline of a scattered point set (a service territory, a fire perimeter); convex_hull bridges across genuine gaps.
| Name | Required | Description | Default |
|---|---|---|---|
| ratio | No | For concave_hull: 0 hugs the points tightly, 1 equals the convex hull. The scale is steeply non-linear -- try 0.0 first and raise it only if the outline is too ragged. | |
| geojson | Yes | Input geometry as GeoJSON (object or string) or WKT. | |
| operation | Yes | The transformation to apply. | |
| distance_m | No | For buffer: offset distance in metres (negative shrinks). For simplify: tolerance in metres. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | Yes | |
| geometry | Yes | |
| measurements | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context: distances are true ground metres, buffering uses an azimuthal equidistant projection (avoiding degree-based distortion), and concave vs convex hulls have distinct use cases. This goes beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a one-sentence summary, then provides necessary details on projection and hull selection. The second paragraph is somewhat lengthy but explains a common pitfall (degree-based distortion) that saves real trouble. Overall it is tight and purposeful, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool supports seven operations, but the description only elaborates on buffer and hulls. Centroid, simplify, repair, and bbox are not given any specific behavioral or usage context. Since an output schema exists, return values are covered, but some operations remain under-described for an AI agent to choose among them confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaningful nuance beyond the schema: it explains that distances are true ground metres, that the ratio scale is steeply non-linear, and that distance_m is applied in metres for both buffer and simplify. This enhances understanding of how parameters behave in practice.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence 'Reshape a geometry: buffer, simplify, hull, centroid, repair or bounding box' clearly states a specific verb (reshape) and the resource (geometry), and lists the supported operations. It does not explicitly differentiate from sibling tools like geom_measure or geom_overlay, but the operation list makes the tool's scope evident and distinct enough.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives implicit usage guidance by naming the operations, but it never explicitly says 'use this tool when you need X, use geom_measure when you need Y'. There is useful internal guidance on choosing concave_hull vs convex_hull, but no direct comparison to sibling tools or exclusions, so it remains at an implied level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
place_geocodeARead-onlyIdempotent
Find the coordinates of an address, place name or landmark.
Uses OpenStreetMap: Nominatim for exact structured lookups, or Photon when fuzzy=true for misspelled or partial input (Nominatim's usage policy forbids autocomplete-style queries, so route those here).
To go the other way -- coordinates to an address -- use place_reverse. To find categories of thing nearby (fuel, hospitals, hotels) rather than one named place, use place_search.
| Name | Required | Description | Default |
|---|---|---|---|
| fuzzy | No | Use the typo-tolerant Photon backend instead of Nominatim. Set this for partial, misspelled or as-you-type input. | |
| limit | No | Maximum matches to return. | |
| query | Yes | An address, place name or landmark. | |
| country_codes | No | Comma-separated ISO 3166-1 alpha-2 codes to restrict results, e.g. 'gb,ie'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | Yes | |
| query | Yes | |
| matches | Yes | |
| provider | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the bar is lower. The description adds valuable context about the backend (Nominatim vs Photon) and why the fuzzy path exists, going beyond what annotations convey. It does not contradict any annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short paragraphs, each earning its place: the first states the core purpose, the second explains backend routing and policy, and the third directs to sibling tools. It is front-loaded and free of fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (4 params, output schema present, annotations covering safety), the description fully covers what an agent needs: the exact input kind, the fuzzy distinction, the policy constraint, and clear alternatives. No missing operational details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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's mention of the fuzzy parameter largely repeats what the schema already says ('Set this for partial, misspelled or as-you-type input'), and it does not add extra meaning to limit, country_codes, or query beyond their schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear, specific statement of what the tool does: 'Find the coordinates of an address, place name or landmark.' It explicitly distinguishes itself from place_reverse (reverse geocoding) and place_search (categorical search), leaving no ambiguity about its scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance, including when to set fuzzy=true for misspelled/partial input and routes to place_reverse and place_search for other use cases. It also mentions Nominatim's policy restriction, which directly informs tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
place_reverseARead-onlyIdempotent
Find the address or place name at a set of coordinates.
The inverse of place_geocode. Useful for labelling GPS traces, describing a delivery destination, or identifying the administrative area a position falls in (lower the zoom to get city, region or country instead of a street address).
| Name | Required | Description | Default |
|---|---|---|---|
| zoom | No | Detail level: 18 building, 16 street, 10 city, 5 state, 3 country. | |
| location | Yes | Position in any coordinate notation: decimal degrees, DMS, a USNG/MGRS grid reference, geohash, H3 or Plus Code. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | Yes | |
| type | No | |
| address | Yes | |
| category | No | |
| latitude | Yes | |
| longitude | Yes | |
| display_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, openWorld, idempotent, and destructive hints, so the safety profile is known. The description adds valuable behavioral context by explaining how the zoom parameter changes the granularity of results (building to country), which is not captured by the annotations alone. This goes beyond the minimal requirement and gives the agent a clear mental model of output variation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with the primary purpose stated in the first sentence, followed by a brief explanation of its relationship to place_geocode and concrete use cases. No unnecessary words; every sentence adds value. The zoom tip is placed at the end, effectively closing with actionable guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema (has_output_schema=true) and comprehensive annotations, the description covers all necessary aspects for correct invocation: purpose, use cases, inverse relationship, and zoom behavior. No missing prerequisites or error conditions are critical for an agent to use this tool safely and correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are documented. The description enhances the zoom parameter by providing a practical usage hint ('lower the zoom to get city, region or country instead of a street address'), which adds meaning beyond the schema's 'Detail level' list. It also reinforces that location accepts multiple notations, tying back to the schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Find the address or place name') and resource (at a set of coordinates), clearly distinguishing it from siblings by explicitly naming it the inverse of place_geocode. The purpose is unambiguous and immediately differentiates the tool from place_search or coordinate conversion tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit use cases ('labelling GPS traces, describing a delivery destination, or identifying the administrative area a position falls in') and names the inverse sibling (place_geocode), giving clear guidance on when to use this tool versus alternatives. The zoom tip ('lower the zoom to get city, region or country') further guides selection based on granularity needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
place_searchARead-onlyIdempotent
Find points of interest of a given category near a location.
Searches OpenStreetMap for facilities by type -- fuel stations along a route, hospitals near an incident, EV chargers in a city, warehouses in a catchment, communication towers on a ridge. Results are sorted by distance and include the bearing from the search centre.
For one specific named place, use place_geocode instead.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results. | |
| category | Yes | What to look for. One of: fuel, ev_charging, parking, hospital, pharmacy, clinic, police, fire_station, school, restaurant, cafe, hotel, supermarket, bank, atm, toilets, drinking_water, bus_stop, railway_station, airport, port, warehouse, power_substation, power_tower, communication_tower, water_tower, viewpoint, shelter, campsite, peak, bridge, farmland. | |
| location | Yes | Centre of the search, as coordinates or a place name. | |
| radius_m | No | Search radius in metres. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | Yes | |
| count | Yes | |
| centre | Yes | |
| places | Yes | |
| category | Yes | |
| radius_m | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint, idempotentHint, openWorldHint, and destructiveHint, so the safety profile is covered. The description adds useful behavioral details beyond annotations: it searches OpenStreetMap, results are sorted by distance, and results include bearing from the search centre.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, beginning with a clear one-sentence summary, followed by concrete use examples, then an explicit pointer to the alternative tool. Every sentence contributes useful information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for this tool: it explains what the tool searches, the types of results returned, the sorting and bearing behavior, and when to use a sibling tool instead. With a rich input schema, an output schema present, and thorough annotations, nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all parameters with defaults and constraints. The description adds contextual examples of category values, but it does not provide meaningful parameter format or semantics details beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Find points of interest of a given category near a location' and elaborates with concrete examples and 'Searches OpenStreetMap for facilities by type.' It clearly differentiates from place_geocode by noting that the geocoder is for a single named place.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit use cases such as fuel stations along a route, hospitals near an incident, and EV chargers in a city. It also names the alternative tool, place_geocode, and specifies the condition under which that alternative should be used instead: 'For one specific named place.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rf_link_budgetARead-onlyIdempotent
Calculate maximum allowable path loss and the resulting cell radius.
Works out EIRP, the loss budget available to the link, and how far that reaches under the chosen propagation model. Use it to size cell coverage, compare frequency bands, or check whether a proposed link closes.
Reports a warning when parameters fall outside the model's published validity range -- an empirical model used out of range still returns a confident number, and nothing else will catch that.
This is a statistical model over an idealised environment, not a specific path: it answers "how far does this radio reach here?", not "does this exact link clear that ridge?". For the ground between two points, use terrain_profile. For what is already transmitting nearby, use rf_towers.
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | Propagation model. free_space: theoretical minimum, any frequency. two_ray: flat rural ground reflection. hata: 150-1500 MHz. cost231_hata: 1500-2000 MHz. | cost231_hata |
| losses_db | No | Feeder, connector and body losses in dB. | |
| environment | No | Clutter type; sets the metro correction and default fade margin. | urban |
| rx_gain_dbi | No | Receive antenna gain in dBi. | |
| rx_height_m | No | Receive antenna height above ground. | |
| tx_gain_dbi | No | Transmit antenna gain in dBi. | |
| tx_height_m | No | Transmit antenna height above ground. | |
| tx_power_dbm | No | Transmit power in dBm. | |
| frequency_mhz | No | Carrier frequency in MHz. | |
| shadow_margin_db | No | Shadow-fading margin in dB. Defaults to a typical value for the environment. | |
| rx_sensitivity_dbm | No | Receiver sensitivity in dBm. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | Yes | |
| model | Yes | |
| inputs | Yes | |
| eirp_dbm | Yes | |
| warnings | No | |
| environment | Yes | |
| cell_area_km2 | Yes | |
| cell_radius_km | Yes | |
| shadow_margin_db | Yes | |
| max_allowable_path_loss_db | Yes | |
| max_path_loss_with_margin_db | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, non-destructive), the description discloses a crucial behavior: it emits a warning when parameters fall outside the model's published validity range, noting that an empirical model out of range still returns a confident number and nothing else catches that. It also clarifies that this is a statistical model over an idealised environment, not a specific path. These are valuable behavioral caveats that annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: the primary purpose appears in the first sentence, followed by use cases, then a critical warning, and finally limitations and alternatives. Every sentence earns its place – no filler or redundant restating of the tool name. The length is justified given the tool's complexity (4 models, 5 environments, 11 parameters) and the need to convey model validity caveats.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity and the presence of a rich output schema (mentioned as present), the description is complete for calling the tool correctly. It covers the main use cases, warns about out-of-range model use, and clarifies the statistical vs. specific-path distinction. It does not describe the output format in prose, but the output schema handles that. The only minor gap is that it doesn't explicitly state that all parameters are optional, though the schema already shows defaults for all, so that's covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% – every parameter has a description that explains its meaning, units, and defaults. The tool description does not add extra semantic context for individual parameters beyond what the schema already provides. It does explain the interaction between environment and default fade margin, but that's already implied in the schema description for environment. Baseline 3 is appropriate since the schema carries the parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb-object pair ('Calculate maximum allowable path loss and the resulting cell radius') that names the exact resource and output. It further distinguishes itself from siblings by explicitly stating it is not for specific paths ('not "does this exact link clear that ridge?"') and names terrain_profile and rf_towers as alternatives. No ambiguity about what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit use cases ('size cell coverage, compare frequency bands, or check whether a proposed link closes') and explicit exclusions: it answers a statistical coverage question, not a point-to-point path question. It even routes to sibling tools (terrain_profile, rf_towers) for those scenarios. This gives an agent clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rf_towersARead-onlyIdempotent
Find known cell towers near a location.
Returns crowdsourced tower records with radio technology (GSM/UMTS/LTE/NR), operator MCC-MNC and approximate position. Useful for coverage benchmarking, IoT and fixed-wireless site qualification, and understanding why signal is poor at a specific address.
Uses OpenCelliD when OPENCELLID_API_KEY is set, otherwise the keyless BeaconDB. Coverage is crowdsourced and sparse outside dense urban areas -- an empty result means no contributor has mapped the area, not that no towers exist.
| Name | Required | Description | Default |
|---|---|---|---|
| location | Yes | Search centre, as coordinates or a place name. | |
| radius_m | No | Search radius in metres. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | Yes | |
| count | Yes | |
| towers | Yes | |
| latitude | Yes | |
| provider | Yes | |
| radius_m | Yes | |
| longitude | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, open-world, and non-destructive behavior. The description adds valuable context beyond that: the conditional backend selection (OpenCelliD vs BeaconDB) and the interpretation of empty results as unmapped areas rather than absence of towers. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly scoped paragraphs: a one-line purpose, return/use-case context, and a data-source caveat. Every sentence carries decision-relevant information, and the most important facts are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Combined with the full input schema, output schema, and safety annotations, the description covers purpose, data-source behavior, coverage limitations, and interpretation of results. Nothing needed to invoke the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema covers both parameters with 100% description coverage, so the schema already explains location and radius_m. The description does not add parameter-level syntax or format details, but it does not need to given the complete schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Find known cell towers near a location.' It also describes the return data (radio technology, operator MCC-MNC, approximate position), making the tool's function unambiguous and distinct from spatial or RF-calculation siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete use cases: coverage benchmarking, IoT/fixed-wireless site qualification, and diagnosing poor signal at an address. It also explains the empty-result meaning. It does not explicitly name alternative sibling tools or state when not to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
route_directionsARead-onlyIdempotent
Get driving, cycling or walking directions along real roads.
Returns distance, travel time and turn-by-turn instructions using OpenStreetMap road data via Valhalla -- no API key needed.
Use this for anything involving actual travel: delivery and field-service scheduling, ambulance response-time modelling, freight planning with vehicle restrictions, commute estimation, hiking and cycling routes.
For straight-line distance instead, use geom_measure -- it is much cheaper and needs no network. To find everywhere reachable within a time budget rather than the path to one place, use route_isochrone. For travel times between many places at once, use route_matrix rather than calling this repeatedly.
| Name | Required | Description | Default |
|---|---|---|---|
| via | No | Optional intermediate stops, semicolon-separated, visited in the order given. Example: '48.87,2.33; 48.88,2.35' | |
| detail | No | 'summary' returns distance, duration and turn list. 'full' adds the route geometry as GeoJSON, which is much larger. | summary |
| origin | Yes | Start, as coordinates or a place name. | |
| profile | No | Vehicle type. 'truck' respects weight, height, width and hazmat restrictions; 'walk' uses footpaths; 'bicycle' prefers cycleways. | car |
| destination | Yes | End, as coordinates or a place name. | |
| coordinate_format | No | 'grid' adds a USNG/MGRS grid reference to each turn. Useful for crews working from gridded paper maps -- search and rescue, wildland fire, surveying. | decimal |
Output Schema
| Name | Required | Description |
|---|---|---|
| end | Yes | |
| meta | Yes | |
| start | Yes | |
| steps | No | |
| profile | Yes | |
| provider | Yes | |
| duration_s | Yes | |
| distance_km | Yes | |
| distance_miles | Yes | |
| duration_display | Yes | |
| geometry_geojson | No | |
| geometry_polyline | No | |
| profile_description | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description adds high-value behavioral context: no API key needed, OpenStreetMap data via Valhalla, return contents (distance, travel time, turn-by-turn instructions), and size implications of 'full' detail. It also discloses routing-behavior differences such as truck restrictions and walking/bicycle preferences. There is no contradiction with the readOnly/openWorld/idempotent annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: what it does, what it returns, when to use it, and when to use alternatives. The sentence list of concrete use cases is specific and earns its place, and the alternative-routing guidance is front-loaded after the core purpose. Nothing feels redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given six parameters and an output schema, the description covers the important contextual ground: data source, no-auth requirement, use cases, and clear routing to siblings. Because an output schema exists, the description does not need to enumerate return fields, and it still communicates the main outputs. This is complete for safe, correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 even without additional parameter detail. The main description adds broad use context and routing profile awareness, but it does not materially extend parameter semantics beyond what the schema already provides for origin/destination format, via ordering, detail levels, profile restrictions, and coordinate_format. It neither repeats nor compensates heavily, so the baseline is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Get driving, cycling or walking directions along real roads.' It immediately distinguishes this tool from geometry-only tools by emphasizing 'real roads' and from isochrone/matrix tools by stating it returns the path to one place. No ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use it: 'Use this for anything involving actual travel' with concrete examples. It also names three alternatives and the conditions that select them: geom_measure for straight-line distance, route_isochrone for reachable areas, and route_matrix for multiple origin/destination pairs at once. This is exactly the when-vs-alternatives guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
route_isochroneARead-onlyIdempotent
Map everywhere reachable within a travel-time budget.
Returns drive-time (or walk-time, cycle-time) polygons. This is the tool for catchment and accessibility questions: which customers are within 30 minutes of a depot, what a store's 15-minute trade area looks like, how many homes a fire station covers in 8 minutes, where to site a warehouse.
direction='to' computes the reverse catchment, which is the correct choice when siting a facility people travel to.
Returns polygons that can be passed straight to geom_relate or geom_overlay to count what falls inside them.
For the path to one specific destination, use route_directions instead.
| Name | Required | Description | Default |
|---|---|---|---|
| minutes | No | Travel-time contours in minutes, comma-separated. Example: '10,20,30'. | 15 |
| profile | No | Vehicle type. | car |
| location | Yes | Centre point, as coordinates or a place name. | |
| direction | No | 'from' = everywhere reachable FROM this point (delivery range). 'to' = everywhere that can REACH this point (catchment area). | from |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | Yes | |
| centre | Yes | |
| profile | Yes | |
| contours | Yes | |
| direction | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as read-only, idempotent, and non-destructive, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: it returns polygons, supports multiple travel modes, explains reverse catchment semantics, and notes that results can be passed directly to geom_relate or geom_overlay.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then organized into short paragraphs covering use cases, direction semantics, downstream composability, and the sibling alternative. Every sentence earns its place without unnecessary filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter tool with an output schema and strong annotations, the description covers everything an agent needs: what it does, when to use it, how direction affects results, what the output is, and how it can be consumed by other tools. Nothing important is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema. It clarifies that profile corresponds to drive/walk/cycle time and gives practical guidance on when direction='to' is appropriate, which is more useful than the raw enum descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Map everywhere reachable within a travel-time budget.' It clearly distinguishes this tool from route_directions by stating that isochrones are for catchment and accessibility questions, not point-to-point paths.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names the use cases (catchment, accessibility, trade areas, coverage) and provides concrete examples. It also gives an exclusion rule: for a path to one specific destination, use route_directions instead, and explains when direction='to' is the correct choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
route_matrixARead-onlyIdempotent
Get road travel times and distances between many origins and destinations at once.
One call answers "which depot is closest by road to each customer", "which crew can reach each job fastest", or ranks candidate sites by access. Returns a duration and distance for every origin-destination pair, indexed [origin][destination], plus the nearest destination for each origin. Unreachable pairs are null.
For turn-by-turn directions on one trip, use route_directions. For everywhere reachable within a time budget, use route_isochrone. For straight-line distance, use geom_measure.
| Name | Required | Description | Default |
|---|---|---|---|
| origins | Yes | Start points, semicolon-separated, as coordinates or place names. Example: '48.8584,2.2945; 48.8606,2.3376' | |
| profile | No | Vehicle type. | car |
| destinations | No | End points in the same form. Leave empty to measure every origin against every other origin. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | Yes | |
| nearest | Yes | |
| origins | Yes | |
| profile | Yes | |
| duration_s | Yes | |
| distance_km | Yes | |
| destinations | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds substantial behavioral detail beyond annotations: every origin-destination pair is returned, results are indexed [origin][destination], the nearest destination per origin is included, and unreachable pairs are null. This gives the agent a clear model of the operation's output behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: first sentence states the core function, second gives representative use cases, third explains return shape, and the final sentence routes to alternatives. Every sentence earns its place without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and annotations are rich, the description is complete for an agent to select and invoke the tool. It covers the matrix semantics, null behavior, and sibling differentiation. No critical missing context is apparent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents origins, profile, and destinations with examples and defaults. The description reinforces the multi-origin/destination nature but does not add significant new parameter-level semantics. Baseline 3 is appropriate because the schema carries the burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Get road travel times and distances between many origins and destinations at once.' It immediately conveys the batch origin-destination calculation and distinguishes itself from route_directions, route_isochrone, and geom_measure through concrete use cases. This is clearly differentiated from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit routing guidance: use route_directions for turn-by-turn directions, route_isochrone for time-budget reachability, and geom_measure for straight-line distance. It also gives example analytical questions the tool answers, such as which depot is closest by road. This is exemplary when-to-use versus when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sun_moonARead-onlyIdempotent
Get sunrise, sunset, twilight, golden hour and moon phase for a location.
Computed offline from astronomical formulas -- no network needed.
Includes the shadow-length ratio, which is what construction shadow studies, right-to-light assessments and solar-panel shading analysis actually need: a 10 m object at 30 degrees solar elevation casts a 17.3 m shadow. Also used for photography scheduling, crop modelling, delivery windows before dusk, and retail daylight-hours analysis.
Inside the polar circles, events that do not occur are returned as null with an explanation rather than as an error.
| Name | Required | Description | Default |
|---|---|---|---|
| on_date | No | Date as YYYY-MM-DD. Defaults to today (UTC). | |
| location | Yes | Position, as coordinates or a place name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| sun | Yes | |
| date | Yes | |
| meta | Yes | |
| moon | Yes | |
| latitude | Yes | |
| timezone | Yes | |
| longitude | Yes | |
| position_now | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering safety. The description adds valuable behavior: 'Computed offline from astronomical formulas -- no network needed' and the crucial edge-case handling 'Inside the polar circles, events that do not occur are returned as null with an explanation rather than as an error.' This goes beyond annotations to disclose surprising behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the main purpose and then provides behavioral context and use cases. It is somewhat verbose (multiple paragraphs) but each sentence adds value; the edge-case explanation is useful. It could be trimmed slightly, but it's well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core function, the offline computation method, the shadow-length ratio with an example, multiple use cases, and the polar-circle null behavior. Since an output schema exists, return-value details are not needed. Nothing essential for calling this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (location and on_date) are already documented. The description does not add any parameter-specific meaning beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource statement: 'Get sunrise, sunset, twilight, golden hour and moon phase for a location.' It also names the shadow-length ratio, a distinct deliverable. This clearly differentiates it from sibling tools like env_weather or time_at_location, even without explicit comparison.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides rich usage context—'construction shadow studies, right-to-light assessments, solar-panel shading analysis, photography scheduling, crop modelling, delivery windows before dusk, and retail daylight-hours analysis'—and notes it works offline. However, it does not explicitly state when to prefer this over alternatives or when not to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
terrain_elevationARead-onlyIdempotent
Get ground elevation above sea level at a location.
Returns height in metres and feet from the Copernicus GLO-90 global DEM (90 m resolution), relative to the EGM2008 geoid -- that is, orthometric height above mean sea level, which is what "elevation" normally means. GNSS receivers report ellipsoidal height, which differs by tens of metres.
For elevation along a path rather than at one point, use terrain_profile -- it fetches up to 100 samples in a single request.
| Name | Required | Description | Default |
|---|---|---|---|
| location | Yes | Position, as coordinates or a place name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | Yes | |
| dataset | Yes | |
| latitude | Yes | |
| longitude | Yes | |
| elevation_m | Yes | |
| elevation_ft | Yes | |
| vertical_datum | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description explains the data source (Copernicus GLO-90), resolution (90 m), datum (EGM2008 geoid), and why this differs from GNSS ellipsoidal height. This prevents a real-world misinterpretation of the returned value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: purpose in the first sentence, key return details in the second, and the alternate tool in the third. Every sentence contributes context without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only lookup with an output schema present, the description covers units, datum, source, and sibling routing. An agent has everything it needs to invoke the tool correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter is already fully described in the schema as 'Position, as coordinates or a place name', so the description adds no extra parameter-level format details. The schema carries the explanatory burden, matching the baseline for 100% schema description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names the exact operation ('Get ground elevation above sea level at a location') and the description explicitly contrasts it with terrain_profile, so the tool is unambiguously distinguishable from its closest sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to prefer terrain_profile ('For elevation along a path rather than at one point') and names the sibling, giving clear selection guidance. No important condition 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.
terrain_profileARead-onlyIdempotent
Get the terrain elevation profile along a path between two points.
Samples the ground along a true geodesic and returns the full profile plus statistics: minimum, maximum, relief, total ascent and descent. All samples come from one batched request rather than one call per point.
Use this for cycling and hiking route difficulty, pipeline and cable routing, drainage assessment, or sizing earthworks. For the elevation at a single point, or at a scattered set of them, use terrain_elevation -- this tool always samples the straight line between two ends.
| Name | Required | Description | Default |
|---|---|---|---|
| origin | Yes | Start of the path. | |
| samples | No | Number of evenly-spaced elevation samples along the path. | |
| destination | Yes | End of the path. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | Yes | |
| profile | Yes | |
| samples | Yes | |
| statistics | Yes | |
| total_distance_m | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive, so safety is covered. The description adds valuable behavioral details beyond annotations: it samples along a true geodesic, returns full profile plus statistics, and all samples come from one batched request rather than one call per point. This informs performance expectations and output nature. It does not contradict annotations. The only minor gap is lack of mention of any potential errors or limitations, but given the annotations and output schema, it's more than adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loaded with the primary purpose, and each sentence adds value. It starts with the core function, then explains the sampling behavior and statistics, and finally provides usage guidance and differentiation from a sibling. No filler or redundant content. It is well-structured and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with three parameters (fully covered by schema), strong annotations (read-only, idempotent, non-destructive), and an output schema, the description covers all essential aspects: what it does, how it behaves (true geodesic, batched), when to use it, and how it differs from the sibling. It leaves no critical gap for an agent to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add extra meaning to the parameters beyond what the schema already provides; it mentions 'samples' in the context of the tool's action but does not elaborate on the parameter format or constraints. The schema already defines origin, destination, and samples with clear descriptions and bounds. Therefore, a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get'), a clear resource ('terrain elevation profile'), and the scope ('along a path between two points'). It explicitly differentiates from the sibling tool terrain_elevation by noting this tool samples the straight line between two ends, while the sibling handles single or scattered points. This is unambiguous and distinguishes it from all siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit use cases ('cycling and hiking route difficulty, pipeline and cable routing, drainage assessment, or sizing earthworks') and directly names the alternative ('use terrain_elevation') for different scenarios ('single point, or at a scattered set of them'). This leaves no doubt about when to choose this tool over the sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
time_at_locationARead-onlyIdempotent
Get the time zone and current local time at a location.
Returns the IANA zone name, current local time, UTC offset, whether daylight saving is active, and when the next DST transition happens. Computed offline from a bundled boundary dataset.
Useful for scheduling across sites, interpreting timestamps in GPS traces, and working out delivery or support-window overlaps.
| Name | Required | Description | Default |
|---|---|---|---|
| location | Yes | Position, as coordinates or a place name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| info | Yes | |
| meta | Yes | |
| latitude | Yes | |
| longitude | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive behavior. The description adds meaningful context beyond that: it is computed offline from a bundled boundary dataset, and it discloses the specific return fields including DST transition timing. This gives the agent useful expectations about data source and behavior without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: a one-line summary, a concise list of return values, a note on the offline computation, and relevant use cases. Every sentence adds value, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only tool with a rich output schema, the description covers the tool's purpose, return contents, computational basis, and example use cases. Nothing essential is missing for an agent to decide whether and how to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes the single parameter as 'Position, as coordinates or a place name,' so schema coverage is 100%. The description does not add further parameter-level detail such as accepted coordinate formats or how place names are resolved, but the schema already carries the necessary meaning, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Get the time zone and current local time at a location.' It then enumerates the exact outputs (IANA zone name, local time, UTC offset, DST status, next DST transition), which clearly differentiates it from sibling tools like place_geocode, env_weather, or sun_moon.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides concrete use cases: scheduling across sites, interpreting GPS timestamps, and delivery/support-window overlaps. It does not explicitly name alternatives or state when not to use this tool, but the context is clear enough for an agent to recognize appropriate invocation scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
22 tool updates
v0.1.0- First observed
coord_convert - First observed
coord_describe - First observed
coord_transform_crs - First observed
data_convert - First observed
env_weather - First observed
geo_capabilities - First observed
geom_measure - First observed
geom_overlay - First observed
geom_relate - First observed
geom_transform - First observed
place_geocode - First observed
place_reverse - First observed
place_search - First observed
rf_link_budget - First observed
rf_towers - First observed
route_directions - First observed
route_isochrone - First observed
route_matrix - First observed
sun_moon - First observed
terrain_elevation - First observed
terrain_profile - First observed
time_at_location
TDQS
Scored across 22 tools
Each tool has a clearly distinct purpose: coordinate validation/conversion/CRS transformation, geometry operations, place lookup, routing modes, terrain, weather, time, data conversion, and RF analysis are all separated. Descriptions explicitly cross-reference similar tools (e.g., coord_convert vs coord_transform_crs, geom_measure vs route_directions), so misselection is unlikely.
Tool names follow a predictable lower_snake_case prefix-based pattern (coord_, geom_, place_, route_, terrain_, rf_) and are readable. However, not all follow a single verb_noun grammar: some are noun_noun (route_directions, env_weather) or noun_prep_noun (time_at_location), making the convention consistent but not perfectly uniform.
At 22 tools, the count sits above the typical 3-15 range and feels slightly heavy, but the broad geospatial domain justifies the number. Each tool covers a distinct capability with no obvious redundancy, and the prefix grouping keeps the set navigable.
The tool surface covers core geospatial workflows well: coordinate/CRS handling, geometry analysis, geocoding/search, routing, terrain, weather, timezone, data conversion, and RF. Minor gaps such as batch geocoding, historical weather, or route optimization exist, but most are workarounds and tools compose cleanly (e.g., isochrones into geom_overlay/relate).
Maintenance
Related MCP Connectors
Ask in plain English, get a rendered, shareable map from live public data. 24 geospatial tools.
Geocoding, weather forecasts, and timezone lookups
- geoOAuthco.thinair
Geocoding, routing, isochrones, traffic, weather, and place search for AI agents. 19 MCP tools.
Geocode, reverse geocode, and run Overpass spatial queries on OpenStreetMap data.
Related MCP Servers
- AlicenseBqualityDmaintenanceProvides 14 comprehensive tools for geocoding, navigation, and visual mapping using Google Maps APIs. It also offers detailed environmental data including weather forecasts, air quality indices, and solar irradiance for location-based analysis and trip planning.1411MIT
- AlicenseAqualityDmaintenanceGeospatial API tools for AI agents — geocoding, reverse geocoding, routing, isochrone, distance matrix, static maps, H3 hexagons, elevation, GPS map-matching, point-in-polygon, address normalisation, timezone lookup, and batch geocoding. Built on OpenStreetMap infrastructure. Cost-effective alternative to Google Maps API.1819 npmMIT
- AlicenseNot gradedqualityCmaintenanceProvides geolocation, routing, and navigation tools including geocoding, place search, distance matrix, and turn-by-turn directions via NextBillion.ai APIs.7 npm1MIT
- AlicenseAqualityDmaintenanceProvides forward/reverse geocoding, bounding box extraction, nearby places discovery, batch geocoding, route waypoints, and administrative boundary lookup using OpenStreetMap data.10Apache 2.0