Milan property valuation via OMI quotations and OSM amenities. Provides fair-price estimation for Milan property listings based on official OMI market quotations and proximity amenity scoring.
Stimmo demonstrates solid tool definition quality with comprehensive schemas, clear action-verb naming, and good parameter documentation. All 6 tools have explicit descriptions and well-structured input schemas with enum constraints for PropertyType, OmiCondition, FineCondition, etc. However, output schemas are not documented in the source code, the tool descriptions mention what is returned conceptually (e.g., 'Full Milan listing appraisal: geocode, OMI quote, amenity score, verdict') but no explicit response schema is visible. Error handling includes a custom ToolError class that returns structured {code, message} payloads, which is good practice. Tool naming follows verb_noun convention (estimate_property, lookup_omi_quote, geocode_milan_address, etc.), which is excellent. Parameter descriptions are present and detailed, including constraints like address format, enum values, and optional flags with defaults. The main weakness is the absence of visible output/response schemas, which prevents confident downstream chain planning. Additionally, no tool annotations (readOnlyHint, destructiveHint) are visible, though the tools are all READ_ONLY by nature.
Return the amenity proximity score (transit, parks, shops) for a (lat, lon).
Full Milan listing appraisal: geocode, OMI quote, amenity score, verdict.
Geocode a Milan address to (lat, lon) and verify it falls inside the comune.
Return the OMI €/m² band for an address without running a full estimate.
Return the 8-semester OMI €/m² history series for a zone and property type.
Return the OMI zone (code + description) for a (lat, lon) coordinate.
Output schemas not documented. Tool descriptions mention what is returned (e.g., 'Full Milan listing appraisal: geocode, OMI quote, amenity score, verdict') but no explicit JSON Schema or field definitions are visible in the source code. LLMs cannot reliably plan downstream calls or extract required fields without documented response structure.
No tool annotations visible. Tools lack readOnlyHint, destructiveHint, or idempotentHint annotations. While all 6 tools are READ_ONLY by nature (no state changes), explicit annotations would improve clarity and allow clients to optimize handling (e.g., not retrying unnecessarily).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 70 | 2026-07-28+ | v2 |
Error messages reference external data (e.g., 'Address outside Milano comune') but recovery guidance is sparse. ToolError class provides code + message, but error descriptions could include actionable next steps (e.g., 'Try a different address in Milan' or 'Check zone availability').
estimate_property has 16 parameters (10 required, 6 optional). While all are documented, this is at the p90 boundary (rubric baseline: avg 4 params, p90=8). Consider whether some parameters could be inferred or grouped (e.g., floor + total_floors could be a single 'floor_position' object).