Skip to content
Zonio Developers

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.

ToolUse it toScope
search_parcelsFind parcels from a plain-language descriptionsearch:read
find_sitesRun a ready-made site-selection scenariosearch:read
list_scenariosSee which scenarios exist and their parameterssearch:read
locate_parcelTurn an address, coordinates or a parcel number into a parcelparcels:read
resolve_regionTurn a place name into a TERYT codeparcels:read
get_parcelGet a parcel's facts in one callparcels:read
check_regulationsRead the zoning and planning statusparcels:read
check_constraintsList environmental and legal constraintsparcels:read
nearbyMeasure distances to infrastructureparcels:read
market_comparablesPull recent sales near a parcelmarket:read
compare_parcelsPut a shortlist side by sideparcels:read
parcel_reportProduce a shareable due-diligence reportreports:create
list_layersSee what data exists and how fresh it islayers:read

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.

InputTypeDescription
querystring, requiredThe user's request, in English or Polish
regionstringPlace name or TERYT code; overrides any place in query
limitinteger1–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.

InputTypeDescription
scenariostring, requiredA scenario id, e.g. bess_storage
regionstring, requiredPlace name or TERYT code
paramsobjectOverride defaults, e.g. { "substation_km": 5 }
weightsobjectRe-weight ranking, e.g. { "grid_capacity_mw": 80 }
limitinteger1–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.

InputTypeDescription
addressstringFree-text address
lat, lngnumberWGS84 coordinates
parcelstringFull 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 parent and ask the user when more than one candidate is plausible.

InputTypeDescription
namestring, requiredDiacritics 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.

InputTypeDescription
parcel_idstring, requiredEGiB 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.

InputTypeDescription
parcel_idstring, requiredEGiB 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.

InputTypeDescription
parcel_idstring, requiredEGiB id
buffer_mintegerLook 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.

InputTypeDescription
parcel_idstring, requiredEGiB id
kindsstring[]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.

InputTypeDescription
parcel_id or regionstringWhere to look
property_typestringland, building or apartment
radius_mintegerDefault 2000
sincedateDefault: 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.

InputTypeDescription
parcel_idsstring[], required2–20 EGiB ids
scenariostringEvaluate 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.

InputTypeDescription
parcel_idstring, requiredEGiB id
scenariostringAdd a scenario-fit section
languagestringen 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." }] }