City of Norman GIS — Norman, Oklahoma 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 and complete input schemas. Naming follows verb_noun pattern (search_datasets, query_layer, layer_info). Descriptions are 150 - 250 chars, explaining WHAT and WHEN. All parameters have type and description. However, output schemas are undocumented, LLMs cannot predict response structure. Parameter constraints (e.g., limit 1 - 50) are stated in descriptions but not enforced via JSON Schema enums/min/max. No error recovery guidance. Missing required field declarations in some schemas (e.g., search_datasets has no 'required' array). No tool annotations (readOnlyHint, idempotentHint) despite all being safe, read-only operations.
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 Norman 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). search_datasets returns {total, count, datasets[{id, name, summary, org, org_id, record_count, type, url}]} but this is invisible to the agent.
Parameter constraints (limit 1 - 50, offset, order_by) stated in descriptions but not enforced via JSON Schema min/max/enum. Validation happens at runtime; LLMs cannot discover constraints before calling.
No error recovery guidance. If query_layer fails (e.g., invalid where clause, 404 layer), error message is bare ('ArcGIS query: 400'). LLM cannot self-correct or suggest alternatives.
search_datasets schema missing 'required' array. query and org_id are optional, but 'query' is the primary search term, should be marked required or default behavior should be explicit.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2026-07-28+ | v2 |
No tool annotations. All three tools are read-only and idempotent, should declare readOnlyHint: true and idempotentHint: true to signal safety to agents.