Professional-grade GIS geoprocessing over MCP, with verifiable provenance
MapSmith demonstrates solid definition quality with all 6 tools having clear, detailed descriptions (avg 180 chars) and complete input schemas with typed parameters. Tool names follow verb_noun convention (describe_, buffer_, clip_, overlay_, dissolve_, nearest_). Descriptions are LLM-optimized, explaining WHAT the tool does, WHEN to use it, and key prerequisites (e.g., CRS alignment, reprojection decisions). All parameters have type declarations and descriptions. However, output schemas are not explicitly documented in the source code, only inferred from descriptions. Error handling guidance is present in descriptions (e.g., 'warnings key flags suspicious-but-valid outcomes') but not formalized as structured error response schemas. No enum constraints visible for string parameters like 'how' in overlay_layers or 'aggfunc' in dissolve_layer, despite these accepting a fixed set of values. Risk annotations (READ_ONLY, WRITE) are present, supporting tool safety classification.
Buffer all features by a distance in meters. Geographic-CRS inputs are reprojected to an estimated UTM zone for the metric operation and back; the decision is recorded in the provenance manifest. A `warnings` key in the result flags a suspicious-but-valid outcome with a hint — e.g. a negative distance that eroded every geometry away.
Clip a layer to the area of a mask layer. CRS are aligned automatically. A `warnings` key in the result means the analysis ran but something is worth your attention (typically an empty result, or inputs whose extents do not overlap); each entry carries a hint. Inputs without a CRS are refused.
Inspect a dataset, vector or raster, before analysing it. Vector: CRS, geometry types, schema, extent, feature count. A MULTI-LAYER container (e.g. a GeoPackage holding several layers) is described per layer — name, feature count, geometry type, CRS — because operations refuse containers with no chosen layer: extract the layer you mean first (run_sql: SELECT * FROM ST_Read(path, layer='name') with an output_path). Raster (.tif): CRS, grid size, resolution, bands with dtype, nodata and masked statistics (nodata cells counted separately). Call this first on any dataset you have not inspected yet — most silent GIS errors start with wrong assumptions about CRS, units, nodata or which layer you are on. Raster inspection requires the [raster] extra.
Merge features into one geometry per value of `by` (or one feature in all). aggfunc — first (default), last, sum, mean, median, min, max or count — is applied to the other columns and RECORDED in the manifest: a sum reported where a mean was meant is a plausible wrong number nobody can see. Features with a null `by` key are dropped by the grouping and the manifest counts them. The output feature count is verified against the number of distinct keys, so a wrong grouping fails loudly instead of shipping.
Output schemas not documented. Descriptions mention 'warnings key' and 'manifest' but no formal schema for response structure is visible in source code. LLMs cannot plan downstream operations without knowing what fields to expect.
String parameters accepting fixed value sets lack enum constraints. 'how' in overlay_layers (intersection|union|identity|symmetric_difference|difference) and 'aggfunc' in dissolve_layer (first|last|sum|mean|median|min|max|count) are documented in descriptions but not formalized as JSON Schema enums, forcing LLMs to parse text.
Error handling is descriptive but not structured. Descriptions mention 'warnings key' and 'manifest' but no formal error response schema or recovery guidance (e.g., 'if empty result, try X') is visible. Agents cannot programmatically classify errors as retryable vs fatal.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
Attach each feature's nearest neighbour from another layer, with the distance IN METERS in a named column. Geographic-CRS inputs are measured in an estimated UTM zone; the decision is recorded in the provenance manifest. A `warnings` key flags a suspicious-but-valid outcome with a hint — e.g. a join where every feature's nearest neighbour is farther than max_distance_meters.
Set-theoretic overlay of two layers: intersection (default), union, identity, symmetric_difference or difference. The overlay layer is reprojected to the input CRS when they differ; the decision is recorded in the provenance manifest. Overlay pieces of lower dimension than the inputs (shared edges, corner contacts) are dropped, and the manifest says so. Inputs without a CRS are refused; an empty result comes back with a `warnings` entry, never as a silent success.
No pagination or result-limiting parameters visible. Tools like describe_dataset on multi-layer containers may return large feature counts or band metadata without documented limits. Large responses risk context window exhaustion.
Tool composition assumes file paths as the primary interface. No batch variants (e.g., buffer_multiple_layers) visible. Agents performing multi-layer operations must call buffer_layer sequentially, wasting tokens and latency.