FakturaXL MCP Server
Enables read-only interaction with the FakturaXL API for querying invoices, clients, products, and stock levels with pagination, date chunking, and rate limiting.
README
FakturaXL MCP Server
Zdalny, read-only serwer MCP dla API FakturaXL.
Wystawiany pod URL przez Streamable HTTP — klient MCP podaje adres serwera oraz klucz API FakturaXL w nagłówku Authorization: Bearer.
Stack
- Node.js (>=20) + TypeScript (ESM)
@modelcontextprotocol/sdkv1.x (McpServer+StreamableHTTPServerTransport)- Express (endpoint HTTP)
fast-xml-parser(API FakturaXL komunikuje się XML-em)
Instalacja
npm install
cp .env.example .env # Windows: copy .env.example .env
Uruchomienie
npm run dev # tryb deweloperski (tsx watch)
npm run build # kompilacja do dist/
npm start # uruchomienie z dist/
Serwer nasłuchuje na http://localhost:<PORT>/mcp (domyślnie port 3000).
Health check: GET /health.
Konfiguracja (.env)
| Zmienna | Domyślnie | Opis |
|---|---|---|
PORT |
3000 |
Port serwera HTTP |
FAKTURAXL_BASE_URL |
https://program.fakturaxl.pl/api |
Bazowy URL API |
FAKTURAXL_TIMEOUT_MS |
30000 |
Timeout wywołań do FakturaXL |
LOG_LEVEL |
info |
debug / info / warn / error |
LOG_TO_FILE |
true |
Zapis logów do logs/fakturaxl-YYYY-MM-DD.log |
DEFAULT_LIST_LIMIT |
50 |
Domyślna liczba wierszy zwracanych z list |
MAX_LIST_LIMIT |
500 |
Twardy górny limit zwracanych wierszy |
MAX_RANGE_MONTHS |
24 |
Maks. zakres dat dla auto-chunkingu (potem przycięcie + ostrzeżenie) |
CACHE_TTL_MS |
300000 |
TTL cache list słownikowych (klienci/produkty/...) |
PAGE_SIZE |
500 |
Rozmiar strony przy auto-paginacji |
RATE_LIMIT_RETRIES |
5 |
Liczba prób przy kodzie 2 (rate limit) |
Warstwa praktyczna (agent-friendly)
Serwer nie jest cienkim wrapperem — ukrywa uciążliwości API przed agentem:
- Auto-paginacja — pobiera wszystkie strony pod spodem; agent nie widzi
strona/na_stronie. - Chunking dat — dowolny zakres jest wewnętrznie dzielony na okna ≤31 dni (limit API) i scalany. Powyżej
MAX_RANGE_MONTHSzakres jest przycinany z ostrzeżeniem. - Natywny throttling — globalny rate limiter respektuje odstępy z dokumentacji (dokumenty 5 s; produkty/klienci/stany 10 s; reszta 1 s) + retry z backoff na kod 2. Agent nigdy nie dostaje błędu limitu.
- Filtrowanie po kliencie (którego API nie ma) — po nazwie (fuzzy) lub NIP, realizowane po stronie serwera.
- Compact + summary +
has_more— listy zwracają skrócone rekordy, zawsze z agregatami (liczba, sumy per waluta, rozkład statusów/rodzajów) i informacją o obcięciu, żeby nie zalewać kontekstu agenta. - Cache TTL — listy słownikowe (klienci/produkty/magazyny/działy) są cache'owane, co przyspiesza wyszukiwanie i ogranicza wywołania.
Autoryzacja
Jeden sekret: klucz API FakturaXL = token Bearer. Klient MCP wysyła w każdym żądaniu nagłówek:
Authorization: Bearer <TWOJ_KLUCZ_API_FAKTURAXL>
Brak nagłówka → HTTP 401. Nieprawidłowy klucz → FakturaXL zwraca kod 3,
mapowany na czytelny błąd narzędzia. Serwer działa w trybie stateless
(nowa instancja per request; klucz nie jest nigdzie przechowywany).
Dostępne narzędzia (tylko odczyt)
| Narzędzie | Opis |
|---|---|
lista_dokumentow |
Faktury dla dowolnego zakresu dat + filtr klienta/statusu/typu/rodzaju. Compact + summary + has_more. |
podsumowanie_dokumentow |
Same agregaty (liczba, sumy per waluta, rozkład statusów/rodzajów) — bez wierszy. |
pobierz_dokument |
Pełne dane pojedynczego dokumentu po ID. |
pobierz_pdf |
PDF dokumentu w base64. |
znajdz_klienta |
Wyszukiwanie klienta po nazwie/NIP. |
lista_klientow |
Lista klientów (opcjonalny filtr szukaj). |
znajdz_produkt |
Wyszukiwanie produktu po nazwie/kodzie/kodzie kreskowym. |
lista_produktow |
Lista produktów (opcjonalny filtr szukaj). |
stany_magazynowe |
Ilości produktów w magazynach. |
lista_magazynow |
Lista magazynów. |
lista_dzialow |
Lista działów firmy. |
Przykład (agent): „faktury od K8 z ostatniego kwartału” → lista_dokumentow z
data_od/data_do i klient: "K8". Chunking, paginacja, throttling i mapowanie
nazwy klienta na klient_id dzieją się wewnętrznie.
Świadomie pominięte (bo zakres read-only): wystawianie faktur/korekt, wysyłka e-mail, KSeF, relacje, tagi, zmiana statusu.
Logowanie
Każde wywołanie API FakturaXL logowane jest jako raw request/response
(URL, nagłówki, body, status). Token API jest maskowany (widoczne tylko
ostatnie 4 znaki). Logi trafiają na konsolę oraz — gdy LOG_TO_FILE=true —
do katalogu logs/.
Struktura
src/
index.ts # Express + Streamable HTTP + Bearer auth + error handler
server.ts # buildServer(apiToken) - instancja McpServer per request
config.ts # konfiguracja z .env
logger.ts # logger JSON + maskowanie sekretów
tools/register.ts # rejestracja narzędzi read-only (compact + summary + limit)
fakturaxl/client.ts # XML->POST->JSON, mapowanie błędów, rate limiter + retry
fakturaxl/rateLimiter.ts # globalny throttling per endpoint (odstępy z dokumentacji)
fakturaxl/pagination.ts # auto-paginacja (fetchAllPages)
fakturaxl/dates.ts # chunking zakresu dat na okna <=31 dni + cap 24 mies.
fakturaxl/cache.ts # cache TTL w pamięci
fakturaxl/service.ts # getDocuments, findClients/Products, listy słownikowe
fakturaxl/compact.ts # compact mappery + agregacja (summary)
fakturaxl/codes.ts # mapa kodów zwracanych przez API
docs/
api-fakturaxl.md # dokumentacja API FakturaXL
Dockerfile # multi-stage: build / runtime (prod) / dev
docker-compose.dev.yml # lokalny dev (hot-reload, bez Traefika)
docker-compose.example.yml # szablon compose produkcyjnego (Traefik) do skopiowania
Docker
Serwer jest bezstanowy i nie przechowuje sekretów — klucz API FakturaXL podaje klient MCP per request (Bearer). Dlatego obrazy/compose nie zawierają danych wrażliwych.
Pliki:
Dockerfile— multi-stage (build→runtimeprodukcyjny, orazdevz hot-reload). Obraz produkcyjny nanode:22-alpine, uruchamiany jako usernode, z healthcheckiem/health.docker-compose.dev.yml— lokalny development (tsx watch, port3000:3000, bez Traefika).docker-compose.example.yml— szablon produkcyjny za Traefikiem (TLS, zewnętrzna siećtraefik-net) do skopiowania i dostosowania (MCP_DOMAIN,TRAEFIK_CERTRESOLVER).
Dev (lokalnie)
docker compose -f docker-compose.dev.yml up --build
# MCP: http://localhost:3000/mcp health: http://localhost:3000/health
Serwer (produkcja, Traefik)
Wymaga istniejącej zewnętrznej sieci traefik-net. Skopiuj szablon i ustaw domenę/certresolver przez zmienne:
cp docker-compose.example.yml docker-compose.yml
# w .env obok compose:
# MCP_DOMAIN=fakturaxl-mcp.twoja-domena.pl
# TRAEFIK_CERTRESOLVER=myresolver
docker compose up -d
Router nasłuchuje na ${MCP_DOMAIN} (entrypoint websecure, TLS przez
${TRAEFIK_CERTRESOLVER:-myresolver}), kierując ruch na port 3000 kontenera.
W mcp.json klienta użyj wtedy https://<MCP_DOMAIN>/mcp z nagłówkiem
Authorization: Bearer <klucz>.
Test lokalny (MCP Inspector)
npx @modelcontextprotocol/inspector
W Inspectorze: transport Streamable HTTP, URL http://localhost:3000/mcp,
nagłówek Authorization: Bearer <klucz>.
Wdrożenie produkcyjne (Linux)
Rekomendowana ścieżka to Docker + Traefik (sekcja „Docker" powyżej):
MCP_DOMAIN=fakturaxl-mcp.twoja-domena.pl docker compose up -d --build
Alternatywnie bez Dockera: npm ci && npm run build && npm start za reverse proxy
(nginx/Caddy/Traefik) z TLS, kierującym /mcp na port aplikacji.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。