cenogram-mcp-server
OfficialThe server provides access to over 8 million Polish real estate transactions and parcel data, enriched with contextual layers for AI analysis.
Core Capabilities:
Transaction Search: Filter by location, street, building number, parcel ID, property type, market type, price range, date, area, floor, rooms, ownership, zoning, flood risk, heritage status, and more. Search within a geographic radius (lat/lng) or a custom GeoJSON polygon.
Price Analytics: Get median/average price per m² for residential apartments by location; generate price distribution histograms; obtain a market overview of the entire database; estimate an apartment’s market value from comparable sales.
Parcel Intelligence: Autocomplete search for parcels by cadastral ID prefix; resolve a parcel from ID, UUID, coordinates, or locality+number; fetch a comprehensive parcel report covering core data, flood risk, heritage, landslide, surroundings, public transport, zoning, buildings, building activity, agricultural eligibility, transaction history, local price context, and demographic/municipal context.
Transaction-Specific Enrichments: For any transaction, access detailed breakdowns of flood hazard (zone category, affected share), heritage listings, landslide risk, surroundings (distances to cemeteries, landfills, etc.), public transport access (nearest stops by mode), building permits history, general-plan zoning (zone parameters, overlays), agricultural land eligibility, and building breakdown (footprint, storeys, floor area).
Location & Demographics: Browse valid TERYT administrative divisions; retrieve ~50 demographic and economic indicators (population, economy, housing, environment, safety, education, prices) at voivodeship/county/municipality level with optional time-series.
Infrastructure Signals: Identify upcoming municipal infrastructure projects from public procurement tenders and municipal spending plans.
Location Comparison: Compare price and area statistics across 2–5 districts side-by-side.
Permalinks: Each transaction includes a shareable map link.
Cenogram MCP Server
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
Get your API key
Go to cenogram.pl/api
Enter your email
You'll receive your
cngrm_...API key by email
Manage your keys at cenogram.pl/ustawienia.
Related MCP server: rcs-mcp
Installation
Pick your client. All options below use the hosted server - no local install needed (except npx/stdio).
One command - zero config files:
claude mcp add cenogram https://mcp.cenogram.pl/mcp \
-t http -H "Authorization: Bearer YOUR_API_KEY"Add to .cursor/mcp.json in your project:
{
"mcpServers": {
"cenogram": {
"type": "http",
"url": "https://mcp.cenogram.pl/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}Add to your config file:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%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"
}
}
}
}Add to .vscode/mcp.json in 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:
HTTP remote:
{
"mcpServers": {
"cenogram": {
"type": "http",
"url": "https://mcp.cenogram.pl/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}If HTTP doesn't work, use the npx (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"
}
}
}Requires Node.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"
}
}
}
}Client | Config file |
Cursor |
|
Claude Code |
|
Claude Desktop |
|
Windsurf |
|
Cline | VS Code settings > Cline > MCP Servers |
Configuration
Env Variable | Required | Default | Description |
| Yes (stdio) | - | API key from cenogram.pl/api |
| No |
| API base URL |
| No |
| Set to |
| No |
| HTTP server port (HTTP mode only) |
| No | auto-generated | Persistent client identifier |
You can also use the --http CLI flag instead of MCP_TRANSPORT=http.
Tips
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.
Example Prompts
Polish:
"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"
English:
"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"
Tools
Tool | Description | Key Parameters |
| Search transactions with filters | location, street, buildingNumber, parcelId, propertyType, marketType, price/date/area range |
| Price/m2 stats by location (residential only) | location (optional) |
| Price histogram | bins, maxPrice |
| Search by geographic radius | latitude, longitude, radiusKm |
| Database overview and stats | (none) |
| List available locations | search (optional) |
| Search parcels by cadastral ID prefix | q (parcel ID prefix, min 3 chars) |
| Search within a GeoJSON polygon | polygon, propertyType, dateFrom/dateTo |
| Compare stats across 2-5 districts | districts (comma-separated), propertyType |
| Per-building breakdown for one transaction (footprint, storeys, est. floor area) | transaction_id (UUID from a search result) |
| Composite dossier for one parcel: core, 9 enrichment layers, transaction history, local price context and municipal context | parcelId (cadastral id or UUID) |
| Resolve a cadastral parcel identifier to its canonical record | parcelId or q (id prefix), or lat + lng |
| Population and demographic context for a location | location or teryt, year (or yearFrom/yearTo), category |
| Municipal infrastructure signals (tenders, utilities, capital spending) | location or teryt |
| Comparable-sales value estimate for a property | area, plus lat + lng or parcelId; rooms, market |
| Flood risk for the property in a transaction | transaction_id (UUID from a search result) |
| Heritage-register status for the property | transaction_id |
| Landslide risk for the property | transaction_id |
| Nuisance and land-use context around the property | transaction_id |
| Public transport accessibility for the property | transaction_id |
| Building permits recorded for the property | transaction_id |
| Local zoning and planning status for the property | transaction_id |
| Agricultural land-use classification for the property | transaction_id |
Location naming
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
Use
list_locationsto find valid names
Property types
Value | Polish | English |
| Grunt | Land plot |
| Budynek | Building |
| Grunt zabudowany | Developed land |
| Lokal | Apartment/unit |
Workflows
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.
Data
8M+ transactions from 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
Troubleshooting
"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.
Development
git clone https://github.com/cenogram/mcp-server.git
cd mcp-server
npm install
npm test
npm run buildLicense
MIT
Available Tools
23 toolscompare_locationsARead-onlyInspect
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 sales) are excluded from price aggregates. Transaction counts and coverage stay complete.
| Name | Required | Description | Default |
|---|---|---|---|
| floor | No | 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. | |
| rooms | No | 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. | |
| dateTo | No | End date (YYYY-MM-DD) | |
| street | No | Street name filter | |
| maxArea | No | Maximum area in m² | |
| minArea | No | Minimum area in m² | |
| dateFrom | No | Start date (YYYY-MM-DD) | |
| maxPrice | No | Maximum price in PLN | |
| minPrice | No | Minimum price in PLN | |
| districts | Yes | Comma-separated district names to compare (2-5, must be unique). E.g. 'Mokotów,Wola,Ursynów' | |
| marketType | No | Market type filter | |
| buildingType | No | Building type filter (PKOB classification). 'unknown' = no type recorded (NULL); without it such rows are excluded (~39% of buildings have no type). | |
| propertyType | No | Property type filter (recommended - API requires at least one filter) | |
| unitFunction | No | 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'. | |
| ownershipType | No | 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. | |
| mpzpDesignation | No | 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'. | |
| transactionType | No | Transaction type filter. For market analysis, ALWAYS specify to exclude non-market transactions. | |
| includeDemographics | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false. The description adds behavioral context: fractional ownership and non-market deeds are excluded from price aggregates, but transaction counts remain complete. This goes beyond annotations by clarifying data filtering.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured paragraph with no wasted words. It efficiently covers purpose, prerequisites, example, and a behavioral note. The key action is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's 18 parameters and no output schema, the description adequately covers the main purpose, required inputs, and a behavioral exclusion. It hints at output metrics (median, average, counts), which is sufficient for tool selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema provides detailed parameter info. The description adds value by noting the districts parameter requires 2-5 unique names, and that an additional filter (e.g., propertyType) is needed. This aids correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'compare' and resource 'real estate statistics across multiple locations side-by-side'. It specifies the output metrics (median price/m², average area, transaction counts) and differentiates from siblings like list_locations or get_market_overview by requiring 2-5 districts and an extra filter.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs to use list_locations first, requires at least one filter besides districts, and provides an example. While it does not explicitly state when not to use, the context implies it is for multi-location comparison, not single-location stats.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
estimate_valueARead-onlyInspect
[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-address floor-area source in Poland, so the caller supplies it. Optional: rooms (1–10) and market (primary/secondary) narrow the comparables; includeComps (default true) echoes the nearest comparables it weighed. Returns the point estimate, a likely and a wide value range, a confidence band, the comparable count, and an as_of date. as_of reflects transaction-data freshness, which lags by county — estimates are NOT directly comparable across cities with different as_of. Apartments only (v1), 10–250 m². Too few comparables near the point → no estimate (the credit is refunded). Costs 5 API tokens, refunded when no estimate is produced. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude of the apartment (WGS84, Poland). Must be paired with lng. Use this OR parcelId. | |
| lng | No | Longitude of the apartment (WGS84, Poland). Must be paired with lat. Use this OR parcelId. | |
| area | Yes | Apartment usable area in m² (REQUIRED, 10–250). Estimates for 300+ m² are unreliable and rejected. | |
| rooms | No | Room count (1–10, optional) — narrows the comparables to ±1 room. | |
| market | No | Restrict comparables to the primary (new-build) or secondary market (optional). | |
| parcelId | No | Full cadastral id (slash or dash form) or internal UUID; the parcel centroid is used. Use instead of lat/lng. | |
| includeComps | No | Echo the nearest comparables the estimate weighed (default true). Set false for the estimate only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds transparency about beta status, token cost, refund on no estimate, data freshness lag, and exclusion of fractional shares, providing a complete picture of behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with sections for purpose, constraints, parameters, returns, and disclaimers. It is slightly verbose but front-loads the main purpose effectively.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 parameters, no output schema), the description covers all aspects: what it returns, how it works, limitations, token cost, and edge cases like insufficient comparables. It is comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds value by explaining why area is required (no floor-area source in Poland), the mutual exclusivity of location parameters, and the effect of optional parameters on narrowing comparables.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool estimates market value of an apartment from comparable transactions. It distinguishes itself from a certified appraisal and from sibling tools like search_transactions or get_price_statistics by focusing on estimation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use (orientation estimate) and when not (not a certified appraisal). It also specifies required parameter (area) and mutually exclusive location parameters (lat/lng or parcelId), providing clear guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_building_breakdownARead-onlyInspect
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 shown on a search result that has building data. Cost: 4 tokens. Returns nothing for a transaction with no buildings.
| Name | Required | Description | Default |
|---|---|---|---|
| transaction_id | Yes | Transaction id (UUID) from a search_transactions / search_by_area / search_by_polygon result that carries building data. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=true and destructiveHint=false. The description adds important behavioral details: cost of 4 tokens, returns nothing for transactions with no buildings, and explains the output structure. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise and well-structured. The first sentence defines purpose and output, the second explains relation to siblings, and the final two provide cost and edge case. Every sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description covers all necessary aspects: purpose, usage, parameter source, cost, and edge case behavior. It is fully self-contained and actionable for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single parameter, and the description adds context beyond the schema regex by stating that transaction_id is 'the id shown on a search result that has building data'. This clarifies the parameter's source and usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and the resource 'building-by-building breakdown for one transaction', and lists the specific fields returned (footprint area, storeys, total floor area). It distinguishes from sibling search tools by explaining that they return per-transaction sums while this tool provides individual building detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool ('after a search when a result has building data and you need the detail'), provides an example ('developed-land deed'), and indirectly tells when not to use it (if the inline sum suffices). It also specifies that the transaction_id comes from search results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_demographicsARead-onlyInspect
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 or 7-digit teryt. teryt wins when both are given. Use list_locations to find TERYT codes — neighborhoods/osiedla are NOT addressable here. A query returns the requested level PLUS all parent levels (a gmina query also yields powiat, NUTS3 region and voivodeship indicators). Optional year, or yearFrom+yearTo for a time series, and category to filter. Cost: 1 token.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | Single year (2003-present). Mutually exclusive with yearFrom/yearTo. Omit for the latest available year per indicator. | |
| teryt | No | TERYT code: 2-digit (voivodeship, e.g. 14), 4-digit (county, e.g. 1465), 6 or 7-digit (gmina, e.g. 1465011). Wins over location. Use list_locations to find codes. | |
| yearTo | No | End year for a time series (max current year + 1). | |
| category | No | Filter to these categories. Omit to return all available. | |
| location | No | City/county name, resolves to county/powiat level (e.g. 'Warszawa', 'Kraków'). Use this OR teryt. For gmina-level data pass a 6/7-digit teryt instead. | |
| yearFrom | No | Start year for a time series (min 2003). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral traits beyond annotations, such as returning all parent levels (gmina query also yields powiat, NUTS3, voivodeship), cost of 1 token, and the default behavior of omitting year for latest data. Annotations already declare readOnlyHint=true, which the description aligns with, and there is no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with the main purpose. It uses clear paragraphs and introduces technical details (L6, NUTS3) appropriately. However, it is slightly verbose with the full list of categories; while informative, it could be more concise. Still, every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (6 parameters, no output schema, hierarchical location resolution), the description covers the key aspects: data coverage, addressing, behavior, and optional filters. It references sibling tool list_locations. However, it lacks explicit description of the output format (e.g., structure of returned data), which would be helpful for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds significant meaning beyond schema descriptions. It explains mutual exclusivity of year with yearFrom/yearTo, the resolution levels for teryt (voivodeship, county, gmina), and that location resolves to county level unless a 6/7-digit teryt is given. This context greatly aids parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves demographic, economic, housing and other local statistics for Polish locations from GUS BDL. It specifies the data source, coverage (~50 indicators across 11 categories), and the addressing methods (location name or TERYT code). This distinguishes it from sibling tools like search_transactions or get_market_overview.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use location vs teryt, the resolution levels (county vs gmina), and that neighborhoods are not addressable. It explains the behavior when both parameters are given (teryt wins), the optional year/category filtering, and recommends list_locations to find TERYT codes. It also notes the cost of 1 token.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_infrastructure_signalsARead-onlyInspect
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 financial forecast. Address by location (city/county name → aggregates every municipality in that county) OR teryt (6-7 digits = one municipality, 4 digits = a county aggregate). teryt wins when both are given. Use list_locations to find codes. Known limits, state them when you report results: the bulletin carries only contracts BELOW the EU procurement thresholds (from 2021), so the largest investments are not visible here. A tender is attributed to the SEAT of the contracting authority, not to the works location — county and national authorities tender works in other municipalities. The category counters therefore include municipal authorities only, while the recent-notice list shows every authority with a flag. Absence of tenders is NOT evidence that a municipality is not investing. Cost: 1 token.
| Name | Required | Description | Default |
|---|---|---|---|
| teryt | No | TERYT code: 6 or 7 digits = one municipality (e.g. 146501), 4 digits = a county aggregate (e.g. 1465). Wins over location. | |
| location | No | City or county name (e.g. 'Warszawa', 'Krotoszyn'). Aggregates every municipality in the county. Use this OR teryt. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description reveals critical behaviors beyond annotations: data sources, input precedence (terytr wins), cost (1 token), and known caveats (attribution to seat, thresholds, flag vs. counters). No contradiction with readOnlyHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear main sentence, bulleted sources, and explanatory notes. It is slightly verbose but every part adds value; front-loading the purpose and key method is effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (multiple sources, constraints, no output schema), the description covers all necessary aspects: how to input, what data comes from, known limitations, and cost. An agent can use it correctly without gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaning beyond schema: explains how teryt and location work, that teryt wins when both given, and that location aggregates municipalities. It also directs to list_locations for codes, which is helpful context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies the exact signals (infrastructure building in Polish municipalities from three public sources) and distinguishes the tool by detailing the input methods (location vs. teryt) and referencing sibling tool list_locations, making the purpose highly distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use (to get infrastructure signals) and provides known limits (e.g., contracts below EU thresholds, attribution by seat, absence not evidence). However, it does not explicitly compare against sibling tools for when to choose this one over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_market_overviewARead-onlyInspect
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 aggregates. Transaction counts and coverage stay complete.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only indicate readOnlyHint=true and destructiveHint=false. The description adds important behavioral context, including data quality issues (marketType unknown for ~55%, transaction_date missing for ~1.7%) and exclusions in price aggregates (fractional shares, non-market deeds). This is valuable beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a lead sentence, a list of returns, and bullet-pointed notes. It is slightly verbose but each sentence adds value (data quality, price exclusions). Front-loading is effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero parameters and no output schema, the description fully compensates by detailing return values and caveats. The tool is well-defined for its purpose as a broad overview, and the caveats about data quality and price calculation are critical for correct interpretation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the input schema provides full coverage. The description adds no extra meaning for parameters, but no additional documentation is needed. The description is complete and clear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns a 'comprehensive overview of the Polish real estate transaction database' and lists specific data elements (total transaction count, date range, breakdowns, top locations, price statistics). This distinguishes it from siblings like get_price_statistics or get_demographics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for high-level summary but does not explicitly state when to use this over alternatives like search_transactions or get_price_statistics. No exclusion criteria or when-not-to-use guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_parcel_reportARead-onlyInspect
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) and a municipal context (a headline demographic/economic subset plus upcoming-infrastructure signals for the gmina). Address it by a full cadastral id in the natural '/' form ('142907_2.0014.342/5'), the URL-safe '-' form, or the internal UUID from a search or resolve result. Each section carries its own state, shown explicitly: covered = a definitive result; covered_no_data = the parcel was checked and nothing was found (still billed); not_covered = outside our data (refunded); not_computed = a live computation could not finish in time (refunded — the rest of the report still returns, so a report can be partial). The two context sections instead use full / low_sample / suppressed / no_data. Prefer this over calling the per-layer parcel tools one by one — it is one call at a flat price and never costs more than the sum of its parts. Use resolve_parcel first when you only have an address, a coordinate, or a 'locality + number'. Costs 35 API tokens. Billing is by outcome (see the billing line on the response): a parcel that cannot be resolved is fully refunded; a resolved parcel where no layer had data is billed only the core floor (1 token) with the rest refunded; a resolved parcel with at least one covered layer is billed in full.
| Name | Required | Description | Default |
|---|---|---|---|
| parcelId | Yes | Full cadastral id ('142907_2.0014.342/5' or the '-' form) or the internal UUID from a search/resolve result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and destructiveHint=false, so safety is clear. The description adds extensive behavioral detail: cost of 35 tokens, billing model based on outcome (full refund, partial refund, full charge), explanation of section states (covered, covered_no_data, not_covered, not_computed), and input format variations. This goes well beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is comprehensive yet efficient. It front-loads the main purpose, then systematically explains input format, output states, usage recommendations, and billing. Every sentence adds value, and the length is appropriate for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (many layers, sections, sibling tools), the description is remarkably complete. It covers input, output structure (section states), billing, and when to use alternative tools (resolve_parcel). No obvious gaps remain for an agent to use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% coverage for the single parameter 'parcelId', but the description adds value by explaining the acceptable input forms (natural '/', URL-safe '-', internal UUID) and their origin from search/resolve results. This extra context justifies a 4 over the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves a comprehensive dossier for one land parcel, listing all included data (core, nine enrichment layers, transaction history, price context, municipal context). It distinguishes from sibling tools like per-layer parcel tools by explicitly recommending this tool over calling them individually.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: 'Prefer this over calling the per-layer parcel tools one by one' and instructions to 'Use resolve_parcel first when you only have an address, a coordinate, or a locality + number'. This directly addresses usage context and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_price_distributionARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| bins | No | Number of price bins (5-50, default 20) | |
| maxPrice | No | Maximum price to include (default 3,000,000 PLN) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The note explains that median/average prices exclude fractional ownership and non-market deeds, while transaction counts remain complete. This adds behavioral context beyond the readOnlyHint and destructiveHint annotations, informing agents about data quality and exclusions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief, front-loaded with the main purpose, and uses a concise note for important exclusions. Every sentence adds value without repetition or verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with two parameters and no output schema, the description fully covers the output (histogram) and key behavioral notes. No gaps are apparent given the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides descriptions and defaults for both parameters (bins and maxPrice). The description does not add further parameter semantics beyond what the schema covers, so baseline score applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns a price distribution histogram showing transaction counts per price range, distinguishing it from siblings like get_price_statistics and get_market_overview. The title 'Price Distribution Histogram' further reinforces the specific resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions it is 'useful for understanding the overall market price structure in Poland,' providing context but no explicit comparison to alternatives like get_price_statistics or get_market_overview. No when-not-to-use or alternative tool references are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_price_statisticsARead-onlyInspect
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 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.
| Name | Required | Description | Default |
|---|---|---|---|
| location | No | Filter by location name. 'Warszawa'/'Kraków'/'Łódź' auto-expand to all sub-districts. Other names use case-insensitive partial match (e.g. 'Wrocł' matches 'Wrocław'). Omit for all Poland. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and destructiveHint, but description adds critical context: data source (notarial deeds), coverage gaps, exclusion of fractional ownership and non-market deeds from price aggregates, and retention of transaction counts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear notes, though slightly verbose. Every sentence earns its place, providing essential context without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, description thoroughly covers what statistics are provided, data quality, and exclusions, making it complete for usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single parameter, but description adds valuable behavioral details about auto-expansion and partial matching, going beyond the schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool retrieves price per m² statistics for residential apartments in Poland, distinguishing it from sibling tools like search_transactions which handle other property types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly specifies it only covers residential units and directs to search_transactions for other property types. Also details auto-expansion for major cities and partial match behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transaction_farmlandARead-onlyInspect
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 for due-diligence on land that is actually eligible/maintained as agricultural (beyond what a registry classification says on paper). TWO-STATE: a parcel with no matched eligible area returns nothing — absence of a match is NEVER a statement that the property is non-agricultural (small plots that are not actively farmed are simply absent, the reference layer has its own update cadence, and older transactions can reference renumbered parcels). Cost: 4 tokens (refunded when there is no eligible agricultural area for the linked parcels).
| Name | Required | Description | Default |
|---|---|---|---|
| transaction_id | Yes | Transaction id (UUID) from a search_transactions / search_by_area / search_by_polygon result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint, destructiveHint), description discloses two-state behavior (no match ≠ non-agricultural), cost (4 tokens refunded when no eligible area), and data source freshness (updated weekly). Adds critical interpretative guidance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with main purpose, followed by details and important notes. Slightly lengthy but each sentence adds value; well-organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, description explains response structure (eligible area, share, source features, match count, snapshot date). Combined with behavioral notes, provides full understanding for a read-only tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage 100% with parameter description. Description adds context that transaction_id comes from specific search tools (search_transactions, search_by_area, search_by_polygon), aiding correct sourcing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Describes a specific action ('get parcel-by-parcel agricultural land-eligibility breakdown for one transaction') with a clear resource and scope. Distinct from sibling tools which cover other transaction aspects (flood, heritage, etc.).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the tool is 'useful for due-diligence on land that is actually eligible/maintained as agricultural'. Provides context on when to use, but does not explicitly mention when not to use or alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transaction_floodARead-onlyInspect
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 parcels and scenarios behind it. Use it after a search when a result shows flood_risk. (search_by_polygon does not include flood inline.) TWO-STATE: a transaction whose land is in no mapped zone returns nothing — absence of a zone is never asserted as "safe". Cost: 4 tokens (refunded when there is no flood data).
| Name | Required | Description | Default |
|---|---|---|---|
| transaction_id | Yes | Transaction id (UUID) from a search_transactions / search_by_area / search_by_polygon result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and destructiveHint, but the description adds substantial behavioral details: the two-state behavior (no return when no flood zone, with warning that absence is not safety), the cost structure (4 tokens, refunded if no flood data), and the exact data returned (worst hazard category, type, share, full per-scenario list).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with three paragraphs: main purpose, usage guidance, and edge case with cost. It is moderately long but front-loaded with core functionality. Could be slightly more concise but earns a 4.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, but the description comprehensively explains returned data (category, type, share, per-scenario list) and the two-state behavior. For a single-parameter tool, this is fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with the single parameter having a clear description. The tool description repeats but does not add new information beyond what the schema provides. Baseline 3 is appropriate as schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get the parcel-by-parcel flood-hazard breakdown for one transaction' with a specific verb and resource. It distinguishes from siblings by noting that search_transactions surfaces inline flood_risk, while this tool splits it into parcels, and search_by_polygon lacks inline flood data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance on when to use: 'Use it after a search when a result shows flood_risk.' It also clarifies that search_transactions and search_by_area provide inline flood_risk, while search_by_polygon does not, providing clear context for alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transaction_heritageARead-onlyInspect
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 heritage_status inline; this tool splits that into the individual parcels and entries behind it. Use it after a search when a result shows a heritage listing. (search_by_polygon does not include heritage inline.) TWO-STATE: a transaction with no detected listing returns nothing — absence of a detection is never asserted as "not listed". Indicative data — the regional heritage conservator makes the final, binding determination. Cost: 4 tokens (refunded when there is no heritage data).
| Name | Required | Description | Default |
|---|---|---|---|
| transaction_id | Yes | Transaction id (UUID) from a search_transactions / search_by_area / search_by_polygon result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. Description adds important behavioral details: TWO-STATE (returns nothing if no listing), indicative data caveat, and cost/token refund policy, enhancing transparency beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with purpose first, then usage guidance, then caveats. Slightly verbose with the TWO-STATE explanation and disclaimer, but each sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, description completely explains output structure (per parcel: status, share, individual entries with fields), intended use case, limitations, and cost. No gaps for a getter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only parameter transaction_id is fully covered by schema (100%), but description provides crucial context: it must come from a search result (search_transactions/search_by_area/search_by_polygon), adding meaning beyond the schema's format constraint.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and the resource 'parcel-by-parcel heritage-listing breakdown for one transaction', differentiating it from sibling tools like search_transactions which only surface inline heritage status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use ('after a search when a result shows a heritage listing'), provides exclusions (search_by_polygon does not include heritage inline), and clarifies that absence of detection is not 'not listed'. Also includes cost and refund behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transaction_landslideARead-onlyInspect
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 scale means the parcel overlaps a mapped hazard area, not that the parcel itself is a landslide. search_transactions (and search_by_area) surface a per-transaction worst-case landslide_risk inline; this tool splits that into the individual parcels and zones behind it. Use it after a search when a result shows a landslide risk. (search_by_polygon does not include landslide inline.) TWO-STATE: a transaction whose land is in no mapped zone returns nothing — absence of data is never an assertion of safety. Cost: 4 tokens (refunded when there is no landslide data).
| Name | Required | Description | Default |
|---|---|---|---|
| transaction_id | Yes | Transaction id (UUID) from a search_transactions / search_by_area / search_by_polygon result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate read-only and non-destructive. Description adds that intersection means overlap, not that the parcel is a landslide; two-state behavior (empty return when no data); cost of 4 tokens refunded when no data. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is thorough but well-structured. Front-loaded with purpose, then details, usage guidance, and cost. Each sentence adds value, though slightly lengthy. Could be trimmed slightly but still effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given one parameter and no output schema, the description covers all needed context: what the tool does, return data details, when to use, behavioral nuances, and cost. Complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter with 100% schema coverage. Description adds context that the ID comes from search results, but schema already specifies pattern and description. Baseline 3 is appropriate as no extra semantics beyond what schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it gets a parcel-by-parcel landslide-hazard breakdown for one transaction. Distinguishes from siblings by noting that search_transactions and search_by_area surface worst-case inline, while this tool splits into parcels. Also notes that search_by_polygon does not include landslide inline.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly say to use it after a search when a result shows a landslide risk. Describes when not to expect results (no mapped zone returns nothing, not a safety assertion). Also mentions cost and refund conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transaction_permitsARead-onlyInspect
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 indicator of development activity. Match is by the parcel's current identifier, so splits/merges break the link, and only positively resolved cases are held (no pending or refused applications). TWO-STATE: a transaction whose parcels have no registered case returns nothing — an empty result is never a confirmation that nothing was ever planned. Cost: 4 tokens (refunded when there is no record).
| Name | Required | Description | Default |
|---|---|---|---|
| transaction_id | Yes | Transaction id (UUID) from a search_transactions / search_by_area / search_by_polygon result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false. The description reinforces this by stating it queries an official registry and lists limitations (parcel identifier dependency, only positive cases). It also discloses cost (4 tokens, refunded when no record) and the two-state behavior. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is somewhat lengthy but well-structured, front-loading the main purpose. Every sentence adds value (e.g., data source, limitations, cost). A minor reduction could improve conciseness, but it remains efficient and clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description adequately explains return values (kind, building intent, works type, etc.) and behavior (empty results, cost refund). It covers all necessary context for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter (transaction_id) with a schema description that is already clear (UUID from search results). The tool description does not add additional semantics for this parameter beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves building-permit history for one transaction's parcels from an official registry. It specifies the verb 'Get', the resource 'building-permit history', and the scope 'for one transaction's parcels', distinguishing it from other transaction-specific tools like get_transaction_flood or get_transaction_heritage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use it after a search to screen what has been built or approved on the transaction's land', indicating when to use. It also warns that matching is by current parcel identifier so splits/merges break the link, and that only positively resolved cases are included, with empty results not confirming absence of planning. This provides clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transaction_planningARead-onlyInspect
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: 'covered' returns zone data; 'covered_no_data' means the municipality has an adopted general plan but no zone data covers these plots in the data yet; 'not_covered' means no published general-plan data for this municipality yet — this is NEVER a claim that the municipality has no plan. General plans are still being adopted across Poland, so coverage grows over time. Use it for feasibility and permitted-use questions on a plot. Cost: 4 tokens (refunded when there is no zone data for the transaction — 'covered_no_data' or 'not_covered').
| Name | Required | Description | Default |
|---|---|---|---|
| transaction_id | Yes | Transaction id (UUID) from a search_transactions / search_by_area / search_by_polygon result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds valuable behavioral details: the three-state coverage with honest semantics, explanation of what each state means, and cost/refund behavior. This goes beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured, starting with the main purpose, then detailing output, state system, usage, and cost. Each sentence is valuable, though slightly verbose; could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one parameter and no output schema, the description comprehensively covers the return values (zone data, building parameters, overlays), the three-state coverage, usage guidance, and cost. It leaves no critical gaps for an agent to understand the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for the single parameter (transaction_id), so the schema already provides meaning. The description does not add further parameter-specific information, meeting the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves general-plan zoning for a transaction's land, specifying the output details (zone symbol, name, share, building parameters, overlay areas) and the three-state coverage system, making it distinct from any sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly recommends use for feasibility and permitted-use questions on a plot, and mentions cost/refund conditions. While it does not list alternatives or when-not-to-use, the context is clear given no sibling overlaps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transaction_surroundingsARead-onlyInspect
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 category is searched within a fixed radius only: cemetery 1 km, landfill 3 km, sewage treatment 2 km, industrial/storage 1 km, large industrial plant 3 km, intensive livestock farm 3 km. TWO-STATE: a null/absent distance means no such object within the search radius in the reference data — it is NEVER a guarantee that none exists. assessed=false means the plot has not been evaluated yet (no statement either way). Cost: 4 tokens (refunded when there is no informative data — no linked plots, or none evaluated yet).
| Name | Required | Description | Default |
|---|---|---|---|
| transaction_id | Yes | Transaction id (UUID) from a search_transactions / search_by_area / search_by_polygon result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description extensively discloses behavioral traits: distances are approximate, measured from plot boundary, 0 means touching/overlapping, search is within fixed radii, and the 'two-state' semantic (null vs assessed=false) is explained. This adds significant value beyond the annotations (readOnlyHint, destructiveHint).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured, front-loading the main purpose, then detailing constraints, state interpretation, and cost. It is slightly verbose but every sentence earns its place, and it avoids redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single parameter, no output schema, and multiple siblings, the description is remarkably complete: it explains output semantics (null vs assessed=false), radius limits, cost, and intended usage, leaving no critical gaps for an agent to decide to call the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage and only one parameter (transaction_id) already described in the schema, the description adds value by clarifying the UUID's source ('from search_transactions / search_by_area / search_by_polygon result'), but does not introduce new parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves a plot-by-plot surroundings profile for one transaction, listing specific distance categories (cemetery, landfill, etc.) and marking it as useful for due-diligence on nearby nuisances. It distinguishes itself from sibling 'get_transaction_*' tools by specifying the exact data returned.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly frames the tool as 'useful for due-diligence on nearby nuisances,' providing clear context. It does not, however, directly compare to alternatives or state when not to use it, leaving inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transaction_transitARead-onlyInspect
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 never asserted as "no transit access" (open feeds cover cities and national rail, not every rural area). Cost: 4 tokens (refunded when there is no transit data).
| Name | Required | Description | Default |
|---|---|---|---|
| transaction_id | Yes | Transaction id (UUID) from a search_transactions / search_by_area / search_by_polygon result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide readOnlyHint and destructiveHint. The description adds significant behavioral details: use of open GTFS data, distance caps per mode, two-state absence handling, token cost and refund. These go well beyond annotation information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single paragraph with no wasted words. It front-loads the core purpose, then provides necessary details in a logical order: process, caps, edge cases, cost.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple input (one parameter) and no output schema, the description fully covers use case, distance caps, absence behavior, token cost, and refund. It leaves no ambiguity about what the tool returns or how it works.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (transaction_id) with schema description covering its source. The tool description does not add further meaning beyond the schema. Schema coverage is 100%, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it gets 'parcel-by-parcel public transport access breakdown for one transaction,' specifying the resource (transaction), action (get), and scope (parcels, modes, stops). It distinguishes itself from sibling transaction tools by focusing on transit details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use (getting transit access for a transaction) and details behavior like two-state returns and cost. It lacks explicit when-not-to-use or alternative tools, but the specificity among many siblings provides implicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_locationsARead-onlyInspect
Browse locations in two modes:
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
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 precise administrative filtering (avoids name ambiguity, e.g. 'Wałcz' is both a county and a municipality).
| Name | Required | Description | Default |
|---|---|---|---|
| parent | No | TERYT parent code to browse children. 2-digit (voivodeship → counties), 4-digit (county → municipalities), 6-digit (municipality → precincts). Omit for all voivodeships. | |
| search | No | Filter locations by name (case-insensitive partial match, e.g. 'Krak' for Kraków districts). Ignored when parent is set. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint and destructiveHint. Description adds operational details: hierarchical code mapping, precedence of parent over search, and the return of TERYT codes for use in another tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with bullet points and explicit modes. Slightly verbose but front-loads key information. Could be tightened slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers both modes, precedence, code length mapping, and connection to search_transactions. Lacks explicit output format details but sufficient for the tool's purpose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, providing parameter descriptions. Description supplements with behavioral context: the hierarchical code lengths for parent and the legacy nature of search, plus the precedence rule.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the purpose: browsing locations in two modes (TERYT hierarchy and name search). It distinguishes the tool from siblings by explicitly linking to search_transactions and mentioning 'location' tool for quick city searches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use each mode and the precedence rule. Recommends using 'location' for quick city searches, implying an alternative, though the alternative is not named as a sibling tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_parcelARead-onlyInspect
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) containing that point). Returns a list of matching parcels with district, area, and coordinates; 'truncated' when the name+number match was capped. When nothing matches, coverage is not_covered and the credit is refunded. Use this to turn an address point, a coordinate, or a locality+number into a concrete parcel id — then feed that id to search_transactions (parcelId) to see its sale history. Costs 1 API token (refunded when nothing matches).
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Full cadastral id, a UUID, or 'locality name + parcel number' (e.g. 'Sabnie 342/5'). Mutually exclusive with parcelId and lat/lng. | |
| lat | No | Latitude WGS84. Must be paired with lng. Mutually exclusive with q and parcelId. | |
| lng | No | Longitude WGS84. Must be paired with lat. Mutually exclusive with q and parcelId. | |
| parcelId | No | Full cadastral id (slash or dash form) or internal UUID. Mutually exclusive with q and lat/lng. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds detailed behavioral traits: costs 1 token refunded on non-match, exact case-insensitive locality matching, truncation flag, and not_covered response. This significantly enriches the agent's understanding beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is fairly long but well-structured, front-loading the purpose and then breaking down methods. Every sentence adds value; however, it could be slightly more compact. Suitable for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description explains return format (list with district, area, coordinates) and edge cases (truncated, not_covered). It also covers token cost and integration with a sibling tool. The description is comprehensive for this complex tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all 4 parameters (100% coverage). Description adds meaning: difference between slash and dash forms for parcelId, free-text format for q, and that lat/lng returns parcel(s) containing the point. This provides useful nuance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool resolves a land parcel to its cadastral identity, specifies three distinct input methods (parcelId, q, lat/lng), and distinguishes it from siblings by explaining the workflow of feeding the result to search_transactions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use each parameter and notes mutual exclusivity. Also suggests integration with search_transactions. Lacks explicit 'when not to use' compared to siblings like search_parcels, but context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_by_areaARead-onlyInspect
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: °N, °E" line, build https://cenogram.pl/ceny-transakcyjne?src=mcpstdio#v=1&lat=&lng=&z=16&tx= (drop the °N/°E; lat = the °N number, lng = the °E number) — opens that exact transaction on the map. Omit &tx= for the area only. Field provenance: values are from the notarial deed (RCN) by default; computed values (parcel area summed across plots or converted from hectares, an inferred/reclassified property type) and approximated streets are flagged inline with a neutral [...] note.
| Name | Required | Description | Default |
|---|---|---|---|
| floor | No | 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. | |
| limit | No | Number of results (1-50, default 20) | |
| rooms | No | 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. | |
| dateTo | No | End date (YYYY-MM-DD) | |
| maxArea | No | Maximum area in m² | |
| minArea | No | Minimum area in m² (usable_area_m2 for units, parcel_area for land) | |
| dateFrom | No | Start date (YYYY-MM-DD) | |
| latitude | Yes | Latitude (Poland range: 49-55) | |
| maxPrice | No | Maximum price in PLN | |
| minPrice | No | Minimum price in PLN | |
| radiusKm | No | Search radius in km (0.1-50, default 2). Use 0.5-1 for neighborhoods, 0.3-0.5 for streets. | |
| floodRisk | No | Flood-hazard filter. high = most frequent flooding (~1-in-10-year), medium (~1-in-100-year), low = rarest (~1-in-500-year). Selects ONLY transactions whose land sits in a mapped flood zone; absence of a zone is never asserted as 'safe'. Multi-select; e.g. ['medium','high'] = at least medium risk. | |
| longitude | Yes | Longitude (Poland range: 14-25) | |
| marketType | No | Market type: primary (developer) or secondary (resale). ~55% of records have unknown market type and will be excluded when this filter is used. | |
| buildingType | No | Building type filter (PKOB classification). 'unknown' = no type recorded (NULL); without it such rows are excluded (~39% of buildings have no type). | |
| propertyType | No | Property type filter | |
| unitFunction | No | 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'. | |
| landslideRisk | No | Landslide-hazard filter, from official landslide-hazard maps (1:10,000 scale). 'landslide' = the land intersects a mapped landslide area; 'threatened' = an area threatened by mass movements. Selects ONLY transactions whose land intersects a mapped hazard area — an intersection means overlap with a mapped area, not that the parcel itself is a landslide; absence of a zone is never asserted as 'safe'. Multi-select; e.g. ['landslide','threatened'] = any mapped hazard. | |
| ownershipType | No | 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. | |
| heritageStatus | No | Heritage-listing filter. listed = a protected monument on/at the property's land; zone = the land lies within a protected urban layout or the designated surroundings of a monument. Selects ONLY transactions where a listing was detected; absence of a detection is never asserted as 'not listed'. Multi-select; e.g. ['listed'] = individually listed properties only. | |
| transactionType | No | Transaction type filter. For market analysis, ALWAYS specify to exclude non-market transactions. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. Description adds behavioral details: permalink construction, field provenance, and that area filters work for all property types. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is informative but lengthy, including permalink construction and field provenance that could be external documentation. Purpose is front-loaded, but verbosity reduces conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description explains result format (id, location) and permalink usage. It also covers data provenance. Missing explicit output field list, but the permalink hint compensates.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds value beyond schema: radius guide, example, and explanation that area filters work for all property types. This enhances understanding of parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb 'search' with resource 'real estate transactions' and scope 'within a geographic radius'. Differentiates from siblings by specifying it is best for neighborhood/osiedle searches, which cannot be done with TERYT-based tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance for when to use (neighborhood searches) with radius recommendations. However, it does not explicitly mention when not to use or alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_by_polygonARead-onlyInspect
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:" line and its "Location: °N, °E" line, build https://cenogram.pl/ceny-transakcyjne?src=mcpstdio#v=1&lat=&lng=&z=16&tx= (drop the °N/°E; lat = the °N number, lng = the °E number) — opens that exact transaction on the map. Omit &tx= for the area only. Field provenance: values are from the notarial deed (RCN) by default; computed values (parcel area summed across plots or converted from hectares, an inferred/reclassified property type) and approximated streets are flagged inline with a neutral [...] note. Example: {"type":"Polygon","coordinates":[[[21.0,52.2],[21.01,52.2],[21.01,52.21],[21.0,52.21],[21.0,52.2]]]}
| Name | Required | Description | Default |
|---|---|---|---|
| floor | No | 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. | |
| limit | No | Max results (1-3000, default 100). MCP displays up to 50 transactions. | |
| rooms | No | 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. | |
| dateTo | No | End date (YYYY-MM-DD) | |
| street | No | Street name filter (partial match) | |
| maxArea | No | Maximum area in m² | |
| minArea | No | Minimum area in m² | |
| polygon | Yes | GeoJSON Polygon geometry. Coordinates: [longitude, latitude] pairs. First and last point must be identical. Max 500 vertices total. | |
| dateFrom | No | Start date (YYYY-MM-DD) | |
| district | No | District name filter | |
| maxPrice | No | Maximum price in PLN | |
| minPrice | No | Minimum price in PLN | |
| marketType | No | Market type filter | |
| buildingType | No | Building type filter (PKOB classification). 'unknown' = no type recorded (NULL); without it such rows are excluded (~39% of buildings have no type). | |
| propertyType | No | Property type filter | |
| unitFunction | No | 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'. | |
| ownershipType | No | 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. | |
| mpzpDesignation | No | MPZP zoning designation filter (exact match). Use 'unknown' for rows with no designation recorded (NULL); distinct from the registry code 'brakMPZPLubWZ'. | |
| transactionType | No | Transaction type filter. For market analysis, ALWAYS specify to exclude non-market transactions. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is clear. The description adds substantial context: coordinate ordering [longitude, latitude], first/last point requirement, max 500 vertices, field provenance (notarial deed default vs computed/approximated values flagged), and permalink construction. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: purpose, usage, permalink details, field provenance. It is a bit long due to the detailed permalink and provenance sections, but each part serves a clear function and the purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with 19 parameters, a nested polygon object, and no output schema, the description covers purpose, usage, polygon format, example, permalink interpretation, and data provenance. This is sufficient for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description provides a GeoJSON example and repeats the coordinate format already specified in the schema, but does not add meaningful new parameter semantics beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Search real estate transactions within a geographic polygon.' It explicitly distinguishes from sibling search_by_area by stating 'Use for precise neighborhood/osiedle boundaries' and 'For quick searches, start with search_by_area instead.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use guidance is provided: 'Use for precise neighborhood/osiedle boundaries.' Alternatives are named: 'For quick searches, start with search_by_area instead.' Also explains how to build a permalink from results, which is useful for sharing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_parcelsARead-onlyInspect
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'.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Parcel ID prefix to search for (min 3 chars). E.g. '146518_8.01' | |
| limit | No | Max results (1-10, default 10) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds value by mentioning autocomplete behavior and specific return fields, but does not disclose further behavioral traits like rate limits or response structure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences: function, output, example. No wasted words, front-loaded with key information. Efficient and clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description explains return fields (district, area, GPS coordinates). It covers the essential aspects for a simple search tool, though pagination details implicit in limit param are not elaborated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions cover both parameters (100% coverage). The description adds an example value for 'q' ('146518_8.01') and clarifies it's a prefix search, providing context beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it searches land parcels by parcel ID prefix with autocomplete, specifies return fields (district, area, GPS coordinates), and distinguishes from sibling tools like search_transactions or search_by_area by focusing on ID prefix matching.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage hint: 'Useful for finding exact parcel IDs, then searching transactions nearby.' This implies a workflow and context, though it does not explicitly state when not to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_transactionsARead-onlyInspect
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 the map. From a result's "id:" line and its "Location: °N, °E" line, build https://cenogram.pl/ceny-transakcyjne?src=mcpstdio#v=1&lat=&lng=&z=16&tx= (drop the °N/°E; lat = the °N number, lng = the °E number) — opens that exact transaction on the map. Omit &tx= for the area only. Field provenance: values are from the notarial deed (RCN) by default; computed values (parcel area summed across plots or converted from hectares, an inferred/reclassified property type) and approximated streets are flagged inline with a neutral [...] note. Location matches TERYT districts only - for neighborhoods (osiedla), use search_by_area instead.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 1) | |
| sort | No | Sort by field (default: date) | date |
| floor | No | 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. | |
| limit | No | Number of results (1-50, default 10) | |
| order | No | Sort order (default: desc) | desc |
| rooms | No | 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. | |
| teryt | No | TERYT administrative code(s) for precise area filtering. Comma-separated, max 10. 2-digit (voivodeship), 4-digit (county), 6-digit (municipality), or full precinct code (e.g. '321705_2.0054'). Use list_locations to find codes. More precise than 'location' - avoids name ambiguity. | |
| dateTo | No | End date (YYYY-MM-DD) | |
| street | No | Street name filter (partial match, e.g. 'Puławska', 'Trakt Lubelski') | |
| maxArea | No | Maximum area in m² | |
| minArea | No | Minimum area in m² | |
| dateFrom | No | Start date (YYYY-MM-DD) | |
| location | No | Location name - city (e.g. 'Warszawa', 'Kraków', 'Gdańsk') or district (e.g. 'Mokotów', 'Kraków-Podgórze'). 'Warszawa', 'Kraków', 'Łódź' auto-expand to all sub-districts. Use list_locations to find valid names. | |
| maxPrice | No | Maximum price in PLN | |
| minPrice | No | Minimum price in PLN | |
| parcelId | No | Exact parcel ID as returned in search results (e.g. '146518_8.0108.27'). Must match exactly - copy from a previous search result's parcel_id field. | |
| floodRisk | No | Flood-hazard filter. high = most frequent flooding (~1-in-10-year), medium (~1-in-100-year), low = rarest (~1-in-500-year). Selects ONLY transactions whose land sits in a mapped flood zone; absence of a zone is never asserted as 'safe'. Multi-select; e.g. ['medium','high'] = at least medium risk. | |
| marketType | No | Market type: primary (developer) or secondary (resale). ~55% of records have unknown market type and will be excluded when this filter is used. | |
| buildingType | No | Building type filter (PKOB classification). 'unknown' = no type recorded (NULL); without it such rows are excluded (~39% of buildings have no type). | |
| propertyType | No | Property type filter | |
| unitFunction | No | 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'. | |
| landslideRisk | No | Landslide-hazard filter, from official landslide-hazard maps (1:10,000 scale). 'landslide' = the land intersects a mapped landslide area; 'threatened' = an area threatened by mass movements. Selects ONLY transactions whose land intersects a mapped hazard area — an intersection means overlap with a mapped area, not that the parcel itself is a landslide; absence of a zone is never asserted as 'safe'. Multi-select; e.g. ['landslide','threatened'] = any mapped hazard. | |
| ownershipType | No | 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. | |
| buildingNumber | No | Building/house number (e.g. '251C', '12A'). Requires location or street to be set. | |
| heritageStatus | No | Heritage-listing filter. listed = a protected monument on/at the property's land; zone = the land lies within a protected urban layout or the designated surroundings of a monument. Selects ONLY transactions where a listing was detected; absence of a detection is never asserted as 'not listed'. Multi-select; e.g. ['listed'] = individually listed properties only. | |
| mpzpDesignation | No | MPZP zoning designation filter (exact match, e.g. 'budownictwoMieszkanioweWielorodzinne', 'terenObiektowProdukcyjnychSkladowIMagazynow'). Use 'unknown' for rows with no designation recorded (NULL); distinct from the registry code 'brakMPZPLubWZ' (= 'no plan/WZ' recorded as data). | |
| transactionType | No | Transaction type filter. For market analysis, ALWAYS specify transactionType to exclude non-market transactions (subsidized, foreclosure, public purpose). ~2% of transactions have unknown type (NULL) and are excluded when this filter is used unless 'unknown' is included. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only indicate readOnlyHint=true. The description adds rich behavioral context: data provenance (notarial deed vs computed), data quality issues (55% NULL marketType, 1.7% missing dates), location granularity (TERYT districts only), and permalink shareability. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is well-structured with clear sections: purpose, data notes, permalink, provenance, location scope. Some redundancy (e.g., repeated '8M+ records') could be trimmed, but overall efficient and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 27 parameters and no output schema, the description covers essential context: data source, quality, usage tips, permalink, field provenance, and sibling distinction. Very complete for a complex search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description does not add parameter-specific details beyond schema, but provides contextual usage (e.g., 'Use list_locations first') that indirectly helps. No additional parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it searches Polish real estate transactions from the RCN registry, listing return fields (address, date, price, etc.). It distinguishes from sibling tool search_by_area which handles neighborhoods.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: use list_locations first, example query, data notes on NULL marketType/missing dates, permalink construction, and advice to filter transactionType for market analysis. Clearly distinguishes from search_by_area.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
1 tool update
v0.6.0- Changed
search_by_polygon2 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Max results (1-5000, default 100). MCP displays up to 50 transactions."New value: +"Max results (1-3000, default 100). MCP displays up to 50 transactions." - changed
Input schema / properties / limit / maximumPrevious value: -5000New value: +3000
23 tool updates
v0.5.0- First observed
compare_locations - First observed
estimate_value - First observed
get_building_breakdown - First observed
get_demographics - First observed
get_infrastructure_signals - First observed
get_market_overview - First observed
get_parcel_report - First observed
get_price_distribution - First observed
get_price_statistics - First observed
get_transaction_farmland - First observed
get_transaction_flood - First observed
get_transaction_heritage - First observed
get_transaction_landslide - First observed
get_transaction_permits - First observed
get_transaction_planning - First observed
get_transaction_surroundings - First observed
get_transaction_transit - First observed
list_locations - First observed
resolve_parcel - First observed
search_by_area - First observed
search_by_polygon - First observed
search_parcels - First observed
search_transactions
TDQS
Each tool has a clearly distinct purpose: spatial searches (search_transactions, search_by_area, search_by_polygon), statistics (get_price_statistics, get_price_distribution, compare_locations), parcel operations (search_parcels, resolve_parcel, get_parcel_report), and enrichment layers (get_building_breakdown, get_transaction_flood, etc.) are all uniquely identifiable. No two tools overlap significantly.
All tool names follow a consistent verb_noun pattern in snake_case (e.g., get_market_overview, search_transactions, resolve_parcel). The verbs are predictably chosen for the action (get for data retrieval, search for finding records, list for enumeration, compare for comparison, estimate for valuation). No mixing of conventions.
With 23 tools, the set is comprehensive but not excessive. Each tool serves a specific function within the Polish real estate domain, from transaction search to parcel enrichment to demographics. The count feels well-scoped for the server's purpose.
The tool surface covers the full lifecycle of real estate data exploration: searching transactions (by text, area, polygon), statistics, parcel identification, detailed parcel reports (including multiple enrichment layers), demographics, infrastructure signals, and value estimation. There are no obvious gaps for the stated domain.
Maintenance
Related MCP Connectors
Polish company registry: 4.4M firms, KRS/REGON data, VAT white list checks, financial statements
Czech distress real estate — paid tier (full search, owner data, RUIAN).
Verified Polish open data for AI agents: debt, budget, 460 MPs, votings, judiciary search, RAG.
UK property data — Land Registry comps, EPC, Rightmove, rental yields, stamp duty, Companies House
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceProvides access to Poland's largest business registry database, enabling company search, beneficiary checks, and financial document retrieval via natural language.1-
- AlicenseAqualityBmaintenanceEnables searching Polish administrative areas and retrieving real estate transaction data from the official registry via geoportal.gov.pl.3GPL 3.0
- AlicenseNot gradedqualityCmaintenanceAnalyzes French real-estate market using open data sources like DVF transactions, DPE certificates, and risk data.MIT
- AlicenseNot gradedqualityCmaintenanceFind, analyze, and score Polish public tenders (BZP): parsed requirements, deadlines, certificates, and bid-fit scoring against your company profile.17MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/cenogram/mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server