The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Cenogram — Polish Real Estate Data listing page.
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
cngrm_... API key by emailManage your keys at cenogram.pl/ustawienia.
Pick your client. All options below use the hosted server - no local install needed (except npx/stdio).
One command - zero config files:
Add to .cursor/mcp.json in your project:
Add to your config file:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.jsonnpx (stdio):
Add to .vscode/mcp.json in your workspace:
Add to ~/.codeium/windsurf/mcp_config.json:
HTTP remote:
If HTTP doesn't work, use the npx (stdio) option below instead.
In VS Code: Settings > Cline > MCP Servers. Add:
Requires Node.js >= 18. Use this if you want to run the server locally instead of connecting to the hosted one.
| Client | Config file |
|---|---|
| Cursor | .cursor/mcp.json |
| Claude Code | .mcp.json in your project |
| Claude Desktop | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
| Cline | VS Code settings > Cline > MCP Servers |
| Env Variable | Required | Default | Description |
|---|---|---|---|
CENOGRAM_API_KEY | Yes (stdio) | - | API key from cenogram.pl/api |
CENOGRAM_API_URL | No | https://cenogram.pl | API base URL |
MCP_TRANSPORT | No | stdio | Set to http for Streamable HTTP mode |
MCP_PORT | No | 3002 | HTTP server port (HTTP mode only) |
CENOGRAM_CLIENT_ID | No | auto-generated | Persistent client identifier |
You can also use the --http CLI flag instead of MCP_TRANSPORT=http.
Polish:
English:
| Tool | Description | Key Parameters |
|---|---|---|
search_transactions | Search transactions with filters | location, street, buildingNumber, parcelId, propertyType, marketType, price/date/area range |
get_price_statistics | Price/m2 stats by location (residential only) | location (optional) |
get_price_distribution | Price histogram | bins, maxPrice |
search_by_area | Search by geographic radius | latitude, longitude, radiusKm |
get_market_overview | Database overview and stats | (none) |
list_locations | List available locations | search (optional) |
search_parcels | Search parcels by cadastral ID prefix | q (parcel ID prefix, min 3 chars) |
search_by_polygon | Search within a GeoJSON polygon | polygon, propertyType, dateFrom/dateTo |
compare_locations | Compare stats across 2-5 districts | districts (comma-separated), propertyType |
get_building_breakdown | Per-building breakdown for one transaction (footprint, storeys, est. floor area) | transaction_id (UUID from a search result) |
get_parcel_report | Composite dossier for one parcel: core, 9 enrichment layers, transaction history, local price context and municipal context | parcelId (cadastral id or UUID) |
resolve_parcel | Resolve a cadastral parcel identifier to its canonical record | parcelId or q (id prefix), or lat + lng |
get_demographics | Population and demographic context for a location | location or teryt, year (or yearFrom/yearTo), category |
get_infrastructure_signals | Municipal infrastructure signals (tenders, utilities, capital spending) | location or teryt |
estimate_value | Comparable-sales value estimate for a property | area, plus lat + lng or parcelId; rooms, market |
get_transaction_flood | Flood risk for the property in a transaction | transaction_id (UUID from a search result) |
get_transaction_heritage | Heritage-register status for the property | transaction_id |
get_transaction_landslide | Landslide risk for the property | transaction_id |
get_transaction_surroundings | Nuisance and land-use context around the property | transaction_id |
get_transaction_transit | Public transport accessibility for the property | transaction_id |
get_transaction_permits | Building permits recorded for the property | transaction_id |
get_transaction_planning | Local zoning and planning status for the property | transaction_id |
get_transaction_farmland | Agricultural land-use classification for the property | transaction_id |
list_locations to find valid names| Value | Polish | English |
|---|---|---|
land | Grunt | Land plot |
building | Budynek | Building |
developed_land | Grunt zabudowany | Developed land |
unit | Lokal | Apartment/unit |
Results include parcel IDs and GPS coordinates, enabling multi-step research:
This mimics how a property appraiser finds comparable transactions for valuation reports.
"Error: CENOGRAM_API_KEY is required" - This only applies to stdio mode. Make sure CENOGRAM_API_KEY is set in the env block of your MCP config. For HTTP remote, the key goes in the Authorization header instead.
npx hangs or fails - Check your Node.js version with node -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. Use list_locations(search="...") to find valid names, or search by radius (search_by_area) for anything smaller than a district.
401 Unauthorized (HTTP mode) - The Authorization header must be Bearer cngrm_... (with the Bearer prefix). Double-check that the full API key is included, not just the prefix.
MIT