zornade
This server lets you query Italian cadastral, geospatial, and real estate data through natural-language MCP tools.
Geocode Italian addresses by street name and optional city, or reverse-geocode coordinates into nearby addresses.
Retrieve enriched cadastral parcel profiles by FID, including risk, economics, valuations, solar potential, buildings, POI, and more.
Locate parcels by single point, multiple points, or bounding box.
Search parcels by municipality, cadastral sheet (foglio), section, and label.
Get administrative reference lists: regions, provinces, and municipalities, with optional filters.
Zornade MCP Server
Model Context Protocol server for Italian cadastral, geospatial and real estate data, powered by the Zornade API v2.
Add it to any MCP client (Claude, Cursor, VS Code Copilot, Cline, ...) and ask questions about Italian properties in natural language: geocoding, cadastral parcels, risk layers, valuations, solar potential, administrative lists.
Endpoint
https://mcp.zornade.com/mcpRelated MCP server: swisstopo-mcp
Authentication
A free Zornade API key (zrn_...) from
https://app.zornade.com/api is required. Send it
as x-api-key header, Authorization: Bearer, or ?api_key= query parameter.
Rate limits and scopes are the ones of your key (10,000 requests/hour).
Tools
Tool | Description |
| Forward geocoding on 18.7M+ Italian addresses (ANNCSU) |
| Reverse geocoding by WGS84 coordinates |
| Enriched cadastral parcel profile (risk, economics, solar, valuations, POI, ...) |
| Parcels by point, multiple points, or bounding box |
| Parcels by comune, foglio, label |
| Regions, provinces, municipalities |
Connect
Claude Code:
claude mcp add zornade -t http https://mcp.zornade.com/mcp \
--header "x-api-key: zrn_YOUR_KEY"Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"zornade": {
"type": "http",
"url": "https://mcp.zornade.com/mcp",
"headers": { "x-api-key": "zrn_YOUR_KEY" }
}
}
}Test
curl -X POST https://mcp.zornade.com/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "x-api-key: zrn_YOUR_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Architecture
functions/mcp/index.ts- Supabase Edge Function (Deno), built with mcp-lite + Hono, streamable HTTP transport. Pattern from the official Supabase MCP guide.netlify.toml+public/- Netlify reverse proxy for the clean hostnamemcp.zornade.com(no build step).
Documentation
API docs: api.zornade.com
API keys: app.zornade.com/api
Main site: zornade.com
Known limitations
The HTTP transport is stateless: no persistent SSE sessions. Some modern SDK clients open a persistent SSE GET after initialize and receive a 400; request/response calls work normally and that error is harmless.
Protocol revision negotiation: the server supports the 2025 MCP revisions (2025-03-26 and 2025-06-18). A client requesting a newer or unknown revision is answered with the oldest supported revision instead of an error.
Tool responses are text-only: geometries are omitted to keep the LLM context light.
Tool calls require a free Zornade API key. Direct API v2 calls are the right tool for batch pipelines, see api.zornade.com.
License
Two distinct layers:
Server code: MIT. Free to use, modify and redistribute, also for commercial purposes. The full text is in
LICENSE.Data: licenses of the original sources, which remain in force for every consumer of the API and of this server. Key ones:
cadastral parcels and cadastral data: Agenzia delle Entrate (free reuse, attribution required)
addresses: ANNCSU, ISTAT and Agenzia delle Entrate (CC BY 4.0, partly CC BY 3.0 IT)
buildings and map layers: OpenStreetMap (ODbL 1.0)
risk and environmental layers: ISPRA, INGV, Copernicus (CC BY 4.0 / Copernicus Data Policy)
solar potential: PVGIS-SARAH3, JRC European Union (free reuse)
real estate market data: OMI and MEF (free reuse)
Every API response lists the applicable licenses in meta.licenses and the
required attribution text. Two attribution levels exist: source attributions
are always mandatory; the "Dati elaborati da Zornade" attribution with link to
zornade.com is required for free plan keys and can be waived with a commercial
license (the response field meta.zornade_attribution_required tells you
which rule applies). Full terms: api.zornade.com.
Available Tools
6 toolszornade_admin_listsA
Italian administrative reference data: regions, provinces, or municipalities. Provinces can be filtered by region; municipalities by province or region.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Which administrative list to return | |
| region | No | Filter by region name (provinces, municipalities) | |
| province | No | Filter by province name (municipalities) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral disclosure burden. The phrase 'reference data' and 'lists' conveys a read-only lookup, and the filter relationships are explicitly described. It does not mention response shape or errors, but for a simple list tool this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences communicate the resource, the three options, and the filtering behavior with no filler. The key information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity tool with a 3-parameter schema, the description plus schema fully covers input selection and filter logic. The lack of an output schema means the return format is not explicitly stated, but the simple list nature of the tool makes this a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all three parameters with 100% coverage, so the baseline is 3. The description restates which filters apply to which type, which adds interpretive clarity but does not go beyond what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description immediately identifies the resource as 'Italian administrative reference data' and enumerates the three list types: regions, provinces, and municipalities. It lacks an explicit verb like 'list' or 'return', but the domain clearly distinguishes it from the geocode and parcel sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context that this tool is for administrative reference data and describes which filters apply to which list type. However, it does not explicitly state when to use this tool versus alternatives, though the sibling tools are clearly unrelated in domain.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zornade_geocode_reverseA
Reverse geocoding: find Italian addresses near WGS84 coordinates. Returns the closest ANNCSU addresses with distance in meters.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude WGS84, Italy bounds 35.5-47.5 | |
| lng | Yes | Longitude WGS84, Italy bounds 6.0-19.0 | |
| limit | No | Max results, default 5 | |
| radius | No | Search radius in meters, default 100, max 500 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It adds return behavior (closest addresses, distance in meters) and a domain-specific data source (ANNCSU), but it does not disclose failure modes, no-result behavior, ordering guarantees beyond 'closest', or whether this is a read-only operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the core purpose front-loaded immediately after the tool name. Every phrase earns its place; there is no redundant or promotional language.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity lookup with four well-documented parameters, the description covers the primary behavior and result shape (addresses with distance). Since there is no output schema, it would benefit from a bit more detail on return structure or empty-result behavior, but nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and every parameter already has an explanatory description including bounds, defaults, and max values. The tool description adds no additional parameter context, so it stays at the baseline for fully documented schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb-resource pairing: 'find Italian addresses near WGS84 coordinates' and explicitly identifies the operation as reverse geocoding. It also names the return type (closest ANNCSU addresses with distance), which distinguishes it from the geocode_search sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Reverse geocoding' and the coordinate input clearly establish when to use this tool: when you have WGS84 coordinates and need addresses. It does not explicitly name alternative tools or exclusions, but the context is clear enough that an agent can route the call correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zornade_geocode_searchA
Forward geocoding for Italian addresses. Searches the ANNCSU street archive (18.7+ million addresses) by street name and optional municipality. Returns matches with WGS84 coordinates, postal code, municipality, province and region. Does NOT find points of interest: search by street name instead.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Street name or search text, min 2 chars. Example: "Via del Corso" | |
| city | No | Municipality name filter. Example: "Roma" | |
| limit | No | Max results, default 10 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It explains the data source, the type of matches returned (WGS84 coordinates, postal code, municipality, province, region), and a key limitation (no POI search). This is strong context beyond basic function.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three focused sentences deliver the core purpose, data source, return fields, and a critical limitation with no filler. The main action is front-loaded, and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple three-parameter geocoding tool with no output schema, the description supplies all necessary context: what it searches, where it searches, what it returns, and what it intentionally excludes. An agent can confidently decide whether to invoke it without additional detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers all three parameters with examples and constraints, so the baseline is solid. The description adds meaningful context by clarifying that 'q' is a street name for address geocoding and that the archive does not support POI searches, reinforcing correct parameter usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and resource: 'Forward geocoding for Italian addresses' and specifies the ANNCSU street archive. It also differentiates itself from reverse geocoding and POI lookup, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states when to use the tool: when searching by street name and optionally municipality, and explicitly warns against using it for points of interest. It does not explicitly name the reverse-geocoding sibling as the alternative for coordinate-based lookups, though 'Forward geocoding' implies the distinction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zornade_parcel_by_idA
Enriched cadastral parcel profile by FID or GML ID. Returns municipality, area, cadastral reference, and the requested data sections (risk, subsidence, terrain, buildings, economics, demographics, valuation, valuation_history, solar, POI, etc.). Geometry is omitted to keep the reply compact.
| Name | Required | Description | Default |
|---|---|---|---|
| fid | Yes | Parcel FID number (example "28009975") or GML ID | |
| include | No | Comma-separated sections: risk,subsidence,terrain,population,buildings,economics,demographics,land_cover,land_use,valuation,valuation_history,coastal_erosion,cultural_heritage,poi,solar,nightlights. Default: risk,economics,solar,valuation |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does a good job: it states what the response includes, lists the available data sections, and explicitly discloses that geometry is omitted to keep the reply compact. This gives the agent useful behavioral context beyond the bare operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief and front-loaded with the core purpose in the first sentence. The second sentence adds a useful behavioral note, though the long parenthetical list of sections partially duplicates the schema's 'include' parameter documentation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description provides enough return-value context: top-level fields, selectable sections, and the deliberate omission of geometry. It is slightly incomplete in that it does not mention error behavior for invalid FIDs, but the invocation requirements are clear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents both parameters with 100% coverage, including the section names and default value for 'include'. The description adds little beyond restating that sections are requested, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action (returns an enriched cadastral parcel profile) and a specific resource (parcel by FID or GML ID). It distinguishes from the sibling search and locate tools by emphasizing exact-ID lookup, though it never names the alternatives explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'by FID or GML ID' implies the tool should be used when the caller already has an exact parcel identifier, and the sibling names suggest alternatives for geocoding/search. However, there is no explicit guidance on when to use this tool versus zornade_parcel_search or zornade_parcel_locate, and no exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zornade_parcel_locateA
Find cadastral parcels by coordinates or bounding box. Three modes: single point (lat+lng), multiple points (points="lat,lng;lat,lng", max 10), or bounding box (bbox="minLng,minLat,maxLng,maxLat", max 0.05 degrees per side). Returns matching parcels with FID, municipality and centroid.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude for single-point mode | |
| lng | No | Longitude for single-point mode | |
| bbox | No | Bounding box as "minLng,minLat,maxLng,maxLat", max 0.05 degrees per side | |
| limit | No | Max results, default 50 | |
| points | No | Multiple points as "lat,lng;lat,lng", max 10 pairs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It does add useful behavioral context: the return value composition ('Returns matching parcels with FID, municipality and centroid') and hard constraints (max 10 points, max 0.05 degrees per bbox side). However, with 0 required parameters it never explains what happens when called with no location arguments or with conflicting modes (lat+lng alongside bbox), and it says nothing about error behavior or pagination beyond the limit param. Partial disclosure with notable gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero waste: purpose statement, mode/format breakdown, and return-value disclosure. The purpose is front-loaded, exact input formats are inline, and constraints are embedded rather than stated as afterthoughts. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a moderately complex tool (5 params, 3 distinct modes, no annotations, no output schema), the description covers the critical decision surface: which mode to use, exact string formats, limits, and what comes back. The only real gaps are edge-case behavior — invocation with no location parameters and conflicting-mode handling — which an agent could reasonably encounter given 0 required params. Otherwise complete enough for correct selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, setting a baseline of 3. The description earns above baseline by revealing that lat/lng, points, and bbox are not independent optional parameters but three mutually exclusive modes — semantics the schema cannot convey by listing them all as optional. The description also confirms the return fields (FID, municipality, centroid) that relate to what the tool yields. This is genuine added meaning beyond per-parameter schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource+method: 'Find cadastral parcels by coordinates or bounding box.' The three-mode breakdown (single point, multiple points, bounding box) makes the tool's scope concrete and clearly differentiates it from siblings like zornade_parcel_by_id (find by ID), zornade_geocode_search (address→coordinates), and zornade_geocode_reverse (coordinates→address). No ambiguity remains about what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear contextual guidance: use this tool when you have coordinates, point lists, or a bounding box, and it precisely explains each mode's input format. However, it never names sibling alternatives or states when NOT to use it (e.g., use zornade_parcel_by_id when you already have a parcel ID). The usage context is clear, but exclusions and alternative routing are left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zornade_parcel_searchA
Search cadastral parcels by cadastral reference: municipality (fuzzy match), sheet number (foglio), parcel label, optional section. Returns matching parcels with FID, municipality, sheet, area and centroid.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | Parcel label. Example: "A" or "123" | |
| limit | No | Max results, default 20 | |
| comune | Yes | Municipality name, required. Example: "Roma" | |
| foglio | No | Cadastral sheet number. Example: "481" | |
| sezione | No | Administrative section. Example: "A" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does add useful behavior: municipality matching is fuzzy, and the search returns specific fields (FID, municipality, sheet, area, centroid). However, it does not disclose how multiple filters are combined (AND vs OR), whether foglio and label are exact or partial matches, or what happens when no results are found. These are notable gaps for a search tool with multiple optional parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with zero filler. It front-loads the core purpose and then immediately lists the return fields. Every word contributes meaning, and the structure is clean and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 5 parameters, no output schema, and no annotations, the description provides essential context (purpose and return fields) but omits key operational details. It does not explain how filters interact (conjunctive vs disjunctive), nor does it clarify that only comune is required (though the schema does). The absence of output schema makes the listed return fields valuable, but the missing filter-combination logic is a significant completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds value beyond the schema by explicitly labeling 'foglio' as sheet number, 'label' as parcel label, and marking 'sezione' as optional. It also reveals that the municipality field uses fuzzy matching, a detail not present in the schema. This extra semantic context pushes it above the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Search cadastral parcels by cadastral reference' and enumerates the search keys (municipality, sheet, label, optional section). The verb and resource are specific, making the core function clear. However, it does not explicitly differentiate from sibling tools like zornade_parcel_by_id or zornade_parcel_locate, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: when you have cadastral reference components (comune, foglio, label, sezione). It implies this tool is for searching parcels by these references. It does not explicitly exclude other scenarios or name alternatives, but the context is concrete and sufficient for an agent to infer the primary use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v1.0.0- First observed
zornade_admin_lists - First observed
zornade_geocode_reverse - First observed
zornade_geocode_search - First observed
zornade_parcel_by_id - First observed
zornade_parcel_locate - First observed
zornade_parcel_search
TDQS
Scored across 6 tools
Each tool targets a distinct operation: forward vs reverse geocoding, parcel retrieval by ID vs spatial locate vs cadastral reference search, and administrative list lookup. No two tools overlap in purpose.
All names follow a consistent snake_case pattern with the zornade_ prefix and a domain identifier (geocode, parcel, admin). However, the action parts mix verbs (search, locate) with noun-like descriptors (by_id, lists), so the convention is readable but not perfectly uniform.
Six tools is well-scoped for a geocoding and cadastral data server. Each tool covers a distinct core capability without redundancy or bloat.
The surface covers key workflows: forward/reverse geocoding, parcel lookup by ID or spatial search, cadastral reference search, and admin reference data. The only minor gap is the deliberate omission of parcel geometry in by_id, but other tools compensate with centroids and bounding-box queries.
Maintenance
Related MCP Connectors
MCP server for Japan geodata: cadastral lot numbers (chiban) and reverse geocoding, for AI agents.
Geospatial AI MCP server — satellite imagery, embeddings, weather, GNS governance
dati.gov.it MCP — Italy's national open-data portal (CKAN API).
Related MCP Servers
- FlicenseBqualityDmaintenanceA Python MCP server that queries Spanish Cadastre services for non-protected cadastral data and exports parcel geometry in GML, GeoJSON, and IFC formats.195-
- AlicenseAqualityBmaintenanceMCP server for Swiss federal geodata -- maps, elevation, geocoding, cadastral extracts, and downloadable datasets via Swisstopo APIs.2014 PyPI9MIT

io.github.stucchi/italyofficial
AlicenseNot gradedqualityDmaintenanceMCP server exposing Italian open data (municipalities, provinces, regions, postal codes, coordinates, geographic data) through simple, developer-friendly tools.1MIT- AlicenseAqualityAmaintenanceMCP server for Russian Rosreestr open cadastral data — lookup by cadastral number, address or coordinates; cadastral value with history.452 PyPI1MIT