npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

teryt-mcp

v1.0.0

Published

MCP server for the official Polish TERYT registry.

Readme

TERYT MCP

Serwer MCP dla oficjalnego rejestru TERYT. Udostępnia dane GUS o jednostkach terytorialnych, miejscowościach i ulicach jako narzędzia dla asystentów oraz automatyzacji.

Obsługiwane zbiory:

  • TERC - województwa, powiaty, gminy i typy jednostek;
  • SIMC - miejscowości;
  • ULIC - ulice;
  • WMRODZ - słownik rodzajów miejscowości.

Pakiet npm: teryt-mcp.

Typowe Pytania

To są najważniejsze zastosowania serwera.

Znalezienie jednostki TERYT

Prompt:

Znajdź identyfikator TERYT dla województwa dolnośląskiego.

Narzędzie: search_units

Input:

{
  "query": "dolnoslaskie",
  "limit": 5
}

Odpowiedź ma postać:

{
  "units": [
    {
      "confidence": 0.95,
      "matchedBy": "exact_normalized_name",
      "unit": {
        "id": "02",
        "name": "DOLNOŚLĄSKIE",
        "stateDate": "2026-01-01",
        "type": "województwo"
      }
    }
  ],
  "stateDate": "2026-01-01"
}

Znalezienie miejscowości

Prompt:

Znajdź miejscowości SIMC o nazwie Kraków.

Narzędzie: search_places

Input:

{
  "query": "Kraków",
  "limit": 5
}

Odpowiedź ma postać:

{
  "places": [
    {
      "confidence": 0.95,
      "matchedBy": "exact_normalized_name",
      "place": {
        "id": "0000000",
        "name": "Kraków",
        "stateDate": "2026-01-01",
        "unitId": "12-61-00-0"
      }
    }
  ],
  "stateDate": "2026-01-01"
}

Znalezienie ulicy

Prompt:

Znajdź ulice ULIC o nazwie Marszałkowska.

Narzędzie: search_streets

Input:

{
  "query": "Marszałkowska",
  "limit": 5
}

Odpowiedź ma postać:

{
  "streets": [
    {
      "confidence": 0.95,
      "matchedBy": "exact_normalized_name",
      "street": {
        "id": "0009876-00123",
        "code": "00123",
        "name": "Marszałkowska",
        "placeId": "0009876",
        "stateDate": "2026-01-01"
      }
    }
  ],
  "stateDate": "2026-01-01"
}

Rozpoznanie miejscowości i ulicy z tekstu

Prompt:

Rozpoznaj "Wieliszew Marszalkowska" i zwróć identyfikatory TERC, SIMC i ULIC.

Narzędzie: resolve_address

Input:

{
  "query": "Wieliszew Marszalkowska",
  "limit": 5
}

Odpowiedź ma postać:

{
  "addresses": [
    {
      "confidence": 0.95,
      "matchedBy": "exact_normalized_address",
      "address": {
        "id": "0008639-12400",
        "unit": {
          "id": "14-08-05-2",
          "name": "Wieliszew",
          "type": "gmina wiejska"
        },
        "place": {
          "id": "0008639",
          "name": "Wieliszew"
        },
        "street": {
          "id": "0008639-12400",
          "code": "12400",
          "name": "Marszałkowska"
        },
        "stateDate": "2026-06-19"
      }
    }
  ],
  "stateDate": "2026-06-19"
}

To nie jest geokodowanie. Narzędzie rozpoznaje identyfikatory rejestrowe do poziomu miejscowości i ulicy. Dla zapytań zawierających wyłącznie miejscowość użyj search_places. Kody pocztowe i numery budynków są odrzucane z czytelnym błędem, ponieważ nie należą do TERYT.

Sprawdzenie konkretnego identyfikatora

Prompt:

Sprawdź jednostkę TERYT 02-01-01-1.

Narzędzie: get_unit

Input:

{
  "id": "02-01-01-1"
}

Odpowiedź ma postać:

{
  "unit": {
    "id": "02-01-01-1",
    "name": "Bolesławiec",
    "stateDate": "2026-01-01",
    "type": "gmina miejska"
  },
  "stateDate": "2026-01-01"
}

Dla brakującego identyfikatora odpowiedź ma postać:

{
  "unit": null,
  "stateDate": null
}

Analogicznie:

  • get_place sprawdza identyfikator SIMC miejscowości;
  • get_street sprawdza identyfikator ULIC ulicy.

Co Jest W TERYT, A Czego Nie Ma

Ten serwer celowo trzyma się TERYT. Dlatego obsługuje identyfikatory i nazwy administracyjne, ale nie udaje geokodera ani rejestru adresów punktowych.

W zakresie TERYT:

  • województwa, powiaty, gminy i ich typy;
  • miejscowości i ich identyfikatory SIMC;
  • ulice i ich identyfikatory ULIC;
  • powiązania miejscowość-jednostka oraz ulica-miejscowość;
  • daty stanu danych z lokalnej migawki.

Poza zakresem TERYT:

  • współrzędne;
  • działki;
  • budynki;
  • kody pocztowe;
  • walidacja punktu adresowego, np. czy istnieje numer budynku przy ulicy.

Do tych danych potrzebne są inne źródła, np. PRG/EMUiA/GUGiK dla punktów adresowych i współrzędnych, EGiB dla katastru albo osobny słownik PNA dla kodów pocztowych. Jeśli te funkcje będą potrzebne, powinny powstać jako osobny serwer lub osobny bounded context, nie jako ukryty dodatek do TERYT.

Narzędzia MCP

Wszystkie narzędzia zwracają structuredContent.

about

Zwraca informacje o pakiecie, autorze, kontakcie, repozytorium, wersji serwera oraz stanie lokalnej synchronizacji danych.

Input:

{}

Odpowiedź ma postać:

{
  "author": {
    "name": "Maciej Ciemborowicz"
  },
  "contact": {
    "email": "[email protected]"
  },
  "repository": {
    "url": "https://github.com/ciembor/teryt-mcp"
  },
  "server": {
    "name": "teryt-mcp",
    "version": "0.1.13"
  },
  "data": {
    "status": "available",
    "synchronizedSuccessfully": true,
    "lastSynchronizedAt": "2026-06-21T00:00:00.000Z",
    "datasets": [
      {
        "dataset": "TERC",
        "stateDate": "2026-01-01",
        "version": "2026-01-01"
      }
    ]
  }
}

TERYT nie ma tu klasycznej wersji semver danych. Pole version jest datą stanu danych STAN_NA z lokalnego manifestu synchronizacji.

health_status

Sprawdza, czy serwer odpowiada.

Input:

{}

Odpowiedź:

{
  "ok": true
}

server_status

Zwraca status runtime serwera.

Input:

{}

Odpowiedź ma postać:

{
  "serverName": "teryt-mcp",
  "serverVersion": "0.1.13",
  "frameworkVersion": "0.2.1",
  "transport": "stdio",
  "dataDir": "/path/to/teryt-data",
  "database": {
    "status": "available"
  }
}

source_status

Pokazuje status lokalnej bazy i metadane źródeł TERYT.

Input:

{}

Odpowiedź ma postać:

{
  "datasets": [
    {
      "dataset": {
        "code": "TERC",
        "name": "Territorial units",
        "sourceUrl": "https://eteryt.stat.gov.pl/eTeryt/"
      },
      "snapshot": null,
      "stateDate": null,
      "sha256": null
    }
  ],
  "lastCheckedAt": null,
  "lastSuccessfulSync": null,
  "localDatabase": {
    "status": "missing"
  },
  "remoteSource": {
    "status": "unknown",
    "errors": []
  }
}

sync_database

Buduje albo przebudowuje lokalną bazę SQLite z oficjalnych danych TERYT.

Input:

{
  "mode": "missing"
}

Tryby:

missing  zbuduj bazę tylko wtedy, gdy jej brakuje
stale    przebuduj bazę, jeśli ma co najmniej 24 godziny
force    przebuduj bazę pod lockiem

Jeśli baza już istnieje, a tryb to missing, odpowiedź ma postać:

{
  "status": "skipped",
  "mode": "missing",
  "databasePath": null,
  "datasets": []
}

Po przebudowie odpowiedź ma postać:

{
  "status": "synced",
  "mode": "force",
  "databasePath": "/path/to/teryt.sqlite",
  "datasets": [
    {
      "dataset": "TERC",
      "recordCount": 123456,
      "stateDate": "2026-01-01",
      "source": "official-teryt-download",
      "sourceUrl": "https://eteryt.stat.gov.pl/eTeryt/",
      "variant": "full"
    }
  ]
}

search_units

Szuka jednostek TERC.

Input:

{
  "query": "Boleslawiec",
  "limit": 20
}

Zwraca:

{
  "units": [],
  "stateDate": "2026-01-01"
}

search_places

Szuka miejscowości SIMC.

Input:

{
  "query": "Stara Wieś",
  "limit": 20
}

Zwraca:

{
  "places": [],
  "stateDate": "2026-01-01"
}

search_streets

Szuka ulic ULIC.

Input:

{
  "query": "Marszałkowska",
  "limit": 20
}

Zwraca:

{
  "streets": [],
  "stateDate": "2026-01-01"
}

resolve_address

Szuka kandydata adresowego do poziomu miejscowości i ulicy.

Input:

{
  "place": "Bolesławiec",
  "street": "Marszałkowska",
  "limit": 20
}

Można również przekazać query, np. Marszalkowska Boleslawiec albo ulica Marszalkowska w Boleslawiec. Pola place i street są preferowane, gdy klient potrafi rozdzielić miejscowość od ulicy.

Zwraca:

{
  "addresses": [],
  "stateDate": "2026-01-01"
}

get_unit

Pobiera jednostkę TERC po identyfikatorze.

Input:

{
  "id": "02-01-01-1"
}

get_place

Pobiera miejscowość SIMC po identyfikatorze.

Input:

{
  "id": "0009876"
}

get_street

Pobiera ulicę ULIC po identyfikatorze.

Input:

{
  "id": "0009876-00123"
}

Dopasowanie I Ranking

matchedBy mówi, dlaczego wynik został zwrócony:

exact_code
exact_normalized_name
exact_normalized_address
prefix
contains

confidence jest wynikiem rankingu wyszukiwania, a nie oficjalną wartością z rejestru. Dopasowanie po dokładnym kodzie ma najwyższy priorytet. Dopasowania zawierające szukany fragment są niżej.

Wyszukiwanie normalizuje polskie znaki, więc zapytania takie jak Boleslawiec mogą znaleźć Bolesławiec.

Instalacja

Uruchomienie bez instalacji globalnej:

npx -y teryt-mcp serve

Instalacja globalna:

npm install -g teryt-mcp
teryt-mcp serve

Wymagania:

  • Node.js >=20.19.0

Podczas instalacji pakiet próbuje utworzyć lokalną bazę SQLite z oficjalnych danych TERYT. Jeśli pierwsza synchronizacja się nie powiedzie, instalacja nadal kończy się sukcesem. Bazę można zsynchronizować później przez CLI albo narzędzie sync_database.

Pominięcie synchronizacji podczas instalacji:

TERYT_MCP_SKIP_POSTINSTALL_SYNC=1 npm install -g teryt-mcp

Podłączenie Do Klienta MCP

Konfiguracja dla transportu stdio:

{
  "mcpServers": {
    "teryt": {
      "command": "npx",
      "args": ["-y", "teryt-mcp", "serve"]
    }
  }
}

Przy instalacji globalnej:

{
  "mcpServers": {
    "teryt": {
      "command": "teryt-mcp",
      "args": ["serve"]
    }
  }
}

W środowisku, które czyści cache między uruchomieniami, ustaw stały katalog danych:

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

Codex

Codex CLI i rozszerzenie Codex dla IDE współdzielą konfigurację ~/.codex/config.toml. Plik VS Code User/mcp.json nie rejestruje serwera w Codex.

Najprościej dodać globalnie zainstalowany serwer poleceniem:

codex mcp add teryt-mcp -- teryt-mcp serve

Odpowiednik w ~/.codex/config.toml:

[mcp_servers.teryt-mcp]
command = "teryt-mcp"
args = ["serve"]

Po zmianie konfiguracji uruchom nowy proces lub nową sesję Codex i sprawdź serwer przez codex mcp list albo /mcp w interfejsie terminalowym.

Pierwsza Synchronizacja

Serwer może zwracać status bez lokalnej bazy, ale wyszukiwanie i lookupy wymagają bazy SQLite.

Podstawowe komendy CLI:

teryt-mcp help
teryt-mcp about
teryt-mcp status
teryt-mcp source-status

Wymuszenie synchronizacji:

npx -y teryt-mcp sync --force

Albo, przy instalacji globalnej:

teryt-mcp sync --force

Synchronizacja zapisuje bazę atomowo. Proces czytający powinien zobaczyć albo starą bazę, albo nową, nigdy częściowo zapisany plik.

CLI

CLI jest pomocnicze. Pełny zestaw funkcji jest dostępny przez MCP.

teryt-mcp serve
teryt-mcp status
teryt-mcp source-status
teryt-mcp sync
teryt-mcp sync --force
teryt-mcp sync --mode missing
teryt-mcp search places Kraków --limit 5

Obecnie CLI obsługuje wyszukiwanie tylko dla search places. Narzędzia MCP udostępniają również jednostki, ulice, rozpoznawanie adresu i lookupy po identyfikatorach.

Przykład:

teryt-mcp search places Boleslawiec --limit 1

Odpowiedź ma postać:

{
  "places": [
    {
      "confidence": 0.95,
      "matchedBy": "exact_normalized_name",
      "place": {
        "id": "0009876",
        "name": "Bolesławiec",
        "stateDate": "2026-01-01",
        "unitId": "02-01-01-1"
      }
    }
  ],
  "stateDate": "2026-01-01"
}

HTTP

HTTP jest przydatne do lokalnego testowania albo własnych wrapperów:

MCP_TRANSPORT=http PORT=3000 teryt-mcp serve

Endpointy:

GET  /health
POST /tools/:toolName

Przykład:

curl -s http://127.0.0.1:3000/tools/search_places \
  -H 'content-type: application/json' \
  -d '{"query":"Kraków","limit":3}'

Odpowiedź HTTP zawiera wynik narzędzia MCP:

{
  "structuredContent": {
    "places": [
      {
        "confidence": 0.95,
        "matchedBy": "exact_normalized_name",
        "place": {
          "id": "0000000",
          "name": "Kraków",
          "stateDate": "2026-01-01",
          "unitId": "12-61-00-0"
        }
      }
    ],
    "stateDate": "2026-01-01"
  }
}

Konfiguracja Runtime

MCP_TRANSPORT=stdio|http  # domyślnie stdio
MCP_PORT / PORT           # domyślnie 3000 dla HTTP
MCP_DATA_DIR              # katalog bazy i manifestu synchronizacji
XDG_CACHE_HOME            # używane, gdy MCP_DATA_DIR nie jest ustawione
MCP_LOG_LEVEL             # debug|info|warn|error|silent

Pliki lokalne:

<data-dir>/teryt.sqlite
<data-dir>/sync-manifest.json
<data-dir>/*.lock

Nowe wydania mogą zmieniać schemat SQLite. Serwer wykrywa niezgodną bazę i przebudowuje ją podczas synchronizacji w trybie missing; można też jawnie uruchomić teryt-mcp sync --force.

Development

Dla osób rozwijających repozytorium:

pnpm install
pnpm build
pnpm quality

Szczegóły architektury i kontraktów:

Licencja i źródło danych

Kod projektu: Copyright 2026 Maciej Ciemborowicz. Udostępniany wyłącznie na warunkach European Union Public Licence 1.2 (EUPL-1.2 only).

Dane TERYT pochodzą z Głównego Urzędu Statystycznego. Informacje o ich pozyskiwaniu i przetwarzaniu znajdują się w pliku NOTICE.md.