City of Charlotte GIS — Charlotte, North Carolina open geospatial data (ArcGIS). Provides access to parcels, zoning, public works & city services datasets through ArcGIS Feature Services.
Three well-named, read-only tools with clear descriptions (avg 180 chars, within baseline 194). All tools have input schemas with typed properties and required fields. However, parameter descriptions lack actionable constraints (ranges, formats, enums). Output schemas are undocumented, LLMs cannot predict response structure for chaining. Error handling is minimal (generic HTTP status errors). No tool annotations (readOnlyHint, idempotentHint). Security is solid (SSRF guard in layerUrl, no secrets exposed). Composition is clean, each tool has one responsibility, and search_datasets→query_layer→layer_info form a logical chain.
Get an ArcGIS Feature/Map Service layer's schema by url: fields (name + type), geometry type, total record count, and capabilities.
Query an ArcGIS Feature Service / Map Service layer by its url (from search_datasets). SQL-like `where`, comma-separated `out_fields`, `order_by`, `limit`, `offset`. Returns attribute rows (and geometry). Use where="1=1" + out_fields="*" to sample.
Search City of Charlotte GIS open geospatial datasets (parcels, zoning, public works & city services) by keyword. Returns each dataset's name, summary, record_count, owner/org, and its Feature Service `url` — pass that url to query_layer / layer_info.
Output schemas undocumented. LLMs cannot predict response structure (fields, types, nesting) for downstream chaining or data extraction. search_datasets returns {total, count, datasets[{id, name, summary, org, org_id, record_count, type, url}]} but this is invisible to the LLM.
Parameter constraints missing. 'limit' accepts 1-50 but description says '(1-50, default 20)', not machine-parseable. 'where' clause is free-form SQL with no validation hints. LLMs cannot self-correct invalid SQL without explicit error guidance.
Error handling is generic. 'ArcGIS Hub: 401' or 'ArcGIS query: 500' gives no recovery guidance. LLM cannot distinguish retryable (timeout) from user-fixable (invalid where clause) from fatal (auth failure). No actionable error messages.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
No tool annotations. All three tools are read-only and idempotent, but lack readOnlyHint and idempotentHint. LLMs cannot infer safety properties and may over-plan or under-cache results.
query_layer 'offset' parameter lacks description. Unclear if it's 0-indexed or 1-indexed, or how it interacts with 'limit'. Parameter descriptions should explain pagination semantics.