Skip to main content
Glama
przemonides

CRU MCP Server

by przemonides
README.md
# rejestr-umow-mcp-server

Serwer MCP (Model Context Protocol) do wyszukiwania umów w **Centralnym
Rejestrze Umów** jednostek sektora finansów publicznych (CRU JSFP),
publicznie dostępnym pod [rejestrumow.gov.pl](https://rejestrumow.gov.pl).
Dzięki niemu asystent AI może wyszukiwać i pobierać umowy (strony,
przedmiot, wartość, daty, status, finansowanie z UE) zamiast ręcznego
przeszukiwania strony.

## Czym jest Centralny Rejestr Umów

CRU to publiczna baza umów zawieranych przez instytucje sektora finansów
publicznych (ministerstwa, urzędy, samorządy, szkoły, szpitale itd.),
uruchomiona 1 lipca 2026 r. Każdy może sprawdzić strony, przedmiot i
wartość umowy bez składania wniosku o dostęp do informacji publicznej.

Ministerstwo Finansów udostępnia też **API integracyjne (CRU API JSFP)**
z autoryzacją nagłówkiem `X-API-KEY`, które oprócz publikacji i
aktualizacji umów przez jednostki obowiązane pozwala też na **wyszukiwanie
zestawień już opublikowanych dokumentów** oraz pobieranie ich
szczegółów. Dokumentacja integracyjna:

- Produkcja: https://jsfp.rejestrumow.gov.pl/api-gw/docs/int/api.html
- Środowisko testowe: https://jsfp-cru-test.mf.gov.pl/api-gw/docs/int/api.html
- Kontakt / zgłoszenie o dostęp: `wsparcie.cru.jsfp@mf.gov.pl`

## Status weryfikacji API (ważne!)

Sesja, w której powstał ten kod, działa w środowisku z ograniczoną
polityką sieciową, która **blokuje połączenia do domen `*.gov.pl`**
(potwierdzone na poziomie proxy — `gateway answered 403 to CONNECT
(policy denial)` dla `jsfp.rejestrumow.gov.pl` i `rejestrumow.gov.pl`).
W efekcie nie było możliwe:

- pobranie strony dokumentacji integracyjnej (`api.html`) i odczytanie
  rzeczywistych ścieżek endpointów, nazw parametrów i kształtu odpowiedzi,
- sprawdzenie publicznej wyszukiwarki na rejestrumow.gov.pl pod kątem
  ewentualnego (nieudokumentowanego) endpointu JSON używanego przez UI,
- zweryfikowanie, czy indywidualny/jednoosobowy wniosek o klucz API
  zostanie w ogóle rozpatrzony pozytywnie (API wygląda na adresowane
  przede wszystkim do jednostek JSFP publikujących własne umowy).

**Co z tego wynika dla tego kodu:** ścieżki żądań w `src/constants.ts` /
`.env.example` (`CRU_SEARCH_PATH`, `CRU_CONTRACT_PATH`) oraz nazwy
parametrów zapytania w `src/tools.ts` (np. `fraza`, `dataOd`,
`numerStrony`) to **przypuszczenia oparte na typowej konwencji REST**, a
nie potwierdzone fakty z dokumentacji. Kod jest skonstruowany tak, by
łatwo je poprawić (jedna zmienna środowiskowa / jedno miejsce w kodzie),
ale **przed pierwszym realnym użyciem trzeba je zweryfikować** względem
oficjalnej dokumentacji (dostępnej z przeglądarki bez ograniczeń tej
sesji) i w razie potrzeby skorygować.

## Dwie ścieżki dalszej pracy

1. **Oficjalne API CRU JSFP (zaimplementowane w tym folderze).**
   Wymaga zgłoszenia się po klucz `X-API-KEY` do Ministerstwa Finansów.
   Najbardziej stabilne i "legalne" rozwiązanie długoterminowo, ale
   nieznany czas/warunki przyznania dostępu dla podmiotu spoza JSFP.
2. **Publiczna wyszukiwarka na rejestrumow.gov.pl (nie zaimplementowane).**
   Strona nie wymaga logowania dla obywatela, więc teoretycznie dałoby
   się zbudować "agregator" odpytujący jej wewnętrzny endpoint JSON —
   ale wymaga to podejrzenia ruchu sieciowego w przeglądarce (Network tab)
   przez kogoś z dostępem do domeny, nie jest udokumentowane, i może
   naruszać regulamin serwisu. Rekomendacja: sprawdzić `robots.txt` i
   regulamin serwisu, zanim ktokolwiek pójdzie tą drogą.

**Rekomendacja:** zacznij od ścieżki 1 — wyślij zapytanie o dostęp na
`wsparcie.cru.jsfp@mf.gov.pl`, a po otrzymaniu klucza i realnej
dokumentacji popraw `CRU_SEARCH_PATH`/`CRU_CONTRACT_PATH` oraz mapowanie
pól w `src/tools.ts` i `src/format.ts` na rzeczywisty kształt odpowiedzi.

## Narzędzia MCP

- `rejestr_umow_search_contracts` — wyszukuje umowy po tekście, stronie
  umowy (nazwa/NIP), jednostce JSFP, zakresie dat i wartości, z paginacją.
- `rejestr_umow_get_contract` — pobiera pełne szczegóły jednej umowy po
  identyfikatorze/numerze.

Oba narzędzia są tylko do odczytu (`readOnlyHint: true`) — serwer nie
publikuje ani nie modyfikuje żadnych umów.

## Instalacja i konfiguracja

```bash
cd rejestr-umow-mcp
npm install
cp .env.example .env
# uzupełnij CRU_API_KEY w .env po otrzymaniu klucza od MF
# zweryfikuj/popraw CRU_SEARCH_PATH i CRU_CONTRACT_PATH względem dokumentacji
npm run build
```

## Uruchomienie

```bash
npm start
```

Serwer komunikuje się przez stdio — podłącz go do klienta MCP (np. Claude
Desktop/Claude Code) w konfiguracji serwerów MCP, wskazując
`node dist/index.js` w katalogu `rejestr-umow-mcp` i przekazując zmienną
środowiskową `CRU_API_KEY`.

## Struktura projektu

```
rejestr-umow-mcp/
├── package.json
├── tsconfig.json
├── .env.example
├── src/
│   ├── index.ts       # inicjalizacja serwera MCP (stdio)
│   ├── tools.ts        # definicje narzędzi (search / get)
│   ├── client.ts        # klient HTTP + obsługa błędów
│   ├── constants.ts     # konfiguracja z env (base URL, ścieżki, klucz)
│   ├── format.ts        # formatowanie odpowiedzi na markdown
│   └── types.ts          # typy odpowiedzi API (celowo permisywne)
└── dist/                  # skompilowany kod (po `npm run build`)
```

TDQS

A4.4/5.0

Scored across 2 tools

Disambiguation5/5

The two tools have clearly distinct purposes: one searches for contracts with various filters, the other retrieves full details of a specific contract. No overlap or ambiguity.

Naming Consistency5/5

Both tool names follow a consistent pattern: 'rejestr_umow_' prefix with a verb (search/get) followed by 'contracts' or 'contract'. The naming is predictable and unambiguous.

Tool Count4/5

With only 2 tools, the server is minimal but well-scoped for a read-only registry query domain. It feels slightly thin, but each tool serves a distinct purpose without unnecessary bloat.

Completeness5/5

For a read-only contract registry, the pair of search and get detail covers the essential functionality completely. No obvious gaps—users can find contracts and retrieve full information.

Maintenance

ActivityStale
ResponsivenessNo issues