Tools
The Zonio MCP server exposes 13 tools. Each description below is the one the model sees, followed by its inputs and an abbreviated example result. All tools are annotated readOnlyHint: true.
| Tool | Use it to | Scope |
|---|---|---|
search_parcels | Find parcels from a plain-language description | search:read |
find_sites | Run a ready-made site-selection scenario | search:read |
list_scenarios | See which scenarios exist and their parameters | search:read |
locate_parcel | Turn an address, coordinates or a parcel number into a parcel | parcels:read |
resolve_region | Turn a place name into a TERYT code | parcels:read |
get_parcel | Get a parcel's facts in one call | parcels:read |
check_regulations | Read the zoning and planning status | parcels:read |
check_constraints | List environmental and legal constraints | parcels:read |
nearby | Measure distances to infrastructure | parcels:read |
market_comparables | Pull recent sales near a parcel | market:read |
compare_parcels | Put a shortlist side by side | parcels:read |
parcel_report | Produce a shareable due-diligence report | reports:create |
list_layers | See what data exists and how fresh it is | layers:read |
Search
search_parcels
Find land parcels in Poland that match a plain-language description, e.g. "vacant plots over 2 ha zoned for industry near Rzeszów within 5 km of a 110 kV substation". Use this whenever the user describes the land they want rather than naming a specific parcel. Returns a ranked shortlist, the structured interpretation of the request, and a coverage report listing criteria that could not be checked. Always tell the user about those.
| Input | Type | Description |
|---|---|---|
query | string, required | The user's request, in English or Polish |
region | string | Place name or TERYT code; overrides any place in query |
limit | integer | 1–50, default 10 |
{
"interpretation": {
"region": { "teryt": "1863", "name": "Rzeszów", "unit_type": "powiat" },
"filters": [
"area ≥ 20,000 m²",
"zoning category in [industrial, commercial_services]",
"no building footprint",
"≤ 5,000 m to a substation ≥ 110 kV"
],
"assumptions": ["\"near Rzeszów\" includes the surrounding powiat (1816)"]
},
"count": 12,
"results": [
{
"parcel_id": "186301_1.0213.1544/7",
"area_sqm": 41210,
"gmina": "Rzeszów",
"score": 94,
"why": ["2.4 km to GPZ Rzeszów-Załęże (110 kV)", "MPZP zone 3P/U", "mean slope 1.2 %"],
"map_url": "https://app.zonio.tech/p/186301_1.0213.1544%2F7"
}
],
"coverage": [
{ "criterion": "zoning", "status": "partial", "note": "4 of 6 gminas publish MPZP data" }
]
}See Plain-language parcel search for how queries are interpreted.
find_sites
Run one of Zonio's site-selection scenarios (solar farm, wind farm, battery storage, agri-PV, biogas, data centre, logistics, housing estate, retail park, brownfield, public land) over a region. Prefer this over search_parcels when the user's goal matches a scenario, because scenarios encode the legal and technical criteria for that asset type. Call list_scenarios first if unsure which parameters exist.
| Input | Type | Description |
|---|---|---|
scenario | string, required | A scenario id, e.g. bess_storage |
region | string, required | Place name or TERYT code |
params | object | Override defaults, e.g. { "substation_km": 5 } |
weights | object | Re-weight ranking, e.g. { "grid_capacity_mw": 80 } |
limit | integer | 1–50, default 10 |
list_scenarios
List the available site-selection scenarios with their hard criteria, adjustable parameters (default, min, max, unit) and ranking signals.
No inputs. Also available as the zonio://scenarios resource.
Parcels
locate_parcel
Identify a parcel from whatever the user gave you: a street address, a pair of coordinates, a full EGiB parcel id, or a parcel number plus a precinct or gmina name ("działka 100/1, obręb Podgórze, Kraków"). Returns the best match and up to 5 alternatives.
| Input | Type | Description |
|---|---|---|
address | string | Free-text address |
lat, lng | number | WGS84 coordinates |
parcel | string | Full id or parcel number with precinct / gmina |
resolve_region
Resolve a place name to administrative units with TERYT codes. Several gminas share names, so check
parentand ask the user when more than one candidate is plausible.
| Input | Type | Description |
|---|---|---|
name | string, required | Diacritics optional: "lodz" finds Łódź |
get_parcel
Get the essential facts about one parcel in a single call: area, location, land-use classes, zoning summary, blocking constraints, terrain and nearest key infrastructure. Use the specialised tools only when the user wants more depth on one aspect.
| Input | Type | Description |
|---|---|---|
parcel_id | string, required | EGiB id |
Data: cadastral parcels, soil classes, terrain slope, plus the layers behind the tools below.
{
"parcel_id": "121905_2.0007.412/2",
"gmina": "Wieliczka",
"area_sqm": 1840,
"land_use_classes": ["RIVa"],
"zoning": "MPZP 12MN: single-family housing, max height 10 m, max coverage 30 %",
"blocking_constraints": [],
"terrain": { "slope_mean_pct": 3.4, "elevation_m": 262 },
"nearest": { "transit_stop_m": 520, "school_m": 1180, "power_substation_m": 4100 },
"map_url": "https://app.zonio.tech/p/121905_2.0007.412%2F2"
}check_regulations
Explain what planning law allows on a parcel: the local plan (MPZP) zone with its symbol, normalised category and parameters, the general plan (Plan Ogólny) zone and its status, the legacy Studium designation, and statutory pre-emption rights (KOWR, State Forests, gmina revitalisation). If no MPZP applies, say so and explain that a WZ decision would be needed.
| Input | Type | Description |
|---|---|---|
parcel_id | string, required | EGiB id |
Data: local zoning plans (MPZP), general plans, Studium, KOWR land.
check_constraints
List every environmental and legal constraint on or near a parcel (Natura 2000, protected landscapes, national parks, flood-risk zones, heritage protection, mining areas, aviation obstacle surfaces, groundwater protection, wind-turbine setbacks), each with a severity (blocking / restrictive / informational) and the overlap or distance.
| Input | Type | Description |
|---|---|---|
parcel_id | string, required | EGiB id |
buffer_m | integer | Look this far beyond the boundary, default 100, max 5000 |
Data: protected areas, flood hazard, heritage, archaeological sites, mining areas, landslides, height limits (OLS), airspace, wind setbacks, forests.
nearby
Measure straight-line distance from a parcel to the nearest infrastructure of each requested kind: power substations (by voltage), MV lines, available grid capacity, public-transport stops, schools, water bodies, existing and planned roads and railways, EV chargers, data centres.
| Input | Type | Description |
|---|---|---|
parcel_id | string, required | EGiB id |
kinds | string[] | Defaults to all |
Data: HV/EHV substations, power lines, grid capacity, transit stops, services, rivers, roads, planned roads, planned railways, EV charging, data centres.
market_comparables
Return recent notarised transactions from the national price register (RCN) near a parcel or in a region, with the median price per m². Use it to sanity-check asking prices or to estimate land value.
| Input | Type | Description |
|---|---|---|
parcel_id or region | string | Where to look |
property_type | string | land, building or apartment |
radius_m | integer | Default 2000 |
since | date | Default: two years ago |
Data: transaction prices (RCN).
compare_parcels
Compare 2–20 parcels side by side on area, zoning, constraints, terrain, infrastructure distances and, optionally, fit with a scenario. Returns a table-ready structure.
| Input | Type | Description |
|---|---|---|
parcel_ids | string[], required | 2–20 EGiB ids |
scenario | string | Evaluate each parcel against this scenario |
parcel_report
Generate a complete due-diligence report for one parcel and return a shareable link to a PDF. Only call this when the user asks for a report or a document to share.
| Input | Type | Description |
|---|---|---|
parcel_id | string, required | EGiB id |
scenario | string | Add a scenario-fit section |
language | string | en or pl, default en |
Data
list_layers
List every data layer Zonio holds with its category, source, coverage (national / partial) and last refresh date. Use it to answer "do you have data on X?" and to explain coverage gaps.
No inputs. Also available as the zonio://layers resource. Every layer it returns has a page in the zonio.tech layer atlas.
Errors
Tool errors are returned as results with isError: true and a message written for the model, e.g.:
{ "isError": true, "content": [{ "type": "text", "text": "\"Ostrów\" matches 4 gminas (Ostrów Mazowiecka, Ostrów Wielkopolski, Ostrów in Podkarpackie, Ostrów in Opolskie). Ask the user which one, or call resolve_region." }] }