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 match). Use 'unknown' for rows with no designation recorded (NULL); distinct from the registry code 'brakMPZPLubWZ'.
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'.

Schema Changelog

Changes observed during successful MCP inspections.

  1. 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"
      +}
  2. 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"
      +}
  3. 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"
      +}
  4. 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"
      +]
  5. 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"
      +}
  6. 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"
      -}
  7. 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"
      +}
  8. 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
  9. 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"
      +}
  10. 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"
      +}
  11. First observed

TDQS

A4.8/5.0
Behavior5/5

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

With annotations already declaring readOnlyHint=true and destructiveHint=false, the description adds substantial behavioral context: the tool actually returns deed and price records despite the polygon name, coordinates are [longitude, latitude] and rings must close, field provenance distinguishes notarial-deed values from computed or approximated ones, and permalink construction shows the shape of results. Nothing contradicts the annotations.

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 long, but the purpose and sibling disambiguation comes first. The permalink and data-provenance paragraphs are verbose, yet they earn their place given the lack of an output schema. It slightly over-delivers detail, so 4 rather than 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 23-parameter tool with no output schema, this description covers the critical non-obvious aspects: the transaction vs parcels distinction, the exact polygon encoding, how to read result coordinates, and the meaning of computed/approximated values. Nothing needed to invoke the tool safely and correctly is missing.

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

Parameters4/5

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 real incremental value for the only required parameter: a full GeoJSON example, the explicit [lon, lat] order, and the closure rule. The other parameters are already well documented in the schema, so the description's contribution is modest but meaningful.

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 states a specific verb and resource: 'Search real estate transactions within a geographic polygon.' It also separates itself from siblings explicitly: it returns transactions, not parcels, and says 'despite the name', then points to list_parcels_in_area for the parcel case. This fully disambiguates the tool's purpose.

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?

It gives explicit usage guidance: 'Use for precise neighborhood/osiedle boundaries' and 'For quick searches, start with search_by_area instead.' It also names the alternative for parcel-level results: 'pass the same polygon to list_parcels_in_area.' Selection between alternatives is fully explicit.

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