Cenogram - Polish Real Estate Transactions (RCN)
Precios de transacciones inmobiliarias polacas provenientes de escrituras notariales, no de anuncios: más de 8 millones de registros del registro nacional RCN, de 2003 a la fecha, con OAuth 2.1.
Documentación
Servidor MCP Cenogram
Datos de transacciones inmobiliarias y parcelas de Polonia para IA
Servidor MCP para datos inmobiliarios polacos. Accede a más de 8 millones de transacciones inmobiliarias del registro nacional de Precios y Valores (Rejestr Cen Nieruchomosci, RCN): precios de escrituras notariales, no de anuncios, directamente desde Claude, Cursor, ChatGPT, Grok o cualquier asistente de IA compatible con MCP. Además de los precios de transacción, el servidor resuelve parcelas catastrales y añade contexto por parcela: zonificación, riesgo de inundación y deslizamiento, registro de patrimonio, permisos de construcción y actividad de obra, acceso a transporte público, clasificación agrícola del suelo y uso del suelo circundante.
Fuente de datos: registro nacional polaco RCN (Rejestr Cen Nieruchomosci) | Plataforma: cenogram.pl
Obtén tu clave de API
- Ve a cenogram.pl/api
- Introduce tu correo electrónico
- Recibirás tu clave de API
cngrm_...por correo electrónico
Gestiona tus claves en cenogram.pl/ustawienia.
Instalación
Elige tu cliente. Todas las opciones a continuación utilizan el servidor alojado: no se necesita instalación local (excepto npx/stdio).
Claude Code
Un solo comando: cero archivos de configuración:
claude mcp add cenogram https://mcp.cenogram.pl/mcp \
-t http -H "Authorization: Bearer YOUR_API_KEY"
Cursor
Añade a .cursor/mcp.json en tu proyecto:
{
"mcpServers": {
"cenogram": {
"type": "http",
"url": "https://mcp.cenogram.pl/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}
Claude Desktop
Añade a tu archivo de configuración:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
npx (stdio):
{
"mcpServers": {
"cenogram": {
"command": "npx",
"args": ["-y", "@cenogram/mcp-server@latest"],
"env": {
"CENOGRAM_API_KEY": "YOUR_API_KEY"
}
}
}
}
VS Code / GitHub Copilot
Añade a .vscode/mcp.json en tu espacio de trabajo:
{
"servers": {
"cenogram": {
"type": "http",
"url": "https://mcp.cenogram.pl/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}
Windsurf
Añade a ~/.codeium/windsurf/mcp_config.json:
HTTP remoto:
{
"mcpServers": {
"cenogram": {
"type": "http",
"url": "https://mcp.cenogram.pl/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}
Si HTTP no funciona, usa la opción npx (stdio) a continuación.
Cline
En VS Code: Configuración > Cline > MCP Servers. Añade:
{
"cenogram": {
"type": "http",
"url": "https://mcp.cenogram.pl/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
npx (stdio) - local/offline
Requiere Node.js >= 18. Úsalo si quieres ejecutar el servidor localmente en lugar de conectarte al servidor alojado.
{
"mcpServers": {
"cenogram": {
"command": "npx",
"args": ["-y", "@cenogram/mcp-server@latest"],
"env": {
"CENOGRAM_API_KEY": "YOUR_API_KEY"
}
}
}
}
| Cliente | Archivo de configuración |
|---|---|
| Cursor | .cursor/mcp.json |
| Claude Code | .mcp.json en tu proyecto |
| Claude Desktop | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
| Cline | Configuración de VS Code > Cline > MCP Servers |
Configuración
| Variable de Entorno | Requerida | Predeterminado | Descripción |
|---|---|---|---|
CENOGRAM_API_KEY | Sí (stdio) | - | Clave de API de cenogram.pl/api |
CENOGRAM_API_URL | No | https://cenogram.pl | URL base de la API |
MCP_TRANSPORT | No | stdio | Configúralo en http para el modo HTTP Streamable |
MCP_PORT | No | 3002 | Puerto del servidor HTTP (solo modo HTTP) |
CENOGRAM_CLIENT_ID | No | auto-generado | Identificador persistente del cliente |
También puedes usar el indicador de línea de comandos --http en lugar de MCP_TRANSPORT=http.
Consejos
- Selección de modelo: Para obtener los mejores resultados, usa Claude Opus 4.7. Realiza más llamadas a herramientas secuenciales y produce análisis más ricos. Puedes cambiar el modelo en el menú desplegable en la parte inferior de la ventana de chat.
Ejemplos de Prompts
Polaco:
- "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"
Inglés:
- "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"
Herramientas
| Herramienta | Descripción | Parámetros clave |
|---|---|---|
search_transactions | Busca transacciones con filtros | ubicación, calle, númeroDeEdificio, idDeParcela, tipoDePropiedad, tipoDeMercado, rango de precio/fecha/área |
get_price_statistics | Estadísticas de precio/m2 por ubicación (solo residencial) | ubicación (opcional) |
get_price_distribution | Histograma de precios | bins, precioMáximo |
search_by_area | Busca por radio geográfico | latitud, longitud, radioKm |
get_market_overview | Resumen de la base de datos y estadísticas | (ninguno) |
list_locations | Lista ubicaciones disponibles | búsqueda (opcional) |
search_parcels | Busca parcelas por prefijo de ID catastral | q (prefijo de ID de parcela, mínimo 3 caracteres) |
search_by_polygon | Busca dentro de un polígono GeoJSON | polígono, tipoDePropiedad, fechaDesde/fechaHasta |
compare_locations | Compara estadísticas entre 2 y 5 distritos | distritos (separados por comas), tipoDePropiedad |
get_building_breakdown | Desglose por edificio para una transacción (huella, plantas, área de piso estimada) | idDeTransacción (UUID de un resultado de búsqueda) |
get_parcel_report | Expediente compuesto para una parcela: núcleo, 9 capas de enriquecimiento, historial de transacciones, contexto de precios local y contexto municipal | idDeParcela (ID catastral o UUID) |
resolve_parcel | Resuelve un identificador de parcela catastral a su registro canónico | idDeParcela o q (prefijo de ID), o lat + lng |
get_demographics | Contexto de población y demografía para una ubicación | ubicación o teryt, año (o añoDesde/añoHasta), categoría |
get_infrastructure_signals | Señales de infraestructura municipal (licitaciones, servicios públicos, gasto de capital) | ubicación o teryt |
estimate_value | Estimación de valor por ventas comparables para una propiedad | área, más lat + lng o idDeParcela; habitaciones, mercado |
get_transaction_flood | Riesgo de inundación para la propiedad en una transacción | idDeTransacción (UUID de un resultado de búsqueda) |
get_transaction_heritage | Estado del registro de patrimonio para la propiedad | idDeTransacción |
get_transaction_landslide | Riesgo de deslizamiento para la propiedad | idDeTransacción |
get_transaction_surroundings | Contexto de molestias y uso del suelo alrededor de la propiedad | idDeTransacción |
get_transaction_transit | Accesibilidad de transporte público para la propiedad | idDeTransacción |
get_transaction_permits | Permisos de construcción registrados para la propiedad | idDeTransacción |
get_transaction_planning | Estado de zonificación y planificación local para la propiedad | idDeTransacción |
get_transaction_farmland | Clasificación de uso agrícola del suelo para la propiedad | idDeTransacción |
Nomenclatura de ubicaciones
- La mayoría de las ciudades: usa directamente el nombre de la ciudad (por ejemplo, "Gdansk", "Lublin")
- Varsovia: "Warszawa" cubre los 18 distritos a la vez; nombra uno ("Mokotow", "Srodmiescie", "Wola") para acotar
- Cracovia y Lodz funcionan igual: el nombre de la ciudad cubre todos los subdistritos, o nombra uno ("Krakow-Podgorze")
- Los nombres de barrios no son unidades administrativas: busca por radio o polígono en su lugar
- Usa
list_locationspara encontrar nombres válidos
Tipos de propiedad
| Valor | Polaco | Inglés |
|---|---|---|
land | Grunt | Parcela de tierra |
building | Budynek | Edificio |
developed_land | Grunt zabudowany | Terreno desarrollado |
unit | Lokal | Apartamento/unidad |
Flujos de trabajo
Los resultados incluyen IDs de parcela y coordenadas GPS, lo que permite investigación en varios pasos:
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")
Esto imita cómo un tasador de propiedades encuentra transacciones comparables para informes de valoración.
Datos
- Más de 8 millones de transacciones de toda Polonia (380 condados)
- Rango de fechas: 2003 - presente
- Fuente: registro nacional polaco RCN (Rejestr Cen Nieruchomosci)
- Actualización: actualizaciones periódicas de RCN
- Contexto por parcela: zonificación, riesgo de inundación y deslizamiento, registro de patrimonio, permisos de construcción y actividad de obra, acceso a transporte, uso agrícola del suelo y alrededores, direccionable por ID catastral
Solución de problemas
"Error: CENOGRAM_API_KEY is required" - Esto solo aplica al modo stdio. Asegúrate de que CENOGRAM_API_KEY esté configurada en el bloque env de tu configuración MCP. Para HTTP remoto, la clave va en el encabezado Authorization en su lugar.
npx se cuelga o falla - Verifica tu versión de Node.js con node -v. El modo stdio requiere Node.js >= 18. Si tienes una versión anterior, usa la opción HTTP remoto en su lugar (no necesita Node.js).
Una ubicación devuelve 0 resultados - El nombre puede no ser una unidad administrativa. Distritos y barrios son cosas diferentes: "Mokotow" es un distrito y funciona, "Sluzew" es un barrio dentro de él y no funciona. Usa list_locations(search="...") para encontrar nombres válidos, o busca por radio (search_by_area) para cualquier cosa más pequeña que un distrito.
401 No autorizado (modo HTTP) - El encabezado Authorization debe ser Bearer cngrm_... (con el prefijo Bearer). Verifica que se incluya la clave API completa, no solo el prefijo.
Desarrollo
git clone https://github.com/cenogram/mcp-server.git
cd mcp-server
npm install
npm test
npm run build
Licencia
MIT