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
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。
mcp-server-qdrant
这个仓库展示了如何为向量搜索引擎 Qdrant 创建一个 MCP (Managed Control Plane) 服务器的示例。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。