Skip to main content
Glama
cenogram-mcp-server

cenogram-mcp-server

Official

get_permits_in_area

Read-only

Find building permits and works notifications registered since 2016 within a radius around a point to see what is being built nearby.

Instructions

List the building permits and works notifications registered since 2016 within a radius of a point - issued decisions only, matched through the parcel geometry we hold, which is near-complete but not the whole cadastre - to see what is being built nearby. Returns cases newest first, NOT nearest first (a permit and a notification for one investment are two cases), plus an aggregate by year and statutory object category over ALL matched cases (do not add it up across pages) with the permit/notification split and building volume. truncated = more cases than the limit: pass the returned cursor back as cursor with the same filters. Examples: apartment blocks → categories=[XIII]; drop utility-network noise (XXVI can be most of a list) → excludeCategories=[XXVI]; utility works as a sign that land is being serviced for development → categories=[XXVI]. For "how many / how much" pass aggregateOnly=true (same price). The list is ordered by date: for what is closest use a smaller radiusKm (e.g. 0.3) instead of paging; radiusKm is 0.1–2 (default 2), for a wider area make several calls for neighbouring centres. Reading it: decision outcomes (granted or refused) are not held; notifications only where accepted without objection; pending cases not at all. Matching uses the parcel's current identifier and geometry, so cases filed before a split or merge may be missed, parcels without geometry are not searched and a parcel number with a sheet segment may be matched less exactly. The answer states how many parcels we hold in the circle (0 = no data for the area) and the date of the last refresh: loaded periodically, not live. A volume marked suspect stays in the sums. A short or empty list is never a statement that nothing is being built. A query over the time limit returns an error asking for a smaller radius. Coordinates: for a parcel take them from resolve_parcel (or search_parcels); for a street use list_parcels_in_area(location, street) and the centre point of a returned row; otherwise from the user - never guess them. Cost: 5 API tokens per call, also for an empty list; each page is a separate call. It can be switched off for maintenance (a plain "temporarily unavailable" reply).

Input Schema

NameRequiredDescriptionDefault
latYesCircle centre latitude (WGS84, Poland), from resolve_parcel / list_parcels_in_area or the user; never guessed.
lngYesCircle centre longitude (WGS84, Poland), from resolve_parcel / list_parcels_in_area or the user; never guessed.
limitNoCases in the list, 1–200 (default 50). The aggregate counts all matched cases.
cursorNoCursor from the previous answer, for the next page; pass it back unchanged with the same filters. Not with aggregateOnly.
dateToNoWindow end, YYYY-MM-DD, inclusive, not before dateFrom. When older than two years, pass dateFrom as well.
intentNomulti_family = categories [XIII], single_family = [I] (incl. semi-detached and terraced), all = no filter (default). Not with categories.
dateFromNoWindow start, YYYY-MM-DD (decision date; intake date for notifications). Default two years back; earlier than 2016-01-01 counts as 2016-01-01.
radiusKmNoRadius in km, 0.1–2 (default 2).
worksTypeNonew_construction (default) or all (adds extensions, demolitions and other works).
categoriesNoKeep only these object categories (Roman numerals I–XXX). Not with intent other than all; must not overlap excludeCategories.
aggregateOnlyNotrue = only the aggregate (year × category counts, split, volumes), no case list. Same price; not with cursor.
excludeCategoriesNoDrop these object categories (cases without a category stay). Must not overlap categories.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Addedv0.18.0

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare a safe read; the description adds far more: 5-token cost per call including empty results, per-page charging, periodic (not live) refresh, maintenance outages, an error when the query exceeds the time limit, and the aggregate covering all matched cases rather than the page. It also discloses real data gaps — no decision outcomes, only accepted notifications, no pending cases, parcels without geometry unsearched — which materially shapes interpretation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose and the 'newest first, not nearest first' caveat are front-loaded, and almost every clause carries operational value. It is nonetheless a dense wall of text without sectioning, and the cost/paging points are restated in more than one place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 12 parameters, no output schema and a complex data source, the description covers return ordering, the year×category aggregate with permit/notification split and volumes, the truncated/cursor protocol, refresh staleness and failure modes. Little an agent needs in order to call and interpret this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so the baseline is 3; the description still adds cross-parameter meaning the schema only states tersely, e.g. that the cursor must be replayed with identical filters, that pages must not be summed, and that aggregateOnly costs the same. It does not add much beyond the schema for lat/lng/date bounds, which the schema already documents well.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb and resource ('List the building permits and works notifications'), plus scope (since 2016, within a radius of a point, issued decisions only) and the matching mechanism (parcel geometry held by the service). An agent knows exactly what it gets back compared with a transaction-lookup sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing guidance: use categories=[XIII] for apartment blocks, excludeCategories=[XXVI] to drop utility noise, aggregateOnly=true for 'how many', and a smaller radiusKm instead of paging to find what is nearest. It also says where coordinates must come from (resolve_parcel / list_parcels_in_area) and forbids guessing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.