Skip to main content
Glama

A hivatalos Billingo MCP szerver — 49 eszköz (tool) a Billingo v3 számlázási API felett, stdio (asztali) és Streamable HTTP (önállóan üzemeltethető) kliensekhez. MIT licenc alatt, önállóan üzemeltethető. Ez az első hivatalos Billingo SDK vagy MCP szerver — korábban nem létezett ilyen.

A legtöbb felhasználónak nincs szükség telepítésre — használd a hosztolt szervert a mcp.billingo.hu címen. Inkább saját magad futtatnád? Publikálva van npm-en is @billingo/billingo-mcp néven (npx, build nélkül), és Docker image formájában is — lásd a Válassz futtatási módot szakaszt lentebb.

Olvasd angolul is — az angol szakasz egy teljes fordítás, nem összefoglaló.

Tartalomjegyzék

Related MCP server: billingo-mcp

🧭 Válassz futtatási módot

Beállítás

Kinek ajánlott

🌐 Hosztolt szerver

Semmi — csak add meg a kliensedben az URL-t

A legtöbb felhasználónak: nulla telepítés, nulla karbantartás

💻 stdio npx-szel

npx, build nélkül

Asztali MCP kliensek (Claude Desktop, Claude Code)

🐳 Docker (önálló üzemeltetés, HTTP)

docker run

Ha saját infrastruktúrán akarod futtatni

⬆️ Ugrás az elejére

🌐 Használat a hosztolt szerverrel (ajánlott)

Nincs telepítés, nincs önálló üzemeltetés — csak állítsd be a klienst a https://mcp.billingo.hu címre, és minden kéréssel küldd el a Billingo API kulcsodat. Ez a leggyorsabb módja a kezdésnek; csak akkor nyúlj a stdio vagy Docker módokhoz lentebb, ha kifejezetten önálló üzemeltetésre van szükséged.

Claude Code CLI

claude mcp add --transport http billingo https://mcp.billingo.hu \
  -s user \
  -H "X-Billingo-Api-Key: your-api-key" \
  -H "X-Billingo-Allow-Write: true"

A -s user az összes projekteden át regisztrálja, nem csak az aktuálisban; az (alapértelmezett) -s local-lal csak az aktuális projektre korlátozod. Hagyd el az X-Billingo-Allow-Write fejlécet, vagy állítsd "false"-ra, csak-olvasás hozzáféréshez.

Más HTTP-kompatibilis MCP kliensek

Bármelyik kliens, amely támogatja a Streamable HTTP protokollt, ugyanígy működik: állítsd be rá a https://mcp.billingo.hu címet, az X-Billingo-Api-Key fejléccel (kötelező), opcionálisan az X-Billingo-Allow-Write-tal — a teljes fejléc-referenciáért lásd a Konfiguráció szakaszt.

Az API kulcsot ugyanúgy szerezd be, mint az API kulcs szakaszban lentebb leírtak szerint.

⬆️ Ugrás az elejére

💻 Telepítés / futtatás stdio-val

Nincs telepítési lépés — az npx igény szerint letölti és futtatja a csomagot.

Claude Desktop

claude_desktop_config.json:

{
  "mcpServers": {
    "billingo": {
      "command": "npx",
      "args": ["-y", "@billingo/billingo-mcp"],
      "env": {
        "BILLINGO_API_KEY": "your-api-key",
        "BILLINGO_ALLOW_WRITE": "false"
      }
    }
  }
}

Utána indítsd újra teljesen a klienst — a Claude Desktop csak induláskor olvassa ezt a fájlt, tehát az ablak bezárása nem elég (macOS-en ⌘Q).

Claude Code CLI

claude mcp add billingo -s user \
  -e BILLINGO_API_KEY=your-api-key \
  -e BILLINGO_ALLOW_WRITE=false \
  -- npx -y @billingo/billingo-mcp

A -s user a felhasználódhoz köti a szervert az összes projekteden át, nem csak az aktuálishoz, és semmit nem ír a repóba. Az (alapértelmezett) -s local-lal csak az aktuális projektre korlátozod. Ellenőrzés: claude mcp list, illetve a mentett konfiguráció megtekintése: claude mcp get billingo.

Más MCP kliensek

Bármelyik kliens, amely elfogadja a szabványos mcpServers JSON formátumot (pl. Cursor, Windsurf), változtatás nélkül újrahasznosíthatja a fenti Claude Desktop blokkot — a command, args és env nem Claude-specifikus, csak a befoglaló konfigurációs fájl és annak helye tér el klienstől függően.

API kulcs

Az API kulcsot a Billingóban a Beállítások → API kulcsok → Új API kulcs menüpont alatt hozod létre. Az űrlapon:

  • Hozzátartozó összekötés: Egyedi fejlesztés.

  • API hatásköre: Olvasás, ha csak listázni/lekérdezni akarsz, vagy Írás, ha dokumentumokat is szeretnél létrehozni, módosítani, küldeni vagy stornózni.

Ez egy második, a lenti BILLINGO_ALLOW_WRITE-tól független kapu: egy csak-olvasás hatáskörű kulcs minden író hívásnál közvetlenül a Billingo API-tól kap jogosultsági hibát, még akkor is, ha itt a BILLINGO_ALLOW_WRITE "true"-ra van állítva — mindkettőnek engedélyeznie kell. Hagyd a BILLINGO_ALLOW_WRITE-ot "false"-on (vagy hagyd el), hacsak nem szeretnéd, hogy a modell dokumentumokat hozhasson létre, módosíthasson, küldhessen el vagy storno­zhasson — lásd a Biztonság szakaszt. Fontos: az olyan konfigurációs fájlok, mint a claude_desktop_config.json, sima szövegként tárolódnak, tehát a kulcs titkosítatlanul áll a lemezen.

Ellenőrzés: a kliensnek read-only módban 22 eszközt kell listáznia, "true"-ra állított BILLINGO_ALLOW_WRITE mellett pedig 49-et. Ha nem talál eszközt, nézd meg a kliens naplóját (macOS-en ~/Library/Logs/Claude/mcp-server-billingo.log) — a szerver {"name":"billingo","version":"0.1.0"} néven mutatkozik be. Ha ott más név szerepel, akkor a kliens egy másik, ugyanezen a néven regisztrált szerverhez beszél.

⬆️ Ugrás az elejére

🐳 Futtatás Dockerrel (HTTP)

docker run -p 3000:3000 ghcr.io/octonull/billingo-mcp:latest

A image nem tartalmaz beégetett API kulcsot. A HTTP mód állapotmentes (stateless) és kérésenkénti: minden hívás egy fejlécben (header) viszi a Billingo API kulcsot, a szerver soha nem tárolja azt. Példahívás, a két Billingo-specifikus fejléccel:

curl -X POST http://localhost:3000 \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H 'X-Billingo-Api-Key: your-api-key' \
  -H 'X-Billingo-Allow-Write: true' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'

A GET /health {"status":"ok"}-kal válaszol, fejléc nélkül is — ez a konténer health checkekhez van. A GET /build_version a futó image build-idejű verzióját adja vissza, pl. {"buildVer":"fcc756d@0.1.0"} — vagy csak a commit SHA-t ({"buildVer":"fcc756d"}), ha az adott build nem tartozik release tag-hez.

Magát az API kulcsot ugyanúgy hozd létre, mint stdio-nál — lásd az API kulcs szakaszt fentebb —, és adj neki Írás hatáskört a Billingo oldalán, ha küldeni akarod az X-Billingo-Allow-Write fejlécet.

Claude Code CLI

claude mcp add --transport http billingo http://localhost:3000 \
  -s user \
  -H "X-Billingo-Api-Key: your-api-key" \
  -H "X-Billingo-Allow-Write: true"

A -s user itt is az összes projekteden át regisztrálja, nem csak az aktuálisban; az (alapértelmezett) -s local-lal csak az aktuális projektre korlátozod. Hagyd el az X-Billingo-Allow-Write fejlécet, vagy állítsd "false"-ra, csak-olvasás hozzáféréshez.

⬆️ Ugrás az elejére

🔧 Konfiguráció

Változó

Transport

Kötelező

Alapérték

Jelentés

BILLINGO_API_KEY

csak stdio

igen

—

A Billingo API kulcsod. HTTP módban nem ezt olvassa a szerver — lásd lent.

BILLINGO_ALLOW_WRITE

csak stdio

nem

false

"true" vagy "1" érték engedélyezi az író (write) eszközöket ennél a stdio folyamatnál. Bármi más érték (elgépelést is beleértve) false-nak számít.

BILLINGO_TOOL_CATEGORIES

csak stdio

nem

mind

Vesszővel elválasztott eszközcsoportok, csak ezek töltődnek be: organization, partners, products, spendings, bank_accounts, document_blocks, documents. Ismeretlen név esetén a szerver el sem indul.

BILLINGO_BASE_URL

mindkettő

nem

https://api.billingo.hu/v3

Az API alap URL felülírása, pl. proxy mögé állításhoz.

PORT

csak HTTP

nem

3000

A HTTP szerver figyelési portja.

BILLINGO_ALLOWED_HOSTS

csak HTTP

nem

nincs beállítva (védelem kikapcsolva)

Vesszővel elválasztott lista az elfogadott Host fejléc-értékekről — DNS-rebinding védelem. Mindig állítsd be, ha a szerver localhoston kívülről is elérhető.

HTTP módban a hitelesítés és a jogosultsági kör (scope) kérésenként, fejlécben érkezik:

Fejléc

Kötelező

Jelentés

X-Billingo-Api-Key

igen

A kérésnél használandó Billingo API kulcs. Soha nem kerül tárolásra.

X-Billingo-Allow-Write

nem

"true" vagy "1" engedélyezi az író eszközöket, de csak erre az egy kérésre.

X-Billingo-Tool-Categories

nem

Ugyanaz a csoportlista, mint a BILLINGO_TOOL_CATEGORIES, erre az egy kérésre. Fejlécet nem kezelő kliensnél ?categories=documents,partners a URL-ben; ha mindkettő meg van adva, a fejléc számít. Ismeretlen név: 400.

⬆️ Ugrás az elejére

🔒 Biztonság

Ezt a szakaszt olvasd el, mielőtt bárkinek elérhetővé teszed a szervert.

  • Alapértelmezetten csak olvasható (read-only). Az író eszközök (létrehozás, módosítás, törlés, küldés, storno) teljesen ki vannak szűrve a tools/list-ből, hacsak explicit be nem kapcsolod a BILLINGO_ALLOW_WRITE-tal (stdio) vagy az X-Billingo-Allow-Write fejléccel (HTTP). Egy modell, amely soha nem lát egy író eszközt, nem is tudja meghívni. Ez az elsődleges biztonsági mechanizmus — hagyd kikapcsolva az írást, hacsak kifejezetten nem szükséges.

  • A kiállított számlák automatikusan a NAV felé jelentésre kerülnek, és ez nem vonható vissza. Amint egy dokumentum véglegesítésre (finalize) kerül és számlává válik, a NAV Online Számla jelentés azonnal megtörténik, és nem visszafordítható. Egy hibás számla egyetlen orvoslása a storno (érvénytelenítés) — de a storno maga is végleges: örökre érvényteleníti a számlát, és ez is jelentésre kerül a NAV felé. Egy már kiállított számlára nincs "törlés".

  • A HTTP mód TLS-t igényel. Az API kulcs minden kérésnél az X-Billingo-Api-Key fejlécben utazik. Zárd le a TLS-t a konténer előtt (reverse proxy, load balancer, vagy a platform ingressze) — soha ne futtasd a HTTP módot titkosítatlan HTTP-n, megbízható helyi hálózaton kívül.

  • A HTTP mód szándékosan nem tárol API kulcsot. Ne "javítsd ki" ezt egy konténerszintű környezeti változóval beállított API kulccsal — ez a telepítést egyfelhasználóssá tenné, és bárki, aki eléri a konténert, a te fiókodra tudna számlázni, mivel semmi nem különböztetné meg a kéréseket egymástól. A kérésenkénti fejléc pont ezért létezik.

  • Mindig állítsd be a BILLINGO_ALLOWED_HOSTS-t, ha a HTTP szerver publikusan elérhető. Enélkül a DNS-rebinding védelem ki van kapcsolva.

⬆️ Ugrás az elejére

🧰 Eszközök

Összesen 49 eszköz: 22 olvasó (mindig látható), 27 író (csak akkor látható, ha az írás engedélyezve van). Ha egy kliens minden eszköz sémáját a promptba teszi, a BILLINGO_TOOL_CATEGORIES (HTTP-n X-Billingo-Tool-Categories) beállítással csak a szükséges csoportok töltődnek be.

Szervezet (Organization) (3 olvasó)

  • billingo_get_organization — Szervezeti adatok lekérése (adószám, előfizetés, NAV-kapcsolat állapota).

  • billingo_check_tax_number — Magyar adószám ellenőrzése (teljes, kötőjeles adószám; élő NAV-kapcsolat kell).

  • billingo_get_conversion_rate — Hivatalos árfolyam lekérése, opcionálisan egy múltbeli dátumra.

Partnerek (2 olvasó, 4 író)

  • billingo_list_partners — Partnerek listázása.

  • billingo_get_partner — Egy partner lekérése.

  • billingo_create_partner — Partner létrehozása. (író)

  • billingo_update_partner — Partner módosítása; csak a megadott mezők változnak. (író)

  • billingo_guess_partner — Partner keresése adószám/email alapján, vagy létrehozása. (író)

  • billingo_delete_partner — Partner törlése. (író)

Termékek (3 olvasó, 3 író)

  • billingo_list_products — Termékek listázása.

  • billingo_get_product — Egy termék lekérése.

  • billingo_get_product_quantity — Egy termék készletmennyiségének lekérése.

  • billingo_create_product — Termék létrehozása. (író)

  • billingo_update_product — Termék módosítása; csak a megadott mezők változnak. (író)

  • billingo_delete_product — Termék törlése. (író)

Kiadások (Spendings) (2 olvasó, 3 író)

  • billingo_list_spendings — Kiadások listázása.

  • billingo_get_spending — Egy kiadás lekérése.

  • billingo_create_spending — Kiadás létrehozása. (író)

  • billingo_update_spending — Kiadás módosítása; csak a megadott mezők változnak. (író)

  • billingo_delete_spending — Kiadás törlése. (író)

Bankszámlák (2 olvasó, 3 író)

  • billingo_list_bank_accounts — Bankszámlák listázása.

  • billingo_get_bank_account — Egy bankszámla lekérése.

  • billingo_create_bank_account — Bankszámla létrehozása. (író)

  • billingo_update_bank_account — Bankszámla módosítása; csak a megadott mezők változnak. (író)

  • billingo_delete_bank_account — Bankszámla törlése. (író)

Dokumentumblokkok (1 olvasó, 1 író)

  • billingo_list_document_blocks — Dokumentumblokkok (számlaszám-tartományok) listázása.

  • billingo_create_document_block — Dokumentumblokk létrehozása. (író)

Dokumentumok — olvasás (8)

  • billingo_list_documents — Dokumentumok listázása (számlák, nyugták, díjbekérők, piszkozatok és mások).

  • billingo_get_document — Egy dokumentum lekérése id vagy külső azonosító (vendor id) alapján.

  • billingo_download_document — A dokumentum PDF-jének lekérése (publikus URL, vagy base64 bájtok).

  • billingo_get_document_public_url — Megosztható publikus URL lekérése egy dokumentumhoz.

  • billingo_get_online_szamla_status — Egy dokumentum NAV Online Számla jelentési állapotának lekérése. Hibát ad, ha a dokumentumnak nincs NAV rekordja — pl. ha a szervezet nincs csatlakoztatva a NAV Online Számlához, vagy a dokumentum nem tartozik jelentési kötelezettség alá.

  • billingo_get_document_payments — Egy dokumentumhoz rögzített kifizetések lekérése.

  • billingo_get_document_reminders — Egy dokumentumhoz küldött fizetési emlékeztetők lekérése.

  • billingo_pos_print — POS hőnyomtatóhoz méretezett PDF nyugta lekérése egy dokumentumhoz.

Dokumentumok — írás (9)

  • billingo_create_document — Dokumentum létrehozása (számla, díjbekérő, piszkozat vagy előlegszámla). (író)

  • billingo_create_receipt — Nyugta létrehozása (nyugta típusú számlatömb kell hozzá). (író)

  • billingo_finalize_draft — Piszkozat véglegesítése számlává — kiállítja és jelenti a NAV felé. (író)

  • billingo_finalize_receipt_draft — Piszkozat véglegesítése nyugtává. (író)

  • billingo_create_document_from_proforma — Számla létrehozása díjbekérőből. (író)

  • billingo_copy_document — Dokumentum másolása; számla másolata piszkozat lesz (a billingo_finalize_draft állítja ki). (író)

  • billingo_create_modification_document — Módosító (helyesbítő) dokumentum létrehozása. (író)

  • billingo_update_payment — Egy dokumentum rögzített kifizetéseinek felülírása: a listából kihagyott kifizetés törlődik. (író)

  • billingo_archive_document — Proforma dokumentum archiválása. (író)

Dokumentumok — export (1 olvasó)

  • billingo_export_documents — Dokumentumok exportálása.

Dokumentumok — destruktív (4 író)

  • billingo_cancel_document — Dokumentum érvénytelenítése (storno) — visszavonhatatlan. (író)

  • billingo_send_document — Dokumentum küldése emailben. (író)

  • billingo_delete_document — Dokumentum törlése (csak piszkozat/ki nem állított dokumentumoknál; egy kiállított számlát stornózni kell helyette). (író)

  • billingo_delete_payment — Egy dokumentum rögzített kifizetéseinek törlése. (író)

Eredmények és hibák

  • Strukturált eredmény. 17 olvasó eszköz outputSchema-t közöl, és az eredményt structuredContent-ként is visszaadja, így a kódból hívó kliensek (code mode) típusos adatot kapnak. A szöveges blokk nem változik. A sémák nyitottak (a Billingo új mezői átmennek), és egy rekord id-ján kívül semmit sem várnak el kötelezően; ha egy válasz mégsem illene, az SDK a hívást Output validation error hibaként adná vissza, amit az npm run test:live minden futáskor ellenőriz. Fájlt adó (download_document, pos_print, export_documents) és sandboxban nem ellenőrizhető (check_tax_number, get_product_quantity) eszköz nem közöl sémát, ahogy az író eszközök sem.

  • Hibák. Egy Billingo API-hiba isError: true eredményként jön vissza: az első szöveges blokk az üzenet, a második JSON, {"error": {"code", "retryable", "outcome_unknown", "status", "retry_after_seconds", "fields", "trace_id", "message"}}. Kódok: bad_request, unauthorized, nav_connection_required, subscription_required, forbidden, not_found, validation_failed, rate_limited, pdf_not_ready, server_error, api_error, client_error, invalid_arguments, export_pending, export_failed. Nem idempotens eszköz szerverhibájánál a retryable sosem igaz: ilyenkor outcome_unknown jelzi, hogy a számla akár ki is állt, ezért újrapróbálás előtt vendor_id alapján ellenőrizd. Egy újrapróbált törlés not_found választ adhat, ha az első kísérlet mégis lefutott. Az SDK bemeneti validációs hibái továbbra is csak szövegesek.

  • Módosítás. A Billingo API módosításkor a teljes rekordot lecseréli, és amit nem küldünk el, azt törli. Ezért a partner, termék, bankszámla és kiadás update_* eszközei előbb kiolvassák a rekordot, és a megadott változtatásokkal együtt a teljes rekordot küldik vissza: elég csak a változó mezőt megadni. Az update_payment viszont a teljes kifizetéslistát cseréli, ezért előbb olvasd ki a meglévő kifizetéseket. Mindegyik destructiveHint: true jelölésű. Az olvasás és az írás két külön kérés, így ami a kettő között a Billingóban változik, az felülíródik. Forintos kiadásnál a *_huf összegek követik a végösszegeket; más pénznemben a Billingo nem vált át, ezért új összeghez, pénznemhez vagy árfolyamhoz a forintos összegeket is meg kell adni. A kiadás tételei (items, NAV-importból) nem részei az író modellnek; hogy módosításkor megmaradnak-e, nem ellenőriztük.

⬆️ Ugrás az elejére

🔨 Fejlesztés

git clone https://github.com/octonull/billingo-mcp.git
cd billingo-mcp
npm ci
npm test

A TypeScript verziója rögzítve van 5.9.3-ra, és jelenleg nem frissíthető: az openapi-typescript a typescript@^5.x-et igényli, a typescript-eslint pedig <6.1.0-t — a kettő metszete 5.9.3. Egy újabb TypeScript telepítése ERESOLVE konfliktussal buktatja el az npm install-t.

További hasznos parancsok: npm run typecheck, npm run lint, npm run format, npm run test:coverage, npm run build.

Architektúra: a rétegek, egy eszközhívás útja és a módosító eszközök működése ábrával: ARCHITECTURE.md.

Élő smoke teszt csomag: az npm run test:live egy kis tesztcsomagot futtat a valódi Billingo sandbox ellen (valódi, de ártalmatlan sandbox adatokat hoz létre és takarít el). Ehhez szükséges a BILLINGO_SANDBOX_API_KEY beállítása egy sandbox API kulcsra; enélkül a csomag tisztán kihagyásra (skip) kerül — így futtatja biztonságosan a CI és minden hozzájáruló, akinek nincs sandbox hozzáférése.

⬆️ Ugrás az elejére

🤝 Közreműködés

Issue-kat és pull requesteket szívesen fogadunk. PR nyitása előtt futtasd le az npm run format:check, npm run lint, npm run typecheck és npm run test:coverage parancsokat — a CI mind a négyet megköveteli. Az architektúráért és a kódból nem nyilvánvaló megkötésekért lásd a CLAUDE.md fájlt.

⬆️ Ugrás az elejére

📜 Licenc

MIT — lásd a LICENSE fájlt. Copyright (c) 2026 Billingo Technologies Zrt.

⬆️ Ugrás az elejére


English

The official Billingo MCP server — 49 tools over the Billingo invoicing API v3, for stdio (desktop) and Streamable HTTP (self-hosted) clients. MIT-licensed and self-hostable. There was no official Billingo SDK or MCP server before this — it is the first.

No install needed for most people — use the hosted server at mcp.billingo.hu. Prefer to run it yourself? It's also published on npm as @billingo/billingo-mcp (npx, no build) and as a Docker image — see Choose how to run it below.

🧭 Choose how to run it

Setup

Best for

🌐 Hosted server

None — point your client at a URL

Most people: zero install, zero maintenance

💻 stdio via npx

npx, no build

Desktop MCP clients (Claude Desktop, Claude Code)

🐳 Docker (self-hosted HTTP)

docker run

Running your own instance, on your own infrastructure

⬆️ Back to top

No install, no self-hosting — point your MCP client at https://mcp.billingo.hu and send your Billingo API key with every request. This is the fastest way to get started; reach for stdio or Docker below only if you specifically need to self-host.

Claude Code CLI

claude mcp add --transport http billingo https://mcp.billingo.hu \
  -s user \
  -H "X-Billingo-Api-Key: your-api-key" \
  -H "X-Billingo-Allow-Write: true"

-s user registers it across every project instead of just the current one; use -s local (the default) to scope it to just this project. Drop the X-Billingo-Allow-Write header, or set it to "false", for read-only access.

Other HTTP-capable MCP clients

Any client that speaks Streamable HTTP works the same way: point it at https://mcp.billingo.hu with the X-Billingo-Api-Key header (required) and optionally X-Billingo-Allow-Write — see Configuration for the full header reference.

Get your API key the same way as described under API key below.

⬆️ Back to top

💻 Install / run with stdio

No install step — npx fetches and runs the package on demand.

Claude Desktop

claude_desktop_config.json:

{
  "mcpServers": {
    "billingo": {
      "command": "npx",
      "args": ["-y", "@billingo/billingo-mcp"],
      "env": {
        "BILLINGO_API_KEY": "your-api-key",
        "BILLINGO_ALLOW_WRITE": "false"
      }
    }
  }
}

Restart the client fully afterwards — Claude Desktop reads this file only at startup, so quitting the window is not enough (use ⌘Q on macOS).

Claude Code CLI

claude mcp add billingo -s user \
  -e BILLINGO_API_KEY=your-api-key \
  -e BILLINGO_ALLOW_WRITE=false \
  -- npx -y @billingo/billingo-mcp

-s user registers the server for you across every project, not just the one you're currently in, without committing anything to a repo. Use -s local (the default) instead to scope it to the current project only. Verify with claude mcp list, or inspect the saved config with claude mcp get billingo.

Other MCP clients

Any client that accepts the standard mcpServers JSON shape (Cursor, Windsurf, and others) can reuse the Claude Desktop block above as-is — command, args, and env are not Claude-specific, only the surrounding config file and its location differ.

API key

Get your API key from Billingo under Settings → API keys → New API key. On the creation form:

  • Associated connection: Custom development.

  • API scope: Read if you only need to list or fetch data, or Write if you also want to create, modify, send, or cancel documents.

This is a second, independent gate from BILLINGO_ALLOW_WRITE below: a Read-scoped key still gets a permission error straight from the Billingo API on any write call, even if BILLINGO_ALLOW_WRITE is "true" here — both have to allow it. Leave BILLINGO_ALLOW_WRITE at "false" (or omit it) unless you actually want the model to be able to create, modify, send, or cancel documents — see Security. Note that config files like claude_desktop_config.json are stored in plain text, so the key sits unencrypted on disk.

To check it worked: the client should list 22 tools in read-only mode, or 49 with BILLINGO_ALLOW_WRITE set to "true". If it reports no tools, check the client's log (on macOS, ~/Library/Logs/Claude/mcp-server-billingo.log) — the server identifies itself as {"name":"billingo","version":"0.1.0"}. A different name there means the client is talking to some other server registered under the same name.

⬆️ Back to top

🐳 Run with Docker (HTTP)

docker run -p 3000:3000 ghcr.io/octonull/billingo-mcp:latest

The image ships with no API key baked in. HTTP mode is stateless and per-request: every call carries the Billingo API key in a header, and the server never stores it. Example call, showing the two Billingo-specific headers:

curl -X POST http://localhost:3000 \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H 'X-Billingo-Api-Key: your-api-key' \
  -H 'X-Billingo-Allow-Write: true' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'

GET /health returns {"status":"ok"} and needs no headers, for container health checks. GET /build_version returns the running image's build-time version, e.g. {"buildVer":"fcc756d@0.1.0"} — or just the commit SHA ({"buildVer":"fcc756d"}) if that build isn't from a release tag.

Get the API key itself the same way as for stdio — see API key above — and give it Write scope on Billingo's side if you intend to send X-Billingo-Allow-Write.

Claude Code CLI

claude mcp add --transport http billingo http://localhost:3000 \
  -s user \
  -H "X-Billingo-Api-Key: your-api-key" \
  -H "X-Billingo-Allow-Write: true"

-s user registers it across every project instead of just the current one; use -s local (the default) to scope it to just this project. Drop the X-Billingo-Allow-Write header, or set it to "false", for read-only access.

⬆️ Back to top

🔧 Configuration

Variable

Transport

Required

Default

Meaning

BILLINGO_API_KEY

stdio only

yes

—

Your Billingo API key. Not read in HTTP mode — see below.

BILLINGO_ALLOW_WRITE

stdio only

no

false

"true" or "1" enables write tools for this stdio process. Any other value (including a typo) is treated as false.

BILLINGO_TOOL_CATEGORIES

stdio only

no

all

Comma-separated tool groups to load, and only these: organization, partners, products, spendings, bank_accounts, document_blocks, documents. An unknown name stops the server from starting.

BILLINGO_BASE_URL

both

no

https://api.billingo.hu/v3

Override the API base URL, e.g. to point at a proxy.

PORT

HTTP only

no

3000

Port the HTTP server listens on.

BILLINGO_ALLOWED_HOSTS

HTTP only

no

unset (protection disabled)

Comma-separated list of Host header values the server will accept — DNS-rebinding protection. Set this whenever the server is reachable from outside localhost.

HTTP mode takes credentials and scope per request, as headers, instead:

Header

Required

Meaning

X-Billingo-Api-Key

yes

The Billingo API key to use for this request. Never stored.

X-Billingo-Allow-Write

no

"true" or "1" enables write tools for this request only.

X-Billingo-Tool-Categories

no

The same group list as BILLINGO_TOOL_CATEGORIES, for this request. Clients that cannot set a header can use ?categories=documents,partners in the URL; when both are set, the header wins. Unknown name: 400.

⬆️ Back to top

🔒 Security

Read this section before exposing the server to anything.

  • Read-only by default. Write tools (create, update, delete, send, cancel) are filtered out of tools/list entirely unless BILLINGO_ALLOW_WRITE (stdio) or X-Billingo-Allow-Write (HTTP) is explicitly set. A model that never sees a write tool cannot call it. This is the primary safety mechanism — leave writes off unless you specifically need them.

  • Issued invoices are reported to NAV automatically and cannot be undone. Once a document is finalized into an invoice, Hungary's NAV Online Számla reporting happens immediately and is not reversible. The only remedy for a wrong invoice is a storno (cancellation) — and a storno is itself irreversible: it voids the invoice permanently and is also reported to NAV. There is no "delete" for an issued invoice.

  • HTTP mode requires TLS. The API key travels in the X-Billingo-Api-Key header on every request. Terminate TLS in front of the container (a reverse proxy, load balancer, or platform ingress) — never run HTTP mode over plain HTTP outside a trusted local network.

  • HTTP mode stores no API key, by design. Do not "fix" this by setting an API key via a container-wide environment variable — that turns the deployment single-tenant and lets every caller who can reach the container bill your account, since there would be nothing left to distinguish requests. The per-request header is the point.

  • Set BILLINGO_ALLOWED_HOSTS whenever the HTTP server is exposed publicly. Without it, DNS-rebinding protection is disabled.

⬆️ Back to top

🧰 Tools

49 tools total: 22 read (always visible), 27 write (visible only with writes enabled). If your client puts every tool schema into the prompt, load only the groups you need with BILLINGO_TOOL_CATEGORIES (over HTTP: X-Billingo-Tool-Categories).

Organization (3 read)

  • billingo_get_organization — Get organization details (tax code, subscription, NAV connection status).

  • billingo_check_tax_number — Validate a Hungarian tax number (full hyphenated form; needs a live NAV connection).

  • billingo_get_conversion_rate — Get an official currency conversion rate, optionally for a past date.

Partners (2 read, 4 write)

  • billingo_list_partners — List partners.

  • billingo_get_partner — Get a single partner.

  • billingo_create_partner — Create a partner. (write)

  • billingo_update_partner — Update a partner; only the fields you send change. (write)

  • billingo_guess_partner — Find a partner by tax number/email, or create one. (write)

  • billingo_delete_partner — Delete a partner. (write)

Products (3 read, 3 write)

  • billingo_list_products — List products.

  • billingo_get_product — Get a single product.

  • billingo_get_product_quantity — Get a product's stock quantity.

  • billingo_create_product — Create a product. (write)

  • billingo_update_product — Update a product; only the fields you send change. (write)

  • billingo_delete_product — Delete a product. (write)

Spendings (2 read, 3 write)

  • billingo_list_spendings — List spendings.

  • billingo_get_spending — Get a single spending.

  • billingo_create_spending — Create a spending. (write)

  • billingo_update_spending — Update a spending; only the fields you send change. (write)

  • billingo_delete_spending — Delete a spending. (write)

Bank accounts (2 read, 3 write)

  • billingo_list_bank_accounts — List bank accounts.

  • billingo_get_bank_account — Get a single bank account.

  • billingo_create_bank_account — Create a bank account. (write)

  • billingo_update_bank_account — Update a bank account; only the fields you send change. (write)

  • billingo_delete_bank_account — Delete a bank account. (write)

Document blocks (1 read, 1 write)

  • billingo_list_document_blocks — List document blocks (invoice number ranges).

  • billingo_create_document_block — Create a document block. (write)

Documents — read (8)

  • billingo_list_documents — List documents (invoices, receipts, proformas, drafts, and more).

  • billingo_get_document — Get a single document by id or vendor id.

  • billingo_download_document — Get the document PDF (public URL, or base64 bytes).

  • billingo_get_document_public_url — Get a shareable public URL for a document.

  • billingo_get_online_szamla_status — Get a document's NAV Online Számla reporting status. Errors when the document has no NAV record — e.g. the organization is not connected to NAV Online Számla, or the document isn't subject to reporting.

  • billingo_get_document_payments — Get the payments recorded against a document.

  • billingo_get_document_reminders — Get the reminder events sent for a document.

  • billingo_pos_print — Get a POS-thermal-printer-sized PDF receipt for a document.

Documents — write (9)

  • billingo_create_document — Create a document (invoice, proforma, draft, or advance). (write)

  • billingo_create_receipt — Create a receipt (needs a receipt-type document block). (write)

  • billingo_finalize_draft — Finalize a draft into an invoice — issues it and reports it to NAV. (write)

  • billingo_finalize_receipt_draft — Finalize a draft into a receipt. (write)

  • billingo_create_document_from_proforma — Create an invoice from a proforma. (write)

  • billingo_copy_document — Copy a document; an invoice copy is a draft (issue it with billingo_finalize_draft). (write)

  • billingo_create_modification_document — Create a modification (correction) document. (write)

  • billingo_update_payment — Replace a document's recorded payments; any payment left out is deleted. (write)

  • billingo_archive_document — Archive a proforma document. (write)

Documents — export (1 read)

  • billingo_export_documents — Export documents.

Documents — destructive (4 write)

  • billingo_cancel_document — Cancel (storno) a document — irreversible. (write)

  • billingo_send_document — Send a document by email. (write)

  • billingo_delete_document — Delete a document (only drafts/unissued documents; an issued invoice must be cancelled instead). (write)

  • billingo_delete_payment — Delete a document's recorded payments. (write)

Results and errors

  • Structured results. 17 read tools publish an outputSchema and also return their result as structuredContent, so hosts that call tools from code (code mode) get typed data. The text block is unchanged. The schemas are open (new Billingo fields pass) and require nothing but a record's id; if a response ever did not fit, the SDK would return the call as an Output validation error, which npm run test:live checks for on every run. Tools that return a file (download_document, pos_print, export_documents) or whose shape cannot be checked on a sandbox (check_tax_number, get_product_quantity) publish none, and neither do the write tools.

  • Errors. A Billingo API error comes back as isError: true: the first text block is the message, the second is JSON, {"error": {"code", "retryable", "outcome_unknown", "status", "retry_after_seconds", "fields", "trace_id", "message"}}. Codes: bad_request, unauthorized, nav_connection_required, subscription_required, forbidden, not_found, validation_failed, rate_limited, pdf_not_ready, server_error, api_error, client_error, invalid_arguments, export_pending, export_failed. retryable is never true for a server error on a tool that is not idempotent: there outcome_unknown is set instead, because the invoice may already have been issued, so check by vendor_id before trying again. A retried delete may answer not_found when the first attempt went through. Input-validation errors from the SDK keep their plain-text form.

  • Updates. Billingo's API replaces the whole record on update and clears what is left out. The partner, product, bank account and spending update_* tools therefore read the record first and send it back complete with your changes: send only the field that changes. update_payment still replaces the whole payment list, so read the existing payments first. All of them carry destructiveHint: true. The read and the write are two requests, so a change made in Billingo between them is overwritten. On a HUF spending the *_huf amounts follow the totals; in another currency Billingo does not convert, so a new total, currency or rate needs its HUF amounts too. A spending's line items (items, from NAV imports) are not part of the write model; whether an update keeps them is not verified.

⬆️ Back to top

🔨 Development

git clone https://github.com/octonull/billingo-mcp.git
cd billingo-mcp
npm ci
npm test

TypeScript is pinned to 5.9.3 and cannot currently be upgraded: openapi-typescript requires typescript@^5.x, and typescript-eslint requires <6.1.0 — their intersection is 5.9.3. Installing a newer TypeScript fails npm install with an ERESOLVE conflict.

Other useful commands: npm run typecheck, npm run lint, npm run format, npm run test:coverage, npm run build.

Architecture: the layers, the path of a tool call and how the update tools work, with a diagram: ARCHITECTURE.md.

Live smoke suite: npm run test:live runs a small suite against the real Billingo sandbox (creating and cleaning up real, if harmless, sandbox data). It needs BILLINGO_SANDBOX_API_KEY set to a sandbox API key; without it, the suite skips cleanly (this is also how CI and contributors without sandbox access run it safely).

⬆️ Back to top

🤝 Contributing

Issues and pull requests are welcome. Please run npm run format:check, npm run lint, npm run typecheck, and npm run test:coverage before opening a PR — CI enforces all four. See CLAUDE.md for the architecture and the constraints that aren't obvious from the code alone.

⬆️ Back to top

📜 Licence

MIT — see LICENSE. Copyright (c) 2026 Billingo Technologies Zrt.

⬆️ Back to top

Available Tools

22 tools
billingo_check_tax_numberCheck tax numberA
Read-onlyIdempotent

Looks up a Hungarian tax number at NAV and returns the company data behind it. Use this to validate a tax number before creating a partner. Works only when the Billingo account has a live NAV Online Számla connection (not available on sandbox accounts).

NameRequiredDescriptionDefault
tax_numberYesFull Hungarian tax number with hyphens, e.g. "12345678-2-42".

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds real context beyond the annotations: it calls out to NAV, requires a live NAV Online Számla connection, and is unavailable on sandbox accounts. It does not cover failure modes for invalid numbers or response shape, but the external-dependency disclosure is valuable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the action and followed by usage and the key constraint. Nothing is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read-only lookup with full schema coverage, the description covers what it does, when to use it, and the account-level prerequisite. Return-value detail is limited to 'company data' given no output schema, but that is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a single parameter fully described including a pattern and example. The description adds no additional parameter meaning, so the schema baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (looks up a Hungarian tax number at NAV) and what it returns (company data behind it). This is clearly distinguishable from sibling partner/listing tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to use it to validate a tax number before creating a partner, which is a clear usage context. It also states the operational precondition (live NAV Online Számla connection, not sandbox), though it names no alternative tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

billingo_download_documentDownload documentA
Read-onlyIdempotent

Gets the document PDF. By default returns a shareable public URL — this is what works in most MCP clients (including Claude Desktop, which rejects the base64 file attachment) and is what you want in almost every case. Pass format="base64" only when a caller specifically needs the raw PDF bytes: it costs a lot of context (base64 is ~1.33x the PDF size) and some clients cannot render the result at all.

NameRequiredDescriptionDefault
idYesDocument id.
formatNo"url" returns a public link (default); "base64" returns the PDF bytes.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnly/idempotent annotations already present, the description adds valuable behavioral detail: default public URL behavior, Claude Desktop incompatibility with base64, ~1.33x context overhead, and rendering risks. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences that front-load the behavior, then add only necessary caveats. Every sentence earns its place, and the cost/rendering warnings are compactly expressed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read-only tool with no output schema, the description is complete: it states the return form, default behavior, when to override it, and the trade-offs. An agent has enough context to call it correctly and to interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers both parameters at 100%, so the baseline is 3, but the description adds significant meaning: it names 'url' as the default, instructs when to use base64, quantifies the context cost, and warns about client support. This exceeds schema-only information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear action and resource: 'Gets the document PDF' and identifies two return formats. It is not a tautology, but it does not explicitly distinguish itself from the sibling billingo_get_document_public_url even though both can yield a public URL.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit format-selection guidance: default URL is 'what you want in almost every case' and base64 should be used 'only when a caller specifically needs the raw PDF bytes.' It does not, however, mention sibling tools or say when to prefer this tool over get_document_public_url.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

billingo_export_documentsExport documentsA
Read-only

Exports documents in a date range to a downloadable file, in one of the accounting/reporting formats Billingo supports (e.g. simple_csv, simple_excel, or a named accounting-system format). Creates the export, waits for it to finish, and returns the file. Nothing is modified. Textual formats (simple_csv, nav_xml, and other XML/JSON-based targets) come back as readable text you can analyse directly — very large exports are truncated with an explicit note, and a narrower date range will return the whole thing. Binary formats (simple_excel, simple_excel_items) come back as a file attachment that some MCP clients cannot display inline.

NameRequiredDescriptionDefault
formatYesExport format/target accounting system. See the enum for valid values.
block_idNoRestrict the export to one document block.
end_dateYesEnd of the export range.
query_typeNoWhich date field start_date/end_date filter by. Defaults to "invoice_date".
start_dateYesStart of the export range.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint, and the description reinforces this with 'Nothing is modified.' It also discloses that the tool creates the export, waits for completion, returns the file, truncates very large exports with an explicit note, and that binary formats may not display inline. This is rich behavioral context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence in the description contributes meaningful information. The main purpose is front-loaded, followed by behavioral notes and output-type distinctions. It is concise enough to read quickly while covering all important nuances.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 5 parameters, no output schema, and a complex format-dependent return behavior, the description covers the key operational aspects: no side effects, waiting/truncation behavior, and inline-display limitations. Schema handles the remaining parameter details, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds value beyond the schema by explaining how the format parameter behaves (textual vs binary output, truncation behavior, and that a narrower date range returns the whole export). This extra semantic context justifies a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description opens with a specific verb and resource: 'Exports documents in a date range to a downloadable file'. It clearly distinguishes itself from siblings like billingo_download_document by emphasizing date-range export and multiple accounting formats. The explicit format examples further anchor the purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear scenarios: use for date-range exports in Billingo-supported formats, with guidance on textual vs binary outputs. However, it does not explicitly name alternatives such as billingo_download_document or say when not to use them, so it stops short of a full when/when-not routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

billingo_get_bank_accountGet bank accountA
Read-onlyIdempotent

Returns a single bank account by id.

NameRequiredDescriptionDefault
idYesBank account id.

Output Schema

NameRequiredDescription
idYes
nameNo
swiftNo
need_qrNo
currencyNo
account_numberNo
account_number_ibanNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered structurally. The description adds no behavioral context of its own - no indication of what happens for an unknown id (error vs empty) or how missing records surface.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short sentence with no filler, and the resource and keying mechanism are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a trivial single-record getter with rich annotations, full schema coverage and an output schema, the description is sufficient to call it correctly. The only gap is error/not-found behavior for an invalid id.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a single documented 'id' parameter ('Bank account id.'), so the schema carries the semantics. The description only restates that lookup is by id and adds nothing about format or validity constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: 'Returns a single bank account by id.' The singular 'single...by id' implicitly distinguishes it from the plural sibling billingo_list_bank_accounts, though it never names that sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the phrase 'by id' signals you need a known identifier, which steers agents toward list_bank_accounts first when they don't. There are no explicit when-to-use/when-not statements or named alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

billingo_get_conversion_rateGet currency conversion rateB
Read-onlyIdempotent

Returns the conversion rate Billingo would apply between two currencies.

NameRequiredDescriptionDefault
toYesTarget currency.
dateNoRate as of this date. Omit for today's rate. For a backdated or historical document, pass its fulfillment_date here — otherwise you'll get today's rate on a document dated in the past.
fromYesSource currency.

Output Schema

NameRequiredDescription
dateNo
to_currencyNo
from_currencyNo
conversation_rateNo

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and openWorld, so safety is covered. The description adds meaningful context by specifying this is the rate Billingo itself would apply rather than a market rate. It stops short of disclosing rounding/precision, direction semantics, or freshness behavior, which are relevant for a rate lookup.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single compact sentence with the key qualifier ('Billingo would apply') front-loaded. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return-value explanation isn't required, and the schema fully documents parameters. But for a tool whose main misuse risk is fetching today's rate for a historical document, the description omits that context entirely, leaving the schema's date note to carry it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with clear enum and a well-annotated date parameter, so the baseline of 3 applies. The description itself contributes nothing to parameter meaning — it never mentions source/target ordering or the date option.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb ('Returns') and resource ('conversion rate') with a scope qualifier ('between two currencies'), and the phrase 'Billingo would apply' distinguishes it from a generic market-rate lookup. No sibling tool offers a comparable function, so no explicit differentiation is needed, but the definition doesn't call out its uniqueness.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to call this versus other tools, no mention of prerequisites, and no hint that the date parameter supports historical rates — that crucial guidance ('for a backdated document pass its fulfillment_date') lives only in the schema, not the prose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

billingo_get_documentGet documentA
Read-onlyIdempotent

Returns a single document. Give either id (the Billingo document id) or vendor_id (your own external reference set when the document was created).

NameRequiredDescriptionDefault
idNoBillingo document id.
vendor_idNoYour external reference for the document.

Output Schema

NameRequiredDescription
idYes
typeNo
itemsNo
partnerNo
summaryNo
block_idNo
currencyNo
due_dateNo
cancelledNo
paid_dateNo
gross_totalNo
invoice_dateNo
invoice_numberNo
payment_methodNo
payment_statusNo
conversion_rateNo
correction_typeNo
fulfillment_dateNo
related_documentsNo
online_szamla_statusNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered and the description's job is lighter. It adds the lookup-mode distinction, but says nothing about error behavior when neither identifier is given, precedence when both are given, or auth requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, the action first and the parameter rule second, with no filler. Every clause carries information an agent needs before calling.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values needn't be described, and the identifier semantics are handled. The only gap is edge-case behavior (no identifier supplied, or both supplied), which is minor for a simple read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds real meaning the schema lacks: it explains that the two parameters are mutually exclusive alternatives rather than both-optional fields, and clarifies vendor_id is a reference set at creation time. That resolves an ambiguity the bare schema leaves open.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Returns a single document"), which cleanly separates it from the plural billingo_list_documents sibling. It doesn't name adjacent document tools like download_document or get_document_public_url, but the singular-retrieval framing is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The alternation rule "Give either `id` or `vendor_id`" gives usable calling guidance, but there is no explicit statement of when to pick this over list_documents, get_document_public_url, or download_document, nor what happens if neither argument is supplied. Usage is implied rather than directed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

billingo_get_document_paymentsGet document paymentsB
Read-onlyIdempotent

Returns the payments recorded against a document.

NameRequiredDescriptionDefault
idYesDocument id.

Output Schema

NameRequiredDescription
paymentsYes

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, and the description is consistent with them. However, it adds no behavioral context beyond the annotations—no pagination, empty-result behavior, or scope details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no wasted words. It states the operation and return subject immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple: one required id parameter, annotations present, and an output schema exists. The description tells the agent what the call returns, which is sufficient for correct invocation, though it could mention empty or paginated results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 100% description coverage and only one parameter, 'id', already documented as 'Document id.' The description adds no additional meaning or format constraints beyond the schema baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: returns payments recorded against a document. It distinguishes itself from the sibling get_document by focusing on the payments subresource, though it does not explicitly contrast with get_document or get_document_reminders.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides no explicit guidance on when to use this tool, when not to, or which sibling to choose instead. The intended use is only implied by the phrase 'payments recorded against a document.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

billingo_get_document_public_urlGet document public URLA
Read-onlyIdempotent

Returns a shareable public URL for the document, viewable without a Billingo login.

NameRequiredDescriptionDefault
idYesDocument id.

Output Schema

NameRequiredDescription
public_urlNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered; the description adds the non-obvious fact that the resulting URL grants public, unauthenticated access. It does not say whether the link expires or can be revoked, which is the one remaining behavioral detail an agent would want.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; the public-access caveat is packed into the same sentence rather than trailing as an afterthought.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the return shape needn't be described, and one fully-documented parameter plus rich annotations make this adequate. Only URL lifetime/revocability is missing, a minor gap for such a narrow tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter ('id') and schema description coverage is 100%, so the schema fully documents it; the description adds nothing about the id's meaning or scope. Baseline 3 applies when the schema carries the load.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Returns') and a precise resource ('shareable public URL for the document'), which clearly separates it from billingo_get_document (metadata/body) and billingo_download_document (file bytes). It stops short of naming those siblings explicitly, so differentiation is inferred rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'viewable without a Billingo login' implies the sharing use case but never says when to choose this over get_document or download_document, nor whether a prerequisite (existing document, permissions) applies. Usage is implied, not directed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

billingo_get_document_remindersGet document reminder eventsB
Read-onlyIdempotent

Returns the payment reminder events sent for a document, grouped into sent, upcoming and postal-mail reminders.

NameRequiredDescriptionDefault
idYesDocument id.

Output Schema

NameRequiredDescription
sent_remindersNo
sent_postal_mailNo
upcoming_remindersNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=true, so the safety profile is covered. The description adds useful behavioral context by naming the reminder groupings returned, but it does not discuss permissions, scoping, or edge cases beyond that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single tight sentence with no filler. It front-loads the action and resource and then lists the grouping categories efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema, full parameter schema coverage, and read-only annotations, so the description only needs to orient the agent. It does that by stating the returned reminder categories. Minor missing context about error behavior or authentication does not significantly impair correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and there is only one required parameter, whose description already says 'Document id.' The tool description does not add additional meaning beyond the schema, but the schema fully documents the parameter, so the baseline score applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it returns payment reminder events for a document. The grouping into sent, upcoming, and postal-mail reminders further clarifies the resource. It does not explicitly distinguish itself from nearby sibling tools such as billingo_get_document_payments, but the resource is clear enough to identify the operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no when-to-use guidance, no exclusions, and no named alternatives. It is implied that an agent calls this when it needs reminder events for a document, but there is no explicit routing information among sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

billingo_get_online_szamla_statusGet NAV Online Számla statusA
Read-onlyIdempotent

Returns the NAV Online Számla reporting status of a document: the transaction id, the status, and any validation messages from NAV. Use this to check whether reporting succeeded. Errors (4xx, "NavOnlineSzamla is not found") when the document has no NAV record at all — for example when the organization is not connected to NAV Online Számla, or the document is not subject to reporting. That is not a NAV failure; it means there is nothing to report on.

NameRequiredDescriptionDefault
idYesDocument id.

Output Schema

NameRequiredDescription
statusNo
messagesNo
transaction_idNo

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds valuable context beyond annotations by explaining the meaning of 4xx 'NavOnlineSzamla is not found' errors and clarifying that it indicates no NAV record rather than a failure. Annotations already cover safety (readOnly, idempotent, openWorld).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences plus an error clarification, front-loaded with return details and usage. No unnecessary text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple one-parameter input, output schema, and annotations, the description covers what is needed: return fields, usage context, and error behavior. No gaps for calling correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with one parameter 'id' fully described. The description adds no additional parameter semantics, but none is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (returns) and resource (NAV Online Számla reporting status of a document), and lists the return fields. However, it does not explicitly differentiate from sibling tools like get_document, though the resource is unique enough that confusion is unlikely.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a clear use case ('Use this to check whether reporting succeeded') and explains error conditions, but does not explicitly name alternatives or state when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

billingo_get_organizationGet organizationA
Read-onlyIdempotent

Returns account-level data for the organization that owns the API key: its tax code, its Billingo subscription, and whether NAV Online Számla is connected. This is NOT a company profile — it contains no name, id or address. Use it to check the subscription or NAV connection status.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
tax_codeNo
subscriptionNo
has_nav_connectionNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is covered. The description adds useful scope details: the data belongs to the organization owning the API key, includes specific fields, and explicitly excludes company-profile data like name, id, and address. It does not add auth or rate-limit context, but it meaningfully supplements the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the return contents, followed by the key exclusion and the use case. Every sentence adds useful information with no repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the description need not document return values in detail. It explains the scope, included fields, and exclusions well enough to call the tool correctly. The only meaningful gap is not clarifying the relationship with the sibling NAV status tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4. There are no parameter semantics to explain, and the description does not need to compensate for any schema gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb and resource: it returns account-level organization data tied to the API key, and specifies tax code, subscription, and NAV connection status. It also explicitly rules out company-profile fields such as name, id, and address. It does not distinguish itself from the sibling billingo_get_online_szamla_status, which also relates to NAV status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit use case: checking subscription or NAV connection status. However, it does not explain when to use the dedicated sibling billingo_get_online_szamla_status instead, and it provides no further exclusions or prerequisites. The guidance is present but incomplete against the sibling set.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

billingo_get_partnerGet partnerB
Read-onlyIdempotent

Returns a single partner by id.

NameRequiredDescriptionDefault
idYesPartner id.

Output Schema

NameRequiredDescription
idYes
ibanNo
nameNo
phoneNo
swiftNo
emailsNo
addressNo
taxcodeNo
tax_typeNo
account_numberNo

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, and the description adds nothing beyond them. It says nothing about error behavior for an unknown id or whether related data (e.g. addresses, tax info) is included, so it contributes no behavioral value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no wasted words. However, the brevity reflects under-specification rather than disciplined density.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a simple single-parameter read with an output schema and full annotation coverage, so the safety and return shape burdens are handled elsewhere. The description is adequate, though a note on missing-record behavior would make it complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with the single id parameter documented in the schema, so the baseline is 3. The phrase "by id" merely restates the schema and adds no format or constraint detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Returns a single partner") plus the lookup key, which implicitly separates it from the sibling list_partners. It does not explicitly name the sibling or clarify it is a full-detail read, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No indication of when to call this instead of billingo_list_partners, nor any precondition such as needing a known partner id. The agent must infer usage entirely from the name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

billingo_get_productGet productA
Read-onlyIdempotent

Returns a single product by id.

NameRequiredDescriptionDefault
idYesProduct id.

Output Schema

NameRequiredDescription
idYes
eanNo
skuNo
vatNo
nameNo
unitNo
commentNo
currencyNo
net_unit_priceNo
gross_unit_priceNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds nothing beyond the bare operation – no error behavior for missing ids, no note about which organization's data is queried despite openWorldHint being true.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler. It is efficient, though the terseness leaves the reader with nothing beyond the bare statement of the operation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and annotations cover the safety profile for this simple one-parameter read. The only gap is the lack of any error or not-found guidance, which is minor here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single id parameter is documented in the schema as "Product id." The description restates the same fact without adding format, range, or source-of-id guidance, so the schema does all the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (returns) and resource (a single product) scoped by id, which clearly separates it from a list operation. It does not name a sibling such as billingo_list_products, so differentiation is only implicit in the wording.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase "single product by id" implies this is the fetch-one counterpart to a list tool, which an agent can infer from the sibling names. There is no explicit when-to-use or when-not-to-use statement, and no mention of what happens if the id is unknown.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

billingo_get_product_quantityGet product stock quantityA
Read-onlyIdempotent

Returns the current inventory quantity for a product.

NameRequiredDescriptionDefault
idYesProduct id.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true, and idempotentHint=true, covering the safety profile. The description adds only that the returned quantity is 'current', which is mild behavioral context but does not disclose potential caveats such as data freshness, units, or whether the quantity represents available vs. physical stock. Since annotations carry most of the burden, a mid-range score is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler or repetition. It conveys the action, the resource, and the returned information efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter getter with rich annotations, the description is nearly complete. It tells the agent what will be returned ('current inventory quantity'). However, since there is no output schema, a slightly more explicit statement about the return format could improve completeness, though it is not essential for such a trivial tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already provides 100% coverage with a clearly described 'id' parameter. The description does not add any parameter-level meaning beyond what the schema states, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Returns'), a specific resource ('inventory quantity'), and the target ('a product'). This clearly distinguishes it from siblings like billingo_get_product, which would return broader product details. The tool's name and title reinforce the purpose without adding confusion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance about when to use this tool versus alternatives such as billingo_get_product or billingo_list_products. There is no stated context, prerequisite, or condition that would help an agent choose it over similar product-related tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

billingo_get_spendingGet spendingB
Read-onlyIdempotent

Returns a single spending by id.

NameRequiredDescriptionDefault
idYesSpending id.

Output Schema

NameRequiredDescription
idYes
commentNo
paid_atNo
partnerNo
categoryNo
currencyNo
due_dateNo
total_grossNo
invoice_dateNo
invoice_numberNo
payment_methodNo
conversion_rateNo
fulfillment_dateNo
total_vat_amountNo
total_gross_localNo
total_vat_amount_localNo

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true and openWorldHint=true, so the safety profile is covered structurally. The description adds nothing beyond that — no note on what happens with an unknown id, whether the response is a live upstream fetch (openWorld), or any rate/consistency caveat.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short, front-loaded sentence with no filler or redundancy. It is arguably too terse rather than padded, but nothing in it is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value explanation is not required, and the single parameter is fully described in the schema. However, for an open-world fetch by id, the description never says whether a missing/invalid id errors or returns empty, leaving a small but real gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter exists and the schema documents it fully ("Spending id.", 100% coverage, required). The description's "by id" is consistent with the schema but adds no meaning beyond it, so the baseline 4 for a fully documented single-parameter tool applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Returns a single spending") and the qualifier "by id" scopes the operation. The word "single" implicitly contrasts with the sibling billingo_list_spendings, though the alternative is never named, so differentiation is only inferable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this tool versus billingo_list_spendings or any other sibling, no prerequisites, and no error/not-found conditions mentioned. The only usable cue is the implicit 'you need one record and already have its id'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

billingo_list_bank_accountsList bank accountsB
Read-onlyIdempotent

Lists the bank accounts configured on the organization.

NameRequiredDescriptionDefault
pageNoPage number, starting at 1.
per_pageNoResults per page (1-100, default 25).

Output Schema

NameRequiredDescription
dataYes
totalNo
per_pageNo
last_pageNo
current_pageNo
next_page_urlNo
prev_page_urlNo

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true and openWorldHint=true, so safety and repeatability are covered. The description adds that results are scoped to the organization's own configuration, but says nothing about pagination behavior or ordering. Acceptable given the annotation coverage, but thin.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler. It is efficient, though the terseness leaves room for one more useful clause about paging or the singular sibling.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-required-parameter list tool with full schema coverage, an output schema and read-only annotations, the description covers the essentials. Only minor gaps remain around pagination behavior and sibling routing, which structured fields largely absorb.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with page and per_page fully documented including ranges and defaults, so the schema carries the parameter burden. The description adds nothing about pagination semantics, which is acceptable at this baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Lists') and resource ('bank accounts') along with scope ('configured on the organization'), which cleanly separates it from the singular sibling billingo_get_bank_account. It stops short of naming that sibling explicitly, so it is clear but not fully differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no when-to-use context and never mentions the obvious alternative (billingo_get_bank_account) or any prerequisite such as authentication. Usage is only inferable from the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

billingo_list_document_blocksList document blocksA
Read-onlyIdempotent

Lists document blocks (invoice number ranges). Every document belongs to a block; you need a block id to create an invoice.

NameRequiredDescriptionDefault
pageNoPage number, starting at 1.
per_pageNoResults per page (1-100, default 25).

Output Schema

NameRequiredDescription
dataYes
totalNo
per_pageNo
last_pageNo
current_pageNo
next_page_urlNo
prev_page_urlNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds genuine domain context beyond that — that blocks are invoice number ranges and that every document belongs to one — which explains the data model rather than repeating the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the definition and followed by the practical reason to call it. Nothing here is padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and both parameters documented, the description only needs to convey the concept and the use case, which it does. A note on result volume or typical block count would have closed the remaining gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% (page and per_page are fully documented in the schema), so the baseline is 3. The description adds no pagination or filtering semantics of its own.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Lists document blocks') and immediately glosses the domain term as 'invoice number ranges', which is the key disambiguation. It does not name any sibling tool, but no sibling deals with blocks, so the risk of confusion is low.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete use condition: 'you need a block id to create an invoice', which tells the agent why and when to call it. It stops short of explicit when-not-to-use guidance or naming an alternative, so it lands at clear context rather than full routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

billingo_list_documentsList documentsA
Read-onlyIdempotent

Lists documents (invoices, receipts, proformas, drafts and more), newest first. Filter by type, invoice date range, fulfillment date range, payment date range, last modification time, partner, payment status/method or document block.

NameRequiredDescriptionDefault
pageNoPage number, starting at 1.
typeNoRestrict to one document type. Only "invoice" or "receipt" are accepted here.
queryNoFree-text search.
block_idNoRestrict to one document block.
end_dateNoInclude documents invoiced on or before this date.
per_pageNoResults per page (1-100, default 25).
partner_idNoRestrict to one partner.
start_dateNoInclude documents invoiced on or after this date.
paid_end_dateNoInclude documents paid on or before this date.
payment_methodNo
payment_statusNo
paid_start_dateNoInclude documents paid on or after this date.
last_modified_dateNoInclude documents created or modified after this moment, "YYYY-MM-DD HH:MM:SS" in Europe/Budapest local time. Use it to fetch only what changed since a previous call.
fulfillment_end_dateNoInclude documents fulfilled (teljesítés) on or before this date.
fulfillment_start_dateNoInclude documents fulfilled (teljesítés) on or after this date.

Output Schema

NameRequiredDescription
dataYes
totalNo
per_pageNo
last_pageNo
current_pageNo
next_page_urlNo
prev_page_urlNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent and openWorld, so the safety profile is covered structurally. The description adds one genuine behavioral fact — results are returned newest first — but says nothing about pagination limits, total counts, or rate behavior beyond what the schema states.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the operation and ordering, then the filter set. No filler or repetition; the small cost is a dense comma-list that is slightly harder to scan than a structured breakdown.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 15-parameter read-only list tool with an output schema and 87% schema coverage, the description establishes scope, default ordering and the filter surface adequately. The missing piece is paging guidance, which is left entirely to the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 87%, so per-parameter meaning is largely already documented. The description's filter list (type, invoice date range, fulfillment date range, payment date range, last modification time, partner, payment status/method, block) maps onto parameters but adds no format, interaction, or precedence guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb + resource ("Lists documents") with an enumeration of what counts as a document (invoices, receipts, proformas, drafts) and an explicit default ordering ("newest first"). An agent can distinguish this list operation from the singular get_document sibling, though no sibling is named directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description enumerates the filter axes, which implies usage for filtered retrieval, but never states when to prefer this over siblings such as billingo_export_documents (bulk export) or billingo_get_document (single record). No exclusions or prerequisites are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

billingo_list_partnersList partnersA
Read-onlyIdempotent

Lists partners (customers), newest first. Supports paging and a free-text search over the partner name.

NameRequiredDescriptionDefault
pageNoPage number, starting at 1.
queryNoFree-text search over the partner name.
per_pageNoResults per page (1-100, default 25).

Output Schema

NameRequiredDescription
dataYes
totalNo
per_pageNo
last_pageNo
current_pageNo
next_page_urlNo
prev_page_urlNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only, idempotent, and open-world. Beyond that, the description discloses useful behavior: results are ordered newest first, paging is supported, and search is limited to partner name. It does not cover rate limits or response shape, but the output schema exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the operation and followed by key behavioral details. Every phrase earns its place, with no repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple, its parameters are fully documented in the schema, and an output schema exists. The description covers ordering, paging, and search scope. The only minor gap is explicit routing guidance relative to billingo_get_partner.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is already 100%, with all three parameters fully documented. The description reinforces paging and free-text search over partner name, but adds no syntax, defaults, or constraints beyond what the schema provides. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb and resource: it lists partners (customers). It also adds useful distinctions such as 'newest first' and free-text search over partner name. It could more explicitly contrast with the sibling get_partner, but the plural list operation is clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: this is the listing tool, and search/paging are supported. However, the description does not explicitly say when to use this versus billingo_get_partner or other retrieval siblings, nor does it mention exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

billingo_list_productsList productsB
Read-onlyIdempotent

Lists products and services from the product catalogue.

NameRequiredDescriptionDefault
pageNoPage number, starting at 1.
queryNoFree-text search over the product name.
per_pageNoResults per page (1-100, default 25).

Output Schema

NameRequiredDescription
dataYes
totalNo
per_pageNo
last_pageNo
current_pageNo
next_page_urlNo
prev_page_urlNo

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already state readOnlyHint=true, idempotentHint=true, and openWorldHint=true, covering the safety profile. The description adds no behavioral context beyond the purpose statement, such as pagination behavior, search semantics, or catalogue scope details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no wasted language. It immediately communicates the tool's resource and scope.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a low-complexity list operation, and the schema, annotations, and output schema already cover parameters, safety, and return values. The description is sufficient for correct invocation, though it could mention search or pagination to be fully self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents page, query, and per_page clearly. The description adds no parameter-level meaning beyond what the schema provides, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Lists products and services from the product catalogue.' It is clear what the tool does, though it does not explicitly distinguish this listing tool from sibling retrieval tools like billingo_get_product.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by 'Lists products and services from the product catalogue,' but there is no explicit guidance on when to use this versus billingo_get_product or billingo_get_product_quantity, nor any stated prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

billingo_list_spendingsList spendingsA
Read-onlyIdempotent

Lists recorded spendings (costs), optionally filtered by date range.

NameRequiredDescriptionDefault
pageNoPage number, starting at 1.
end_dateNoInclude spendings fulfilled on or before this date.
per_pageNoResults per page (1-100, default 25).
start_dateNoInclude spendings fulfilled on or after this date.

Output Schema

NameRequiredDescription
dataYes
totalNo
per_pageNo
last_pageNo
current_pageNo
next_page_urlNo
prev_page_urlNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is clear. The description adds little beyond 'recorded' and optional filtering; it does not elaborate on pagination behavior, return format, or rate limits. With annotations covering the core behavior, a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no wasted words. It efficiently conveys the core action and the optional filter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema, complete parameter descriptions, and clear annotations, the description is sufficient for an agent to call the tool correctly. It could mention pagination defaults, but that gap is minor because the schema covers it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four parameters (page, per_page, start_date, end_date) are fully documented in the schema. The description only restates the date-range filter and adds no semantics beyond what the schema provides. Baseline 3 is correct when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description specifies a clear verb ('Lists') and resource ('recorded spendings (costs)'), and mentions the optional date-range filter. It distinguishes itself from the singular 'billingo_get_spending' by implication, though it does not explicitly name the sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'optionally filtered by date range' implies when to use the date parameters, but there is no explicit guidance on when to choose this tool over 'billingo_get_spending' or other list tools. Usage is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

billingo_pos_printGet POS print dataA
Read-onlyIdempotent

Returns a printable PDF receipt for a document, sized for a POS thermal printer.

NameRequiredDescriptionDefault
idYesDocument id.
sizeYesThermal paper width in millimeters: 58 or 80.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds the output format (PDF receipt) and POS sizing intent, which is useful, but it does not disclose additional behavioral details such as error handling, authorization requirements, or document availability behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no filler. It efficiently conveys the output type, the target use, and the format in one line.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter read-only tool with full schema coverage, the description plus schema adequately cover what an agent needs: the document id, the size, and the PDF output. An explicit pointer to sibling document-retrieval tools would strengthen routing, but nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already fully documents both parameters: id as 'Document id' and size as thermal paper width with 58/80 enumeration. The description adds no new parameter-level meaning beyond reinforcing the POS sizing context, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Returns') and clearly identifies the deliverable: a printable PDF receipt for a document, sized for a POS thermal printer. This distinguishes it from sibling document tools like billingo_download_document by its receipt-specific POS purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'sized for a POS thermal printer' gives a clear contextual signal for when this tool should be chosen over generic document download or public-URL tools. However, it does not explicitly name alternatives or state when not to use it, so it falls short of full guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 18 tool updatesv0.1.3
    • Changedbillingo_check_tax_number3 fields changed
      • changedInput schema / properties / tax_number / description
        Previous value: -"Hungarian tax number, e.g. \"12345678\" or \"12345678-2-42\"."New value: +"Full Hungarian tax number with hyphens, e.g. \"12345678-2-42\"."
      • removedInput schema / properties / tax_number / minLength
        Removed value: -1
      • addedInput schema / properties / tax_number / pattern
        Added value: +"^\\d{8}-\\d-\\d{2}$"
    • Changedbillingo_get_bank_account1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "account_number": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "account_number_iban": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "currency": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "id": {
        +      "type": "number"
        +    },
        +    "name": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "need_qr": {
        +      "type": [
        +        "boolean",
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "swift": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "id"
        +  ],
        +  "type": "object"
        +}
    • Changedbillingo_get_conversion_rate1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "conversation_rate": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "date": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "from_currency": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "to_currency": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedbillingo_get_document1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "block_id": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "cancelled": {
        +      "type": [
        +        "boolean",
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "conversion_rate": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "correction_type": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "currency": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "due_date": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "fulfillment_date": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "gross_total": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "id": {
        +      "type": "number"
        +    },
        +    "invoice_date": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "invoice_number": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "items": {
        +      "anyOf": [
        +        {
        +          "items": {
        +            "additionalProperties": {},
        +            "properties": {
        +              "gross_amount": {
        +                "type": [
        +                  "number",
        +                  "string",
        +                  "null"
        +                ]
        +              },
        +              "name": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              },
        +              "net_amount": {
        +                "type": [
        +                  "number",
        +                  "string",
        +                  "null"
        +                ]
        +              },
        +              "net_unit_amount": {
        +                "type": [
        +                  "number",
        +                  "string",
        +                  "null"
        +                ]
        +              },
        +              "quantity": {
        +                "type": [
        +                  "number",
        +                  "string",
        +                  "null"
        +                ]
        +              },
        +              "unit": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              },
        +              "vat": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "online_szamla_status": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "paid_date": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "partner": {
        +      "anyOf": [
        +        {
        +          "anyOf": [
        +            {
        +              "additionalProperties": {},
        +              "properties": {
        +                "id": {
        +                  "type": [
        +                    "number",
        +                    "string",
        +                    "null"
        +                  ]
        +                },
        +                "name": {
        +                  "type": [
        +                    "string",
        +                    "null"
        +                  ]
        +                },
        +                "taxcode": {
        +                  "type": [
        +                    "string",
        +                    "null"
        +                  ]
        +                }
        +              },
        +              "type": "object"
        +            },
        +            {
        +              "items": {},
        +              "maxItems": 0,
        +              "type": "array"
        +            }
        +          ]
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "payment_method": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "payment_status": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "related_documents": {
        +      "anyOf": [
        +        {
        +          "items": {
        +            "additionalProperties": {},
        +            "properties": {
        +              "id": {
        +                "type": [
        +                  "number",
        +                  "string",
        +                  "null"
        +                ]
        +              },
        +              "invoice_number": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "summary": {
        +      "anyOf": [
        +        {
        +          "anyOf": [
        +            {
        +              "additionalProperties": {},
        +              "properties": {
        +                "gross_amount_local": {
        +                  "type": [
        +                    "number",
        +                    "string",
        +                    "null"
        +                  ]
        +                },
        +                "net_amount": {
        +                  "type": [
        +                    "number",
        +                    "string",
        +                    "null"
        +                  ]
        +                },
        +                "vat_amount": {
        +                  "type": [
        +                    "number",
        +                    "string",
        +                    "null"
        +                  ]
        +                }
        +              },
        +              "type": "object"
        +            },
        +            {
        +              "items": {},
        +              "maxItems": 0,
        +              "type": "array"
        +            }
        +          ]
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "type": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "id"
        +  ],
        +  "type": "object"
        +}
    • Changedbillingo_get_document_payments1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "payments": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "conversion_rate": {
        +            "type": [
        +              "number",
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "date": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "payment_method": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "price": {
        +            "type": [
        +              "number",
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "voucher_number": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "payments"
        +  ],
        +  "type": "object"
        +}
    • Changedbillingo_get_document_public_url1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "public_url": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedbillingo_get_document_reminders1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "sent_postal_mail": {
        +      "anyOf": [
        +        {
        +          "items": {},
        +          "type": "array"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "sent_reminders": {
        +      "anyOf": [
        +        {
        +          "items": {},
        +          "type": "array"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "upcoming_reminders": {
        +      "anyOf": [
        +        {
        +          "items": {},
        +          "type": "array"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedbillingo_get_online_szamla_status1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "messages": {
        +      "anyOf": [
        +        {
        +          "items": {
        +            "additionalProperties": {},
        +            "properties": {
        +              "human_readable_message": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              },
        +              "validation_error_code": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              },
        +              "validation_result_code": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "status": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "transaction_id": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedbillingo_get_organization1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "has_nav_connection": {
        +      "type": [
        +        "boolean",
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "subscription": {
        +      "anyOf": [
        +        {
        +          "anyOf": [
        +            {
        +              "additionalProperties": {},
        +              "properties": {
        +                "expiration_date": {
        +                  "type": [
        +                    "string",
        +                    "null"
        +                  ]
        +                },
        +                "features": {
        +                  "anyOf": [
        +                    {
        +                      "items": {},
        +                      "type": "array"
        +                    },
        +                    {
        +                      "type": "null"
        +                    }
        +                  ]
        +                }
        +              },
        +              "type": "object"
        +            },
        +            {
        +              "items": {},
        +              "maxItems": 0,
        +              "type": "array"
        +            }
        +          ]
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "tax_code": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedbillingo_get_partner1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "account_number": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "address": {
        +      "anyOf": [
        +        {
        +          "anyOf": [
        +            {
        +              "additionalProperties": {},
        +              "properties": {
        +                "address": {
        +                  "type": [
        +                    "string",
        +                    "null"
        +                  ]
        +                },
        +                "city": {
        +                  "type": [
        +                    "string",
        +                    "null"
        +                  ]
        +                },
        +                "country_code": {
        +                  "type": [
        +                    "string",
        +                    "null"
        +                  ]
        +                },
        +                "post_code": {
        +                  "type": [
        +                    "string",
        +                    "null"
        +                  ]
        +                }
        +              },
        +              "type": "object"
        +            },
        +            {
        +              "items": {},
        +              "maxItems": 0,
        +              "type": "array"
        +            }
        +          ]
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "emails": {
        +      "anyOf": [
        +        {
        +          "items": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "type": "array"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "iban": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "id": {
        +      "type": "number"
        +    },
        +    "name": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "phone": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "swift": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "tax_type": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "taxcode": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "id"
        +  ],
        +  "type": "object"
        +}
    • Changedbillingo_get_product1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "comment": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "currency": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "ean": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "gross_unit_price": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "id": {
        +      "type": "number"
        +    },
        +    "name": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "net_unit_price": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "sku": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "unit": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "vat": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "id"
        +  ],
        +  "type": "object"
        +}
    • Changedbillingo_get_spending1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "category": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "comment": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "conversion_rate": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "currency": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "due_date": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "fulfillment_date": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "id": {
        +      "type": "number"
        +    },
        +    "invoice_date": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "invoice_number": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "paid_at": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "partner": {
        +      "anyOf": [
        +        {
        +          "anyOf": [
        +            {
        +              "additionalProperties": {},
        +              "properties": {
        +                "id": {
        +                  "type": [
        +                    "number",
        +                    "string",
        +                    "null"
        +                  ]
        +                },
        +                "name": {
        +                  "type": [
        +                    "string",
        +                    "null"
        +                  ]
        +                },
        +                "tax_code": {
        +                  "type": [
        +                    "string",
        +                    "null"
        +                  ]
        +                }
        +              },
        +              "type": "object"
        +            },
        +            {
        +              "items": {},
        +              "maxItems": 0,
        +              "type": "array"
        +            }
        +          ]
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "payment_method": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "total_gross": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "total_gross_local": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "total_vat_amount": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "total_vat_amount_local": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "id"
        +  ],
        +  "type": "object"
        +}
    • Changedbillingo_list_bank_accounts1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "current_page": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "data": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "account_number": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "account_number_iban": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "currency": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "id": {
        +            "type": "number"
        +          },
        +          "name": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "need_qr": {
        +            "type": [
        +              "boolean",
        +              "number",
        +              "null"
        +            ]
        +          },
        +          "swift": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          }
        +        },
        +        "required": [
        +          "id"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "last_page": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "next_page_url": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "per_page": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "prev_page_url": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "total": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedbillingo_list_document_blocks1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "current_page": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "data": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "id": {
        +            "type": "number"
        +          },
        +          "name": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "prefix": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "type": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          }
        +        },
        +        "required": [
        +          "id"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "last_page": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "next_page_url": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "per_page": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "prev_page_url": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "total": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedbillingo_list_documents6 fields changed
      • addedInput schema / properties / fulfillment_end_date
        Added value: +{
        +  "description": "Include documents fulfilled (teljesítés) on or before this date.",
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / fulfillment_start_date
        Added value: +{
        +  "description": "Include documents fulfilled (teljesítés) on or after this date.",
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / last_modified_date
        Added value: +{
        +  "description": "Include documents created or modified after this moment, \"YYYY-MM-DD HH:MM:SS\" in Europe/Budapest local time. Use it to fetch only what changed since a previous call.",
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / paid_end_date
        Added value: +{
        +  "description": "Include documents paid on or before this date.",
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / paid_start_date
        Added value: +{
        +  "description": "Include documents paid on or after this date.",
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "current_page": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "data": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "block_id": {
        +            "type": [
        +              "number",
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "cancelled": {
        +            "type": [
        +              "boolean",
        +              "number",
        +              "null"
        +            ]
        +          },
        +          "conversion_rate": {
        +            "type": [
        +              "number",
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "correction_type": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "currency": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "due_date": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "fulfillment_date": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "gross_total": {
        +            "type": [
        +              "number",
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "id": {
        +            "type": "number"
        +          },
        +          "invoice_date": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "invoice_number": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "items": {
        +            "anyOf": [
        +              {
        +                "items": {
        +                  "additionalProperties": {},
        +                  "properties": {
        +                    "gross_amount": {
        +                      "type": [
        +                        "number",
        +                        "string",
        +                        "null"
        +                      ]
        +                    },
        +                    "name": {
        +                      "type": [
        +                        "string",
        +                        "null"
        +                      ]
        +                    },
        +                    "net_amount": {
        +                      "type": [
        +                        "number",
        +                        "string",
        +                        "null"
        +                      ]
        +                    },
        +                    "net_unit_amount": {
        +                      "type": [
        +                        "number",
        +                        "string",
        +                        "null"
        +                      ]
        +                    },
        +                    "quantity": {
        +                      "type": [
        +                        "number",
        +                        "string",
        +                        "null"
        +                      ]
        +                    },
        +                    "unit": {
        +                      "type": [
        +                        "string",
        +                        "null"
        +                      ]
        +                    },
        +                    "vat": {
        +                      "type": [
        +                        "string",
        +                        "null"
        +                      ]
        +                    }
        +                  },
        +                  "type": "object"
        +                },
        +                "type": "array"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "online_szamla_status": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "paid_date": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "partner": {
        +            "anyOf": [
        +              {
        +                "anyOf": [
        +                  {
        +                    "additionalProperties": {},
        +                    "properties": {
        +                      "id": {
        +                        "type": [
        +                          "number",
        +                          "string",
        +                          "null"
        +                        ]
        +                      },
        +                      "name": {
        +                        "type": [
        +                          "string",
        +                          "null"
        +                        ]
        +                      },
        +                      "taxcode": {
        +                        "type": [
        +                          "string",
        +                          "null"
        +                        ]
        +                      }
        +                    },
        +                    "type": "object"
        +                  },
        +                  {
        +                    "items": {},
        +                    "maxItems": 0,
        +                    "type": "array"
        +                  }
        +                ]
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "payment_method": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "payment_status": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "related_documents": {
        +            "anyOf": [
        +              {
        +                "items": {
        +                  "additionalProperties": {},
        +                  "properties": {
        +                    "id": {
        +                      "type": [
        +                        "number",
        +                        "string",
        +                        "null"
        +                      ]
        +                    },
        +                    "invoice_number": {
        +                      "type": [
        +                        "string",
        +                        "null"
        +                      ]
        +                    }
        +                  },
        +                  "type": "object"
        +                },
        +                "type": "array"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "summary": {
        +            "anyOf": [
        +              {
        +                "anyOf": [
        +                  {
        +                    "additionalProperties": {},
        +                    "properties": {
        +                      "gross_amount_local": {
        +                        "type": [
        +                          "number",
        +                          "string",
        +                          "null"
        +                        ]
        +                      },
        +                      "net_amount": {
        +                        "type": [
        +                          "number",
        +                          "string",
        +                          "null"
        +                        ]
        +                      },
        +                      "vat_amount": {
        +                        "type": [
        +                          "number",
        +                          "string",
        +                          "null"
        +                        ]
        +                      }
        +                    },
        +                    "type": "object"
        +                  },
        +                  {
        +                    "items": {},
        +                    "maxItems": 0,
        +                    "type": "array"
        +                  }
        +                ]
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "type": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          }
        +        },
        +        "required": [
        +          "id"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "last_page": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "next_page_url": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "per_page": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "prev_page_url": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "total": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedbillingo_list_partners1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "current_page": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "data": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "account_number": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "address": {
        +            "anyOf": [
        +              {
        +                "anyOf": [
        +                  {
        +                    "additionalProperties": {},
        +                    "properties": {
        +                      "address": {
        +                        "type": [
        +                          "string",
        +                          "null"
        +                        ]
        +                      },
        +                      "city": {
        +                        "type": [
        +                          "string",
        +                          "null"
        +                        ]
        +                      },
        +                      "country_code": {
        +                        "type": [
        +                          "string",
        +                          "null"
        +                        ]
        +                      },
        +                      "post_code": {
        +                        "type": [
        +                          "string",
        +                          "null"
        +                        ]
        +                      }
        +                    },
        +                    "type": "object"
        +                  },
        +                  {
        +                    "items": {},
        +                    "maxItems": 0,
        +                    "type": "array"
        +                  }
        +                ]
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "emails": {
        +            "anyOf": [
        +              {
        +                "items": {
        +                  "type": [
        +                    "string",
        +                    "null"
        +                  ]
        +                },
        +                "type": "array"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "iban": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "id": {
        +            "type": "number"
        +          },
        +          "name": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "phone": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "swift": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "tax_type": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "taxcode": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          }
        +        },
        +        "required": [
        +          "id"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "last_page": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "next_page_url": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "per_page": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "prev_page_url": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "total": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedbillingo_list_products1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "current_page": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "data": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "comment": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "currency": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "ean": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "gross_unit_price": {
        +            "type": [
        +              "number",
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "id": {
        +            "type": "number"
        +          },
        +          "name": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "net_unit_price": {
        +            "type": [
        +              "number",
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "sku": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "unit": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "vat": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          }
        +        },
        +        "required": [
        +          "id"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "last_page": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "next_page_url": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "per_page": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "prev_page_url": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "total": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedbillingo_list_spendings1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "current_page": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "data": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "category": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "comment": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "conversion_rate": {
        +            "type": [
        +              "number",
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "currency": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "due_date": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "fulfillment_date": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "id": {
        +            "type": "number"
        +          },
        +          "invoice_date": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "invoice_number": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "paid_at": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "partner": {
        +            "anyOf": [
        +              {
        +                "anyOf": [
        +                  {
        +                    "additionalProperties": {},
        +                    "properties": {
        +                      "id": {
        +                        "type": [
        +                          "number",
        +                          "string",
        +                          "null"
        +                        ]
        +                      },
        +                      "name": {
        +                        "type": [
        +                          "string",
        +                          "null"
        +                        ]
        +                      },
        +                      "tax_code": {
        +                        "type": [
        +                          "string",
        +                          "null"
        +                        ]
        +                      }
        +                    },
        +                    "type": "object"
        +                  },
        +                  {
        +                    "items": {},
        +                    "maxItems": 0,
        +                    "type": "array"
        +                  }
        +                ]
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "payment_method": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "total_gross": {
        +            "type": [
        +              "number",
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "total_gross_local": {
        +            "type": [
        +              "number",
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "total_vat_amount": {
        +            "type": [
        +              "number",
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "total_vat_amount_local": {
        +            "type": [
        +              "number",
        +              "string",
        +              "null"
        +            ]
        +          }
        +        },
        +        "required": [
        +          "id"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "last_page": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "next_page_url": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "per_page": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "prev_page_url": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "total": {
        +      "type": [
        +        "number",
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "data"
        +  ],
        +  "type": "object"
        +}
  2. 22 tool updatesv0.1.0
    • First observedbillingo_check_tax_number
    • First observedbillingo_download_document
    • First observedbillingo_export_documents
    • First observedbillingo_get_bank_account
    • First observedbillingo_get_conversion_rate
    • First observedbillingo_get_document
    • First observedbillingo_get_document_payments
    • First observedbillingo_get_document_public_url
    • First observedbillingo_get_document_reminders
    • First observedbillingo_get_online_szamla_status
    • First observedbillingo_get_organization
    • First observedbillingo_get_partner
    • First observedbillingo_get_product
    • First observedbillingo_get_product_quantity
    • First observedbillingo_get_spending
    • First observedbillingo_list_bank_accounts
    • First observedbillingo_list_document_blocks
    • First observedbillingo_list_documents
    • First observedbillingo_list_partners
    • First observedbillingo_list_products
    • First observedbillingo_list_spendings
    • First observedbillingo_pos_print

TDQS

B3.4/5.0

Scored across 22 tools

Disambiguation4/5

Most tools target a clearly distinct resource and action (list vs get for partners, products, spendings, bank accounts; document-specific operations like payments, reminders, NAV status, POS print). The main overlap is billingo_download_document vs billingo_get_document_public_url, which both default to returning a shareable public URL, making selection ambiguous.

Naming Consistency4/5

Names follow a consistent billingo_ prefix with snake_case verb_noun structure (list_documents, get_partner, export_documents, check_tax_number). Minor deviation: billingo_pos_print uses noun_verb ordering rather than the verb_noun pattern used elsewhere.

Tool Count3/5

22 tools is on the heavy side for the rubric, though the broad billing domain (documents, partners, products, spendings, org, bank accounts) partly justifies it. Several simple list/get pairs could potentially be consolidated, placing it at borderline.

Completeness2/5

The surface is almost entirely read-only: there are no create/update/delete tools for invoices, partners, products, or spendings, yet descriptions reference creating partners and needing block ids to create invoices, implying write operations that don't exist. Core billing workflows (issuing an invoice, recording a payment) cannot be performed, a significant gap.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    An MCP server for the Billingo invoicing API (v3) that enables AI assistants like Claude to manage invoices, partners, products, expenses, and more through natural language.
    42
    13
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for the Billingo V3 Hungarian invoicing API. Manage invoices, partners, products, spendings, and bank accounts from any MCP client.
    9 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Model Context Protocol (MCP) server for SuperFaktura invoicing system. Enables AI assistants to interact with SuperFaktura API for managing invoices, clients, and expenses.
    Apache 2.0