{
  "markdown": "# Cenogram MCP Server\n\n[![npm version](https://img.shields.io/npm/v/@cenogram/mcp-server)](https://www.npmjs.com/package/@cenogram/mcp-server)\n[![Node.js](https://img.shields.io/badge/node-%3E%3D18-brightgreen)](https://nodejs.org)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n\n**Polish Real Estate Transaction & Parcel Data for AI**\n\nMCP 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.\n\nData source: Polish national RCN registry (Rejestr Cen Nieruchomosci) | Platform: [cenogram.pl](https://cenogram.pl?src=mcpstdio)\n\n## Get your API key\n\n1. Go to [cenogram.pl/api](https://cenogram.pl/api?src=mcpstdio)\n2. Enter your email\n3. You'll receive your `cngrm_...` API key by email\n\nManage your keys at [cenogram.pl/ustawienia](https://cenogram.pl/ustawienia).\n\n## Installation\n\nPick your client. All options below use the hosted server - no local install needed (except npx/stdio).\n\n<details open>\n<summary><strong>Claude Code</strong></summary>\n\nOne command - zero config files:\n\n```bash\nclaude mcp add cenogram https://mcp.cenogram.pl/mcp \\\n  -t http -H \"Authorization: Bearer YOUR_API_KEY\"\n```\n\n</details>\n\n<details>\n<summary><strong>Cursor</strong></summary>\n\nAdd to `.cursor/mcp.json` in your project:\n\n```json\n{\n  \"mcpServers\": {\n    \"cenogram\": {\n      \"type\": \"http\",\n      \"url\": \"https://mcp.cenogram.pl/mcp\",\n      \"headers\": {\n        \"Authorization\": \"Bearer YOUR_API_KEY\"\n      }\n    }\n  }\n}\n```\n\n</details>\n\n<details>\n<summary><strong>Claude Desktop</strong></summary>\n\nAdd to your config file:\n- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`\n- Windows: `%APPDATA%\\Claude\\claude_desktop_config.json`\n\n**npx (stdio):**\n```json\n{\n  \"mcpServers\": {\n    \"cenogram\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@cenogram/mcp-server@latest\"],\n      \"env\": {\n        \"CENOGRAM_API_KEY\": \"YOUR_API_KEY\"\n      }\n    }\n  }\n}\n```\n\n</details>\n\n<details>\n<summary><strong>VS Code / GitHub Copilot</strong></summary>\n\nAdd to `.vscode/mcp.json` in your workspace:\n\n```json\n{\n  \"servers\": {\n    \"cenogram\": {\n      \"type\": \"http\",\n      \"url\": \"https://mcp.cenogram.pl/mcp\",\n      \"headers\": {\n        \"Authorization\": \"Bearer YOUR_API_KEY\"\n      }\n    }\n  }\n}\n```\n\n</details>\n\n<details>\n<summary><strong>Windsurf</strong></summary>\n\nAdd to `~/.codeium/windsurf/mcp_config.json`:\n\n**HTTP remote:**\n```json\n{\n  \"mcpServers\": {\n    \"cenogram\": {\n      \"type\": \"http\",\n      \"url\": \"https://mcp.cenogram.pl/mcp\",\n      \"headers\": {\n        \"Authorization\": \"Bearer YOUR_API_KEY\"\n      }\n    }\n  }\n}\n```\n\nIf HTTP doesn't work, use the **npx (stdio)** option below instead.\n\n</details>\n\n<details>\n<summary><strong>Cline</strong></summary>\n\nIn VS Code: Settings > Cline > MCP Servers. Add:\n\n```json\n{\n  \"cenogram\": {\n    \"type\": \"http\",\n    \"url\": \"https://mcp.cenogram.pl/mcp\",\n    \"headers\": {\n      \"Authorization\": \"Bearer YOUR_API_KEY\"\n    }\n  }\n}\n```\n\n</details>\n\n<details>\n<summary><strong>npx (stdio) - local/offline</strong></summary>\n\nRequires **Node.js >= 18**. Use this if you want to run the server locally instead of connecting to the hosted one.\n\n```json\n{\n  \"mcpServers\": {\n    \"cenogram\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@cenogram/mcp-server@latest\"],\n      \"env\": {\n        \"CENOGRAM_API_KEY\": \"YOUR_API_KEY\"\n      }\n    }\n  }\n}\n```\n\n| Client | Config file |\n|---|---|\n| Cursor | `.cursor/mcp.json` |\n| Claude Code | `.mcp.json` in your project |\n| Claude Desktop | `~/Library/Application Support/Claude/claude_desktop_config.json` |\n| Windsurf | `~/.codeium/windsurf/mcp_config.json` |\n| Cline | VS Code settings > Cline > MCP Servers |\n\n</details>\n\n## Configuration\n\n| Env Variable | Required | Default | Description |\n|---|---|---|---|\n| `CENOGRAM_API_KEY` | **Yes** (stdio) | - | API key from [cenogram.pl/api](https://cenogram.pl/api?src=mcpstdio) |\n| `CENOGRAM_API_URL` | No | `https://cenogram.pl` | API base URL |\n| `MCP_TRANSPORT` | No | `stdio` | Set to `http` for Streamable HTTP mode |\n| `MCP_PORT` | No | `3002` | HTTP server port (HTTP mode only) |\n| `CENOGRAM_CLIENT_ID` | No | auto-generated | Persistent client identifier |\n\nYou can also use the `--http` CLI flag instead of `MCP_TRANSPORT=http`.\n\n## Tips\n\n- **Model selection**: For best results, use Claude **Opus 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.\n\n## Example Prompts\n\n**Polish:**\n- \"Jaka jest mediana cen mieszkan w Krakowie w 2025?\"\n- \"Pokaz transakcje z ulicy Pulawskiej 15 na Mokotowie\"\n- \"Znajdz transakcje na dzialce 126104_9.0015.201\"\n- \"Sprawdz plan miejscowy i ryzyko powodziowe dla dzialki 126104_9.0015.201\"\n- \"Znajdz transakcje gruntow w promieniu 5km od centrum Wroclawia powyzej 500 000 PLN\"\n- \"Porownaj ceny mieszkan na Mokotowie i Woli\"\n- \"Pokaz rozklad cen nieruchomosci w Polsce\"\n\n**English:**\n- \"What's the median apartment price in Krakow in 2025?\"\n- \"Show transactions at Pulawska 15 in Mokotow\"\n- \"Find all transactions on parcel 126104_9.0015.201 and then search nearby\"\n- \"Check the zoning and flood risk for parcel 126104_9.0015.201\"\n- \"Find land transactions within 5km of Wroclaw center above 500,000 PLN\"\n- \"Compare apartment prices in Mokotow and Wola districts\"\n- \"Show the price distribution of real estate in Poland\"\n\n## Tools\n\n| Tool | Description | Key Parameters |\n|---|---|---|\n| `search_transactions` | Search transactions with filters | location, street, buildingNumber, parcelId, propertyType, marketType, price/date/area range |\n| `get_price_statistics` | Price/m2 stats by location (residential only) | location (optional) |\n| `get_price_distribution` | Price histogram | bins, maxPrice |\n| `search_by_area` | Search by geographic radius | latitude, longitude, radiusKm |\n| `get_market_overview` | Database overview and stats | (none) |\n| `list_locations` | List available locations | search (optional) |\n| `search_parcels` | Search parcels by cadastral ID prefix | q (parcel ID prefix, min 3 chars) |\n| `search_by_polygon` | Search within a GeoJSON polygon | polygon, propertyType, dateFrom/dateTo |\n| `compare_locations` | Compare stats across 2-5 districts | districts (comma-separated), propertyType |\n| `get_building_breakdown` | Per-building breakdown for one transaction (footprint, storeys, est. floor area) | transaction_id (UUID from a search result) |\n| `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) |\n| `resolve_parcel` | Resolve a cadastral parcel identifier to its canonical record | parcelId or q (id prefix), or lat + lng |\n| `get_demographics` | Population and demographic context for a location | location or teryt, year (or yearFrom/yearTo), category |\n| `get_infrastructure_signals` | Municipal infrastructure signals (tenders, utilities, capital spending) | location or teryt |\n| `estimate_value` | Comparable-sales value estimate for a property | area, plus lat + lng or parcelId; rooms, market |\n| `get_transaction_flood` | Flood risk for the property in a transaction | transaction_id (UUID from a search result) |\n| `get_transaction_heritage` | Heritage-register status for the property | transaction_id |\n| `get_transaction_landslide` | Landslide risk for the property | transaction_id |\n| `get_transaction_surroundings` | Nuisance and land-use context around the property | transaction_id |\n| `get_transaction_transit` | Public transport accessibility for the property | transaction_id |\n| `get_transaction_permits` | Building permits recorded for the property | transaction_id |\n| `get_transaction_planning` | Local zoning and planning status for the property | transaction_id |\n| `get_transaction_farmland` | Agricultural land-use classification for the property | transaction_id |\n\n### Location naming\n\n- Most cities: use the city name directly (e.g., \"Gdansk\", \"Lublin\")\n- Warsaw: \"Warszawa\" covers all 18 districts at once; name one (\"Mokotow\", \"Srodmiescie\", \"Wola\") to narrow it down\n- Krakow and Lodz work the same way: the city name covers every sub-district, or name one (\"Krakow-Podgorze\")\n- Neighbourhood names are not administrative units - search by radius or polygon instead\n- Use `list_locations` to find valid names\n\n### Property types\n\n| Value | Polish | English |\n|---|---|---|\n| `land` | Grunt | Land plot |\n| `building` | Budynek | Building |\n| `developed_land` | Grunt zabudowany | Developed land |\n| `unit` | Lokal | Apartment/unit |\n\n### Workflows\n\nResults include parcel IDs and GPS coordinates, enabling multi-step research:\n\n```\n1. Search by address    -> search_transactions(location=\"Mokotow\", street=\"Pulawska\", buildingNumber=\"15\")\n2. Note parcel_id and coordinates from results\n3. Search nearby        -> search_by_area(lat=52.19, lng=21.01, radiusKm=2, propertyType=\"unit\")\n4. Compare prices       -> get_price_statistics(location=\"Mokotow\")\n```\n\nThis mimics how a property appraiser finds comparable transactions for valuation reports.\n\n## Data\n\n- **8M+ transactions** from all of Poland (380 counties)\n- **Date range:** 2003 - present\n- **Source:** Polish national RCN registry (Rejestr Cen Nieruchomosci)\n- **Refresh:** periodic updates from RCN\n- **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\n\n## Troubleshooting\n\n**\"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.\n\n**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).\n\n**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.\n\n**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.\n\n## Development\n\n```bash\ngit clone https://github.com/cenogram/mcp-server.git\ncd mcp-server\nnpm install\nnpm test\nnpm run build\n```\n\n## License\n\nMIT\n",
  "bytes": 11094,
  "sha": "6884ecba65268d02b19870fad37399482d62ea623e9d9bce34b7597c612fb8cb",
  "repo_slug": "cenogram/mcp-server",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_pl_cenogram_mcp_server_0857c438/readme"
}