Skip to main content
Glama
README.md
# PRG MCP

Serwer MCP dla Panstwowego Rejestru Granic (PRG), oficjalnego rejestru
Glownego Urzedu Geodezji i Kartografii. Udostepnia lokalne dane o granicach,
wlasciwosci terytorialnej, punktach adresowych i ulicach jako narzedzia dla
asystentow oraz automatyzacji.

Obslugiwane zbiory:

- 54 warstwy PRG lacznie: 52 warstwy WFS granic i wlasciwosci
  terytorialnej oraz `A07` punkty adresowe i `A08` ulice;
- lokalne pokrycie danych, status zrodel i planowanie zakresow.

Pakiet npm: `prg-mcp`.

## Typowe Pytania

To sa najwazniejsze zastosowania serwera.

### Znalezienie jednostki administracyjnej

Prompt:

```text
Znajdz gmine Wieliszew.
```

Narzedzie: `search_areas`

Input:

```json
{
  "category": "administrative",
  "query": "Wieliszew",
  "limit": 5
}
```

Odpowiedz ma postac:

```json
{
  "areas": [
    {
      "areaId": "opaque-id",
      "category": "administrative",
      "code": "1408032",
      "layerId": "A03",
      "layerTitle": "Granice gmin",
      "name": "Gmina Wieliszew",
      "objectId": "gmina-wieliszew",
      "snapshotId": 1
    }
  ],
  "source": {
    "system": "PRG",
    "layerIds": ["A00", "A01", "A02", "A03", "A04", "A05", "A06"],
    "channels": ["wfs"]
  },
  "datasetState": "installed",
  "syncedAt": "2026-06-22T00:00:00.000Z",
  "coverage": {
    "complete": true,
    "installedPairs": ["A03:country:PL"],
    "installedScopes": ["country:PL"],
    "missingScopes": []
  }
}
```

### Sprawdzenie obszarow obejmujacych punkt

Prompt:

```text
W jakiej gminie i powiecie lezy punkt EPSG:2180 637807, 486708?
```

Narzedzie: `locate_point`

Input:

```json
{
  "category": "administrative",
  "x": 637807,
  "y": 486708,
  "limit": 10
}
```

Odpowiedz zawiera `matches` posortowane deterministycznie oraz metadane
`source`, `datasetState`, `syncedAt` i `coverage`.

### Ustalenie wlasciwosci terytorialnej

Prompt:

```text
Jaki sad rejonowy jest wlasciwy dla tego punktu?
```

Narzedzie: `locate_point`

Input:

```json
{
  "layerIds": ["S03"],
  "x": 637807,
  "y": 486708,
  "limit": 5
}
```

Dla prokuratur uzyj warstw `P01-P03`, dla policji `K01-K13`, a dla urzedow
`U01-U11`.

### Znalezienie punktu adresowego

Prompt:

```text
Znajdz adres Warszawa Zurawia 12A.
```

Narzedzie: `search_addresses`

Input:

```json
{
  "query": "Warszawa Zurawia 12A",
  "voivodeshipCodes": ["14"],
  "limit": 5
}
```

Odpowiedz ma postac:

```json
{
  "addresses": [
    {
      "addressId": "opaque-id",
      "buildingNumber": "12A",
      "localityName": "Warszawa",
      "point": [637807, 486708],
      "postalCode": "00503",
      "postalCodeNote": "postal_code_is_prg_attribute_not_postal_service_validation",
      "sourceScope": "woj:14",
      "streetName": "Zurawia",
      "voivodeshipCode": "14"
    }
  ],
  "datasetState": "installed",
  "coverage": {
    "complete": true,
    "installedPairs": ["A07:voivodeship:14"],
    "installedScopes": ["voivodeship:14"],
    "missingScopes": []
  }
}
```

Kod pocztowy jest atrybutem punktu adresowego PRG. To nie jest walidacja
operatorska Poczty Polskiej.

### Odwrotne wyszukiwanie adresu

Prompt:

```text
Co jest najblizszym adresem dla punktu 637807, 486708?
```

Narzedzie: `reverse_address`

Input:

```json
{
  "x": 637807,
  "y": 486708,
  "radiusMeters": 1000,
  "voivodeshipCodes": ["14"],
  "limit": 5
}
```

Narzedzie ma twardy limit promienia i kandydatow. Nie udaje trafienia poza
limitem.

### Znalezienie ulicy

Prompt:

```text
Znajdz ulice Zurawia w danych PRG.
```

Narzedzie: `search_streets`

Input:

```json
{
  "query": "Zurawia",
  "voivodeshipCodes": ["14"],
  "limit": 5
}
```

Do pobrania szczegolow i geometrii ulicy sluzy `get_street`.

### Pobranie geometrii obszaru

Prompt:

```text
Pokaz geometrie gminy Wieliszew.
```

Narzedzie: `get_area_geometry`

Input:

```json
{
  "areaId": "opaque-id",
  "maxVertices": 10000,
  "toleranceMeters": 0
}
```

Odpowiedz jest w `EPSG:2180`. Dla duzych eksportow uzyj CLI `prg-mcp export`,
zamiast zalewac kontekst modelu pelna geometria.

### Brak lokalnych danych

Gdy wymagany zakres nie jest zainstalowany, narzedzia danych nie zwracaja
pustej listy. Zwracaja blad `DATA_NOT_INSTALLED` z informacja, ze ten build
nie zawiera spakowanego runnera synchronizacji, np.:

```text
PRG address data is not installed for the requested scope. Data synchronization is not packaged in this build; prepare PRG address data for voivodeship 14 with a configured import pipeline.
```

## Co Jest W PRG, A Czego Nie Ma

Ten serwer celowo trzyma sie PRG. Dlatego obsluguje oficjalne granice,
wlasciwosc terytorialna, punkty adresowe, ulice i relacje przestrzenne, ale nie
udaje uniwersalnego rejestru publicznego.

W zakresie PRG:

- granice panstwa, wojewodztw, powiatow, gmin, miast, jednostek
  ewidencyjnych i obrebow;
- obszary statystyczne, sadowe, prokuratorskie, policyjne, strazy pozarnej,
  strazy granicznej, skarbowe, lesne, wodne i morskie;
- punkty adresowe `A07` z lokalizacja w `EPSG:2180`;
- ulice `A08` i ich geometrie;
- daty stanu, wersje i atrybuty z lokalnej migawki;
- lokalne pokrycie danych i status oficjalnych zrodel.

Poza zakresem PRG:

- pelne slowniki TERYT, historia zmian TERYT i klasyfikacje statystyczne poza
  atrybutami obecnymi w PRG;
- nazwy geograficzne PRNG;
- dzialki, budynki, lokale i ksiegi wieczyste EGiB;
- walidacja kodow pocztowych Poczty Polskiej;
- trasowanie, routing i adresy spoza lokalnie zsynchronizowanego zakresu.

Do tych danych potrzebne sa inne zrodla, np. `teryt-mcp` dla TERYT, PRNG dla
nazw geograficznych, EGiB dla katastru albo osobny slownik PNA dla kodow
pocztowych.

## Narzedzia MCP

Wszystkie narzedzia zwracaja `structuredContent`. Publiczne narzedzia MCP sa
obecnie read-only. Runner synchronizacji nie jest wystawiony jako `sync_data`,
dopoki zrodla i publisher nie sa spiete produkcyjnie.

Narzedzia zwracajace dane PRG dolaczaja:

```text
source
datasetState
syncedAt
coverage
```

### Operacyjne

#### `about`

Zwraca informacje o pakiecie, autorze, repozytorium i wersji schematu.

Input:

```json
{}
```

#### `health_status`

Sprawdza, czy serwer odpowiada.

Input:

```json
{}
```

Odpowiedz:

```json
{
  "ok": true
}
```

#### `server_status`

Zwraca status runtime, katalog danych, pliki SQLite oraz dostepnosc FTS5 i
R-tree.

Input:

```json
{}
```

#### `list_layers`

Zwraca katalog 54 warstw PRG z lokalna dostepnoscia, zakresami i liczba
rekordow.

Input:

```json
{
  "limit": 100
}
```

#### `source_status`

Pokazuje zainstalowane pokrycie i opcjonalny status zrodel.

Input:

```json
{
  "checkRemote": false
}
```

Planowane tryby synchronizacji:

```text
missing  pobierz tylko brakujace zakresy
stale    pobierz nieaktualne zakresy
force    przebuduj wskazane zakresy
```

Profile planowania:

```text
administrative         podstawowe granice administracyjne
administrative-history archiwalne granice administracyjne; wymaga --archive-year
addresses              punkty adresowe i ulice dla wskazanych zakresow
boundaries-full        wszystkie warstwy graniczne PRG
poland-full            pelna instalacja Polski, wymaga jawnego potwierdzenia w CLI
```

### Obszary

#### `search_areas`

Szuka jednostki, sadu, urzedu albo obszaru po nazwie, kodzie, kategorii,
warstwie, dacie waznosci i migawce.

Input:

```json
{
  "query": "Krakow",
  "category": "administrative",
  "limit": 20
}
```

#### `get_area`

Pobiera jeden obiekt PRG po `areaId`, bez pelnej geometrii.

Input:

```json
{
  "areaId": "opaque-id"
}
```

#### `get_area_geometry`

Pobiera kontrolowana geometrie GeoJSON w `EPSG:2180`.

Input:

```json
{
  "areaId": "opaque-id",
  "maxVertices": 10000,
  "toleranceMeters": 0
}
```

#### `locate_point`

Znajduje obszary pokrywajace punkt w `EPSG:2180`.

Input:

```json
{
  "x": 566000,
  "y": 244000,
  "category": "administrative",
  "limit": 20
}
```

#### `relate_areas`

Znajduje ograniczone relacje przestrzenne miedzy jednym obiektem a wskazanymi
warstwami lub kategoria.

Input:

```json
{
  "areaId": "opaque-id",
  "layerIds": ["W01"],
  "limit": 20
}
```

### Adresy i Ulice

#### `search_addresses`

Szuka punktow adresowych po tekscie naturalnym albo polach strukturalnych.
`query` i `structured` sa wzajemnie wykluczajace sie.

Input:

```json
{
  "query": "Warszawa Zurawia 12A",
  "voivodeshipCodes": ["14"],
  "limit": 20
}
```

#### `get_address`

Pobiera punkt adresowy po `addressId`.

Input:

```json
{
  "addressId": "opaque-id"
}
```

#### `reverse_address`

Szuka najblizszych punktow adresowych wokol punktu `EPSG:2180`.

Input:

```json
{
  "x": 637807,
  "y": 486708,
  "radiusMeters": 500,
  "voivodeshipCodes": ["14"],
  "limit": 10
}
```

#### `search_streets`

Szuka ulic `A08`.

Input:

```json
{
  "query": "Zurawia",
  "voivodeshipCodes": ["14"],
  "limit": 20
}
```

#### `get_street`

Pobiera szczegoly i geometrie ulicy po `streetId`.

Input:

```json
{
  "streetId": "opaque-id"
}
```

## Instalacja

Uruchomienie bez instalacji globalnej:

```bash
npx -y prg-mcp serve
```

Instalacja globalna:

```bash
npm install -g prg-mcp
prg-mcp serve
```

Wymagania:

- Node.js `>=22.0.0`;
- SQLite z FTS5 i R-tree, sprawdzane przez `server_status` albo `prg-mcp doctor`.

Dane PRG nie sa dolaczane do pakietu npm. Serwer moze odpowiedziec na status i
katalog narzedzi bez lokalnych danych, ale wyszukiwanie wymaga jawnej
synchronizacji.

## Podlaczenie Do Klienta MCP

Konfiguracja dla transportu stdio:

```json
{
  "mcpServers": {
    "prg": {
      "command": "npx",
      "args": ["-y", "prg-mcp", "serve"],
      "env": {
        "MCP_DATA_DIR": "/absolute/path/to/prg-data"
      }
    }
  }
}
```

Przy instalacji globalnej:

```json
{
  "mcpServers": {
    "prg": {
      "command": "prg-mcp",
      "args": ["serve"],
      "env": {
        "MCP_DATA_DIR": "/absolute/path/to/prg-data"
      }
    }
  }
}
```

### Codex

Codex CLI i rozszerzenie Codex dla IDE wspoldziela konfiguracje
`~/.codex/config.toml`. Plik VS Code `User/mcp.json` nie rejestruje serwera w
Codex.

Najprosciej dodac globalnie zainstalowany serwer poleceniem:

```bash
codex mcp add prg-mcp -- prg-mcp serve
```

Odpowiednik w `~/.codex/config.toml`:

```toml
[mcp_servers.prg-mcp]
command = "prg-mcp"
args = ["serve"]

[mcp_servers.prg-mcp.env]
MCP_DATA_DIR = "/absolute/path/to/prg-data"
```

Po zmianie konfiguracji uruchom nowy proces lub nowa sesje Codex i sprawdz
serwer przez `codex mcp list` albo `/mcp` w interfejsie terminalowym.

### Claude Desktop i VS Code

Claude Desktop oraz VS Code uzywaja konfiguracji `mcpServers` pokazanej wyzej.
W srodowisku, ktore czysci cache miedzy uruchomieniami, ustaw staly
`MCP_DATA_DIR`, inaczej serwer moze startowac bez lokalnych danych.

## Plan Danych

Serwer moze zwracac status bez lokalnych baz, ale wyszukiwanie i lookupy
wymagaja lokalnych plikow SQLite. Publiczny runner synchronizacji nie jest
jeszcze spakowany; `setup` zwraca estymacje i `syncAvailable: false`.

Podstawowe komendy CLI:

```bash
prg-mcp tools
prg-mcp status
prg-mcp coverage
prg-mcp source-status
prg-mcp doctor
```

Rekomendowany plan startowy:

```bash
prg-mcp setup
```

Plan adresow dla jawnego zakresu:

```bash
prg-mcp setup --profile addresses --teryt 14
```

Pelna instalacja Polski jest duza i wymaga jawnego potwierdzenia:

```bash
prg-mcp setup --profile poland-full --confirm-poland-full
```

## CLI

CLI jest pomocnicze. Pelny zestaw funkcji jest dostepny przez MCP.

```bash
prg-mcp serve
prg-mcp tools
prg-mcp setup
prg-mcp status
prg-mcp coverage
prg-mcp source-status
prg-mcp doctor
prg-mcp call list_layers '{}'
prg-mcp call search_areas '{"query":"Warszawa","category":"administrative","limit":5}'
prg-mcp call source_status '{"checkRemote":false}'
```

Eksport geometrii przez CLI:

```bash
prg-mcp export --layer A03 --id '<object-id>' --format geojson --crs EPSG:4326
```

## HTTP

HTTP jest przydatne do lokalnego testowania albo wlasnych wrapperow:

```bash
MCP_TRANSPORT=http MCP_PORT=3000 prg-mcp serve
```

Endpointy:

```text
GET  /health
POST /tools/:toolName
```

Przyklad:

```bash
curl -s http://127.0.0.1:3000/tools/search_areas \
  -H 'content-type: application/json' \
  -d '{"query":"Krakow","category":"administrative","limit":3}'
```

Odpowiedz HTTP zawiera wynik narzedzia MCP:

```json
{
  "structuredContent": {
    "areas": [],
    "datasetState": "installed",
    "coverage": {
      "complete": true,
      "installedPairs": ["A03:country:PL"],
      "installedScopes": ["country:PL"],
      "missingScopes": []
    }
  }
}
```

## Konfiguracja Runtime

```text
MCP_TRANSPORT=stdio|http   # domyslnie stdio
MCP_PORT / PORT            # domyslnie 3000 dla HTTP
MCP_DATA_DIR               # katalog baz SQLite i metadanych synchronizacji
MCP_CONFIG_DIR             # katalog konfiguracji runtime
MCP_LOG_LEVEL              # debug|info|warn|error|silent
PRG_SOURCE_TIMEOUT_MS      # timeout pojedynczego zadania zrodlowego
PRG_MAX_DOWNLOAD_BYTES     # twardy limit rozmiaru pobrania
PRG_SYNC_CONCURRENCY       # liczba rownoleglych pobran
PRG_FRESHNESS_CHECK_MS     # minimalny odstep miedzy sprawdzeniami swiezosci zrodel
```

Pliki lokalne:

```text
<data-dir>/catalog.sqlite
<data-dir>/boundaries.sqlite
<data-dir>/addresses-<woj>.sqlite
<data-dir>/*.lock
```

Nowe wydania moga zmieniac schemat SQLite. Serwer i narzedzia synchronizacji
wykrywaja stan schematu przez metadane lokalnych baz.

## Development

Dla osob rozwijajacych repozytorium:

```bash
pnpm install
pnpm build
pnpm quality
pnpm test:pack-smoke
```

Benchmark lokalny dla pelnej instalacji Polski:

```bash
PRG_DATA_DIR=/absolute/path/to/prg-data pnpm benchmark:full-poland
```

Szczegoly architektury i kontraktow:

- [docs/tools.md](docs/tools.md)
- [docs/data-sync.md](docs/data-sync.md)
- [docs/intent-selection.md](docs/intent-selection.md)
- [docs/tutorial.md](docs/tutorial.md)
- [docs/troubleshooting.md](docs/troubleshooting.md)
- [docs/provenance.md](docs/provenance.md)
- [docs/layer-coverage.md](docs/layer-coverage.md)
- [docs/release.md](docs/release.md)

## Licencja i Zrodlo Danych

Kod projektu: Copyright 2026 Maciej Ciemborowicz. Udostepniany wylacznie na
warunkach [European Union Public Licence 1.2](LICENSE) (`EUPL-1.2 only`).

Dane PRG pochodza z Glownego Urzedu Geodezji i Kartografii oraz serwisu
[Geoportal.gov.pl](https://www.geoportal.gov.pl/pl/dane/panstwowy-rejestr-granic-prg/).
Informacje o ich pozyskiwaniu i przetwarzaniu znajduja sie w pliku
[NOTICE.md](NOTICE.md).

TDQS

A4.4/5.0

Scored across 1 tool

Disambiguation5/5

Only one tool exists, so there is no possibility of confusion with other tools.

Naming Consistency5/5

With a single tool, there is no inconsistency to evaluate; the name 'health_status' is clear and follows snake_case convention.

Tool Count3/5

The server has only one tool. While it serves a specific purpose, this is on the low end of the scale and may feel thin if the server is intended for broader use.

Completeness5/5

For a health check server, a single tool that returns server health is complete and covers the domain.

Maintenance

ActivityInactive
ResponsivenessNo issues