Cenogram - Polish Real Estate Transactions (RCN)

SSE

by cenogram

336 downloads Not rated yet

About

Polish real estate transaction prices from notarial deeds, not listings - 8M+ records from the national RCN registry, 2003 to present, with OAuth 2.1.

Details

Transport
SSE

Explore

Setting up with Highlight

This MCP is not yet compatible with Highlight’s one-click setup. However, you can still use it with Highlight by following these steps:

  1. Download and install Highlight from highlightai.com/download
  2. Navigate to the plugins tab and select "Add Custom Plugin"
  3. Configure the plugin with the settings below
    Plugin Name Cenogram - Polish Real Estate Transactions (RCN)
    Command (node, npx, python, etc.)

    Please refer to the README for specific instructions on how to obtain API keys or other required environment variables.

  4. Enable "Start Automatically" if you want the plugin to start when Highlight launches

search_transactions

Search Polish real estate transactions from the national RCN registry (8M+ records). Returns transaction details: address, date, price, area, price/m², property type. Use list_locations first to find valid location names. Example: search for apartments in Mokotów sold in 2024 above 500,000 PLN. Data notes: marketType is NULL for ~55% of records (notary didn't classify) - filtering by marketType excludes them. ~1.7% of records have no transaction_date. Permalink: every result is shareable on t…

get_price_statistics

Get price per m² statistics by location for residential apartments in Poland. Note: only covers residential units (lokale mieszkalne). For other property types, use search_transactions. 'Warszawa'/'Kraków'/'Łódź' auto-expand to all sub-districts (Warszawa=19, Kraków=5, Łódź=6). Other names use partial match. Data quality: based on transaction prices from notarial deeds, not asking/listing prices. Coverage varies by county (some have data gaps of 5+ years). Note: median/average prices are mark…

get_price_distribution

Get price distribution histogram showing how many transactions fall into each price range. Useful for understanding the overall market price structure in Poland. 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.

search_by_area

Search real estate transactions within a geographic radius. Best tool for neighborhood/osiedle searches (neighborhoods are not TERYT districts). Radius guide: 0.3-0.5 km for a street, 0.5-1 km for a neighborhood, 2-5 km for a city area. Example: apartments in Wrocław's Nowy Dwór (lat 51.143, lng 16.993, radiusKm=0.7). Area filters (minArea/maxArea) work for all propertyType values. Permalink: every result is shareable on the map. From a result's "id:" line and its "Location: <A>°N, <B>°E" lin…

get_market_overview

Get a comprehensive overview of the Polish real estate transaction database. Returns: total transaction count, date range, breakdown by property type and market type, top locations, price statistics. Note: data quality varies by field - marketType is unknown for ~55% of records, transaction_date missing for ~1.7%. Note: median/average prices are market-based — fractional ownership shares and non-market deeds (public tenders, foreclosures, privileged/subsidized sales) are excluded from price a…

list_locations

Browse locations in two modes: 1. TERYT hierarchy (parent param): Navigate voivodeship → county → municipality → precinct. Returns TERYT codes for use in search_transactions(teryt=...). - No parent: 16 voivodeships (2-digit codes) - 2-digit: counties (4-digit), 4-digit: municipalities (6-digit), 6-digit: precincts 2. Name search (search param): Find districts by name (flat list, legacy). If both provided, parent takes precedence. Use 'location' for quick city searches, 'teryt' for preci…

search_parcels

Search for land parcels by parcel ID prefix (autocomplete). Returns matching parcels with their district, area, and GPS coordinates. Useful for finding exact parcel IDs, then searching transactions nearby. Example: search for parcels starting with '146518_8.01'.

resolve_parcel

Resolve a land parcel to its cadastral identity using exactly ONE of: - parcelId: a full cadastral id, either raw '/' form ('142907_2.0014.342/5') or URL-safe '-' form ('142907_2.0014.342-5'), or the internal UUID from search results. - q: a full cadastral id, a UUID, OR free-text 'locality name + parcel number' (e.g. 'Sabnie 342/5'). Name matching is exact on the locality (case-insensitive) — an unusual spelling may miss. - lat & lng: a WGS84 point inside the parcel (returns the parcel(s) co…

get_parcel_report

The whole dossier for one land parcel in a single call: the parcel core (location, area, land use, plan designation), all nine enrichment layers (flood risk, heritage listing, landslide risk, nuisance surroundings, public-transport access, general-plan zoning, buildings on the parcel, recent building activity, agricultural-land eligibility), the parcel's transaction history (newest first, up to 20), a local price context (median zł/m² for the county and the locality over the last 12 months) a…

search_by_polygon

Search real estate transactions within a geographic polygon. 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…

compare_locations

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. Use list_locations first to find valid location names. 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 sale…

get_demographics

Demographic, economic, housing and other local statistics for a Polish location, from GUS BDL (Bank Danych Lokalnych) — Poland's public Central Statistical Office open-data bank. ~50 indicators across 11 categories (population, economy, housing, spatial planning, infrastructure, environment, safety, education, prices) plus a few derived metrics. Address by location (city/county name) OR teryt. A name resolves to county/powiat (4-digit) level; for richer gmina/district-level data (L6) pass a 6…

get_infrastructure_signals

Signals that a Polish municipality is about to build infrastructure — sewerage, water supply, roads, street lighting, gas network or cycling infrastructure. Three independent public sources: tenders published in the national public procurement bulletin (rolling 12-month window), membership in an agglomeration of the national urban waste-water treatment programme (where collective sewerage exists or is planned), and the municipality's own planned capital expenditure from its multi-year financi…

estimate_value

[Beta] Estimate the market value of an apartment from comparable registered transaction prices near a point. An orientation estimate, NOT a certified appraisal (operat szacunkowy) — it does not account for the unit's condition, finish standard or floor, and does not replace a surveyor's valuation. Address by lat + lng (a point on the map) OR parcelId (a full cadastral id or internal UUID; the parcel centroid is used) — exactly one. area (usable area in m², 10–250) is REQUIRED: there is no per…

get_rental_yield

EXPERIMENTAL (beta): this tool may change or be withdrawn without notice; do not build critical workflows on it. Estimate the gross rental yield for a Polish city or county: annualized median asking rent (PLN/m²/month × 12) divided by the median apartment transaction price per m² (secondary market) from the RCN registry. Gross and top-line only — excludes vacancy, management, tax and maintenance. Indicative, not investment advice. Address by location (city name → resolves to a county) OR tery…

list_rental_yield_locations

EXPERIMENTAL (beta): this tool may change or be withdrawn without notice; do not build critical workflows on it. List the cities/counties for which get_rental_yield can return data (asking-rent coverage). Use this to discover valid location/teryt values for get_rental_yield instead of guessing names. Each entry is coverage signal only (offer sample size + confidence) — it does not compute the yield; call get_rental_yield(location|teryt) for the actual yield. Optional search filters by city na…

get_price_spread

EXPERIMENTAL (beta): this tool may change or be withdrawn without notice; do not build critical workflows on it. Measure the asking-vs-transaction price spread for a Polish city or county: how far the median asking price per m² of apartments for sale sits above (or below) the median apartment transaction price per m² from the RCN registry. spread_pct = (asking − transaction) / transaction × 100. The spread can be NEGATIVE (asking below transaction) in premium-secondary cities — that is a vali…

list_price_spread_locations

EXPERIMENTAL (beta): this tool may change or be withdrawn without notice; do not build critical workflows on it. List the cities/counties for which get_price_spread can return data (asking-sale coverage). Use this to discover valid location/teryt values for get_price_spread instead of guessing names. Each entry is coverage signal only (sale offer sample size + confidence) — it does not compute the spread; call get_price_spread(location|teryt) for the actual spread. Optional search filters by …

get_building_breakdown

Get the building-by-building breakdown for one transaction: footprint area, number of storeys, and estimated total floor area (footprint × storeys) for each building on the property. search_transactions / search_by_area / search_by_polygon return per-transaction building SUMS inline; this tool splits them into individual buildings. Use it after a search when a result has building data and you need the detail (e.g. a developed-land deed covering several buildings). The transaction_id is the id…

get_transaction_flood

Get the parcel-by-parcel flood-hazard breakdown for one transaction: for each linked plot that sits in a mapped flood zone — the worst hazard category (high/medium/low, i.e. ~1-in-10-year to ~1-in-500-year), the hazard type (river/coastal/infrastructure), the share of the plot inside the zone, and the full per-scenario list (each with its return period). search_transactions (and search_by_area) surface a per-transaction worst-case flood_risk inline; this tool splits that into the individual p…

get_transaction_heritage

Get the parcel-by-parcel heritage-listing breakdown for one transaction: for each linked plot with a detected heritage listing — the status (listed = a protected monument on/at the plot; zone = the plot lies within a protected urban layout or the designated surroundings of a monument), the share of the plot inside the protected area (when measurable), and the individual entries (category, name, function, period, entry date). search_transactions (and search_by_area) surface a per-transaction h…

get_transaction_landslide

Get the parcel-by-parcel landslide-hazard breakdown for one transaction, based on official landslide-hazard maps (1:10,000 scale): for each linked plot that intersects a mapped hazard area — the worst category ('landslide' = a mapped landslide area, 'threatened' = an area threatened by mass movements), the share of the plot inside the mapped zones, and the per-zone list (each with its source_version_date — the source-record version date, not a survey/observation date). An intersection at this…

get_transaction_surroundings

Get the plot-by-plot surroundings profile for one transaction: for each linked plot, the distance in meters to the nearest cemetery, landfill (waste disposal site), sewage treatment plant, industrial/storage area, large industrial plant, and intensive livestock farm, from reference land-use and environmental-registry data. Useful for due-diligence on nearby nuisances. Distances are approximate and measured from the plot boundary; 0 means the plot touches or overlaps such an area. Each categor…

get_transaction_transit

Get the parcel-by-parcel public transport access breakdown for one transaction: for each linked plot, the nearest public transport stop distances per transaction parcel, by mode (rail/metro/tram/bus), from open GTFS data — plus the nearest stop's name for each mode present. A mode is present only when a stop of that mode is within its cap (rail/metro 3000 m, tram 1500 m, bus 1000 m). TWO-STATE: a transaction whose land has no stop within cap in any mode returns nothing — absence of a row is n…

get_transaction_permits

Get the building-permit history for one transaction's parcels, from the official national registry of positively resolved building permits and works notifications (records since 2016): for each case — its kind (permit / notification), the building intent and works type, the statutory object category, the deciding authority, the decision or intake date, the investment address, and the volume. Use it after a search to screen what has been built or approved on the transaction's land — a leading …

get_transaction_planning

Get the general-plan (plan ogólny, POG) zoning for one transaction's land: for each linked plot, the planning zones that cover it — zone symbol and name, the share of the plot each zone covers, and the building parameters the plan sets (max building height, max development intensity, max built-up coverage, min biologically active area) — plus any overlay areas (infill development area / obszar uzupełnienia zabudowy, central development area) that sit on top. Coverage is honest and THREE-STATE…

get_transaction_farmland

Get the parcel-by-parcel agricultural land-eligibility breakdown for one transaction, from official nationwide agricultural land-eligibility data (updated weekly): for each linked parcel with a matched eligible agricultural area — the eligible area in square metres, its share of the parcel (when the parcel's measured area is known), and how many source features compose it. The response also reports how many of the transaction's linked parcels carry a match and the source snapshot date. Useful…

Claude Desktop / Cursor

Paste into your MCP client config file to install this server.

{
    "mcpServers": {
        "cenogram - polish real estate transactions (rcn)": {
            "server": {
                "command": "npx",
                "args": [
                    "-y",
                    "@cenogram/mcp-server"
                ],
                "env": {
                    "CENOGRAM_API_KEY": ""
                }
            }
        }
    }
}

McpServers

{
    "server": {
        "command": "npx",
        "args": [
            "-y",
            "@cenogram/mcp-server"
        ],
        "env": {
            "CENOGRAM_API_KEY": ""
        }
    }
}

Transport

"stdio"

Package

"@cenogram/mcp-server"

Registry

"npm"

Polish real estate transaction prices from notarial deeds, not listings - 8M+ records from the national RCN registry, 2003 to present, with OAuth 2.1.

Polish Real Estate Transaction & Parcel Data for AI

MCP server for Polish real estate data. Access 8M+ real estate transactions from the national Registry of Prices and Values (Rejestr Cen Nieruchomosci, RCN) - prices from notarial deeds, not listings - directly from Claude, Cursor, ChatGPT, Grok, or any MCP-compatible AI assistant. Beyond transaction prices, the server resolves cadastral parcels and adds per-parcel context: zoning, flood and landslide risk, heritage register, building permits and construction activity, public transport access, agricultural land classification and surrounding land use.

Data source: Polish national RCN registry (Rejestr Cen Nieruchomosci) | Platform:cenogram.pl
- Go to
cenogram.pl/api
- Enter your email
- You'll receive yourcngrm_...API key by email

Manage your keys atcenogram.pl/ustawienia.

Pick your client. All options below use the hosted server - no local install needed (except npx/stdio).

claude mcp add cenogram https://mcp.cenogram.pl/mcp \ -t http -H "Authorization: Bearer YOUR_API_KEY"

Add to.cursor/mcp.jsonin your project:

{ "mcpServers": { "cenogram": { "type": "http", "url": "https://mcp.cenogram.pl/mcp", "headers": { "Authorization": "Bearer YOUR_API_KEY" } } } }

- macOS:~/Library/Application Support/Claude/claude_desktop_config.json
- Windows:%APPDATA%\Claude\claude_desktop_config.json

{ "mcpServers": { "cenogram": { "command": "npx", "args": ["-y", "@cenogram/mcp-server@latest"], "env": { "CENOGRAM_API_KEY": "YOUR_API_KEY" } } } }

Add to.vscode/mcp.jsonin your workspace:

{ "servers": { "cenogram": { "type": "http", "url": "https://mcp.cenogram.pl/mcp", "headers": { "Authorization": "Bearer YOUR_API_KEY" } } } }

Add to~/.codeium/windsurf/mcp_config.json:

{ "mcpServers": { "cenogram": { "type": "http", "url": "https://mcp.cenogram.pl/mcp", "headers": { "Authorization": "Bearer YOUR_API_KEY" } } } }

If HTTP doesn't work, use thenpx (stdio)option below instead.

In VS Code: Settings > Cline > MCP Servers. Add:

{ "cenogram": { "type": "http", "url": "https://mcp.cenogram.pl/mcp", "headers": { "Authorization": "Bearer YOUR_API_KEY" } } }

RequiresNode.js >= 18. Use this if you want to run the server locally instead of connecting to the hosted one.

{ "mcpServers": { "cenogram": { "command": "npx", "args": ["-y", "@cenogram/mcp-server@latest"], "env": { "CENOGRAM_API_KEY": "YOUR_API_KEY" } } } }

You can also use the--httpCLI flag instead ofMCP_TRANSPORT=http.

- Model selection: For best results, use ClaudeOpus 4.7. It makes more sequential tool calls and produces richer analysis. You can switch the model in the dropdown at the bottom of the chat window.

- "Jaka jest mediana cen mieszkan w Krakowie w 2025?"
- "Pokaz transakcje z ulicy Pulawskiej 15 na Mokotowie"
- "Znajdz transakcje na dzialce 126104_9.0015.201"
- "Sprawdz plan miejscowy i ryzyko powodziowe dla dzialki 126104_9.0015.201"
- "Znajdz transakcje gruntow w promieniu 5km od centrum Wroclawia powyzej 500 000 PLN"
- "Porownaj ceny mieszkan na Mokotowie i Woli"
- "Pokaz rozklad cen nieruchomosci w Polsce"

- "What's the median apartment price in Krakow in 2025?"
- "Show transactions at Pulawska 15 in Mokotow"
- "Find all transactions on parcel 126104_9.0015.201 and then search nearby"
- "Check the zoning and flood risk for parcel 126104_9.0015.201"
- "Find land transactions within 5km of Wroclaw center above 500,000 PLN"
- "Compare apartment prices in Mokotow and Wola districts"
- "Show the price distribution of real estate in Poland"

- Most cities: use the city name directly (e.g., "Gdansk", "Lublin")
- Warsaw: "Warszawa" covers all 18 districts at once; name one ("Mokotow", "Srodmiescie", "Wola") to narrow it down
- Krakow and Lodz work the same way: the city name covers every sub-district, or name one ("Krakow-Podgorze")
- Neighbourhood names are not administrative units - search by radius or polygon instead
- Uselist_locationsto find valid names

Results include parcel IDs and GPS coordinates, enabling multi-step research:

1. Search by address -> search_transactions(location="Mokotow", street="Pulawska", buildingNumber="15") 2. Note parcel_id and coordinates from results 3. Search nearby -> search_by_area(lat=52.19, lng=21.01, radiusKm=2, propertyType="unit") 4. Compare prices -> get_price_statistics(location="Mokotow")

This mimics how a property appraiser finds comparable transactions for valuation reports.

- 8M+ transactionsfrom all of Poland (380 counties)
- Date range:2003 - present
- Source:Polish national RCN registry (Rejestr Cen Nieruchomosci)
- Refresh:periodic updates from RCN
- Per-parcel context:zoning, flood and landslide risk, heritage register, building permits and construction activity, transit access, agricultural land use and surroundings, addressable by cadastral ID

"Error: CENOGRAM_API_KEY is required"- This only applies to stdio mode. Make sureCENOGRAM_API_KEYis set in theenvblock of your MCP config. For HTTP remote, the key goes in theAuthorizationheader instead.

npx hangs or fails- Check your Node.js version withnode -v. The stdio mode requires Node.js >= 18. If you're on an older version, use the HTTP remote option instead (no Node.js needed).

A location returns 0 results- The name may not be an administrative unit. Districts and neighbourhoods are two different things: "Mokotow" is a district and works, "Sluzew" is a neighbourhood inside it and does not. Uselist_locations(search="...")to find valid names, or search by radius (search_by_area) for anything smaller than a district.

401 Unauthorized (HTTP mode)- TheAuthorizationheader must beBearer cngrm_...(with theBearerprefix). Double-check that the full API key is included, not just the prefix.

git clone https://github.com/cenogram/mcp-server.git cd mcp-server npm install npm test npm run build

Latvian property portal MCP: search rentals, sales & nightly stays, market stats; owner tools via OAuth. Remote server at https://bezbaseina.lv/mcp

AI-native property MCP for North Cyprus (KKTC) — 9 tools, live data from evlek.app, hosted, no auth required.

Zillapi — Zillow Property Data MCP Server

Real-time Zillow property data — Zestimate, listings, photos, schools, taxes, price history — for AI agents via the Zillapi REST API. 4 MCP tools, OAuth 2.1. 3 Python agent skills, MIT-0. Free tier: 100 credits, no card. Corrected re-submission of the existing api.zillapi.com/mcp listing.

Public HTAG MCP connectors for Australian property intelligence, H3 spatial intelligence, and capability discovery — 70+ read-only tools over Streamable HTTP.

Personal wealth & portfolio tracker — 23 OAuth-scoped tools for holdings, performance, FIRE status, crypto P&L, and confirm-gated transaction writes across 20+ markets.

Airbnb & short-term rental market analytics — occupancy, ADR, RevPAR, revenue, comparables, and ML revenue estimates for 30,000+ markets worldwide, backed by 20M+ tracked listings.

Bottom/top market-timing verdicts for 8 markets (crypto, stocks, commodities, FX, property) — x402 pay-per-call, no API key.

Live Bank of England data over MCP — base rate (current, history, stats), any IADB series (SONIA, FX, mortgage rates), and MPC meeting dates. No auth required.

ultifamily real estate deal analysis — cap rate, DSCR, cash-on-cash, IRR, DFP Score, max offer price for 2-200 unit properties

Four UK property finance calculators for AI assistants: bridging cost, dev appraisal, BTL stress test, stamp duty (SDLT/LBTT/LTT). By FD Commercial.

No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.