Use for ANY Croatian/Serbian cadastre (katastar) or land-registry (zemljišne knjige, gruntovnica, ZK) question - looking up parcels (čestica, k.č.) by cadastral municipality (katastarska općina, k.o.), finding owners (vlasnici, suvlasnički udjeli, vlastovnica / B-list), possessors (posjedovni list), land-registry units (zemljišnoknjižni uložak), encumbrances (teret, teretovnica / C-list), or parcel geometry. Reach for the cadastral MCP tools (find them via tool search for "cadastre" / "katastar" / "land registry").
78
98%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
This project exposes a cadastral/land-registry MCP server. Its tools are the way
to answer parcel and ownership questions - prefer them over guessing. If they are
not already loaded, find them by searching available tools for cadastre,
katastar, land registry, zemljišne knjige, or parcel.
Cadastre and land registry are different registers and often list different people. Choose deliberately:
Every returned person record carries a register field
(cadastre | land_registry) - check it.
Two tools do the work; both take a list of references (one for a single item, several for a portfolio) and return one entry per reference, in order.
get_lr_unit with
{"parcel_number": ..., "municipality": ...} references. It resolves the
land-registry unit even when the parcel has no direct unit (via parcel links;
check lr_unit_derived_from_links) and returns B-list owners.get_parcel with
source="cadastre" (find_parcel for a bare existence check + parcel_id).get_parcel call with all references
(source="land_registry" if owners are wanted), then one get_lr_unit call
with the parcel references or the returned data.lr_unit references. Units
shared by several parcels are fetched once (status: "duplicate",
same_unit_as).get_lr_unit with
{"lr_unit_number": "769", "main_book_id": 21277}, or with
"main_book_name": "SAVAR" when only the main book (glavna knjiga) name is
known; find_main_book lists the books.get_lr_unit entry is an error saying so.compare_registers
with the parcel references: relationship per parcel (same,
overlapping, disjoint, cadastre_only), matched pairs (fuzzy when
the match rests on the name without "POK./UD."), who is in one register
only, party_type_inferred (always an inference), distinct people across
the set. Read both registers through it instead of comparing by hand.build_assembly with up
to 50 parcel references: matrix of persons x parcels, persons ranked by
controlled area (grouped by surname), parcels ranked by ease of
acquisition with the weights and per-parcel factors shown (a factor
not evaluated is left out, never counted against the parcel);
include_zoning for the building-area factor; export for CSV/GeoJSON
text. Quote the caveats in notes (inferred party types, cadastre areas).get_possession_sheet with the exact number. A harmonized sheet has no
cadastre possessors (possessors_in_land_registry); its registered owners
come back under owners. find_possession_sheet lists the sheets whose
number begins with a text, at most 50, from an index that lags: an empty
answer is not proof the sheet does not exist. KPU books ->
find_book_of_dc.get_lr_unit with include_plombe_detail,
or get_file_status for one file number and the unit's institution_id.list_municipalities with the
office_id from list_cadastral_offices.get_parcel_geometry.find_parcels_in_area (bbox,
polygon or centre + radius, EPSG:3765 metres as get_parcel_geometry
returns them) and find_parcel_neighbours (shared boundary, corner touch).
Both read the cached cadastral map and give numbers and graphical areas
only; follow with get_parcel / get_lr_unit for the registers.get_lr_unit takes detail = summary | ownership (default) | shares |
parcels | encumbrances | full:
ownership returns B-list owners + structured shares
(share = {num, den, decimal}) + a summary - it already fits in context.shares is raw list B (shares with sub-shares, entries, status), parcels
is list A and encumbrances is list C, each on its own; reach for full
only when every sheet and the geometry are needed at once.limit and page with offset: every level carries a
page block (total, returned, truncated, next_offset). A response
too large to return comes back as that unit's error with the smaller
options named; use a per-sheet level with a limit instead of retrying full.historical_overview=true adds deleted entries and non-active shares.status (success, error, duplicate); read the
error and error_type of a failed reference instead of retrying blindly:
*_not_found means no such record, access_denied that the server refused,
rate_limit that it throttled, response_too_large that the entry must be
paged (limit, offset), invalid_request that the reference was wrong.
Tool-level errors end with [error_type=...] for the same reason.provenance (register, source_url,
retrieved_at): quote it with any fact you forward, so the answer is never
taken for an official extract. get_parcel entries also carry area_check
(cadastre area against the cadastral map's graphical area and, when known,
the land register's; mismatch above 5 %). get_lr_unit entries carry
distinct_owners next to total_owners (one person on two shares is two
records, one owner) for judging fragmentation.in_land_registry: false (or the
parcel_not_in_land_registry error) is cadastre-only - report it as such
rather than inventing an owner.name_normalized companion; the raw name preserves
source quirks (use it for fidelity, the normalized form for matching/display).entry (the registration entry: order number, receipt
date, diary number, action type); share_entries are notes registered on
single shares. Cite them when asked how or when someone became owner.db6a36d
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.