Skip to main content
Glama

Cenogram - Polish Real Estate Data

search_by_polygon

Read-only

Search real estate transactions within a geographic polygon. Returns TRANSACTIONS — deeds and prices — despite the name. For the land plots themselves inside a drawn shape, pass the same polygon to list_parcels_in_area. Provide a GeoJSON Polygon geometry to search within a custom area. Returns transactions found inside the polygon with coordinates. Use for precise neighborhood/osiedle boundaries. Can estimate coordinates from search_by_area results. For quick searches, start with search_by_area instead. Coordinates are [longitude, latitude]. First and last point must be identical. Permalink: every result is shareable on the map. From a result's "id:" line and its "Location: °N, °E" line, build https://cenogram.pl/ceny-transakcyjne?src=mcphttp#v=1&lat=&lng=&z=16&tx= (drop the °N/°E; lat = the °N number, lng = the °E number) — opens that exact transaction on the map. Omit &tx= for the area only. Field provenance: values are from the notarial deed (RCN) by default; computed values (parcel area summed across plots or converted from hectares, an inferred/reclassified property type) and approximated streets are flagged inline with a neutral [...] note. Example: {"type":"Polygon","coordinates":[[[21.0,52.2],[21.01,52.2],[21.01,52.21],[21.0,52.21],[21.0,52.2]]]}

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
floorNoFloor of the unit (piętro lokalu, residential). Multi-select buckets: exact integers incl. '0' (parter) and negatives e.g. '-1' (basement), 'Nplus' e.g. '10plus' = 10 or more, '0plus' = ground and above, 'unknown' = no floor recorded (NULL). E.g. ['0','1','2'] for ground-to-2nd floor. Building storeys are a different attribute. Without 'unknown', rows with no floor are excluded.
limitNoMax results (1-3000, default 100). MCP displays up to 50 transactions.
roomsNoNumber of rooms (izby) filter, residential units only. Multi-select; '8plus' means 8 or more, 'unknown' = no room count recorded (NULL). E.g. ['2','3'] for 2-3 izby flats. Without 'unknown', rows with no room count are excluded.
dateToNoEnd date (YYYY-MM-DD)
streetNoStreet name filter (partial match)
landUseNoRecorded land-use category of the transaction's land. Multi-select from: gruntyZabudowaneIZurbanizowane (built-up and urbanised), gruntyRolne (agricultural), gruntyLesne (forest), terenyKomunikacyjne (transport), inne (other). 'unknown' = no category recorded for the land (NULL) — a legitimate bucket, never a claim that the land has no use. Values are case-sensitive. E.g. ['gruntyRolne'] for farmland, or ['gruntyZabudowaneIZurbanizowane','gruntyRolne'] to compare developed vs farmland.
maxAreaNoMaximum area in m²
minAreaNoMinimum area in m²
polygonYesGeoJSON Polygon geometry. Coordinates: [longitude, latitude] pairs. First and last point must be identical. Max 500 vertices total.
dateFromNoStart date (YYYY-MM-DD)
districtNoDistrict name filter
maxPriceNoMaximum price in PLN
minPriceNoMinimum price in PLN
marketTypeNoMarket type filter
buildingTypeNoBuilding type filter (PKOB classification). 'unknown' = no type recorded (NULL); without it such rows are excluded (~39% of buildings have no type).
propertyTypeNoProperty type filter
unitFunctionNoUnit/apartment function filter. 'unknown' = no function recorded (NULL); without it such rows are excluded. Garages appear only when 'garage' is selected, not via 'unknown'.
ownershipTypeNoOwnership / legal-right type filter (rodzaj prawa do nieruchomości). land_ownership; perpetual_usufruct (użytkowanie wieczyste — covers both registry codes for this right); cooperative_ownership; unit_sale; ownership; unit_ownership_with_appurtenant_right; building_ownership_with_appurtenant_right. 'unknown' = no right recorded (NULL). Multi-select; e.g. ['land_ownership','perpetual_usufruct'] to compare ownership vs perpetual usufruct on undeveloped land.
buildingStoreysNoNumber of above-ground storeys of the building. Multi-select buckets: exact non-negative integers (e.g. '1','2'), 'Nplus' e.g. '3plus' = 3 or more, 'unknown' = no storey count recorded (NULL). Recorded ONLY for single-building transactions, so 'unknown' covers BOTH a deed with several buildings (no single storey count exists) and a single building with missing data — never read it as 'a building with no storeys'. This is NOT the floor of a unit (see floor). Without 'unknown', rows with no storey count are excluded.
mpzpDesignationNoMPZP zoning designation filter, exact token match (not prefix). Comma-separated = OR, e.g. 'MN,MW'. Use 'unknown' for rows with no designation recorded (NULL); distinct from the registry code 'brakMPZPLubWZ' (= 'no plan/WZ' recorded as data). Known codes: budownictwoMieszkanioweJednorodzinne, brakMPZPLubWZ, terenRolniczy, innyNiewymieniony, terenZabudowyUslugowej, terenDrogWewnetrznych, terenDrogPublicznych, terenZabudowyZagrodowejGospodarstwRolnych, budownictwoMieszkanioweWielorodzinne, las, terenObiektowProdukcyjnychSkladowIMagazynow, terenSportuIRekreacji, decyzjaWarunkiZabudowy, terenZieleniUrzadzonej, terenZieleniObjetyFormaOchronyPrzyrody, terenWodPowierzchniowychSrodladowych, obszarITerenGorniczy, terenObslugiProdukcjiWGospodarstwachRolnych, terenInfrastrukturyTechnicznej, terenOgrodowDzialkowych, terenRozmieszczeniaDuzcychObiektowHandlowych, cmentarz, terenKomunikacjiWodnejSzlakWodny, terenWodPowierzchniowychMorskich, MN, BP, KD, U, INN, MW, KDW, R, ZP, P, WZ, ZN, WS, UC, ZL, ZD, US, TIT. An unrecognised value is still sent but adds a warning to the reply.
transactionTypeNoTransaction type filter. For market analysis, ALWAYS specify to exclude non-market transactions.
maxFootprintAreaNoMaximum building footprint (ground-plan) area in m², summed over all buildings of the transaction. Distinct from maxArea, which measures usable floor area (units) or land/parcel area. Set only where every linked building has footprint data, so this bound selects only measured rows — absence means 'not measured', not 'no building'.
minFootprintAreaNoMinimum building footprint (ground-plan) area in m², summed over all buildings of the transaction. Distinct from minArea, which measures usable floor area (units) or land/parcel area. Set only where every linked building has footprint data, so this bound selects only measured rows — absence means 'not measured', not 'no building'.
excludeFractionalSharesNoSet true to analyze clean land prices: excludes fractional ownership shares, whose price reflects the whole deed rather than the share and skews a per-m² comparison. Default false.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / excludeFractionalShares
      Added value: +{
      +  "default": false,
      +  "description": "Set true to analyze clean land prices: excludes fractional ownership shares, whose price reflects the whole deed rather than the share and skews a per-m² comparison. Default false.",
      +  "type": "boolean"
      +}
  2. Changed1 schema field changed
    • changedInput schema / properties / mpzpDesignation / description
      Previous value: -"MPZP zoning designation filter (exact match). Use 'unknown' for rows with no designation recorded (NULL); distinct from the registry code 'brakMPZPLubWZ'."New value: +"MPZP zoning designation filter, exact token match (not prefix). Comma-separated = OR, e.g. 'MN,MW'. Use 'unknown' for rows with no designation recorded (NULL); distinct from the registry code 'brakMPZPLubWZ' (= 'no plan/WZ' recorded as data). Known codes: budownictwoMieszkanioweJednorodzinne, brakMPZPLubWZ, terenRolniczy, innyNiewymieniony, terenZabudowyUslugowej, terenDrogWewnetrznych, terenDrogPublicznych, terenZabudowyZagrodowejGospodarstwRolnych, budownictwoMieszkanioweWielorodzinne, las, terenObiektowProdukcyjnychSkladowIMagazynow, terenSportuIRekreacji, decyzjaWarunkiZabudowy, terenZieleniUrzadzonej, terenZieleniObjetyFormaOchronyPrzyrody, terenWodPowierzchniowychSrodladowych, obszarITerenGorniczy, terenObslugiProdukcjiWGospodarstwachRolnych, terenInfrastrukturyTechnicznej, terenOgrodowDzialkowych, terenRozmieszczeniaDuzcychObiektowHandlowych, cmentarz, terenKomunikacjiWodnejSzlakWodny, terenWodPowierzchniowychMorskich, MN, BP, KD, U, INN, MW, KDW, R, ZP, P, WZ, ZN, WS, UC, ZL, ZD, US, TIT. An unrecognised value is still sent but adds a warning to the reply."
  3. Changed6 schema fields changed
    • addedInput schema / properties / buildingStoreys
      Added value: +{
      +  "description": "Number of above-ground storeys of the building. Multi-select buckets: exact non-negative integers (e.g. '1','2'), 'Nplus' e.g. '3plus' = 3 or more, 'unknown' = no storey count recorded (NULL). Recorded ONLY for single-building transactions, so 'unknown' covers BOTH a deed with several buildings (no single storey count exists) and a single building with missing data — never read it as 'a building with no storeys'. This is NOT the floor of a unit (see floor). Without 'unknown', rows with no storey count are excluded.",
      +  "items": {
      +    "pattern": "^(\\d+|\\d+plus|unknown)$",
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / landUse
      Added value: +{
      +  "description": "Recorded land-use category of the transaction's land. Multi-select from: gruntyZabudowaneIZurbanizowane (built-up and urbanised), gruntyRolne (agricultural), gruntyLesne (forest), terenyKomunikacyjne (transport), inne (other). 'unknown' = no category recorded for the land (NULL) — a legitimate bucket, never a claim that the land has no use. Values are case-sensitive. E.g. ['gruntyRolne'] for farmland, or ['gruntyZabudowaneIZurbanizowane','gruntyRolne'] to compare developed vs farmland.",
      +  "items": {
      +    "enum": [
      +      "gruntyZabudowaneIZurbanizowane",
      +      "gruntyRolne",
      +      "gruntyLesne",
      +      "terenyKomunikacyjne",
      +      "inne",
      +      "unknown"
      +    ],
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • changedInput schema / properties / limit / description
      Previous value: -"Max results (1-5000, default 100). MCP displays up to 50 transactions."New value: +"Max results (1-3000, default 100). MCP displays up to 50 transactions."
    • changedInput schema / properties / limit / maximum
      Previous value: -5000New value: +3000
    • addedInput schema / properties / maxFootprintArea
      Added value: +{
      +  "description": "Maximum building footprint (ground-plan) area in m², summed over all buildings of the transaction. Distinct from maxArea, which measures usable floor area (units) or land/parcel area. Set only where every linked building has footprint data, so this bound selects only measured rows — absence means 'not measured', not 'no building'.",
      +  "type": "number"
      +}
    • addedInput schema / properties / minFootprintArea
      Added value: +{
      +  "description": "Minimum building footprint (ground-plan) area in m², summed over all buildings of the transaction. Distinct from minArea, which measures usable floor area (units) or land/parcel area. Set only where every linked building has footprint data, so this bound selects only measured rows — absence means 'not measured', not 'no building'.",
      +  "type": "number"
      +}
  4. Changed1 schema field changed
    • addedInput schema / properties / floor
      Added value: +{
      +  "description": "Floor of the unit (piętro lokalu, residential). Multi-select buckets: exact integers incl. '0' (parter) and negatives e.g. '-1' (basement), 'Nplus' e.g. '10plus' = 10 or more, '0plus' = ground and above, 'unknown' = no floor recorded (NULL). E.g. ['0','1','2'] for ground-to-2nd floor. Building storeys are a different attribute. Without 'unknown', rows with no floor are excluded.",
      +  "items": {
      +    "pattern": "^(-?\\d+|\\d+plus|unknown)$",
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  5. Changed1 schema field changed
    • addedInput schema / properties / ownershipType
      Added value: +{
      +  "description": "Ownership / legal-right type filter (rodzaj prawa do nieruchomości). land_ownership; perpetual_usufruct (użytkowanie wieczyste — covers both registry codes for this right); cooperative_ownership; unit_sale; ownership; unit_ownership_with_appurtenant_right; building_ownership_with_appurtenant_right. 'unknown' = no right recorded (NULL). Multi-select; e.g. ['land_ownership','perpetual_usufruct'] to compare ownership vs perpetual usufruct on undeveloped land.",
      +  "items": {
      +    "enum": [
      +      "land_ownership",
      +      "perpetual_usufruct",
      +      "cooperative_ownership",
      +      "unit_sale",
      +      "ownership",
      +      "unit_ownership_with_appurtenant_right",
      +      "building_ownership_with_appurtenant_right",
      +      "unknown"
      +    ],
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  6. Changed7 schema fields changed
    • changedInput schema / properties / buildingType / description
      Previous value: -"Building type filter (PKOB classification)"New value: +"Building type filter (PKOB classification). 'unknown' = no type recorded (NULL); without it such rows are excluded (~39% of buildings have no type)."
    • changedInput schema / properties / buildingType / enum
      Previous value: -[
      -  "residential",
      -  "commercial",
      -  "industrial",
      -  "transport",
      -  "office",
      -  "warehouse",
      -  "education_sports",
      -  "farm_utility",
      -  "hospital",
      -  "other_nonresidential"
      -]New value: +[
      +  "residential",
      +  "commercial",
      +  "industrial",
      +  "transport",
      +  "office",
      +  "warehouse",
      +  "education_sports",
      +  "farm_utility",
      +  "hospital",
      +  "other_nonresidential",
      +  "unknown"
      +]
    • changedInput schema / properties / mpzpDesignation / description
      Previous value: -"MPZP zoning designation filter (exact match)"New value: +"MPZP zoning designation filter (exact match). Use 'unknown' for rows with no designation recorded (NULL); distinct from the registry code 'brakMPZPLubWZ'."
    • changedInput schema / properties / rooms / description
      Previous value: -"Number of rooms (izby) filter, residential units only. Multi-select; '8plus' means 8 or more. E.g. ['2','3'] for 2-3 izby flats. Rows with no room count are excluded."New value: +"Number of rooms (izby) filter, residential units only. Multi-select; '8plus' means 8 or more, 'unknown' = no room count recorded (NULL). E.g. ['2','3'] for 2-3 izby flats. Without 'unknown', rows with no room count are excluded."
    • changedInput schema / properties / rooms / items / enum
      Previous value: -[
      -  "1",
      -  "2",
      -  "3",
      -  "4",
      -  "5",
      -  "6",
      -  "7",
      -  "8plus"
      -]New value: +[
      +  "1",
      +  "2",
      +  "3",
      +  "4",
      +  "5",
      +  "6",
      +  "7",
      +  "8plus",
      +  "unknown"
      +]
    • changedInput schema / properties / unitFunction / description
      Previous value: -"Unit/apartment function filter"New value: +"Unit/apartment function filter. 'unknown' = no function recorded (NULL); without it such rows are excluded. Garages appear only when 'garage' is selected, not via 'unknown'."
    • changedInput schema / properties / unitFunction / enum
      Previous value: -[
      -  "residential",
      -  "commercial",
      -  "office",
      -  "production",
      -  "garage",
      -  "other"
      -]New value: +[
      +  "residential",
      +  "commercial",
      +  "office",
      +  "production",
      +  "garage",
      +  "other",
      +  "unknown"
      +]
  7. Changed4 schema fields changed
    • changedInput schema / properties / polygon / description
      Previous value: -"GeoJSON Polygon geometry. Coordinates: [longitude, latitude] pairs. Max 500 vertices."New value: +"GeoJSON Polygon geometry. Coordinates: [longitude, latitude] pairs. First and last point must be identical. Max 500 vertices total."
    • addedInput schema / properties / polygon / properties / coordinates / minItems
      Added value: +1
    • addedInput schema / properties / rooms
      Added value: +{
      +  "description": "Number of rooms (izby) filter, residential units only. Multi-select; '8plus' means 8 or more. E.g. ['2','3'] for 2-3 izby flats. Rows with no room count are excluded.",
      +  "items": {
      +    "enum": [
      +      "1",
      +      "2",
      +      "3",
      +      "4",
      +      "5",
      +      "6",
      +      "7",
      +      "8plus"
      +    ],
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / transactionType
      Added value: +{
      +  "description": "Transaction type filter. For market analysis, ALWAYS specify to exclude non-market transactions.",
      +  "items": {
      +    "enum": [
      +      "free_market",
      +      "auction",
      +      "non_auction",
      +      "subsidized",
      +      "public_purpose",
      +      "foreclosure",
      +      "unknown"
      +    ],
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  8. Changed4 schema fields changed
    • changedInput schema / properties / polygon / description
      Previous value: -"GeoJSON Polygon geometry. Coordinates: [longitude, latitude] pairs. First and last point must be identical. Max 500 vertices total."New value: +"GeoJSON Polygon geometry. Coordinates: [longitude, latitude] pairs. Max 500 vertices."
    • removedInput schema / properties / polygon / properties / coordinates / minItems
      Removed value: -1
    • removedInput schema / properties / rooms
      Removed value: -{
      -  "description": "Number of rooms (izby) filter, residential units only. Multi-select; '8plus' means 8 or more. E.g. ['2','3'] for 2-3 izby flats. Rows with no room count are excluded.",
      -  "items": {
      -    "enum": [
      -      "1",
      -      "2",
      -      "3",
      -      "4",
      -      "5",
      -      "6",
      -      "7",
      -      "8plus"
      -    ],
      -    "type": "string"
      -  },
      -  "type": "array"
      -}
    • removedInput schema / properties / transactionType
      Removed value: -{
      -  "description": "Transaction type filter. For market analysis, ALWAYS specify to exclude non-market transactions.",
      -  "items": {
      -    "enum": [
      -      "free_market",
      -      "auction",
      -      "non_auction",
      -      "subsidized",
      -      "public_purpose",
      -      "foreclosure",
      -      "unknown"
      -    ],
      -    "type": "string"
      -  },
      -  "type": "array"
      -}
  9. Changed1 schema field changed
    • addedInput schema / properties / rooms
      Added value: +{
      +  "description": "Number of rooms (izby) filter, residential units only. Multi-select; '8plus' means 8 or more. E.g. ['2','3'] for 2-3 izby flats. Rows with no room count are excluded.",
      +  "items": {
      +    "enum": [
      +      "1",
      +      "2",
      +      "3",
      +      "4",
      +      "5",
      +      "6",
      +      "7",
      +      "8plus"
      +    ],
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  10. Changed2 schema fields changed
    • changedInput schema / properties / polygon / description
      Previous value: -"GeoJSON Polygon geometry. Coordinates: [longitude, latitude] pairs. Max 500 vertices."New value: +"GeoJSON Polygon geometry. Coordinates: [longitude, latitude] pairs. First and last point must be identical. Max 500 vertices total."
    • addedInput schema / properties / polygon / properties / coordinates / minItems
      Added value: +1
  11. Changed1 schema field changed
    • addedInput schema / properties / transactionType
      Added value: +{
      +  "description": "Transaction type filter. For market analysis, ALWAYS specify to exclude non-market transactions.",
      +  "items": {
      +    "enum": [
      +      "free_market",
      +      "auction",
      +      "non_auction",
      +      "subsidized",
      +      "public_purpose",
      +      "foreclosure",
      +      "unknown"
      +    ],
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  12. Changed3 schema fields changed
    • addedInput schema / properties / buildingType
      Added value: +{
      +  "description": "Building type filter (PKOB classification)",
      +  "enum": [
      +    "residential",
      +    "commercial",
      +    "industrial",
      +    "transport",
      +    "office",
      +    "warehouse",
      +    "education_sports",
      +    "farm_utility",
      +    "hospital",
      +    "other_nonresidential"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / mpzpDesignation
      Added value: +{
      +  "description": "MPZP zoning designation filter (exact match)",
      +  "type": "string"
      +}
    • addedInput schema / properties / unitFunction
      Added value: +{
      +  "description": "Unit/apartment function filter",
      +  "enum": [
      +    "residential",
      +    "commercial",
      +    "office",
      +    "production",
      +    "garage",
      +    "other"
      +  ],
      +  "type": "string"
      +}
  13. First observed

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the readOnlyHint annotations, it discloses rich behavior: return contents (transactions with coordinates), field provenance (RCN notarial deed by default, with computed/approximated values flagged inline), and the exact permalink construction rule. These are substantive behavioral traits the schema does not carry.

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?

Front-loaded with the critical scope/reverses-name warning in the first sentence, then routing guidance, then geometry rules and the permalink recipe. Efficient overall, though the permalink paragraph and field-provenance note make it long enough that some sentences are dense.

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

Completeness4/5

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

For a 24-parameter tool with no output schema, it covers the essentials: return contents, geometry requirements, source/approximation caveats, and routing. It leans on the fully-covered schema for filter semantics, so it is largely complete, though result-format/pagination details remain unstated (the 50-row display cap lives only in the schema).

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

Parameters3/5

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

Schema coverage is 100%, so all 24 parameters are already documented. The description restates the polygon coordinate convention ([longitude, latitude], closed ring) that the schema already specifies and adds a worked example, but contributes little new semantics beyond the structured fields. Baseline 3 applies.

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?

States a specific verb+resource ('Search real estate transactions within a geographic polygon') and immediately disambiguates against the misleading name by noting it returns TRANSACTIONS/notarial deeds, not land plots. It explicitly names the sibling (list_parcels_in_area) that returns the plots themselves, so an agent can tell the two apart without opening schemas.

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?

Explicit when-to-use ('Use for precise neighborhood/osiedle boundaries') and when-not ('For quick searches, start with search_by_area instead'), plus a bridging hint that coordinates can be estimated from search_by_area results. Alternatives are named with the condition that selects them.

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