An MCP server that provides geocoding tools for address-to-coordinates conversion, residency validation, and district/ward lookup with support for city-specific configurations like quadrant systems.
Three tools with basic verb-noun naming (geocode_address, check_residency, get_district). Descriptions present but generic (avg 150 chars, below 194-char baseline). Input schemas visible with single 'address' parameter, but lack type specificity and validation constraints. No output schemas documented. No error handling guidance. No tool annotations. Parameters lack enums, ranges, or format constraints despite accepting free-form strings that fail silently on abbreviations.
Verify if an address is within the city boundary for residency validation. This tool geocodes the address and checks all matches against the city boundary. Returns JSON with is_resident (true/false), matched_address(es), and coordinates.
Geocode an address to latitude/longitude coordinates. IMPORTANT: If an abbreviated address (like 'Penn Ave') fails to geocode, try the full street name (like 'Pennsylvania Avenue'). Returns all matching addresses if multiple are found.
Get the district/ward for an address. Geocodes the address and returns the district/ward name and geometry.
No output schemas documented. LLMs cannot plan downstream calls or extract required fields (lat, lng, matched_address, is_resident, district_name). Responses are unstructured.
Input parameter 'address' lacks constraints. No enum, pattern, length limit, or format guidance. Description says 'use EXACTLY as user provided' but offers no validation or error recovery path when abbreviations fail.
Error handling is silent. When geocoding fails (e.g., 'Penn Ave' vs 'Pennsylvania Avenue'), the tool returns {success: false, error: 'No address match found'} with no recovery guidance. LLM cannot self-correct or suggest alternatives.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 46 | <=2025-11-25 | v2 |
Descriptions mention quadrant logic ('try variations if needed', 'use EXACTLY as user provided initially, then try variations') but this is implementation detail, not user-facing guidance. Descriptions should explain WHEN to call each tool and what it returns, not how to retry.
No tool annotations (readOnlyHint, idempotentHint). All three tools are read-only and idempotent, but this is not declared in the schema, forcing LLMs to infer safety properties.