FakturaXL MCP Server

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.

Category
访问服务器

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/sdk v1.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_MONTHS zakres 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 (buildruntime produkcyjny, oraz dev z hot-reload). Obraz produkcyjny na node:22-alpine, uruchamiany jako user node, z healthcheckiem /health.
  • docker-compose.dev.yml — lokalny development (tsx watch, port 3000: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

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选
mcp-server-qdrant

mcp-server-qdrant

这个仓库展示了如何为向量搜索引擎 Qdrant 创建一个 MCP (Managed Control Plane) 服务器的示例。

官方
精选
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选