Skip to main content
Glama

Cenogram - Polish Real Estate Data

list_parcels_in_area

Read-only

List cadastral parcels in an area — the land plots themselves, NOT transactions. For deeds and prices in an area use search_by_area or search_by_polygon instead. To look up a parcel by an id prefix use search_parcels; to turn one address, coordinate or 'locality + number' into a parcel use resolve_parcel; for everything known about a single parcel use get_parcel_report.

Name the area in one of five ways — at least one is required:

  • teryt: administrative code prefix at any level (2 digits = voivodeship, 4 = county, 6 = municipality, finer allowed); comma-separate several. Browse codes with list_locations.

  • location: a county or city NAME, resolved to its code. A name shared by two counties comes back as an error listing both, never as a guess.

  • bbox: "minLng,minLat,maxLng,maxLat" in WGS84.

  • lat + lng + radiusKm: a circle (all three together).

  • polygon: a GeoJSON Polygon, for a drawn shape. Pass it on its own. A bbox and a circle cannot be combined — together they would mean the overlap of a rectangle and a circle, which is rarely the question.

Two shapes of answer, priced differently:

  • Default: the LIGHT list — parcel id, district and centre point per row, with no outline and no surface. 2 API tokens. Pages by cursor: when more parcels match, the answer hands you an opaque cursor to pass back as cursor=.

  • includeGeometry=true (needs a bbox), or a polygon: OUTLINES — the full GeoJSON polygon of each parcel. 5 API tokens, at most 100 parcels per call (50 by default), no paging.

Truncation is the normal case on outlines, not an edge case. An area the size of a city holds far more parcels than one call returns, so an outline answer is usually marked TRUNCATED and the parcels in it are an arbitrary subset — not the first, nearest or largest. Never report a truncated answer as the parcel list of an area; ask for a smaller area instead.

minArea / maxArea (m²) filter on the registered parcel surface without returning it. They need a narrow scope — a bbox, a circle, a location name, or a teryt of at least 4 digits (county level) — and are refused elsewhere with a message saying what to add. They are not available on the outline calls.

Every row of the light list carries the street address held for that parcel, whether or not you asked about one, and says where it came from: a street on record, one we worked out for a parcel the record left without a street (shown with a note saying so), or — only when a buildingNumber search on the record came back empty — one read off an official address point that falls inside the parcel (also noted). A building number is only ever on record or from that address point, so a worked-out street never carries one. When a page comes back with a requested buildingNumber, it also carries a note on which of the two the number came from. If the street exists in the area but not with that number, the answer says so instead of the generic "no such street". Most rural parcels have no street at all — for those the way in is resolve_parcel with the precinct name and the parcel number, not a street.

  • street: matches whole words of the name, case- and accent-insensitively — 4 letters or digits minimum, 200 characters maximum. It is a NAME, not a pattern: % and _ match themselves. 'Górna' finds 'ulica Górna' and 'Górna 15' but not 'Podgórna', and a fragment like 'Marsza' finds nothing. Both sources are searched at once and a parcel found in both appears once, attributed to the record. Matching folds accents, so 'karmelicka' finds 'Karmelicka' — but it does NOT inflect: pass the name in the NOMINATIVE, because an inflected form like 'Karmelickiej' answers with an empty list. That empty page costs nothing (the tokens are refunded) and carries a suggestions block with close names to retry, so read the suggestions before you conclude anything about the data.

  • buildingNumber: needs street alongside it. Against the record the match is EXACT ('12A' does not find '12a'); RCN often records a compound or split number ('84/92'), so an exact '84' will not find '84/92'. When that comes back empty, the same street+number is tried against official address points instead — that match ignores case ('12a' finds '12A') but is still exact on the number, no compound splitting, and it matches the street by the same whole-word rule as above, not a fragment ('Waszyngtona' finds 'Aleja Waszyngtona', 'szyng' does not). Only when BOTH miss does the page come back empty (the tokens are refunded), listing the numbers held on the street as suggestions to retry. Both need a narrow scope for the same reason minArea does — a bbox, a circle, a teryt of at least 4 digits, or a location name — and neither counts as naming the area: a common street name across the country is a national search, not a question. Neither is available on the outline calls.

Parcel identity is gated: parcel_id comes back for API-token / OAuth callers and for paid or active-trial accounts, and is withheld for everyone else while the location and the outline still come back.

Coverage, so you can allow for it — TWO SEPARATE GAPS:

  1. We hold near-complete coverage of the cadastral register, though not the whole of it and not live: what we hold was measured county by county on a fixed date, so a freshly split, merged or renumbered parcel may not be in yet. This applies to EVERY entrance here, teryt and location included. A short list, and the absence of a truncation marker, mean only that nothing further matched what we hold as of that measurement — never that you have every parcel in the area. Each answer carries a corpus_coverage block: for teryt and location it gives the measured parcels-held and parcels-in-register figures for the counties you asked about; for bbox, circle and polygon those figures are null, because sizing an arbitrary shape needs county boundaries we do not have — the measurement still applies, we just cannot put a number on it for that shape.

  2. Separately, the spatial entrances (bbox, circle, polygon) work off the stored outline, and a small share of the parcels we DO hold keep theirs in a coordinate system those queries cannot read — those are missing from spatial answers specifically. The teryt and location entrances never touch geometry and are unaffected BY THAT SECOND GAP; a parcel whose outline we do not hold shows up there with no location. Neither gap is a reason to distrust what comes back: a returned parcel is a real parcel. They are a reason never to read an empty or short answer as evidence that the land is not there.

Limits: an area over 500 km², a radius over 12.6 km (the same ground) or a polygon over 500 vertices is refused rather than scanned, and a query that outruns its time limit answers with an error asking you to narrow it.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
latNoLatitude of the circle centre (WGS84). Requires lng and radiusKm.
lngNoLongitude of the circle centre (WGS84). Requires lat and radiusKm.
bboxNoBounding box in WGS84 as "minLng,minLat,maxLng,maxLat", covering at most 500 km². Required for includeGeometry=true.
limitNoMax parcels returned. Light list: up to 1000, default 250. Outlines: up to 100, default 50 — a larger value is clamped there.
terytNoTERYT administrative code prefix (2/4/6 digits or finer), comma-separated for several. Wins over location when both are given.
cursorNoOpaque cursor from the previous light-list answer, to get the next page. Pass it back unchanged; it is not available on outline calls.
streetNoStreet name, matched by whole words within the name, case- and accent-insensitively (min 4 letters or digits): 'Górna' finds 'ulica Górna' and 'Górna 15' but not 'Podgórna', and a fragment like 'Marsza' finds nothing. NOMINATIVE: 'Karmelickiej' does not fold to 'Karmelicka' and answers empty. Needs a bbox, a circle, a location name, or a teryt of at least 4 digits. Not available with includeGeometry or a polygon.
maxAreaNoMaximum parcel surface in m². Same scope requirement as minArea.
minAreaNoMinimum parcel surface in m². Needs a bbox, a circle, a location name, or a teryt of at least 4 digits. Not available with includeGeometry or a polygon.
polygonNoGeoJSON Polygon geometry. Coordinates: [longitude, latitude] pairs, first and last point identical, at most 500 vertices. Always returns outlines. Pass it instead of the other area parameters, not alongside them.
locationNoCounty, city, or district name, resolved to its TERYT code. A Warszawa district name (e.g. 'Mokotów') narrows to that district; another city's delegatura (e.g. 'Kraków-Podgórze') resolves to its parent county. An ambiguous name is an error listing the candidates.
radiusKmNoCircle radius in km (max 12.6 — the radius covering the 500 km² ceiling). Requires lat and lng.
buildingNumberNoBuilding number. Against the record the match is exact ('12A' does not find '12a') and RCN numbering is often compound ('84/92'), so an exact '84' misses '84/92'. When that comes back empty, the same number is tried against official address points instead, case-insensitively ('12a' finds '12A') but still exact, matching the street by the same whole-word rule as street, not a fragment — if that also misses, drop the number and read the numbers off the street's rows. Requires street. Same scope requirement as street.
includeGeometryNoReturn each parcel's full outline instead of the light row (5 tokens instead of 2, at most 100 parcels, no paging). Requires a bbox; with a polygon the outlines come back anyway.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / street / description
      Previous value: -"Street name, matched by whole words within the name, case- and accent-insensitively (min 4 letters or digits): 'Bielska' finds 'ulica Bielska' and 'Bielska 15' but not 'Zabielska', and a fragment like 'Marsza' finds nothing. NOMINATIVE: 'Karmelickiej' does not fold to 'Karmelicka' and answers empty. Needs a bbox, a circle, a location name, or a teryt of at least 4 digits. Not available with includeGeometry or a polygon."New value: +"Street name, matched by whole words within the name, case- and accent-insensitively (min 4 letters or digits): 'Górna' finds 'ulica Górna' and 'Górna 15' but not 'Podgórna', and a fragment like 'Marsza' finds nothing. NOMINATIVE: 'Karmelickiej' does not fold to 'Karmelicka' and answers empty. Needs a bbox, a circle, a location name, or a teryt of at least 4 digits. Not available with includeGeometry or a polygon."
  2. Changed2 schema fields changed
    • changedInput schema / properties / buildingNumber / description
      Previous value: -"Building number, matched exactly ('12A' does not find '12a'). RCN numbering is often compound ('84/92'), so an exact '84' misses '84/92' — if a plain number answers empty, drop it and read the numbers off the street's rows. Requires street, and answers only with parcels whose street is on record. Same scope requirement as street."New value: +"Building number. Against the record the match is exact ('12A' does not find '12a') and RCN numbering is often compound ('84/92'), so an exact '84' misses '84/92'. When that comes back empty, the same number is tried against official address points instead, case-insensitively ('12a' finds '12A') but still exact, matching the street by the same whole-word rule as street, not a fragment — if that also misses, drop the number and read the numbers off the street's rows. Requires street. Same scope requirement as street."
    • changedInput schema / properties / street / description
      Previous value: -"Street name, matched case-insensitively anywhere inside the name (min 3 letters or digits). A name, not a pattern — % and _ match themselves. NOMINATIVE and with Polish diacritics: 'Karmelickiej' and 'Marszalkowska' both answer empty. Needs a bbox, a circle, a location name, or a teryt of at least 4 digits. Not available with includeGeometry or a polygon."New value: +"Street name, matched by whole words within the name, case- and accent-insensitively (min 4 letters or digits): 'Bielska' finds 'ulica Bielska' and 'Bielska 15' but not 'Zabielska', and a fragment like 'Marsza' finds nothing. NOMINATIVE: 'Karmelickiej' does not fold to 'Karmelicka' and answers empty. Needs a bbox, a circle, a location name, or a teryt of at least 4 digits. Not available with includeGeometry or a polygon."
  3. Changed1 schema field changed
    • changedInput schema / properties / location / description
      Previous value: -"County or city name, resolved to its TERYT code. An ambiguous name is an error listing the candidates."New value: +"County, city, or district name, resolved to its TERYT code. A Warszawa district name (e.g. 'Mokotów') narrows to that district; another city's delegatura (e.g. 'Kraków-Podgórze') resolves to its parent county. An ambiguous name is an error listing the candidates."
  4. Changed1 schema field changed
    • changedInput schema / properties / buildingNumber / description
      Previous value: -"Building number, matched exactly ('12A' does not find '12a'). Requires street, and answers only with parcels whose street is on record. Same scope requirement as street."New value: +"Building number, matched exactly ('12A' does not find '12a'). RCN numbering is often compound ('84/92'), so an exact '84' misses '84/92' — if a plain number answers empty, drop it and read the numbers off the street's rows. Requires street, and answers only with parcels whose street is on record. Same scope requirement as street."
  5. Changed3 schema fields changed
    • addedInput schema / properties / buildingNumber
      Added value: +{
      +  "description": "Building number, matched exactly ('12A' does not find '12a'). Requires street, and answers only with parcels whose street is on record. Same scope requirement as street.",
      +  "maxLength": 200,
      +  "type": "string"
      +}
    • changedInput schema / properties / minArea / description
      Previous value: -"Minimum parcel surface in m². Needs a bbox, a circle, or a teryt of at least 4 digits. Not available with includeGeometry or a polygon."New value: +"Minimum parcel surface in m². Needs a bbox, a circle, a location name, or a teryt of at least 4 digits. Not available with includeGeometry or a polygon."
    • addedInput schema / properties / street
      Added value: +{
      +  "description": "Street name, matched case-insensitively anywhere inside the name (min 3 letters or digits). A name, not a pattern — % and _ match themselves. NOMINATIVE and with Polish diacritics: 'Karmelickiej' and 'Marszalkowska' both answer empty. Needs a bbox, a circle, a location name, or a teryt of at least 4 digits. Not available with includeGeometry or a polygon.",
      +  "maxLength": 200,
      +  "type": "string"
      +}
  6. Added

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds substantial behavioral context: truncation is the norm for outlines, coverage gaps (two separate ones) are explained, token costs differ between light and outline calls, paging via cursor, and the fact that empty answers may still be valid. It also explains the gating of parcel_id by account type. All of this goes far beyond the annotations and materially helps the agent reason about results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very long, but it is well-structured with clear sections (naming the area, shapes of answer, truncation, coverage, limits) and front-loaded with the core purpose. Every sentence earns its place given the tool's complexity (14 parameters, multiple modes, edge cases). It is not concise, but it is appropriately sized and organized, so it earns a 4 rather than a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 14 parameters, no output schema, and multiple pricing/paging modes, the description is remarkably complete. It covers return shapes, truncation semantics, coverage limitations, token costs, paging, and parameter interactions. An agent has everything needed to call this tool correctly and interpret results, including edge cases like refunded tokens and suggestions on empty pages.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description massively enriches parameter semantics. It explains the five ways to name an area and their interactions (e.g., teryt wins over location), the exact matching rules for street (whole-word, accent-insensitive, nominative only), the compound-number behavior for buildingNumber, and the scope requirements that apply to several parameters. This is far beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a crisp, specific statement: 'List cadastral parcels in an area — the land plots themselves, NOT transactions.' It immediately distinguishes itself from siblings by naming alternatives for deeds/prices, id lookup, address resolution, and full reports. An agent can tell exactly what this tool does and how it differs from every related tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly routes to alternatives: 'For deeds and prices in an area use search_by_area or search_by_polygon instead. To look up a parcel by an id prefix use search_parcels...' It also gives detailed when-to-use guidance for each area-naming method, including constraints like 'a bbox and a circle cannot be combined' and scope requirements for minArea/street. No ambiguity remains about when to pick this tool or a sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources