Skip to main content
Glama

Cenogram - Polish Real Estate Data

compare_locations

Read-only

Compare real estate statistics across multiple locations side-by-side. Provide 2-5 district names to compare median price/m², average area, and transaction counts. This tool matches on name only. Call list_locations(search=...) first: use names it flags as RCN districts (rcn_district) — other names (most TERYT unit names) silently return no data here. Requires at least one filter besides districts (e.g., propertyType). Example: compare Mokotów, Wola, Ursynów for apartments. Note: median/average prices are market-based — fractional ownership shares and non-market deeds (public tenders, foreclosures, privileged/subsidized sales) are excluded from price aggregates. Transaction counts and coverage stay complete.

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.
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
maxAreaNoMaximum area in m²
minAreaNoMinimum area in m²
dateFromNoStart date (YYYY-MM-DD)
maxPriceNoMaximum price in PLN
minPriceNoMinimum price in PLN
districtsYesComma-separated district names to compare (2-5, must be unique). E.g. 'Mokotów,Wola,Ursynów'
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 (recommended - API requires at least one 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.
mpzpDesignationNoMPZP zoning designation prefix filter (e.g. 'terenRolniczy', 'budownictwoMieszkanioweJednorodzinne', 'budownictwoMieszkanioweWielorodzinne'). 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.
includeDemographicsNoAdd a GUS BDL demographics block per district (county-level: population density, wages, unemployment, median age, plus a few cross-source ratios like price-to-income). Districts that don't resolve to a county are omitted from the demographics section.

Schema Changelog

Changes observed during successful MCP inspections.

  1. 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"
      +}
  2. 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"
      +}
  3. 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 prefix filter (e.g. 'terenRolniczy', 'budownictwoMieszkanioweJednorodzinne', 'budownictwoMieszkanioweWielorodzinne')"New value: +"MPZP zoning designation prefix filter (e.g. 'terenRolniczy', 'budownictwoMieszkanioweJednorodzinne', 'budownictwoMieszkanioweWielorodzinne'). 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"
      +]
  4. Changed5 schema fields changed
    • changedInput schema / properties / districts / description
      Previous value: -"Comma-separated district names to compare (2-5). E.g. 'Mokotów,Wola,Ursynów'"New value: +"Comma-separated district names to compare (2-5, must be unique). E.g. 'Mokotów,Wola,Ursynów'"
    • removedInput schema / properties / districts / minLength
      Removed value: -1
    • addedInput schema / properties / includeDemographics
      Added value: +{
      +  "description": "Add a GUS BDL demographics block per district (county-level: population density, wages, unemployment, median age, plus a few cross-source ratios like price-to-income). Districts that don't resolve to a county are omitted from the demographics section.",
      +  "type": "boolean"
      +}
    • 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"
      +}
  5. Changed5 schema fields changed
    • changedInput schema / properties / districts / description
      Previous value: -"Comma-separated district names to compare (2-5, must be unique). E.g. 'Mokotów,Wola,Ursynów'"New value: +"Comma-separated district names to compare (2-5). E.g. 'Mokotów,Wola,Ursynów'"
    • addedInput schema / properties / districts / minLength
      Added value: +1
    • removedInput schema / properties / includeDemographics
      Removed value: -{
      -  "description": "Add a GUS BDL demographics block per district (county-level: population density, wages, unemployment, median age, plus a few cross-source ratios like price-to-income). Districts that don't resolve to a county are omitted from the demographics section.",
      -  "type": "boolean"
      -}
    • 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"
      -}
  6. Changed1 schema field changed
    • addedInput schema / properties / includeDemographics
      Added value: +{
      +  "description": "Add a GUS BDL demographics block per district (county-level: population density, wages, unemployment, median age, plus a few cross-source ratios like price-to-income). Districts that don't resolve to a county are omitted from the demographics section.",
      +  "type": "boolean"
      +}
  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 / districts / description
      Previous value: -"Comma-separated district names to compare (2-5). E.g. 'Mokotów,Wola,Ursynów'"New value: +"Comma-separated district names to compare (2-5, must be unique). E.g. 'Mokotów,Wola,Ursynów'"
    • removedInput schema / properties / districts / minLength
      Removed 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. Changed1 schema field changed
    • addedInput schema / properties / mpzpDesignation
      Added value: +{
      +  "description": "MPZP zoning designation prefix filter (e.g. 'terenRolniczy', 'budownictwoMieszkanioweJednorodzinne', 'budownictwoMieszkanioweWielorodzinne')",
      +  "type": "string"
      +}
  11. Changed2 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 / unitFunction
      Added value: +{
      +  "description": "Unit/apartment function filter",
      +  "enum": [
      +    "residential",
      +    "commercial",
      +    "office",
      +    "production",
      +    "garage",
      +    "other"
      +  ],
      +  "type": "string"
      +}
  12. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover read-only/non-destructive behavior, and the description adds meaningful behavioral context beyond that: name-only matching, silent no-data outcomes, exclusion of non-market transactions from price aggregates, and clarity that counts/coverage remain complete. This is exactly the kind of extra context an agent needs.

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

Conciseness5/5

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

The description is compact and front-loaded: purpose, constraints, example, then data-quality note. Every sentence contributes either to correct usage or behavioral understanding, with no redundancy or filler.

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 an 18-parameter tool with no output schema, the description covers the most critical operational pitfalls: name matching, required filter, and which data is excluded. It does not describe the response shape or failure handling, but the given context is strong and likely sufficient for an agent to invoke the tool correctly.

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 coverage is 100%, so the baseline is 3. The description adds value beyond the schema by explaining how the districts parameter must be populated (RCN names from list_locations), that an additional filter is required, and by giving a concrete example. This is enough to justify a 4, though not a 5 since most parameter details are already in the schema.

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 uses a specific verb ('Compare') and resource ('real estate statistics across multiple locations side-by-side') and names the exact metrics (median price/m², average area, transaction counts). It clearly differentiates from the many sibling get_* tools by emphasizing the multi-location comparison aspect.

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 when-to-use guidance: call list_locations first, use names flagged as rcn_district, and warns that other names silently return no data. It also states the hard requirement of at least one filter besides districts and provides a concrete example, leaving little to inference.

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