MCP server for ArcGIS Hub open data platforms - works with any city by configuring the domain
Server has 5 tools with complete input schemas and descriptions. Naming follows verb_noun convention (list_, search_, get_, query_). Descriptions are present (avg ~120 chars) but lack actionable context for LLM selection. Parameters are typed with enums and constraints (e.g., collection enum, limit bounds). However, output schemas are not documented, LLMs cannot predict response structure. Error handling is absent from visible code. No tool annotations (readOnlyHint, destructiveHint). Parameter descriptions are minimal (10-30 chars) and lack dependency hints or format guidance.
Get detailed metadata for a dataset and learn how to access its data (Feature Service query vs CSV download)
Download and process CSV dataset with optional column selection and filtering
List available data collections from the ArcGIS Hub catalog (dataset, document, appAndMap, all)
Query a Feature Service with spatial and attribute filters. Main tool for rich geospatial data access.
Search for datasets by text query. Returns compact results with queryable flag indicating Feature Service availability.
Output schemas not documented. LLMs cannot predict response structure or plan downstream tool calls. search_datasets returns {numberMatched, results[{id, title, type, snippet, owner, modified, queryable}]} but this is not declared in tool definition.
Parameter descriptions are too brief (avg 10-30 chars). 'Text search query (optional)' lacks guidance on format, length, or when to use. 'Dataset ID' does not explain how to obtain one or what format is expected.
No error handling guidance in code. If query_feature_service receives an invalid serviceUrl or layerId, the error response is not visible. LLMs need actionable recovery hints (e.g., 'Invalid layer ID. Call get_dataset() first to see available layers').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | 2026-07-28+ | v2 |
No tool annotations. All tools are read-only (no state mutation), but readOnlyHint is not declared. This prevents agents from reasoning about safety and retry logic.
query_feature_service accepts both 'id' and 'serviceUrl' as alternatives but does not document mutual exclusivity or precedence. LLMs may pass both, causing ambiguous behavior.