Skip to main content
Glama
dennismenken

BuchhaltungsButler MCP-Server

by dennismenken

BuchhaltungsButler MCP-Server (inoffiziell)

Inoffizielles Projekt. Keine Verbindung zur BuchhaltungsButler GmbH, keine Unterstützung von dort. Die Marke gehört ihrem Rechteinhaber.

Der Server arbeitet auf echten Buchhaltungsdaten. 40 der 59 Werkzeuge schreiben. Buchungen und Rechnungen sind über diese API nicht löschbar.

Nach der Installation sind alle 59 Werkzeuge sofort aufrufbar. Welche Ihr Assistent benutzen darf, entscheiden Sie in Ihrem Client.

Dieser Server verbindet einen KI-Assistenten über das Model Context Protocol (MCP) mit Ihrem BuchhaltungsButler-Mandanten. Er läuft auf Ihrem Rechner; Ihre Zugangsdaten gehen an niemanden außer an BuchhaltungsButler selbst.


1. Was der Server kann

Der Server bietet zwei Sorten von Werkzeugen an.

54 Endpunktwerkzeuge, genau eines je Endpunkt der BuchhaltungsButler-API v1, davon 15 lesend. Kein Endpunkt bleibt ohne Werkzeug, und keines dieser 54 fasst zwei Endpunkte zusammen. Wer einen Vorgang genau so auslösen will, wie die Schnittstelle ihn kennt, nimmt eines davon.

Dazu fünf Bündelwerkzeuge, davon vier lesend. Ein Bündel erledigt in einem einzigen Aufruf, wofür sonst mehrere nacheinander nötig wären — etwa alle Seiten einer langen Belegliste zu blättern oder eine Auswertung anzustoßen, auf sie zu warten und sie abzuholen. Die Bündel ersetzen kein Endpunktwerkzeug; sie kommen daneben. Was sie beantworten, steht in Abschnitt 11.1.

Zusammen meldet der Server damit 59 Werkzeuge, davon 19 lesend.

Bereich

Werkzeuge

davon lesend

Belege

9

3

Zahlungen

8

3

Rechnungen

3

0

Buchungen

12

1

Stammdaten

13

4

Kostenstellen

4

1

Berichte

5

3

Endpunktwerkzeuge zusammen

54

15

Bündelwerkzeuge (11.1)

5

4

Alle Werkzeuge zusammen

59

19

Die vollständige Liste mit einer Zeile je Werkzeug steht in Abschnitt 11. Diese Tabellen werden aus dem Register des Servers erzeugt und nicht von Hand gepflegt; ein neues Werkzeug, das dort fehlt, macht die CI rot.


Related MCP server: Buchhaltungsbutler MCP

2. Voraussetzungen

  • Node.js 22.19.0 oder neuer. Das ist die Untergrenze im Feld engines.node der package.json. Sie kommt daher, dass die HTTP-Schicht undici@8 benutzt, das selbst >=22.19.0 verlangt. Node 24 und neuer erfüllen sie ebenfalls.

  • Ein BuchhaltungsButler-Konto mit aktivierter API-Schnittstelle.

  • Die drei Zugangsdaten aus BuchhaltungsButler: API Client, API Secret und API Key.

Ihre Node-Version zeigt node --version.


3. Zugangsdaten beschaffen

Sie brauchen drei Werte. In BuchhaltungsButler finden Sie sie in den Einstellungen, im Bereich für Schnittstellen beziehungsweise API-Zugang. Die beiden Quellen des Anbieters beschreiben die Menüführung unterschiedlich; deshalb sind hier beide genannten Orte aufgeführt, statt zu behaupten, es gäbe nur einen.

Wert

Was er ist

Wofür er benutzt wird

API Client

Benutzername der HTTP-Basic-Authentifizierung

weist Ihre Anwendung aus

API Secret

Passwort der HTTP-Basic-Authentifizierung

weist Ihre Anwendung aus

API Key

wählt den Mandanten

entscheidet, in wessen Buchhaltung geschrieben wird

Der API Key ist kein harmloser Bezeichner. Er bestimmt, welcher Mandant bearbeitet wird. Ein falscher API Key bedeutet: richtige Anmeldung, falsche Buchhaltung. Behandeln Sie alle drei Werte wie ein Passwort.


4. Schnellstart in fünf Minuten

npx -y @dennismenken/buchhaltungsbutler-mcp setup

Der Einrichtungsassistent

  1. prüft Ihre Node-Version und sucht die auf Ihrem Rechner vorhandenen MCP-Clients,

  2. fragt die drei Zugangsdaten maskiert ab,

  3. testet die Verbindung mit einem einzigen lesenden Aufruf und sagt Ihnen im Klartext, ob API Client, API Secret oder der API Key nicht stimmt,

  4. zeigt Ihnen die gefundenen Zahlungskonten und fragt, ob diese zu dem Mandanten gehören, den Sie verbinden wollen. Antworten Sie mit nein, ist der API Key der falsche,

  5. fragt, ob der Server über npx oder fest installiert gestartet werden soll,

  6. fragt, wo die Zugangsdaten liegen sollen: in einer eigenen Datei mit den Rechten 0600 (Vorgabe), direkt in der Clientkonfiguration, oder nirgends,

  7. zeigt vor jedem Schreibvorgang den vollständigen Dateipfad und den einzufügenden Block, Geheimnisse maskiert, und legt vor jeder Änderung eine Sicherung <datei>.bak-<zeitstempel> an. Bestehende Einträge werden nie ohne Ihre ausdrückliche Zustimmung überschrieben,

  8. sagt je Client, was noch zu tun ist, etwa Claude Desktop vollständig zu beenden,

  9. fragt einmal, ob der Server zunächst nur lesen darf. Vorgabe ist nein.

Danach tippen Sie in Ihrem Client diesen Satz, um den Erfolg zu sehen:

Liste meine Zahlungskonten in BuchhaltungsButler.

Für Skripte gibt es den Assistenten auch ohne Rückfragen:

npx -y @dennismenken/buchhaltungsbutler-mcp setup \
  --client claude-code --scope user --start npx --non-interactive --print-only

5. Installation je Client

Jeder Abschnitt nennt den Befehl oder den Block, den Ablageort, ob ein Neustart nötig ist und wie Sie prüfen, ob es funktioniert hat. Alle Blöcke benutzen npx; für die feste Installation siehe Abschnitt 6.

Der Eintrag heißt überall bbutler, und der kurze Name ist Absicht. Ein Client stellt den Eintragsnamen jedem Werkzeugnamen als mcp__<name>__ voran, und ein Werkzeugname darf höchstens 64 Zeichen lang sein. Mit dem früheren Eintragsnamen buchhaltungsbutler kam mcp__buchhaltungsbutler__bb_postings_create_for_transaction_batch auf 65 Zeichen und fiel deshalb aus, erfahrungsgemäß ohne sprechende Meldung. Mit bbutler sind es 54. Wer einen eigenen Namen einträgt, rechnet ihn gegen diese Grenze nach.

Eine ältere Installation führt den Eintrag noch unter buchhaltungsbutler. Schreiben Sie den neuen Namen nicht einfach daneben: Der Client lüde sonst jedes Werkzeug doppelt. bbutler-mcp uninstall entfernt beide Namen. bbutler-mcp setup erkennt einen Alteintrag und ersetzt ihn mit --overwrite, statt einen zweiten anzulegen.

5.1 Claude Code

claude mcp add-json --scope user bbutler \
  '{"type":"stdio","command":"npx","args":["-y","@dennismenken/buchhaltungsbutler-mcp"],"env":{"BB_API_CLIENT":"${BB_API_CLIENT}","BB_API_SECRET":"${BB_API_SECRET}","BB_API_KEY":"${BB_API_KEY}"}}'

Claude Code ersetzt ${VAR} aus Ihrer Umgebung. Wer die Werte lieber direkt einträgt, schreibt sie statt der ${…}-Verweise hinein.

Die drei Ebenen, in denen ein Eintrag liegen kann:

Scope

Gilt

Geteilt mit dem Team

Liegt in

local (Vorgabe)

nur im aktuellen Projekt

nein

~/.claude.json

project

nur im aktuellen Projekt

ja, über die Versionsverwaltung

.mcp.json im Projektwurzelverzeichnis

user

in allen Projekten

nein

~/.claude.json

Kein Neustart nötig. Prüfen mit claude mcp get bbutler, in einer laufenden Sitzung mit /mcp. Entfernen mit claude mcp remove bbutler --scope user.

5.2 Claude Desktop

Claude-Menü, Settings, Reiter Developer, „Edit Config". Die Datei liegt hier:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "bbutler": {
      "command": "npx",
      "args": ["-y", "@dennismenken/buchhaltungsbutler-mcp"],
      "env": {
        "BB_API_CLIENT": "IHR_API_CLIENT",
        "BB_API_SECRET": "IHR_API_SECRET",
        "BB_API_KEY": "IHR_API_KEY"
      }
    }
  }
}

Claude Desktop muss danach vollständig beendet und neu gestartet werden, nicht nur das Fenster geschlossen. Prüfen: Der Server erscheint im Werkzeugmenü der Eingabezeile.

Claude Desktop kennt keine Verweise auf Umgebungsvariablen; die Zugangsdaten stehen also im Klartext in dieser Datei. Wenn Sie das nicht wollen, benutzen Sie den Einrichtungsassistenten: Er legt die Zugangsdaten in einer eigenen Datei mit eingeschränkten Rechten ab. Zusätzlich gibt es ein .mcpb-Bundle, das Sie ohne Terminal in Claude Desktop hineinziehen können; es liegt den Veröffentlichungen bei.

5.3 OpenAI Codex CLI

codex mcp add bbutler \
  --env BB_API_CLIENT="IHR_API_CLIENT" \
  --env BB_API_SECRET="IHR_API_SECRET" \
  --env BB_API_KEY="IHR_API_KEY" \
  -- npx -y @dennismenken/buchhaltungsbutler-mcp

Oder von Hand in ~/.codex/config.toml:

[mcp_servers.bbutler]
command = "npx"
args = ["-y", "@dennismenken/buchhaltungsbutler-mcp"]
startup_timeout_sec = 30
default_tools_approval_mode = "writes"

[mcp_servers.bbutler.env]
BB_API_CLIENT = "IHR_API_CLIENT"
BB_API_SECRET = "IHR_API_SECRET"
BB_API_KEY = "IHR_API_KEY"

startup_timeout_sec = 30 ist wichtig: Die Vorgabe von 10 Sekunden ist für einen npx-Kaltstart knapp. default_tools_approval_mode = "writes" fragt bei schreibenden Werkzeugen nach und lässt lesende durch. Kein Neustart nötig. Prüfen mit codex mcp get bbutler, in der Oberfläche mit /mcp.

5.4 ChatGPT-Desktop-App

Die ChatGPT-Desktop-App teilt sich die Konfiguration mit der Codex CLI. Tragen Sie den Server einmal nach 5.3 ein; ein zweiter Eintrag ist nicht nötig.

5.5 Grok Build (xAI)

grok mcp add bbutler \
  -e BB_API_CLIENT="IHR_API_CLIENT" \
  -e BB_API_SECRET="IHR_API_SECRET" \
  -e BB_API_KEY="IHR_API_KEY" \
  -- npx -y @dennismenken/buchhaltungsbutler-mcp

Mit --scope project landet der Eintrag in ./.grok/config.toml statt in ~/.grok/config.toml und kann geteilt werden. Kein Neustart nötig. Prüfen mit grok mcp list und grok mcp doctor bbutler.

5.6 Cursor

Für ein Projekt .cursor/mcp.json, für alle Projekte ~/.cursor/mcp.json:

{
  "mcpServers": {
    "bbutler": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@dennismenken/buchhaltungsbutler-mcp"],
      "env": {
        "BB_API_CLIENT": "${env:BB_API_CLIENT}",
        "BB_API_SECRET": "${env:BB_API_SECRET}",
        "BB_API_KEY": "${env:BB_API_KEY}"
      }
    }
  }
}

Cursor setzt ${env:NAME} aus Ihrer Umgebung ein; diese Datei enthält damit keine Zugangsdaten und kann eingecheckt werden. Cursor muss neu geladen werden. Server ein- und ausschalten: „Customize" in der Seitenleiste. Protokolle: Output-Bereich, „MCP Logs".

5.7 VS Code mit GitHub Copilot

Datei .vscode/mcp.json im Projekt. Der äußere Schlüssel heißt hier servers, nicht mcpServers:

{
  "servers": {
    "bbutler": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@dennismenken/buchhaltungsbutler-mcp"],
      "env": {
        "BB_API_CLIENT": "${input:bb-api-client}",
        "BB_API_SECRET": "${input:bb-api-secret}",
        "BB_API_KEY": "${input:bb-api-key}"
      }
    }
  },
  "inputs": [
    { "type": "promptString", "id": "bb-api-client", "description": "BuchhaltungsButler API Client", "password": true },
    { "type": "promptString", "id": "bb-api-secret", "description": "BuchhaltungsButler API Secret", "password": true },
    { "type": "promptString", "id": "bb-api-key", "description": "BuchhaltungsButler API Key", "password": true }
  ]
}

VS Code fragt die drei Werte beim ersten Start ab, maskiert die Eingabe und speichert sie sicher; die Datei kann deshalb eingecheckt werden. Für das Nutzerprofil statt eines Projekts: Befehlspalette, MCP: Open User Configuration. Ohne Zugangsdaten geht auch:

code --add-mcp "{\"name\":\"bbutler\",\"command\":\"npx\",\"args\":[\"-y\",\"@dennismenken/buchhaltungsbutler-mcp\"]}"

Der Server wird in VS Code ausdrücklich gestartet. Status und Protokolle: Befehlspalette, MCP: List Servers, Server wählen, Show Output.

5.8 Windsurf, Zed, Cline, Continue, LM Studio, Jan

Client

Datei beziehungsweise Weg

Besonderheit

Windsurf

~/.codeium/windsurf/mcp_config.json, Schlüssel mcpServers

auch über das Symbol „MCPs" im Cascade-Bereich erreichbar

Zed

settings.json, Schlüssel context_servers

Zed nennt MCP-Server „context servers". Die Datei ist JSONC mit Kommentaren; der Einrichtungsassistent gibt den Block deshalb nur aus und schreibt ihn nicht

Cline

CLI-Variante: ~/.cline/mcp.json. IDE-Variante: Symbol „MCP Servers", Reiter Configure

Tragen Sie unter autoApprove nur lesende Werkzeuge ein

Continue

.continue/mcpServers/bbutler.yaml im Projekt

MCP wirkt in Continue nur im Agent-Modus. YAML, Ablageort projektabhängig, deshalb nur Ausgabe

LM Studio

~/.lmstudio/mcp.json, ab Version 0.3.17 über Reiter „Program", Install, Edit mcp.json

lädt den Server nach dem Speichern selbst neu

Jan

Settings, MCP Servers, „+ Add MCP Server": Command npx, Args -y und @dennismenken/buchhaltungsbutler-mcp

Lassen Sie „Allow All MCP Tool Permissions" aus. Sonst führt Jan auch schreibende Buchhaltungsoperationen ohne Rückfrage aus

Den fertigen Block für jeden dieser Clients gibt auch der Server selbst aus:

npx -y @dennismenken/buchhaltungsbutler-mcp print-config --client zed

Die Kürzel für --client: claude-code, claude-desktop, codex, grok, vscode, cursor, windsurf, lmstudio, cline, zed, continue, jan.

5.9 Andere Clients

Die meisten MCP-Clients lesen dieses Format:

{
  "mcpServers": {
    "bbutler": {
      "command": "npx",
      "args": ["-y", "@dennismenken/buchhaltungsbutler-mcp"],
      "env": {
        "BB_API_CLIENT": "IHR_API_CLIENT",
        "BB_API_SECRET": "IHR_API_SECRET",
        "BB_API_KEY": "IHR_API_KEY"
      }
    }
  }
}

Bekannte Abweichungen: VS Code nennt den äußeren Schlüssel servers, Zed nennt ihn context_servers, Codex und Grok benutzen TOML mit [mcp_servers.<name>]. Hinter dem Paketnamen steht kein Argument: Ohne Unterbefehl startet der Server auf stdio.

5.10 Nicht unterstützt: ChatGPT im Browser

ChatGPT im Browser kann keine lokalen Programme starten und spricht ausschließlich über HTTPS mit entfernten MCP-Servern. Dieser Server läuft bewusst lokal, damit Ihre Buchhaltungszugangs- daten Ihren Rechner nicht verlassen. Zwei Auswege: die ChatGPT-Desktop-App benutzen (5.4), oder OpenAIs Secure MCP Tunnel selbst betreiben. Letzteres setzt ein OpenAI-Platform-Konto mit Tunnels-Berechtigung, den Entwicklermodus im Arbeitsbereich und einen dauerhaft laufenden Tunnel-Client voraus.


6. Statt npx: feste Installation

npx lädt das Paket beim ersten Start aus der npm-Registry. Das ist bequem, kostet aber Zeit, und manche Clients brechen den Start nach wenigen Sekunden ab.

npm install -g @dennismenken/buchhaltungsbutler-mcp

Der installierte Befehl heißt bbutler-mcp. In der Clientkonfiguration steht dann:

{ "command": "bbutler-mcp", "args": [] }

Findet Ihr Client den Befehl nicht, tragen Sie den absoluten Pfad ein:

which bbutler-mcp     # macOS und Linux
where bbutler-mcp     # Windows

Für den Dauerbetrieb ist das die ruhigere Variante: Der Start dauert Millisekunden statt Sekunden, das Startzeitlimit eines Clients kann nicht mehr reißen, und Sie wissen jederzeit, welche Version läuft. Desktop-Anwendungen erben nicht immer den PATH Ihrer Shell; das ist der häufigste Grund dafür, dass ein Server im Terminal läuft, im Client aber nicht.


7. Konfiguration

Alle Einstellungen sind Umgebungsvariablen. Variablen mit dem Präfix BB_ beschreiben die Verbindung zur API, Variablen mit dem Präfix BB_MCP_ steuern das Verhalten dieses Servers. Eine Vorlage mit allen Variablen liegt als .env.example bei.

7.1 Pflichtvariablen

Variable

Bedeutung

BB_API_CLIENT

API Client, Benutzername der Basic-Authentifizierung

BB_API_SECRET

API Secret, Passwort der Basic-Authentifizierung

BB_API_KEY

der api_key im Body; wählt den Mandanten, kein harmloser Bezeichner

Fehlt einer der drei Werte, startet der Server trotzdem und meldet alle 59 Werkzeuge. Jeder Aufruf antwortet dann mit einem Fehler, der genau sagt, welche Variable fehlt, und dass nichts an BuchhaltungsButler hinausgegangen ist. Das ist Absicht: Ein Server, der gar nicht startet, erzeugt im Client nur die Meldung „Server konnte nicht gestartet werden", und die hilft niemandem weiter.

7.2 Optionale Variablen

Variable

Bedeutung

Vorgabe

BB_BASE_URL

Basis-URL der API. Muss https: sein; http: nur gegen localhost

https://webapp.buchhaltungsbutler.de/api/v1

BB_PROFILE

Profilname in der Zugangsdatendatei

default

BB_CONFIG_DIR

Ort der Zugangsdatendatei

${XDG_CONFIG_HOME:-~/.config}/buchhaltungsbutler-mcp, unter Windows %APPDATA%\buchhaltungsbutler-mcp

BB_MCP_READ_ONLY

true beschränkt den Server auf die 19 lesenden Werkzeuge

false, also aus

BB_MCP_TOOL_GROUPS

Kommaliste von Werkzeuggruppen. Gesetzt: nur diese Gruppen werden angemeldet (siehe 7.4)

nicht gesetzt, also alle zwölf

BB_MCP_TOOL_GROUPS_EXCLUDE

Kommaliste von Werkzeuggruppen, die abgezogen werden

nicht gesetzt

BB_MCP_MAX_BATCH

Obergrenze je Aufruf für jedes Stapel- und Positionsarray, zulässig 1 bis 50

50

BB_MCP_MAX_AMOUNT

Betragsgrenze für buchende und anlegende Werkzeuge mit Betragsfeld

nicht gesetzt, also aus

BB_MCP_RATE_LIMIT

Nachfüllrate des Standardeimers je Minute, 10 bis 100

60

BB_MCP_TIMEOUT_MS

Zeitlimit der Stufe „normal", mindestens 5000

30000

BB_MCP_DUPLICATE_CHECK

on oder off. Bei on sucht der Server vor jedem anlegenden Aufruf nach einem Duplikat und verbraucht dafür einen zusätzlichen Request

off

BB_MCP_MAX_RESPONSE_TOKENS

weiche Kürzungsgrenze je Antwort

5000

BB_MCP_CACHE_TTL_MS

Haltbarkeit des Stammdatenspeichers, 0 schaltet ihn ab

0, also aus

BB_MCP_UPLOAD_DIRS

Liste erlaubter Verzeichnisse für file:// als Belegquelle

leer, also kein Dateisystemzugriff

BB_MCP_UPLOAD_FROM_URL

erlaubt https:// als Belegquelle

false

BB_MCP_LOG_LEVEL

error, warn, info oder debug; Ausgabe ausschließlich auf stderr

warn

BB_READ_ONLY

veralteter Name von BB_MCP_READ_ONLY, wird noch angenommen (siehe unten)

nicht gesetzt

BB_READ_ONLY ist der frühere Name von BB_MCP_READ_ONLY. Er wird weiterhin angenommen und ausgewertet, erzeugt dabei aber eine Warnung auf stderr. Sind beide Variablen gesetzt und widersprechen sich, bricht der Server den Start ab, statt sich stillschweigend für eine von beiden zu entscheiden: Bei einem Nur-Lesen-Schalter wäre die stille Wahl im Zweifel die gefährliche. Neu gesetzt wird deshalb nur noch BB_MCP_READ_ONLY.

Zwei Regeln, die Ihnen Zeit sparen:

  • Ein unbrauchbarer Wert bricht den Start ab, statt still auf die Vorgabe zurückzufallen. BB_MCP_READ_ONLY=ture darf nicht heimlich „aus" bedeuten.

  • Jede unbekannte BB_*-Variable erzeugt eine Warnung auf stderr, zusammen mit dem ähnlichsten bekannten Namen. Das fängt den häufigsten Einrichtungsfehler ab: einen Tippfehler in einer fremden JSON-Datei, der sonst wirkungslos bleibt.

Zugangsdaten nimmt kein Unterbefehl als Kommandozeilenargument entgegen, auch nicht über eine Option. Was es nicht gibt, kann niemand in eine Prozessliste oder eine Shell-Historie schreiben.

7.3 Zugangsdatendatei

Statt die drei Werte in jede Clientkonfiguration zu schreiben, können sie in einer eigenen Datei liegen:

Betriebssystem

Pfad

macOS und Linux

${XDG_CONFIG_HOME:-~/.config}/buchhaltungsbutler-mcp/credentials.json

Windows

%APPDATA%\buchhaltungsbutler-mcp\credentials.json

Dateirechte 0600, Verzeichnisrechte 0700. Sind die Rechte weiter, warnt der Server auf stderr und nennt den Korrekturbefehl; er bricht nicht ab, weil Windows keine Entsprechung hat.

{
  "version": 1,
  "profiles": {
    "default": {
      "api_client": "PLATZHALTER_API_CLIENT",
      "api_secret": "PLATZHALTER_API_SECRET",
      "api_key": "PLATZHALTER_API_KEY",
      "label": "Musterfirma GmbH"
    }
  }
}

Sind BB_API_CLIENT, BB_API_SECRET und BB_API_KEY alle drei gesetzt, gelten sie, und die Datei wird nicht gelesen. Teilweise gesetzte Werte mischen sich nicht mit der Datei. Verwaltet wird die Datei mit bbutler-mcp profiles list|add|remove.

7.4 Werkzeuggruppen abschalten

BB_MCP_TOOL_GROUPS=bundles

Der Gruppenschalter spart Kontext, nicht Zugriff. Die 54 Werkzeugdefinitionen wiegen zusammen gemessen 48.368 Token, und Claude Desktop legt sie in seinem ungünstigsten Modus in jede Anfrage. Wer Buchhaltung auswertet und nicht erfasst, bezahlt davon den größten Teil umsonst. Claude Code und die Codex CLI laden Werkzeugdefinitionen dagegen erst bei Bedarf; dort kostet ein Werkzeug im Leerlauf nur seinen Namen, und der Schalter lohnt sich nicht.

Abgeschaltete Gruppen werden gar nicht erst angemeldet. Sie stehen nicht in tools/list und sagen deshalb auch nicht ab — sie sind schlicht nicht da. Das ist der bewusste Unterschied zum Nur-Lesen-Schalter aus Abschnitt 8, der gesperrte Werkzeuge sichtbar lässt und beim Aufruf mit einer Erklärung absagt. Wer den Zugriff begrenzen will, nimmt deshalb BB_MCP_READ_ONLY und nicht diesen Schalter.

Die zwölf Gruppen

Gruppe

Werkzeuge

Token (gemessen)

Was sie kann

postings

12

12.213

Buchungen suchen, anlegen, stornieren, Belege an Buchungen binden

receipts

8

8.529

Belege suchen, hochladen, anlegen, löschen, wiederherstellen

transactions

8

6.661

Zahlungen suchen und anlegen, Belege an Zahlungen binden

invoices

3

5.766

Ausgangsrechnungen, Entwürfe, E-Rechnungen schreiben

creditors

4

3.341

Lieferanten nachschlagen, anlegen, ändern

reports

5

3.203

BWA, Summen- und Saldenliste, Kontenblatt

debtors

4

3.198

Kunden nachschlagen, anlegen, ändern

postingaccounts

3

1.877

Sachkonten nachschlagen, anlegen, ändern

cost_locations

4

1.839

Kostenstellen nachschlagen, anlegen, ändern, löschen

payment_accounts

2

1.142

Zahlungskonten auflisten und anlegen

comments

1

599

Kommentar an Beleg oder Zahlung hängen

bundles

5

6.852

Bündelwerkzeuge: mehrere Endpunkte in einem Aufruf

Summe der elf Endpunktgruppen

54

48.368

Die Tokenzahlen sind mit gpt-tokenizer (Kodierung o200k_base) an den ausgelieferten Definitionen gemessen, nicht geschätzt; pnpm measure-tokens weist sie je Gruppe neu aus. Die Gruppe bundles steht nicht in der Summe darüber: Ihre 6.852 Token kommen zu den 48.368 hinzu, sie hat mit BUNDLE_DEFINITION_TOKEN_BUDGET eine eigene Grenze und ist als Ganzes abschaltbar.

Empfohlene Profile

Zweck

Einstellung

Werkzeuge

Token

Claude Desktop, Buchhaltung ohne Erfassung

BB_MCP_TOOL_GROUPS=bundles

nur die Bündel

6.852 statt 55.220

Claude Desktop, mit Belegerfassung

BB_MCP_TOOL_GROUPS=bundles,receipts,payment_accounts

10 plus die Bündel

16.523

Nur auswerten

BB_MCP_TOOL_GROUPS=bundles,reports plus BB_MCP_READ_ONLY=true

5 plus die Bündel

10.055

Claude Code, Codex CLI

alles an, also nichts setzen

54 plus die Bündel

im Leerlauf rund 2.000, nur die Namen

Die Zahlen der ersten drei Zeilen enthalten die Bündelgruppe. Sie sind seit dem 2026-09-13 gemessen und keine Schätzungen mehr: 6.852 Token für die fünf Bündel, dazu 8.529 für receipts und 1.142 für payment_accounts beziehungsweise 3.203 für reports.

Vier Startfehler statt stiller Wirkung

Ein Tippfehler, der die halbe Werkzeugliste abschaltet und nichts sagt, ist der teuerste Zustand dieses Schalters. Der Server bricht deshalb ab und erklärt sich, statt weiterzulaufen:

  1. Unbekannter Gruppenname. Die Meldung nennt den falschen Wert, die Variable, alle zwölf gültigen Namen und, wenn der Wert nah genug liegt, den wahrscheinlich gemeinten.

  2. Derselbe Name in beiden Variablen. Ein echter Widerspruch; keine Seite gewinnt stillschweigend.

  3. Ein Ausschluss ohne Wirkung, also ein Name in BB_MCP_TOOL_GROUPS_EXCLUDE, der durch BB_MCP_TOOL_GROUPS ohnehin nicht aktiv ist.

  4. Keine Gruppe übrig. Ein Server ohne Werkzeuge ist kein Server.

Aus 2 und 3 zusammen folgt: Beide Variablen gleichzeitig zu setzen ist immer ein Startfehler. Ein leerer Wert ist dagegen ausdrücklich kein Fehler und gilt wie „nicht gesetzt"; im Desktop-Bundle bleibt das Feld sonst für jeden unausfüllbar, der es nicht braucht.

Was gerade gilt, sagen drei Stellen: die Startmeldung auf stderr, bbutler-mcp doctor und bbutler-mcp print-config. Alle drei nennen die aktiven Gruppen, die Zahl der angemeldeten Werkzeuge, den Tokenpreis und jede abgeschaltete Gruppe samt der Variable, die sie abgeschaltet hat. Die instructions des Servers nennen dem Assistenten dieselben Gruppen, damit er nicht nach Werkzeugen sucht, die diese Installation nicht anbietet.

Im Desktop-Bundle (.mcpb) heißt das Feld Werkzeuggruppen; leer lassen heißt alle Gruppen. Der Schalter wird nur beim Start gelesen und wirkt erst nach einem Neustart des Clients.


8. Nur lesen lassen

BB_MCP_READ_ONLY=true

Standard ist false, der Schalter ist also aus. Nach der Installation sind alle 59 Werkzeuge aufrufbar.

Steht er auf true, führt der Server nur die 19 lesenden Werkzeuge aus. Die übrigen 40 lehnen ab, bevor ein Request an BuchhaltungsButler abgeht, und die Absage nennt die Variable und ihren Zielwert. Gesperrte Werkzeuge bleiben in der Werkzeugliste sichtbar: Ein Assistent, der ein Werkzeug nicht sieht, schließt auf eine fehlende Fähigkeit und sucht Umwege; einer, der eine klare Absage liest, kann sie Ihnen erklären.

Genau darin unterscheidet er sich vom Gruppenschalter aus 7.4: Der sagt nicht ab, sondern meldet gar nicht erst an, und er tut das, um Kontext zu sparen. Die beiden Schalter sind voneinander unabhängig und lassen sich kombinieren.

Der Schalter wird nur beim Start gelesen und ist aus einem Gespräch heraus nicht aufhebbar, auch nicht durch ein Werkzeug.

Folge für die Auswertungen: BWA und Summen- und Saldenliste entstehen in zwei Schritten, erzeugen und abholen. Der erste Schritt ist gesperrt, weil er den zuvor erzeugten Bericht desselben Typs ersetzt. Bei aktivem Schalter sind also

Auswertung

Schalter aus

BB_MCP_READ_ONLY=true

Kontenblatt (bb_reports_get_ledger)

verfügbar

verfügbar

Kontostand und Kontenblatt (bb_balances_get)

verfügbar

verfügbar, dieses Bündel liest nur

BWA

verfügbar

nicht verfügbar, der erste Schritt ist gesperrt

Summen- und Saldenliste

verfügbar

nicht verfügbar, der erste Schritt ist gesperrt

BWA oder Summenliste in einem Aufruf (bb_reports_run)

verfügbar

nicht verfügbar, das Bündel stößt genau diesen ersten Schritt an

Ein früher erzeugter Bericht lässt sich weiterhin abholen. bb_reports_run ist damit das einzige der fünf Bündelwerkzeuge, das der Nur-Lesen-Schalter sperrt; die übrigen vier bleiben nutzbar.


9. Weitere Grenzen

Alle vier sind Betreibergrenzen: Sie wirken vor dem Request und lassen sich aus einem Gespräch heraus nicht aufheben.

  • BB_MCP_MAX_BATCH begrenzt jedes Stapel- und Positionsarray, also auch die Positionen einer Splitbuchung oder einer Rechnung. Wirksam ist der kleinere Wert aus 50 und Ihrer Angabe. Die Grenze 50 ist für die Stapelendpunkte der Belege und Zahlungen dokumentiert; für Positionslisten ist sie unsere Mengengrenze und keine Regel der API.

  • BB_MCP_MAX_AMOUNT lehnt anlegende und buchende Aufrufe oberhalb eines Betrags ab. Als Dezimalzeichenkette angeben, etwa 10000.00.

  • BB_MCP_RATE_LIMIT ist die Nachfüllrate je Minute. Die API erlaubt 100 Anfragen je Mandant und Minute; die Vorgabe 60 hält Abstand, weil Sie den Mandanten möglicherweise nicht allein benutzen.

  • BB_MCP_DUPLICATE_CHECK=on lässt den Server vor jedem anlegenden Aufruf nachsehen, ob es den Datensatz schon gibt. Ein Treffer blockiert nichts, sondern steht sichtbar in der Antwort. Der Preis: ein zusätzlicher Request je anlegendem Aufruf aus Ihrem Minutenkontingent. Bei Stapelwerkzeugen läuft er einmal für den ganzen Stapel. Deshalb ist er standardmäßig aus.


10. Mehrere Mandanten

Eine Kanzlei oder Agentur betreut mehrere Mandanten mit demselben Paar aus API Client und API Secret und wechselndem API Key. Dafür gibt es Profile in der Zugangsdatendatei:

bbutler-mcp profiles add
bbutler-mcp profiles list

Welches Profil ein Serverprozess benutzt, entscheidet BB_PROFILE. Tragen Sie in Ihrem Client je Mandant einen eigenen Servereintrag mit eigenem BB_PROFILE und eigenem Namen ein; dann sieht Ihr Assistent, welcher Mandant gemeint ist.

Das Minutenlimit zählt je api_key, nicht je Prozess. Der Server führt deshalb einen eigenen Zählersatz je Mandant und drosselt nicht quer über Mandanten hinweg. Der Schlüssel wird gehasht abgelegt und taucht in keinem Protokoll auf. Zwei gleichzeitig laufende Clients auf demselben Mandanten teilen sich diesen Zähler allerdings nicht; siehe Abschnitt 17.


11. Die Werkzeuge

Eine Zeile je Endpunktwerkzeug, gruppiert nach Bereichen. Der Text ist der erste Satz der Werkzeugbeschreibung, die Ihr Assistent sieht. Diese Tabelle wird aus dem Register erzeugt. Die fünf Bündelwerkzeuge stehen nicht darin, sondern in 11.1.

Belege

Werkzeug

Wirkung

Was es tut

bb_comments_create

anlegend

Hängt einen Kommentar an einen Beleg oder an eine Zahlung in BuchhaltungsButler.

bb_receipts_create

anlegend

Legt in BuchhaltungsButler einen Beleg ohne Datei an, zum Beispiel den Datensatz einer Eingangsrechnung aus einem Vorsystem; Belegart, Gegenpartei, Rechnungsnummer, Belegdatum, Betrag und Währung sind Pflicht.

bb_receipts_create_batch

anlegend

Legt in BuchhaltungsButler bis zu 50 Belege ohne Datei an, beim Import aus einem Vorsystem; höchstens ein Aufruf je fünf Sekunden.

bb_receipts_delete

löschend

Markiert einen Beleg in BuchhaltungsButler als gelöscht, zum Beispiel einen versehentlich doppelt angelegten Beleg.

bb_receipts_get

lesend

Holt genau einen Beleg aus BuchhaltungsButler über seine mandantenbezogene Belegnummer und liefert mehr Felder als die Suche: Buchungs- und Originalwährung, Umrechnungskurs, Steuersatz, Zahlungsreferenz und auf Wunsch die Belegdatei.

bb_receipts_list_transactions

lesend

Listet die Zahlungen, die in BuchhaltungsButler einem bestimmten Beleg zugeordnet sind, etwa um zu prüfen, ob eine Eingangsrechnung schon bezahlt wurde.

bb_receipts_restore

ändernd

Nimmt in BuchhaltungsButler die Löschmarkierung eines Belegs zurück, sodass er wieder für die Buchhaltung zählt; typischer Fall ist ein versehentlich als gelöscht markierter Beleg.

bb_receipts_search

lesend

Durchsucht die Belege eines Mandanten in BuchhaltungsButler, also Eingangs- und Ausgangsrechnungen samt Gutschriften, und liefert sie seitenweise.

bb_receipts_upload

anlegend

Lädt eine Belegdatei nach BuchhaltungsButler, legt daraus einen Beleg an und stößt die Texterkennung an; Pflicht sind nur die Datei und die Belegart, alles Weitere liest BuchhaltungsButler aus der Datei.

Zahlungen

Werkzeug

Wirkung

Was es tut

bb_transactions_assign_receipt

ändernd

Ordnet in BuchhaltungsButler einen Beleg einer Zahlung zu.

bb_transactions_assign_receipt_batch

ändernd

Stellt bis zu 50 Zuordnungen aus Beleg und Zahlung in BuchhaltungsButler in einem Aufruf her.

bb_transactions_create

anlegend

Legt in BuchhaltungsButler eine Zahlung auf einem echten Zahlungskonto an, also einen Kontoumsatz.

bb_transactions_create_batch

anlegend

Legt bis zu 50 Zahlungen in BuchhaltungsButler in einem Aufruf an.

bb_transactions_get

lesend

Holt genau eine Zahlung aus BuchhaltungsButler über ihre mandantenbezogene Nummer.

bb_transactions_list_receipts

lesend

Listet die Belege auf, die in BuchhaltungsButler einer bestimmten Zahlung zugeordnet sind.

bb_transactions_search

lesend

Sucht Zahlungen, also Kontoumsätze, in BuchhaltungsButler und liefert sie seitenweise.

bb_transactions_unassign_receipt

löschend

Löst in BuchhaltungsButler die Zuordnung zwischen einem Beleg und einer Zahlung.

Rechnungen

Werkzeug

Wirkung

Was es tut

bb_invoices_create

anlegend

Erzeugt in BuchhaltungsButler eine endgültige Ausgangsrechnung, eine Gutschrift oder ein Angebot: nummeriert, als PDF und als Ausgangsbeleg der Buchhaltung.

bb_invoices_create_draft

anlegend

Erzeugt in BuchhaltungsButler einen Rechnungsentwurf: ohne endgültige Nummer, ohne PDF, aber als sichtbares Objekt in der Rechnungsstellung des Mandanten.

bb_invoices_create_einvoice

anlegend

Erzeugt in BuchhaltungsButler eine E-Rechnung: endgültig, nummeriert, mit PDF und strukturiertem Datensatz nach EN 16931.

Buchungen

Werkzeug

Wirkung

Was es tut

bb_postings_assign_receipt

ändernd

Bindet in BuchhaltungsButler einen vorhandenen Beleg an eine vorhandene freie Buchung.

bb_postings_cancel

löschend

Storniert in BuchhaltungsButler eine einzelne Buchungszeile.

bb_postings_create_for_receipt

anlegend

Legt die Buchungssätze zu einem bereits vorhandenen Beleg in BuchhaltungsButler an.

bb_postings_create_for_receipt_batch

anlegend

Legt die Buchungssätze zu mehreren vorhandenen Belegen in BuchhaltungsButler in einem Aufruf an.

bb_postings_create_for_transaction

anlegend

Legt die Buchungssätze zu einer bereits vorhandenen Zahlung in BuchhaltungsButler an.

bb_postings_create_for_transaction_batch

anlegend

Legt die Buchungssätze zu mehreren vorhandenen Zahlungen in BuchhaltungsButler in einem Aufruf an.

bb_postings_create_free

anlegend

Legt in BuchhaltungsButler eine freie Buchung an, also einen vollständigen Buchungssatz ohne Beleg- und Zahlungsbezug, etwa eine Umbuchung zwischen zwei Sachkonten.

bb_postings_create_free_batch

anlegend

Legt in BuchhaltungsButler mehrere freie Buchungen in einem Aufruf an, also vollständige Buchungssätze ohne Beleg- und Zahlungsbezug.

bb_postings_search

lesend

Liest die Buchungssätze eines Zeitraums aus der Buchhaltung von BuchhaltungsButler.

bb_postings_unconfirm_for_receipt

löschend

Hebt in BuchhaltungsButler die Bestätigung der Buchungen eines Belegs auf und entfernt sie damit.

bb_postings_unconfirm_for_transaction

löschend

Hebt in BuchhaltungsButler die Bestätigung der Buchungen einer Zahlung auf und entfernt sie damit.

bb_postings_unconfirm_free

löschend

Hebt in BuchhaltungsButler die Bestätigung einer einzelnen freien Buchung auf und entfernt sie damit.

Stammdaten

Werkzeug

Wirkung

Was es tut

bb_creditors_create

anlegend

Legt ein Kreditorenkonto, also ein Lieferantenkonto, in BuchhaltungsButler an.

bb_creditors_create_batch

anlegend

Legt mehrere Kreditorenkonten in BuchhaltungsButler in einem Aufruf an.

bb_creditors_search

lesend

Listet die Kreditorenkonten des Mandanten in BuchhaltungsButler auf, also die Lieferantenkonten, mit Kontonummer, Name und Anschrift.

bb_creditors_update

ändernd

Überschreibt die Stammdaten eines Kreditorenkontos in BuchhaltungsButler, die Bankverbindung eingeschlossen.

bb_debtors_create

anlegend

Legt ein Debitorenkonto, also ein Kundenkonto, in BuchhaltungsButler an.

bb_debtors_create_batch

anlegend

Legt mehrere Debitorenkonten in BuchhaltungsButler in einem Aufruf an.

bb_debtors_search

lesend

Listet die Debitorenkonten des Mandanten in BuchhaltungsButler auf, also die Kundenkonten, mit Kontonummer, Name, Kundennummer und Anschrift.

bb_debtors_update

ändernd

Überschreibt die Stammdaten eines Debitorenkontos in BuchhaltungsButler, Anschrift und Bankverbindung eingeschlossen.

bb_payment_accounts_create

anlegend

Legt ein manuell geführtes Zahlungskonto in BuchhaltungsButler an, etwa eine Kasse oder ein Kreditkartenkonto.

bb_payment_accounts_list

lesend

Listet die Zahlungskonten des Mandanten in BuchhaltungsButler auf, also Kassen, Bank- und Kreditkartenkonten.

bb_postingaccounts_create

anlegend

Legt ein neues Sachkonto im Kontenrahmen des Mandanten in BuchhaltungsButler an.

bb_postingaccounts_search

lesend

Durchsucht den Kontenrahmen des Mandanten in BuchhaltungsButler.

bb_postingaccounts_update

ändernd

Überschreibt die Bezeichnung eines Sachkontos in BuchhaltungsButler.

Kostenstellen

Werkzeug

Wirkung

Was es tut

bb_cost_locations_create

anlegend

Legt eine Kostenstelle in BuchhaltungsButler an, mit einem selbst gewählten code von höchstens 10 Zeichen und einer Bezeichnung.

bb_cost_locations_delete

löschend

Löscht eine Kostenstelle in BuchhaltungsButler über ihren code.

bb_cost_locations_search

lesend

Listet die Kostenstellen des Mandanten in BuchhaltungsButler auf oder holt mit code genau eine.

bb_cost_locations_update

ändernd

Überschreibt die Bezeichnung einer Kostenstelle in BuchhaltungsButler.

Berichte

Werkzeug

Wirkung

Was es tut

bb_reports_create_bwa

anlegend

Stößt in BuchhaltungsButler die Erzeugung einer Betriebswirtschaftlichen Auswertung für einen Zeitraum an und liefert deren id_by_customer zurück.

bb_reports_create_sums

anlegend

Stößt in BuchhaltungsButler die Erzeugung einer Summen- und Saldenliste über alle Konten des Mandanten an und liefert deren id_by_customer zurück; wahlweise entstehen dabei PDF, CSV und ein ZIP-Archiv mit den Kontenblättern.

bb_reports_get_bwa

lesend

Holt eine zuvor in BuchhaltungsButler erzeugte Betriebswirtschaftliche Auswertung ab, auf Wunsch samt Dateien.

bb_reports_get_ledger

lesend

Liefert das Kontenblatt eines Sachkontos aus BuchhaltungsButler für einen Zeitraum, also dessen Buchungen mit laufendem Saldo.

bb_reports_get_sums

lesend

Holt eine zuvor in BuchhaltungsButler erzeugte Summen- und Saldenliste ab, auf Wunsch samt Dateien.

11.1 Die fünf Bündelwerkzeuge

Ein Bündelwerkzeug beantwortet eine Frage, für die sonst mehrere Aufrufe nacheinander nötig wären. Der Server erledigt diese Aufrufe selbst und schickt eine Antwort zurück. Das spart nicht nur Zeit: Jeder Zwischenschritt, den ein Assistent nicht selbst planen muss, ist ein Schritt, bei dem er sich nicht verlaufen kann.

Drei Dinge gelten für alle fünf gleich:

  • Sie ersetzen nichts. Jedes der 54 Endpunktwerkzeuge bleibt da und kann weiterhin einzeln aufgerufen werden. Braucht man ein Feld, das ein Bündel zusammenfasst oder weglässt, nennt die Antwort das Einzelwerkzeug, das es liefert.

  • Sie sagen, wenn etwas offen geblieben ist. Jede Antwort führt ein Feld bundle.complete. Steht dort false, ist der Bestand nicht vollständig gelesen worden — etwa weil die Aufrufobergrenze erreicht war — und die Antwort nennt daneben, was fehlt und womit man weitermacht. Eine unvollständige Antwort wird also nie als vollständige ausgegeben.

  • Sie haben eine harte Obergrenze an Aufrufen. Die Spalte „Aufrufe höchstens" sagt, wie viele Anfragen an BuchhaltungsButler ein einziger Aufruf im schlimmsten Fall verbraucht. Das ist wichtig, weil BuchhaltungsButler nur 100 Anfragen je Mandant und Minute zulässt (Abschnitt 9).

Werkzeug

Wirkung

Aufrufe höchstens

Wofür es da ist

bb_masterdata_search

lesend

5

Findet ein Zahlungskonto, ein Sachkonto, einen Debitor, einen Kreditor oder eine Kostenstelle über den Namen oder die Nummer, ohne dass man vorher wissen muss, in welcher Liste der Eintrag geführt wird.

bb_records_collect

lesend

10

Läuft serverseitig über alle Seiten von Belegen, Zahlungen oder Buchungen und liefert Anzahl und Summe statt aller Zeilen; Einzelzeilen erst ab max_rows.

bb_assignments_get

lesend

5

Holt einen Beleg oder eine Zahlung samt allen zugeordneten Gegenstücken in einem Aufruf und beantwortet damit 'welcher Beleg gehört zu dieser Abbuchung' und 'welche Zahlung hängt an dieser Rechnung'.

bb_reports_run

anlegend

10

Erzeugt eine BWA oder eine Summen- und Saldenliste für einen Zeitraum, wartet auf die serverseitige Berechnung und liefert die fertige Auswertung im selben Aufruf zurück.

bb_balances_get

lesend

2

Liefert das Kontenblatt eines Kontos mit fortgeschriebenem Saldo und beantwortet damit 'stimmt mein Kassenbestand' und 'wie viel ist gerade auf PayPal'. account nimmt eine Kontonummer oder den Namen eines Zahlungskontos; die Nummer eines Sachkontos liefert bb_masterdata_search.

In Alltagssprache:

  • bb_masterdata_search beantwortet „unter welcher Nummer läuft eigentlich der Lieferant Meier" und „was habe ich überhaupt für Konten und Kostenstellen". Es sucht in allen fünf Stammdatenlisten gleichzeitig, damit man nicht vorher wissen muss, in welcher der Gesuchte geführt wird. Ohne Suchwort liefert es den Überblick für den Sitzungsanfang.

  • bb_records_collect beantwortet „wie viele offene Eingangsrechnungen habe ich" und „was ist im März über PayPal gelaufen". Es blättert selbst durch alle Seiten und liefert Anzahl und Summe statt hunderter Einzelzeilen. Belege sucht es auf Wunsch in beiden Richtungen zugleich, Eingang und Ausgang; die beiden Durchläufe teilen sich dabei dieselben höchstens zehn Aufrufe.

  • bb_assignments_get beantwortet „welcher Beleg gehört zu dieser Abbuchung" und „ist diese Rechnung schon bezahlt". Es holt den Vorgang und seine Gegenstücke zusammen. Die Belegdatei selbst kommt nie mit; dafür gibt es bb_receipts_get.

  • bb_reports_run erzeugt eine BWA oder eine Summen- und Saldenliste, wartet auf die Berechnung und legt die fertige Auswertung vor. Es ist das einzige schreibende Bündel und überschreibt dabei die zuvor erzeugte Auswertung desselben Typs im ganzen Mandanten — auch die einer Kollegin, die gerade daran arbeitet. Buchungsdaten ändert es nicht. Bei BB_MCP_READ_ONLY=true ist es gesperrt. Achten Sie auf das Zeitlimit Ihres Clients, denn es ist das zweite und schärfere: Viele Clients brechen eine einzelne Anfrage nach etwa 60 Sekunden ab. Das ist die Vorgabe des MCP-SDK (DEFAULT_REQUEST_TIMEOUT_MSEC = 60000); welche Frist ein bestimmter Client tatsächlich setzt, ist nicht verifiziert. Bricht er ab, sehen Sie eine gescheiterte Anfrage — der Bericht ist trotzdem erzeugt und der vorherige trotzdem ersetzt. Er ist dann nicht verloren, sondern nur noch mit bb_reports_get_bwa beziehungsweise bb_reports_get_sums abzuholen; die dafür nötige Kennung steht nicht in der abgebrochenen Antwort, sondern im stderr-Protokoll des Servers und in der Weboberfläche von BuchhaltungsButler. Wählen Sie max_wait_seconds deshalb unterhalb der Frist Ihres Clients. Bei den üblichen 60 Sekunden heißt das höchstens 30: Der Server wartet dann in Pausen von zusammen höchstens 24 Sekunden und behält Luft für das Anlegen und die Abholversuche. Die Vorgabe 60 und erst recht das erlaubte Maximum 240 setzen ein Zeitlimit voraus, das Sie bei Ihrem Client kennen und das höher liegt: Ist der Bericht bei max_wait_seconds=60 nicht rechtzeitig fertig, wartet der Server allein 60 Sekunden und setzt dazu acht Anfragen ab, liegt also in jedem Fall über der Minute.

  • bb_balances_get beantwortet „stimmt mein Kassenbestand" und „wie viel ist gerade auf PayPal". Man darf den Kontonamen sagen; die Kontonummer sucht das Werkzeug selbst. Ein leeres Kontenblatt ist dabei ausdrücklich kein Saldo von 0,00, und die Antwort sagt das auch so.

Die Tabelle darüber wird wie die der Endpunktwerkzeuge aus dem Register erzeugt. Ein sechstes Bündel erscheint nach pnpm generate von selbst darin, und die CI ist rot, solange dieser Lauf fehlt. Die Erklärungen in Alltagssprache darunter sind von Hand geschrieben und gehören mit demselben Schritt ergänzt.

11.2 Was die Annotationen bedeuten

Jedes Werkzeug trägt vier maschinenlesbare Hinweise. Ihr Client entscheidet damit, wofür er nachfragt. Das ist der eigentliche Schutz, denn dieser Server fragt selbst nicht nach.

Annotation

Bedeutung

Bei diesem Server

readOnlyHint

verändert nichts

true bei den 19 lesenden Werkzeugen, also den 15 lesenden Endpunktwerkzeugen und den vier lesenden Bündeln

destructiveHint

überschreibt, löscht oder ersetzt Bestehendes

true bei 14 Werkzeugen: den sieben löschenden, den vier überschreibenden Stammdatenwerkzeugen, den beiden Berichtserzeugern, die den Vorgängerbericht ersetzen, und dem Bündel bb_reports_run, das genau diese Erzeugung anstößt

idempotentHint

ein zweiter Aufruf ändert nichts mehr

true bei 23 Werkzeugen, nämlich nur dort, wo das beweisbar ist: bei den 19 lesenden und den 4 überschreibenden. Bei allen übrigen false, weil es nicht verifiziert ist und ein falsches true einen Client zum automatischen Wiederholen einlädt

openWorldHint

spricht mit einem fremden System

überall true

So vergeben Sie Leserechte getrennt von Schreibrechten:

  • Claude Code und Claude Desktop fragen vor jedem Werkzeugaufruf; Sie können je Werkzeug dauerhaft zustimmen. Stimmen Sie den lesenden Werkzeugen dauerhaft zu und lassen Sie schreibende einzeln nachfragen.

  • Codex CLI und ChatGPT-Desktop-App: default_tools_approval_mode = "writes" in der Serverkonfiguration.

  • Cline: nur lesende Werkzeuge in autoApprove eintragen.

  • Jan: „Allow All MCP Tool Permissions" ausgeschaltet lassen.

Wenn Ihr Client keine Unterscheidung anbietet, benutzen Sie BB_MCP_READ_ONLY und starten den Server für Schreibarbeiten getrennt.


12. Bekannte Eigenheiten der API

Diese Punkte sind keine Fehler dieses Servers, sondern Eigenschaften der BuchhaltungsButler-API. Der Server reicht sie sichtbar durch, statt sie zu verstecken.

  • rows ist keine Gesamttrefferzahl, sondern die Zeilenzahl dieser Antwort. Die API nennt an keiner Stelle, wie viele Treffer es insgesamt gibt. Eine volle Seite bedeutet: Es kann mehr geben.

  • Es gibt keinen Idempotenzschlüssel. Ein wiederholter Schreibaufruf legt einen zweiten Datensatz an. Deshalb wiederholt dieser Server einen schreibenden Aufruf nie von selbst, auch nicht nach einem Zeitlimit. Er sagt stattdessen, mit welchem lesenden Werkzeug Sie prüfen, ob der Vorgang doch angekommen ist.

  • Beträge kommen als Zeichenkette mit Punkt als Dezimaltrennzeichen, etwa "884.65", und werden beim Senden als Zahl erwartet. Der Server reicht die Zeichenkette unverändert durch und legt zusätzlich einen Cent-Betrag als Ganzzahl bei, damit niemand mit Gleitkommazahlen rechnet.

  • Wahrheitswerte kommen als "0" und "1". Der Server macht daraus echte Wahrheitswerte.

  • Es gibt drei verschiedene order-Syntaxen an drei Endpunkten, und bei den Buchungen wird die Groß- und Kleinschreibung geprüft.

  • Debitoren und Kreditoren liefern ohne ausdrückliches limit nur 25 Zeilen. Wer die vollständige Liste will, muss limit setzen.

  • Ein Bericht ersetzt seinen Vorgänger. bb_reports_create_bwa und bb_reports_create_sums überschreiben den zuletzt erzeugten Bericht desselben Typs und blockieren, solange eine Erzeugung läuft.

  • Feldnamen unterscheiden sich zwischen Listen- und Einzelabruf. In der Belegliste heißt das Leistungsdatum delivery_date, im Einzelabruf date_delivery; die Fälligkeit heißt due_date beziehungsweise date_payment_due. Der Einzelabruf liefert außerdem mehr Felder als die Liste, die Zahlungsliste zum Beispiel kein account. Der Server prüft je Endpunkt gegen das, was dort tatsächlich kommt, und meldet Abweichungen in derselben Antwort.

  • id_by_customer ist je Mandant fortlaufend, keine globale Kennung, und kommt bei Belegen als Zeichenkette, bei Zahlungen als Zahl. Nach außen gibt der Server sie immer als Zeichenkette.

  • Leere Zeichenketten sind bei den meisten Feldern ungültig, nicht neutral. Felder weglassen statt leeren.


13. Was der Server mit Ihren Daten macht

  • Ihre Zugangsdaten bleiben im Prozess. Sie werden einmal beim Start gelesen, gehen ausschließlich an BB_BASE_URL und erscheinen in keiner Werkzeugantwort, keiner Fehlermeldung und keiner Protokollzeile, auch nicht gekürzt oder maskiert.

  • Es gibt keine Telemetrie. Der Server sendet nichts an uns oder an Dritte. Er spricht mit genau einer Gegenstelle: der BuchhaltungsButler-API.

  • Protokolliert wird auf stderr, nie auf stdout, weil stdout dem MCP-Protokoll gehört. Die Stufe stellen Sie mit BB_MCP_LOG_LEVEL ein.

  • Kontextkosten. Die Definitionen der 54 Endpunktwerkzeuge sind rund 48.000 Token groß, die der fünf Bündelwerkzeuge weitere 6.852, die Serverbeschreibung rund 1.400. Gemessen mit gpt-tokenizer in der Kodierung o200k_base; für andere Modellfamilien ist das eine Größenordnung und keine exakte Zahl. Das ist der Preis dafür, dass jeder Endpunkt ein eigenes Werkzeug mit allen Parametern hat. Wer viele Server gleichzeitig betreibt, sollte das einplanen.

  • Werkzeugargumente können von Inhalten beeinflusst sein, die Ihr Assistent gelesen hat. Verwendungszwecke, Gegenparteien, Buchungstexte und Dateinamen stammen von Dritten. Ein präparierter Text kann versuchen, Ihren Assistenten zu einer Handlung zu bewegen. Der Server gibt solche Inhalte neutralisiert aus, nie als Anweisung formatiert, und entfernt Steuer- und Richtungszeichen. Vollständig verhindern lässt sich das nicht. Deshalb: Lassen Sie sich schreibende Aufrufe vom Client vorlegen.


14. Dateien hochladen

bb_receipts_upload nimmt eine Belegdatei in drei Formen an:

Form

Voraussetzung

base64-Zeichenkette (Vorgabe)

keine; funktioniert immer. Der Dateiname gehört in file_name

file://…

Der Betreiber hat mit BB_MCP_UPLOAD_DIRS Verzeichnisse freigegeben. Ohne diese Variable liest der Server keine Datei von der Platte

https://…

BB_MCP_UPLOAD_FROM_URL=true. Ohne diese Variable lädt der Server nichts aus dem Netz

Angenommen werden PDF, XML, JPEG, PNG, BMP und TIFF. Der Typ wird am Inhalt bestimmt, nicht an der Endung.

Warnung. BB_MCP_UPLOAD_DIRS und BB_MCP_UPLOAD_FROM_URL geben Ihrem Assistenten die Möglichkeit, Dateien zu lesen, deren Pfad oder Adresse aus einem Gespräch stammt. Steht diese Adresse in einer E-Mail, einem Beleg oder einer Webseite, die der Assistent zuvor gelesen hat, entscheidet am Ende nicht mehr Ihr Wunsch, welche Datei hochgeladen wird. Geben Sie deshalb nur ein eng umrissenes Ablageverzeichnis frei, niemals das Heimatverzeichnis, und lassen Sie BB_MCP_UPLOAD_FROM_URL aus, wenn Sie es nicht ausdrücklich brauchen.


15. Verifikation

npx -y @dennismenken/buchhaltungsbutler-mcp doctor

Eine gesunde Ausgabe zeigt

  • Paketversion, Node-Version und Plattform,

  • die Basis-URL,

  • woher die Zugangsdaten kommen (Umgebung oder Zugangsdatendatei) und dass alle drei gesetzt sind, ohne einen der Werte anzuzeigen,

  • die Rechte der Zugangsdatendatei,

  • das Ergebnis des Verbindungstests mit der Zahl der gefundenen Zahlungskonten,

  • die Schalterlage, also BB_MCP_READ_ONLY, die Grenzen und den Stammdatenspeicher,

  • „Registriert: 59 — 54 Endpunktwerkzeuge und 5 Bündelwerkzeuge" und darunter die Wirkungen der Endpunktwerkzeuge, also „15 lesend, 24 anlegend, 8 ändernd, 7 löschend",

  • die geschätzte Größe der Werkzeugdefinitionen,

  • die gefundenen Clientkonfigurationen mit Pfad,

  • jede unbekannte BB_*-Variable mit dem ähnlichsten bekannten Namen.

Die Ausgabe enthält garantiert kein Geheimnis und kann in einen Fehlerbericht kopiert werden. Für Skripte gibt es bbutler-mcp test: nur der Verbindungstest, Rückgabewert 0 oder 1. Mit doctor --skip-connection-test geht kein einziger Aufruf an die API hinaus.


16. Fehlersuche

Symptom

Ursache

Abhilfe

Der Server erscheint im Client gar nicht

Konfiguration nicht gespeichert, falsche Datei, oder der Client wurde nicht neu gestartet

Pfad gegen Abschnitt 5 prüfen, Client neu starten, danach bbutler-mcp doctor

Jede Antwort beginnt mit „NICHT KONFIGURIERT"

Der Server hat keine Zugangsdaten gefunden

Die Meldung nennt die fehlende Variable. bbutler-mcp setup ausführen oder die drei Variablen in der Clientkonfiguration setzen und den Client neu starten; die Zugangsdaten werden nur beim Start gelesen

401, error_code 3: API credentials unknown or invalid

API Client oder API Secret ist falsch. Der API Key wurde damit noch nicht geprüft

Beide Werte in BuchhaltungsButler neu abschreiben

401, error_code 4: customer not found …

Client und Secret stimmen, aber der API Key gehört nicht dazu, oder dieser Client darf diesen Mandanten nicht bedienen

API Key prüfen und die Zuordnung des Clients zum Mandanten

Die Antwort ist HTML statt JSON

Falsche Basis-URL, oder ein Proxy oder Anmeldeportal sitzt davor

BB_BASE_URL prüfen, HTTPS_PROXY prüfen, Zieldomain freigeben

Werkzeuge antworten mit einer Nur-Lesen-Absage

BB_MCP_READ_ONLY steht auf true

Variable entfernen oder auf false setzen und den Client neu starten. Aus dem Gespräch heraus ist das nicht möglich

Die Debitorenliste zeigt nur 25 Einträge

Die API liefert an /settings/get/debtors und /settings/get/creditors ohne ausdrückliches limit nur 25 Zeilen

Den Assistenten bitten, limit zu setzen und mit offset weiterzublättern

Die Kontenliste scheint unvollständig

Zahlungskonten und Sachkonten sind zwei verschiedene Listen

bb_payment_accounts_list liefert die Zahlungskonten, bb_postingaccounts_search den Kontenrahmen einschließlich Debitoren und Kreditoren

Codex meldet einen Zeitablauf beim Start

Der npx-Kaltstart dauert länger als die Vorgabe von 10 Sekunden

startup_timeout_sec = 30 setzen (5.3) oder fest installieren (Abschnitt 6)

Eine gesetzte BB_*-Variable wirkt nicht

Tippfehler im Namen

Der Server warnt auf stderr und nennt den ähnlichsten bekannten Namen. bbutler-mcp doctor zeigt dieselbe Warnung


17. Bekannte Einschränkungen

Diese Punkte sind bekannt, benannt und nicht wegkonstruierbar.

  • Ein Client, der nicht nachfragt, kann mit diesem Server löschen, stornieren und buchen. Der Server erzwingt keine Bestätigung; das ist eine bewusste Entscheidung. Ihr Schutz sind die Annotationen (11.2), die Freigabe in Ihrem Client, der Nur-Lesen-Schalter und die Betrags- und Mengengrenzen.

  • Die Werkzeuge kosten Kontext. Die 54 Endpunktwerkzeuge wiegen rund 48.000 Token (gemessen 48.368), die fünf Bündelwerkzeuge weitere 6.852, zusammen 55.220. Bei vielen gleichzeitig aktiven Servern kann die Trefferquote eines Assistenten darunter leiden. Wer nur einen Teil braucht, meldet mit BB_MCP_TOOL_GROUPS nur diesen an (7.4). In Claude Code und der Codex CLI erübrigt sich das: Dort werden Definitionen erst bei Bedarf geladen.

  • Buchungen und Rechnungen sind über die API nicht löschbar. Eine Buchung wird storniert, eine festgeschriebene erzeugt dabei eine dauerhaft sichtbare Stornobuchung. Für Rechnungen gibt es über die API gar keinen Weg zurück.

  • Debitoren, Kreditoren und Kommentare lassen sich über die API nicht wieder entfernen.

  • Zwei schreibende Aufrufformen sind nicht verifiziert. Bei bb_receipts_delete und bb_receipts_restore ist die Pfadform aus zwei gemessenen lesenden Endpunkten abgeleitet, aber nicht selbst gemessen, weil dafür ein Schreibtest nötig wäre. Der Code weist das aus.

  • Das Wiederholungsverhalten der löschenden Werkzeuge ist nicht verifiziert. Deshalb idempotentHint: false bei allen; lieber eine Rückfrage zu viel als ein automatischer zweiter Aufruf.

  • Welche Währungen die Belegendpunkte wirklich annehmen, ist nicht verifiziert. Die Spezifikation widerspricht sich dort dreifach. Der Server nimmt deshalb einen freien Text an und nennt den Widerspruch in der Parameterbeschreibung, statt gültige Belege vorab abzulehnen.

  • Die Zeitzone der Datumsfelder ist nirgends dokumentiert. Werte werden unverändert durchgereicht und nicht umgerechnet.

  • Die Drosselung ist prozesslokal. Zwei gleichzeitig laufende Clients auf demselben Mandanten teilen sich den Zähler nicht und können gemeinsam das Minutenlimit der API reißen. Die Vorgabe 60 statt 100 hält deshalb Abstand.

  • Prompt-Injection über Freitextfelder lässt sich nicht vollständig verhindern, siehe Abschnitt 13.

  • Die Clientanleitungen altern. Pfade und Befehle der Clients ändern sich; vier der in 5.8 genannten Pfade sind nicht verifiziert. Deshalb schreibt der Einrichtungsassistent dort nichts, sondern gibt nur aus.


18. Einen neuen Endpunkt nachrüsten

Bekommt die API einen neuen Endpunkt, sind es genau fünf Schritte:

  1. Die neue Spezifikationsdatei einspielen und pnpm generate ausführen. Die Vollständigkeitsprüfung P1 schlägt fehl und nennt den neuen Pfad.

  2. Eine Datei src/registry/tools/<werkzeugname>.ts anlegen. Der Dateiname ist der Werkzeugname.

  3. Den Eintrag nach dem Typ ToolEntry füllen: Name, Titel, Pfad, Wirkung, Klasse, Beschreibung mit dem passenden Pflichtsatz, alle Felder, verifyWith, Eimer, Zeitlimitstufe, concise und Antwortvertrag.

  4. pnpm generate erneut ausführen. Der Registerindex wird ergänzt, die Werkzeugtabelle dieser README wird neu erzeugt. Der Index ist nicht eingecheckt und deshalb auch nicht zu committen.

  5. pnpm test ausführen. Die dreizehn Registerprüfungen sind grün oder nennen genau, was fehlt.

Einen sechsten Schritt gibt es nicht. Es ist keine Sammeldatei zu ändern, kein Handler zu schreiben und keine Liste an zweiter Stelle zu pflegen.


19. Mitwirken

Fehler melden: über die Issues des Repositories dennismenken/buchhaltungsbutler-mcp. Legen Sie die Ausgabe von bbutler-mcp doctor bei; sie enthält kein Geheimnis. Für Sicherheitslücken gilt der Weg in SECURITY.md, nicht der öffentliche Issue.

Entwicklungsumgebung, Testregeln und der Weg über das Register stehen in CONTRIBUTING.md. Die Kurzfassung:

pnpm install
pnpm generate && pnpm typecheck && pnpm lint && pnpm test

Kein Test spricht mit der echten API. Der normale Testlauf sperrt das Netz; ein eigener Test prüft, dass diese Sperre aktiv ist.

Vor jeder Veröffentlichung ist der Vertragslauf pnpm contract:read Pflicht. Er ruft die 15 lesenden Endpunkte gegen echte Zugangsdaten auf und vergleicht die gelieferten Felder mit den hinterlegten Antwortverträgen. Er läuft nicht in der öffentlichen CI und ist ein blockierender Punkt der Veröffentlichungs-Checkliste.


20. Lizenz und Abgrenzung

Lizenz: MIT, siehe LICENSE.

  • Dieses Projekt ist inoffiziell. Es steht in keiner Verbindung zur BuchhaltungsButler GmbH, wird von dort weder herausgegeben noch unterstützt noch geprüft. Einzelheiten in NOTICE.md.

  • „BuchhaltungsButler" ist eine Marke ihres Rechteinhabers. Der Name wird hier ausschließlich benutzt, um zu beschreiben, mit welcher Schnittstelle dieses Programm spricht.

  • Dies ist kein Ersatz für steuerliche Beratung. Was gebucht werden darf und wie, entscheidet Ihre Steuerberatung, nicht ein Sprachmodell.

  • Die Verantwortung für jede Buchung bleibt bei Ihnen. Der Server führt aus, was Ihr Assistent aufruft. Er prüft keine fachliche Richtigkeit, und er kann eine falsche Buchung nicht zurücknehmen.

Available Tools

59 tools
bb_assignments_getVorgang mit Zuordnungen holenA
Read-onlyIdempotent

Holt einen Beleg oder eine Zahlung samt allen zugeordneten Gegenstücken in einem Aufruf und beantwortet damit 'welcher Beleg gehört zu dieser Abbuchung' und 'welche Zahlung hängt an dieser Rechnung'. Genau eines der beiden Kennungsfelder setzen. Ersetzt das Paar bb_receipts_get und bb_receipts_list_transactions sowie das Paar bb_transactions_get und bb_transactions_list_receipts. Konnte die Zuordnungsliste nicht geholt werden, steht dort null und nicht das leere Array; 'keine Zuordnung' wird nur behauptet, wenn die API es gesagt hat. Die Belegdatei kommt nie mit, dafür bb_receipts_get. Höchstens 5 Aufrufe an die API.

ParametersJSON Schema
NameRequiredDescriptionDefault
max_rowsNoHöchstzahl der angezeigten Zuordnungszeilen, 1 bis 200, Vorgabe 50. Wirkt serverseitig und geht nicht an die API; assignment_count nennt weiterhin alle gefundenen Zuordnungen.
confirmed_onlyNoWenn true, liefert die API nur bestätigte Zuordnungen, also solche, hinter denen eine bestätigte Buchung steht. Ohne Angabe kommen alle. Der Bestätigungsstand selbst steht in keiner Antwortzeile; dieses Werkzeug weist ihn deshalb nicht aus.
response_formatNo'concise' liefert nur die Felder, die einen Datensatz erkennbar machen und den nächsten Schritt erlauben. 'detailed' liefert den Datensatz so, wie die BuchhaltungsButler-API ihn ausgibt. Mit 'concise' beginnen und nur für die wenigen Datensätze auf 'detailed' wechseln, die wirklich geprüft werden müssen. Dieses Feld ist serverseitig und geht nicht an die API.concise
receipt_id_by_customerNoDie mandantenbezogene Belegnummer, zu finden über bb_records_collect oder bb_receipts_search. Genau eines der beiden Kennungsfelder ist zu setzen. In Suchergebnissen erscheint die Nummer als Zeichenkette; hier ohne Anführungszeichen übergeben. Beleg 1590 und Zahlung 1590 sind verschiedene Vorgänge.
transaction_id_by_customerNoDie mandantenbezogene Nummer einer Zahlung, zu finden über bb_records_collect oder bb_transactions_search. Genau eines der beiden Kennungsfelder ist zu setzen. Der Nummernraum ist von dem der Belege getrennt.

Output Schema

ParametersJSON Schema
NameRequiredDescription
kindYes
bundleYes
recordNo
successYes
enrichedNo
assignmentsYes
not_enrichedNo
confirmed_onlyNo
id_by_customerNo
assignment_countNo
assignments_statusYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower. The description nevertheless discloses valuable behavior: null vs empty-array semantics for failed assignment lists, the guard that 'keine Zuordnung' is only claimed when the API said so, and the API-call budget ('Höchstens 5 Aufrufe'). It doesn't discuss pagination of the assignment rows, but the max_rows note partially covers that.

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?

Front-loaded with the core purpose and the question it answers, followed by invocation rules and behavioral caveats in logical order. It is dense and every sentence carries information, though the 'Ersetzt das Paar...' sentence is somewhat list-like and could be tightened.

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 an output schema exists, the description needn't explain return fields, and it doesn't. It covers what the schema and annotations can't: sibling replacement, exactly-one-of, null-vs-empty semantics, file exclusion, and the API call limit. Nothing an agent needs to call this correctly 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 description coverage is 100%, so baseline is 3. The description adds meaning beyond the schema: it states the exactly-one-of constraint on the two ID fields, clarifies that string-form IDs from search results must be passed unquoted, and warns that receipt 1590 and transaction 1590 are distinct entities. That is genuine added value over the schema's per-parameter text.

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?

Specific verb+resource: 'Holt einen Beleg oder eine Zahlung samt allen zugeordneten Gegenstücken'. It even states the user questions it answers ('welcher Beleg gehört zu dieser Abbuchung'). It explicitly distinguishes itself from the four siblings it replaces (bb_receipts_get/list_transactions and bb_transactions_get/list_receipts), making its scope unambiguous.

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

Usage Guidelines5/5

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

Explicit guidance: 'Genau eines der beiden Kennungsfelder setzen' tells the invocation rule, and 'Ersetzt das Paar X und Y' tells the agent when to prefer it over the sibling pairs. It also names a when-not case ('Die Belegdatei kommt nie mit, dafür bb_receipts_get'), routing the file-retrieval use case elsewhere.

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

bb_balances_getKontostand und KontenblattA
Read-onlyIdempotent

Liefert das Kontenblatt eines Kontos mit fortgeschriebenem Saldo und beantwortet damit 'stimmt mein Kassenbestand' und 'wie viel ist gerade auf PayPal'. account nimmt eine Kontonummer oder den Namen eines Zahlungskontos; die Nummer eines Sachkontos liefert bb_masterdata_search. Der Saldo steht in der letzten Zeile und enthält gemessen auch den Bestand vor date_from; gekürzt wird deshalb in der Mitte und nie am Ende. Ersetzt bb_reports_get_ledger für die Frage nach dem Kontostand; alle 24 Felder je Buchungszeile liefert weiterhin nur dieses Einzelwerkzeug. Ein leeres Kontenblatt ist kein Saldo von 0,00. Höchstens 2 Aufrufe an die API.

ParametersJSON Schema
NameRequiredDescriptionDefault
baseNoDatumsgrundlage. 'date' ist das Buchungs- oder Rechnungsdatum, 'date_delivery_else_date' das Leistungsdatum und hilfsweise das Buchungsdatum. Vorgabe ist 'date'.
accountYesDas Konto. Kontonummer ODER Name eines Zahlungskontos, zum Beispiel 1200 oder PayPal. Eine rein numerische Angabe wird unverändert als Kontonummer gesendet; ein Name wird über die Liste der Zahlungskonten aufgelöst und bei mehreren oder keinem Treffer abgelehnt, statt geraten. Sachkonten stehen nicht in dieser Liste: Ihre Nummer zuerst mit bb_masterdata_search nachschlagen und hier als Zahl eintragen. Entspricht postingaccount_number in bb_reports_get_ledger.
date_toYesLetzter Tag des Zeitraums, eingeschlossen, als YYYY-MM-DD. Für den heutigen Bestand das heutige Datum setzen.
max_rowsNoHöchstzahl der angezeigten Buchungszeilen, 1 bis 200, Vorgabe 50. Gekürzt wird in der MITTE: Die letzten fünf Zeilen bleiben immer stehen, weil in der letzten der Saldo steht. Der Wert wirkt serverseitig und geht nicht an die API.
date_fromYesErster Tag des Zeitraums, eingeschlossen, als YYYY-MM-DD. Der Zeitraum darf eng sein: Der Saldo der letzten Zeile enthält gemessen auch den Bestand vor date_from.
response_formatNo'concise' liefert nur die Felder, die einen Datensatz erkennbar machen und den nächsten Schritt erlauben. 'detailed' liefert den Datensatz so, wie die BuchhaltungsButler-API ihn ausgibt. Mit 'concise' beginnen und nur für die wenigen Datensätze auf 'detailed' wechseln, die wirklich geprüft werden müssen. Dieses Feld ist serverseitig und geht nicht an die API.concise

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsYes
bundleYes
periodNo
accountYes
successYes
rows_shownNo
balance_endYes
rows_omittedNo
posting_countNo
standard_chartNo
integrity_errorNo
account_candidatesNo

TDQS

A5/5.0
Behavior5/5

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

The read-only nature is clear from 'Liefert' and aligns with readOnlyHint=true, idempotentHint=true, and destructiveHint=false. It also notes server-side truncation and a maximum of 2 API calls, giving useful behavioral expectations.

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 compact and structured around purpose, usage, edge cases, and sibling differentiation. It avoids redundant restatement while still conveying the important operational caveats.

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?

It covers purpose, usage, account resolution, truncation behavior, empty-ledger semantics, API-call limits, and sibling-tool routing. With output schema present and annotations consistent, the description is complete for this read-only balance tool.

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?

Schema coverage is 100% for all 6 parameters, and the description adds meaning for account resolution, date_from behavior with pre-period Saldo, max_rows middle truncation, and response_format. The remaining parameters are clearly documented in the schema.

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 it returns a Kontenblatt with fortgeschriebenem Saldo and answers specific questions about Kassenbestand and PayPal. It also explicitly distinguishes itself from bb_reports_get_ledger for balance queries versus the 24-field ledger tool.

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

Usage Guidelines5/5

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

Explains that account accepts a Kontonummer or Zahlungskonto name, directs Sachkonten to bb_masterdata_search, and says it replaces bb_reports_get_ledger for Kontostand questions. It also includes edge-case guidance that an empty Kontenblatt is not a 0,00 Saldo.

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

bb_comments_createKommentar anhängenA

Hängt einen Kommentar an einen Beleg oder an eine Zahlung in BuchhaltungsButler. Gedacht für einen Hinweis an die Buchhaltung, etwa warum ein Beleg noch offen ist. Genau eine der beiden Kennungen receipt_id_by_customer und transaction_id_by_customer angeben; die API lehnt den Aufruf sonst ab. Der Kommentar ist für alle Nutzer des Mandanten sichtbar. Die API kennt keinen Endpunkt, Kommentare zu lesen, zu ändern oder zu entfernen, und die Antwort nennt auch keine Kennung des angelegten Kommentars. Schreibt in die echten Buchhaltungsdaten von BuchhaltungsButler. Die API bietet keinen Endpunkt, das rückgängig zu machen.

ParametersJSON Schema
NameRequiredDescriptionDefault
comment_textYesDer Kommentartext, 2 bis 210 Zeichen. Für alle Nutzer des Mandanten sichtbar und über die API weder änderbar noch löschbar.
receipt_id_by_customerNoDie mandantenbezogene Nummer des Belegs, zu finden über bb_receipts_search. Keine globale Kennung. In Suchergebnissen erscheint sie als String; hier ohne Anführungszeichen übergeben. Genau eine der beiden Kennungen receipt_id_by_customer und transaction_id_by_customer angeben; die API lehnt den Aufruf sonst ab.
transaction_id_by_customerNoDie mandantenbezogene Nummer der Zahlung, zu finden über bb_transactions_search. Keine globale Kennung. In Suchergebnissen erscheint sie als String; hier ohne Anführungszeichen übergeben. Genau eine der beiden Kennungen receipt_id_by_customer und transaction_id_by_customer angeben; die API lehnt den Aufruf sonst ab.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
createdNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.4/5.0
Behavior5/5

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

Goes well past the annotations by disclosing that the comment is visible to every user of the tenant, that no API endpoint exists to read, change, or delete comments, that the response returns no identifier for the created comment, and that the write hits real accounting data with no undo path. These are exactly the operational facts an agent needs before committing an irreversible write.

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?

Front-loads what the tool does, then layers constraints and side effects in a logical order with no filler sentences. It is a touch long and leans on comma splices rather than clean clause separation, but every sentence carries a distinct fact.

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 an irreversible create against live data, the description covers target selection, visibility, the absence of read/update/delete endpoints, and the missing return identifier—even though an output schema exists. Nothing needed to invoke it safely 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?

Schema description coverage is 100%, so all three parameters are already fully documented in the schema, including the exactly-one-identifier rule and the 'pass as integer, not string' note. The description only restates the either/or constraint, adding no semantics beyond what the schema already provides; baseline 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?

Specific verb (anhängen) plus resource (Kommentar) plus the two supported targets (Beleg oder Zahlung), and the use case is exemplified ('Hinweis an die Buchhaltung, etwa warum ein Beleg noch offen ist'). No sibling tool competes for this action, so an agent can pick it out unambiguously.

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 clear context for when to reach for it (a note to accounting about an open receipt) and states the hard selection rule that exactly one of the two identifiers must be supplied. It does not explicitly route the agent to the search tools for obtaining those IDs in the description text—that routing lives only in the schema—so it falls short of full when/when-not guidance.

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

bb_cost_locations_createKostenstelle anlegenA

Legt eine Kostenstelle in BuchhaltungsButler an, mit einem selbst gewählten code von höchstens 10 Zeichen und einer Bezeichnung. Gedacht für eine neue Abteilung oder ein neues Projekt, auf das Buchungszeilen verteilt werden sollen. Die Kostenstelle steht danach in den Positionsfeldern cost_location und cost_location_two der Buchungswerkzeuge zur Verfügung. Welche Codes schon belegt sind, zeigt bb_cost_locations_search. Schreibt in die echten Buchhaltungsdaten von BuchhaltungsButler. Rückgängig zu machen mit bb_cost_locations_delete.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesAlphanumerischer Code der neuen Kostenstelle, höchstens 10 Zeichen, zum Beispiel abc123. Er ist zugleich der Identifikator. Welche Codes belegt sind, zeigt bb_cost_locations_search.
nameYesBezeichnung der Kostenstelle, zum Beispiel Vertrieb Nord oder Projekt Neubau.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
createdNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already define the write/safety profile (readOnly=false, destructive=false, idempotent=false, openWorld=true), but the description adds real value beyond them: it writes to live BuchhaltungsButler accounting data, is reversible only via bb_cost_locations_delete, and its codes become usable in the cost_location fields of posting tools. It does not state what happens if the code is already taken, which keeps this from a 5.

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?

Front-loads the action and its two constraints, then adds intent, downstream effect, duplicate-check routing, side-effect warning, and undo path — every sentence carries distinct information and none restates structured fields verbatim.

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?

Output schema covers return values, annotations cover the safety profile, and the description supplies the remaining context an agent needs: side effects on real data, the sibling to consult before creating, and the recovery tool. Complete for a 2-parameter create 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 the formal constraints are already documented, but the description adds semantics: that 'code' is the self-chosen identifier of the cost center and that taken codes can be looked up via bb_cost_locations_search, plus the real-world meaning of 'name'. This goes beyond the schema's examples.

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+resource (legt eine Kostenstelle ... an) plus defining constraints (code max 10 chars, Bezeichnung), and names the sibling tools it relates to (search, delete). An agent can distinguish it from bb_cost_locations_update/search/delete without opening any schema.

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

Usage Guidelines5/5

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

Explicitly gives the intended use case (neue Abteilung oder Projekt, auf das Buchungszeilen verteilt werden), names bb_cost_locations_search for checking taken codes, and names bb_cost_locations_delete as the undo path. When-to-use and alternatives are both stated.

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

bb_cost_locations_deleteKostenstelle löschenA
Destructive

Löscht eine Kostenstelle in BuchhaltungsButler über ihren code. Gedacht für eine versehentlich angelegte oder nicht mehr benutzte Kostenstelle. Was mit Buchungen geschieht, die auf diese Kostenstelle verweisen, ist nicht dokumentiert und nicht verifiziert: Die Zuordnung kann verloren gehen. Welche Buchungen betroffen sind, zeigt bb_postings_search. Entfernt Daten aus dem echten Mandanten von BuchhaltungsButler: eine Kostenstelle samt ihrer Bezeichnung. Die betroffenen Datensätze vorher lesen und dem Nutzer vorlegen.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesCode der zu löschenden Kostenstelle, zum Beispiel abc123. Nachschlagen mit bb_cost_locations_search.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
messageNo
removedNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and openWorldHint=true, but the description adds substantial context beyond them: exactly what is removed (the cost center plus its Bezeichnung), that it deletes from the real/production tenant, and that the effect on referencing postings is undocumented and the assignment may be lost. It also prescribes reading affected records and presenting them to the user first.

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?

It is somewhat long, but every sentence carries distinct information (purpose, target scenario, undeclared side effect, impact-check tool, production scope, recommended pre-read) and the core action is front-loaded.

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?

With an output schema present and only one fully-documented parameter, the description still covers behavior, side effects, production scope, and a pre-deletion workflow. Nothing an agent needs to invoke this safely 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?

Schema description coverage is 100% — the single 'code' parameter is fully documented with an example and a lookup hint (bb_cost_locations_search). The description only restates that deletion happens 'über ihren code', adding no syntax or format detail beyond the schema, so the 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?

The description gives a specific verb and resource in German ('Löscht eine Kostenstelle in BuchhaltungsButler über ihren code') and adds the intent behind the operation. An agent can immediately distinguish this from sibling operations like bb_cost_locations_update, _create or _search.

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?

It states a clear usage context ('Gedacht für eine versehentlich angelegte oder nicht mehr benutzte Kostenstelle') and routes the agent to bb_postings_search to inspect affected postings before acting. It does not spell out an explicit 'do not use when' exclusion, but the guidance is concrete.

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

bb_cost_locations_updateKostenstelle überschreibenA
DestructiveIdempotent

Überschreibt die Bezeichnung einer Kostenstelle in BuchhaltungsButler. Gedacht für eine berichtigte Bezeichnung. Der code bleibt unverändert; er ist der Identifikator und lässt sich nicht ändern. Buchungen, die auf diese Kostenstelle verweisen, bleiben erhalten und erscheinen danach unter der neuen Bezeichnung. Die Antwort bestätigt die neue Bezeichnung nicht, deshalb den Stand vorher und nachher mit bb_cost_locations_search lesen. Überschreibt Stammdaten im echten Mandanten von BuchhaltungsButler. Die API liefert die vorherigen Werte nicht zurück; ohne vorher gelesenen Datensatz ist die Änderung nicht rückgängig zu machen.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesCode der zu ändernden Kostenstelle, zum Beispiel abc123. Er ist der Identifikator und lässt sich nicht ändern. Nachschlagen mit bb_cost_locations_search.
nameYesNeue Bezeichnung der Kostenstelle, zum Beispiel Vertrieb Nord. Sie ersetzt die bisherige vollständig.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
changedNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses that bookings referencing the cost center are preserved and re-labelled, that the response does not confirm the new name, that the API returns no previous values, and that the change is irreversible without a prior read. This is exactly the destructive-mutation context the annotations cannot convey.

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?

Front-loads the core action and each sentence carries operational weight (irreversibility, verification workflow, identifier immutability). Slightly verbose, but nothing is filler.

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?

An output schema exists, so return values need no explanation, yet the description adds the crucial caveat that the response does not confirm the new name. Combined with the irreversibility warning, an agent has everything needed to call this mutation safely.

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%, so the schema already documents both parameters, including the code's immutability and the lookup hint. The description reinforces that the code stays unchanged but adds no syntax or format detail beyond the schema, so the baseline 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 (überschreibt) and the exact resource scoped (die Bezeichnung einer Kostenstelle), and clarifies that the code/identifier itself is not changed. This lets an agent distinguish it from bb_cost_locations_create/delete/search without opening the schema.

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 clear context ('Gedacht für eine berichtigte Bezeichnung') and names the sibling to use for verification (bb_cost_locations_search before and after). It stops short of an explicit when-not-to-use statement, but the intended scenario is unambiguous.

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

bb_creditors_createKreditorenkonto anlegenA

Legt ein Kreditorenkonto, also ein Lieferantenkonto, in BuchhaltungsButler an. Gedacht für einen neuen Lieferanten, bevor eine Eingangsrechnung kreditorisch erfasst wird. Ohne postingaccount_number vergibt BuchhaltungsButler die nächste freie Nummer und nennt sie in der Antwort. Mehrere Konten in einem Aufruf legt bb_creditors_create_batch an; Kunden sind Debitoren und gehören zu bb_debtors_create. Schreibt in die echten Buchhaltungsdaten von BuchhaltungsButler. Die API bietet keinen Endpunkt, das rückgängig zu machen.

ParametersJSON Schema
NameRequiredDescriptionDefault
bicNoBIC der Bankverbindung, zum Beispiel BYLADEM1001.
zipNoPostleitzahl, zum Beispiel "28195".
cityNoOrt, zum Beispiel Bremen.
ibanNoIBAN der Bankverbindung, zum Beispiel DE02120300000000202051.
nameYesName des Lieferantenkontos, zum Beispiel Musterlieferant GmbH.
emailNoE-Mail-Adresse, zum Beispiel rechnung@beispiel.de.
streetNoStraße und Hausnummer, zum Beispiel Hauptstraße 12.
countryNoLand, zum Beispiel Deutschland oder DE.
due_in_daysNoZahlungsfrist in Tagen, zum Beispiel 14. Schreibbar, aber von keinem lesenden Endpunkt der API zurückgeliefert; der gesetzte Wert ist danach nur in der Weboberfläche von BuchhaltungsButler zu sehen.
sales_tax_idNoUmsatzsteuer-Identifikationsnummer, zum Beispiel DE123456789.
contact_person_nameNoName der Ansprechperson, zum Beispiel Maria Schmidt.
postingaccount_numberNoKontonummer des neuen Kreditorenkontos als Zeichenkette. Ohne Angabe vergibt BuchhaltungsButler die nächste freie Nummer. Belegte Nummern zeigt bb_creditors_search.
additional_address_lineNoZusätzliche Adresszeile, zum Beispiel Gebäude B.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
createdNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations cover write/non-idempotent/non-destructive, and the description adds critical extras not in annotations: automatic numbering when postingaccount_number is omitted (and that it is returned), that it writes to real data, and that the API offers no undo endpoint. This materially raises the stakes-awareness beyond structured fields.

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?

Dense but every sentence earns its place: purpose, use case, numbering behavior, sibling routing, write target, and irreversibility. Front-loaded with the core action and no filler.

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?

With 13 params, an output schema, and full annotations, the description covers the remaining gaps: auto-numbering, return of the number, sibling alternatives, and irreversibility. Nothing an agent needs to invoke correctly 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 for postingaccount_number by explaining auto-assignment and pointing to bb_creditors_search for checking occupied numbers. The due_in_days caveat about write-only visibility is also covered, though it appears mainly in the schema.

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?

Specific verb+resource in German: creates a creditor (supplier) account in BuchhaltungsButler. It explicitly distinguishes itself from siblings by naming bb_creditors_create_batch for bulk and bb_debtors_create for customers, making selection unambiguous.

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

Usage Guidelines5/5

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

States the intended use case (new supplier before an incoming invoice is recorded) and names alternatives with their selecting conditions: batch for multiple accounts, bb_debtors_create for customers. Clear when/when-not guidance.

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

bb_creditors_create_batchKreditorenkonten im Stapel anlegenA

Legt mehrere Kreditorenkonten in BuchhaltungsButler in einem Aufruf an. Gedacht für die Übernahme einer Lieferantenliste. Ein Element trägt dieselben Felder wie bb_creditors_create, allerdings ohne email. Die Antwort meldet Teilerfolg: Das Array errors nennt jeden abgelehnten Eintrag. Schreibt in die echten Buchhaltungsdaten von BuchhaltungsButler. Die API bietet keinen Endpunkt, das rückgängig zu machen.

ParametersJSON Schema
NameRequiredDescriptionDefault
creditorsYesDie anzulegenden Kreditorenkonten. Ein Element trägt dieselben Felder wie bb_creditors_create, allerdings ohne email. Höchstens 50 Einträge je Aufruf. Ein abgelehnter Stapel wird nicht teilweise verarbeitet.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
createdNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.5/5.0
Behavior5/5

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

Adds substantial behavior beyond the annotations: the response is partial-success with an 'errors' array naming each rejected entry, and critically there is no API endpoint to undo the write. This 'no-undo' warning is exactly the kind of risk context annotations (destructiveHint=false, idempotentHint=false) do not convey.

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?

Front-loaded with the core action, then use case, element shape, response semantics, and irreversibility in tight sentences. No wasted text; each sentence carries distinct, decision-relevant information.

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?

Covers write target ('echten Buchhaltungsdaten'), partial-success semantics, lack of undo, batch element shape, and intended scenario. Even though an output schema exists, the description adds the failure-mode context an agent needs to invoke this safely.

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 every field, the 1-50 item bounds, and the postingaccount_number behavior. The description only adds that items mirror bb_creditors_create minus email, which is a minor clarification rather than new syntax meaning, 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?

States a specific verb+resource (mehrere Kreditorenkonten anlegen) with the batch scope made explicit ('in einem Aufruf'). It names the sibling bb_creditors_create and clarifies the difference (same fields, but without email), so an agent can distinguish the batch from the single-create tool without opening either schema.

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 clear use context ('Gedacht für die Übernahme einer Lieferantenliste') and implicitly routes single-record work to bb_creditors_create by referencing shared fields. It lacks an explicit when-not/alternative statement (e.g. 'use single create for one creditor'), so it stops just 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.

bb_creditors_updateKreditorenkonto überschreibenA
DestructiveIdempotent

Überschreibt die Stammdaten eines Kreditorenkontos in BuchhaltungsButler, die Bankverbindung eingeschlossen. Gedacht für eine geänderte Anschrift oder IBAN eines Lieferanten. Angesprochen wird das Konto über postingaccount_number; die Nummer selbst lässt sich nicht ändern. Ob ein weggelassenes Feld unverändert bleibt, ist nicht dokumentiert — im Zweifel den vollständigen Datensatz senden, vorher gelesen mit bb_creditors_search. Überschreibt Stammdaten im echten Mandanten von BuchhaltungsButler. Die API liefert die vorherigen Werte nicht zurück; ohne vorher gelesenen Datensatz ist die Änderung nicht rückgängig zu machen.

ParametersJSON Schema
NameRequiredDescriptionDefault
bicNoBIC der Bankverbindung, zum Beispiel BYLADEM1001.
zipNoPostleitzahl, zum Beispiel "28195".
cityNoOrt, zum Beispiel Bremen.
ibanNoIBAN der Bankverbindung, zum Beispiel DE02120300000000202051.
nameNoNeuer Name des Lieferantenkontos, zum Beispiel Musterlieferant GmbH.
emailNoE-Mail-Adresse, zum Beispiel rechnung@beispiel.de.
streetNoStraße und Hausnummer, zum Beispiel Hauptstraße 12.
countryNoLand, zum Beispiel Deutschland oder DE.
due_in_daysNoNeue Zahlungsfrist in Tagen, zum Beispiel 14. Schreibbar, aber von keinem lesenden Endpunkt der API zurückgeliefert; der neue Wert ist danach nur in der Weboberfläche von BuchhaltungsButler zu sehen.
sales_tax_idNoUmsatzsteuer-Identifikationsnummer, zum Beispiel DE123456789.
contact_person_nameNoName der Ansprechperson, zum Beispiel Maria Schmidt.
postingaccount_numberYesKontonummer des zu ändernden Kreditorenkontos, zum Beispiel 70150. Sie ist der Identifikator und lässt sich nicht ändern. Nachschlagen mit bb_creditors_search. Dieser Endpunkt erwartet eine ganze Zahl, das Anlegen dagegen eine Zeichenkette.
additional_address_lineNoZusätzliche Adresszeile, zum Beispiel Gebäude B.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
changedNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations (destructive, idempotent, openWorld), it discloses that partial-update semantics are undocumented and advises sending the full record, warns that it writes to the real tenant, and that the API returns no previous values so the change is irreversible without a prior read. This is exactly the extra context annotations cannot carry.

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?

Front-loads purpose, then usage, then caveats in a logical order with no filler. It is somewhat dense for a description, but each sentence carries distinct information (scope, identifier, partial-update risk, irreversibility).

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 destructive 13-parameter mutation with an output schema already covering returns, the description supplies everything an agent needs: the identifier, the pre-read requirement, partial-update ambiguity, and irreversibility. Nothing material 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?

Schema description coverage is 100%, so the schema already documents all 13 fields. The description's identifier note (postingaccount_number is the key and cannot be changed) largely duplicates the schema's own text, so it adds little beyond the baseline.

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 (überschreibt die Stammdaten eines Kreditorenkontos) and even scopes the fields touched (Bankverbindung eingeschlossen). An agent can distinguish this mutation from the read sibling bb_creditors_search, which the description names explicitly.

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 usage context ("Gedacht für eine geänderte Anschrift oder IBAN eines Lieferanten") and a prerequisite workflow (read the record first with bb_creditors_search before overwriting). It does not explicitly state when NOT to use it, e.g. routing account creation to bb_creditors_create, so it falls short of a full 5.

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

bb_debtors_createDebitorenkonto anlegenA

Legt ein Debitorenkonto, also ein Kundenkonto, in BuchhaltungsButler an. Gedacht für einen neuen Kunden, bevor ihm eine Ausgangsrechnung zugeordnet wird. Ohne postingaccount_number vergibt BuchhaltungsButler die nächste freie Nummer und nennt sie in der Antwort. Mehrere Konten in einem Aufruf legt bb_debtors_create_batch an; Lieferanten sind Kreditoren und gehören zu bb_creditors_create. Schreibt in die echten Buchhaltungsdaten von BuchhaltungsButler. Die API bietet keinen Endpunkt, das rückgängig zu machen.

ParametersJSON Schema
NameRequiredDescriptionDefault
bicNoBIC der Bankverbindung, zum Beispiel BYLADEM1001.
zipNoPostleitzahl, zum Beispiel "28195".
cityNoOrt, zum Beispiel Bremen.
ibanNoIBAN der Bankverbindung, zum Beispiel DE02120300000000202051.
nameYesName des Kundenkontos, zum Beispiel Musterkunde GmbH.
emailNoE-Mail-Adresse, zum Beispiel rechnung@beispiel.de.
streetNoStraße und Hausnummer, zum Beispiel Hauptstraße 12.
countryNoLand, zum Beispiel Deutschland oder DE.
sales_tax_idNoUmsatzsteuer-Identifikationsnummer, zum Beispiel DE123456789.
customer_numberNoKunden- oder Lieferantennummer des Mandanten.
contact_person_nameNoName der Ansprechperson, zum Beispiel Maria Schmidt.
postingaccount_numberNoKontonummer des neuen Debitorenkontos als Zeichenkette. Ohne Angabe vergibt BuchhaltungsButler die nächste freie Nummer. Belegte Nummern zeigt bb_debtors_search.
additional_address_lineNoZusätzliche Adresszeile, zum Beispiel Gebäude B.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
createdNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare a non-read-only, non-destructive, non-open write, but the description adds material context beyond them: writes go to real live accounting data, and the API offers no endpoint to undo the operation. It also discloses the auto-numbering side effect and that the assigned number is returned in the response.

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?

Six tight sentences, each carrying distinct information: purpose, usage context, default behavior, alternatives, write scope, irreversibility. Purpose is front-loaded and nothing is padding.

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 13-parameter mutation tool with full schema coverage, an output schema, and safety annotations, this description covers everything an agent needs: what it does, when to pick it versus siblings, and the irreversible-write risk. No gap remains for 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 description coverage is 100% across all 13 parameters, so the schema already carries parameter meaning and 3 is the baseline. The description's note that omitting postingaccount_number triggers automatic numbering duplicates what the schema's own description says rather than adding new syntax or constraints.

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 ('legt ein Debitorenkonto, also ein Kundenkonto, in BuchhaltungsButler an') and immediately disambiguates the German term. It names the sibling tools it is not (bb_debtors_create_batch, bb_creditors_create), so the agent can select correctly without opening schemas.

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

Usage Guidelines5/5

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

Explicit context for use ('für einen neuen Kunden, bevor ihm eine Ausgangsrechnung zugeordnet wird') plus clear routing to alternatives: batch creation for multiple accounts and bb_creditors_create for suppliers. Both when-to-use and when-to-use-something-else are covered.

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

bb_debtors_create_batchDebitorenkonten im Stapel anlegenA

Legt mehrere Debitorenkonten in BuchhaltungsButler in einem Aufruf an. Gedacht für die Übernahme einer Kundenliste. Ein Element trägt dieselben Felder wie bb_debtors_create, allerdings ohne email. Die Antwort meldet Teilerfolg: Das Array errors nennt jeden abgelehnten Eintrag. Schreibt in die echten Buchhaltungsdaten von BuchhaltungsButler. Die API bietet keinen Endpunkt, das rückgängig zu machen.

ParametersJSON Schema
NameRequiredDescriptionDefault
debtorsYesDie anzulegenden Debitorenkonten. Ein Element trägt dieselben Felder wie bb_debtors_create, allerdings ohne email. Höchstens 50 Einträge je Aufruf. Ein abgelehnter Stapel wird nicht teilweise verarbeitet.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
createdNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.1/5.0
Behavior4/5

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

Going well beyond the annotations, it discloses partial-success semantics (an 'errors' array naming rejected entries), that the operation writes to live BuchhaltungsButler accounting data, and that no undo endpoint exists — valuable for a non-idempotent write. However, the partial-success claim sits in tension with the schema's statement that a rejected batch is not partially processed, which weakens the reliability of the behavioral description. The irreversibility note does not contradict destructiveHint=false, since creation is not a destructive operation.

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?

Front-loaded with purpose before intent, response behavior and risk warnings; no filler sentences. Slightly repetitive because the field-equivalence and batch-size statements reappear in the schema.

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 batch mutation tool with annotations and an output schema, the description covers the missing pieces an agent needs: intent, partial-failure handling, production data, and irreversibility. It omits any guidance on the partial-vs-all-or-nothing conflict and on retry/rate behavior, so it is strong but not airtight.

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?

With a single top-level parameter and 100% schema description coverage, the schema already carries the field-by-field semantics, so the baseline is 3. The description's notes ('same fields as bb_debtors_create', 'without email', 50-item cap) are duplicated verbatim inside the schema, adding no meaning beyond what structured data already provides.

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 precise verb and resource ('Legt mehrere Debitorenkonten ... an') and adds the batch scope ('in einem Aufruf') plus the intended scenario ('Übernahme einer Kundenliste'). It anchors itself to the sibling bb_debtors_create by declaring identical fields minus email, so an agent can distinguish the single-create tool from this one without opening either schema.

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 intent sentence ('Gedacht für die Übernahme einer Kundenliste') tells an agent clearly when this tool is the right choice, i.e. bulk onboarding of existing customers. It stops short of explicit routing rules or exclusions (e.g. 'use bb_debtors_create for a single debtor'), so it is context-rich but not fully directive.

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

bb_debtors_updateDebitorenkonto überschreibenA
DestructiveIdempotent

Überschreibt die Stammdaten eines Debitorenkontos in BuchhaltungsButler, Anschrift und Bankverbindung eingeschlossen. Gedacht für eine geänderte Adresse oder IBAN eines Kunden. Angesprochen wird das Konto über postingaccount_number; die Nummer selbst lässt sich nicht ändern. Ob ein weggelassenes Feld unverändert bleibt, ist nicht dokumentiert — im Zweifel den vollständigen Datensatz senden, vorher gelesen mit bb_debtors_search. Überschreibt Stammdaten im echten Mandanten von BuchhaltungsButler. Die API liefert die vorherigen Werte nicht zurück; ohne vorher gelesenen Datensatz ist die Änderung nicht rückgängig zu machen.

ParametersJSON Schema
NameRequiredDescriptionDefault
bicNoBIC der Bankverbindung, zum Beispiel BYLADEM1001.
zipNoPostleitzahl, zum Beispiel "28195".
cityNoOrt, zum Beispiel Bremen.
ibanNoIBAN der Bankverbindung, zum Beispiel DE02120300000000202051.
nameNoNeuer Name des Kundenkontos, zum Beispiel Musterkunde GmbH.
emailNoE-Mail-Adresse, zum Beispiel rechnung@beispiel.de.
streetNoStraße und Hausnummer, zum Beispiel Hauptstraße 12.
countryNoLand, zum Beispiel Deutschland oder DE.
sales_tax_idNoUmsatzsteuer-Identifikationsnummer, zum Beispiel DE123456789.
customer_numberNoKunden- oder Lieferantennummer des Mandanten.
contact_person_nameNoName der Ansprechperson, zum Beispiel Maria Schmidt.
postingaccount_numberYesKontonummer des zu ändernden Debitorenkontos, zum Beispiel 10001. Sie ist der Identifikator und lässt sich nicht ändern. Nachschlagen mit bb_debtors_search. Dieser Endpunkt erwartet eine ganze Zahl, das Anlegen dagegen eine Zeichenkette.
additional_address_lineNoZusätzliche Adresszeile, zum Beispiel Gebäude B.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
changedNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.5/5.0
Behavior5/5

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

Adds substantial context beyond annotations: warns that an omitted field's behavior is unspecified, advises sending the full record, warns changes hit the live Mandant and are irreversible because previous values are not returned. That irreversibility disclosure is exactly what destructiveHint=true implies but cannot verbalize.

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?

Front-loads the core action, then routes, then warns about the irreversible write. Sentences are dense and each earns its place, though the passage on postingaccount_number's type split could sit closer to the field definition.

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?

Covers purpose, identifier, lookup requirement, irreversibility, and the partial-update caveat, which is complete for a destructive mutation with an output schema. The one residual gap — that it does not name bb_debtors_create as the alternative for new accounts — is minor given the identifier-based framing.

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 description coverage is 100%, so schema already carries field semantics; baseline would be 3. The description adds two non-obvious facts: postingaccount_number is the immutable identifier, and it must be an integer here whereas create expects a string — a type-mismatch trap worth flagging.

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 (überschreibt) plus resource (Stammdaten eines Debitorenkontos) and enumerates the fields affected (Anschrift, Bankverbindung). Distinguishes from bb_debtors_create by naming the identifier (postingaccount_number) that this tool addresses, which create does not.

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?

Clearly frames the target scenario (changed address or IBAN) and routes the agent to bb_debtors_search for the prior record. Does not explicitly state when-not to use it vs. bb_debtors_create, but the identifier-based framing makes the boundary inferable.

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

bb_invoices_createRechnung erzeugenA

Erzeugt in BuchhaltungsButler eine endgültige Ausgangsrechnung, eine Gutschrift oder ein Angebot: nummeriert, als PDF und als Ausgangsbeleg der Buchhaltung. Zu nehmen, sobald der Vorgang final ist, etwa 10 Std. Beratung zu 120.00 je Stunde; bb_invoices_create_draft erzeugt stattdessen einen Entwurf ohne Nummernvergabe, bb_invoices_create_einvoice eine E-Rechnung mit Steuerart je Position. Die API kennt keinen Pfad, eine Rechnung oder ihr PDF zu lesen; nachsehen lässt sich das Ergebnis nur in der Weboberfläche. Einen Währungsparameter gibt es nicht, Rechnungen über die API laufen in Euro. Schreibt in die echten Buchhaltungsdaten von BuchhaltungsButler. Die API bietet keinen Endpunkt, das rückgängig zu machen.

ParametersJSON Schema
NameRequiredDescriptionDefault
zipNoPostleitzahl, zum Beispiel "28195".
cityNoOrt, zum Beispiel Bremen.
dateYesRechnungsdatum als YYYY-MM-DD, zum Beispiel 2026-04-26. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. Die Spezifikation nennt hier kein Format; YYYY-MM-DD gilt überall sonst in dieser API.
emailNoE-Mail-Adresse, zum Beispiel rechnung@beispiel.de.
itemsYesDie Rechnungspositionen, je Eintrag eine Zeile des Dokuments. item_amount ist die Menge und nicht der Betrag; der Preis einer Einheit steht in item_single_price. Die BuchhaltungsButler-API nimmt diese Werte als parallele Arrays entgegen (item_name, item_amount, item_unit, item_vat, item_single_price, item_description); dieses Werkzeug nimmt eine Positionsliste und rechnet sie um, wodurch die Arrays zwingend gleich lang sind.
streetNoStraße und Hausnummer, zum Beispiel Hauptstraße 12.
countryNoLand des Empfängers, deutscher Ländername oder ISO-Code, zum Beispiel DK.
due_daysNoTage bis zur Fälligkeit, Ziffernfolge, zum Beispiel 14. Nur dieses Feld erzeugt ein Fälligkeitsdatum. Die Vorgabe ohne Angabe ist hier nicht dokumentiert.
languageNoSprache der festen Beschriftungen: 'de_DE' oder 'en_US', ohne Angabe 'de_DE'. Positionstexte werden nicht übersetzt.
company_nameYesFirmenname des Empfängers, wie er auf dem Dokument erscheint.
invoice_typeYesArt des Dokuments: 'invoice' Rechnung, 'credit' Gutschrift, 'offer' Angebot. Heißt in der API type, hier umbenannt: type ist dort siebenfach belegt.
discount_typeNoRabatt auf die gesamte Rechnung: 'percent' Prozent, 'EUR' Euro. Positionsrabatte kennt die API nicht; gemeinsam mit discount_value setzen.
invoicenumberNoRechnungsnummer. Ohne Angabe vergibt BuchhaltungsButler sie aus dem eigenen Nummernkreis.
show_bankdataNotrue zeigt die im Mandanten hinterlegte Bankverbindung auf dem Dokument. Die Bankdaten selbst stammen aus den Mandanteneinstellungen.
correspondenceNoAnschreiben an den Empfänger, erscheint vor den Positionen.
date_of_supplyNoLiefer- oder Leistungsdatum, freier Text oder YYYY-MM-DD. Nur im Format YYYY-MM-DD wird der Wert zusätzlich date_delivery des entstehenden Belegs. Ein Datum nach date verwirft BuchhaltungsButler wegen der DATEV-Regel stillschweigend.
discount_valueNoHöhe des Rabatts mit Dezimalpunkt, zum Beispiel 10 oder 49.50. Die Bedeutung entscheidet discount_type.
customer_numberNoKunden- oder Lieferantennummer des Mandanten.
final_provisionsNoSchlusstext des Dokuments, erscheint nach den Positionen.
show_contactdataNotrue zeigt die im Mandanten hinterlegten Kontaktdaten auf dem Dokument.
show_prices_typeYesPreisdarstellung: 'net' Nettopreise, 'gross' Bruttopreise. Danach werden die Werte in item_single_price gelesen.
payment_referenceNoZahlungsreferenz für die spätere Zuordnung zu einer Zahlung: Amazon-Bestellnummer oder Vorgangsnummer von PayPal oder Stripe.
payment_conditionsNoZahlungsbedingungen als Text auf dem Dokument. Erzeugt kein Fälligkeitsdatum, dafür ist due_days da.
recurring_intervalNoRhythmus eines Rechnungsplans: 'weekly', 'monthly', 'quarterly' oder 'yearly'. Es entsteht ein dauerhafter Plan, der selbsttätig weitere Rechnungen erzeugt und über die API weder lesbar noch zu beenden ist.
contact_person_nameNoName der Ansprechperson, zum Beispiel Maria Schmidt.
recurring_date_nextNoNächster Termin des Rechnungsplans als YYYY-MM-DD. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. Pflicht, sobald recurring_interval gesetzt ist.
additional_addresslineNoZusätzliche Adresszeile, zum Beispiel Gebäude B.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
createdNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.5/5.0
Behavior4/5

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

With annotations present the bar is lower, and the description still adds substantial context beyond them: the write lands in real BuchhaltungsButler data, there is no API path to read the invoice or its PDF (only the web UI), there is no currency parameter because API invoices are EUR-only, and there is no endpoint to undo the write. The irreversibility warning sits in mild tension with destructiveHint=false, though creating a record is additive rather than a destructive update, so it is complementary rather than contradictory. Auth needs and rate limits are not covered.

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?

Front-loaded correctly: what it creates, then when to use it and which sibling to prefer, then the operational caveats. Dense and mostly waste-free, though the worked example and the sibling detour lengthen the opening considerably and could be trimmed.

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 27-parameter irreversible write with an output schema, the description covers the decisive operational facts: finality trigger, alternatives, no read-back path, EUR-only, no undo. It stops short of documenting failure modes (e.g. duplicate invoicenumber handling) or delivery of the PDF, but the core is sufficient to call the tool correctly.

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 schema already carries the field-level detail (including the item_amount vs item_single_price distinction and the parallel-array conversion). The description still contributes beyond the schema by flagging the absent currency parameter and illustrating a realistic call ('10 Std. Beratung zu 120.00 je Stunde'), which prevents a foreseeable misuse.

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 states a precise verb and resource ('Erzeugt ... eine endgültige Ausgangsrechnung, eine Gutschrift oder ein Angebot') and immediately qualifies the scope ('endgültig', nummeriert, PDF, Ausgangsbeleg). It explicitly separates itself from the two nearest siblings, so an agent can route without opening any schema.

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

Usage Guidelines5/5

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

It gives an explicit when-to-use trigger ('Zu nehmen, sobald der Vorgang final ist') plus a concrete example, and names both alternatives with the condition that selects them: bb_invoices_create_draft for a draft without numbering, bb_invoices_create_einvoice for an e-invoice with per-position tax type. Nothing is left to inference.

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

bb_invoices_create_draftRechnungsentwurf erzeugenA

Erzeugt in BuchhaltungsButler einen Rechnungsentwurf: ohne endgültige Nummer, ohne PDF, aber als sichtbares Objekt in der Rechnungsstellung des Mandanten. Zu nehmen, solange der Vorgang noch abgestimmt wird, etwa ein Angebot zur internen Durchsicht; bb_invoices_create erzeugt die endgültige, nummerierte Rechnung, bb_invoices_create_einvoice die E-Rechnung. Die Antwort trägt ausschließlich success und message: keine id_by_customer, keine invoicenumber, und die API kennt keinen Pfad, den Entwurf später zu lesen. Die Felder invoicenumber, due_days und payment_reference führt dieser Endpunkt nicht. Schreibt in die echten Buchhaltungsdaten von BuchhaltungsButler. Die API bietet keinen Endpunkt, das rückgängig zu machen.

ParametersJSON Schema
NameRequiredDescriptionDefault
zipNoPostleitzahl, zum Beispiel "28195".
cityNoOrt, zum Beispiel Bremen.
dateYesRechnungsdatum als YYYY-MM-DD, zum Beispiel 2026-04-26. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. Ob der Wert im Entwurf erhalten bleibt, ist nicht verifiziert.
emailNoE-Mail-Adresse, zum Beispiel rechnung@beispiel.de.
itemsYesDie Positionen des Entwurfs, je Eintrag eine Zeile des späteren Dokuments. item_amount ist die Menge und nicht der Betrag; der Preis einer Einheit steht in item_single_price. Die BuchhaltungsButler-API nimmt diese Werte als parallele Arrays entgegen (item_name, item_amount, item_unit, item_vat, item_single_price, item_description); dieses Werkzeug nimmt eine Positionsliste und rechnet sie um, wodurch die Arrays zwingend gleich lang sind.
streetNoStraße und Hausnummer, zum Beispiel Hauptstraße 12.
countryNoLand des Empfängers, deutscher Ländername oder ISO-Code, zum Beispiel DK.
languageNoSprache der festen Beschriftungen: 'de_DE' oder 'en_US', ohne Angabe 'de_DE'. Positionstexte werden nicht übersetzt.
company_nameYesFirmenname des Empfängers, wie er auf dem Dokument erscheint.
invoice_typeYesArt des Dokuments: 'invoice' Rechnung, 'credit' Gutschrift, 'offer' Angebot. Heißt in der API type, hier umbenannt: type ist dort siebenfach belegt.
discount_typeNoRabatt auf die gesamte Rechnung: 'percent' Prozent, 'EUR' Euro. Positionsrabatte kennt die API nicht; gemeinsam mit discount_value setzen.
show_bankdataNotrue zeigt die im Mandanten hinterlegte Bankverbindung auf dem Dokument. Die Bankdaten selbst stammen aus den Mandanteneinstellungen.
correspondenceNoAnschreiben an den Empfänger, erscheint vor den Positionen.
date_of_supplyNoLiefer- oder Leistungsdatum, freier Text oder YYYY-MM-DD. Nur im Format YYYY-MM-DD wird der Wert zusätzlich date_delivery des entstehenden Belegs. Ein Datum nach date verwirft BuchhaltungsButler wegen der DATEV-Regel stillschweigend.
discount_valueNoHöhe des Rabatts mit Dezimalpunkt, zum Beispiel 10 oder 49.50. Die Bedeutung entscheidet discount_type.
customer_numberNoKunden- oder Lieferantennummer des Mandanten.
final_provisionsNoSchlusstext des Dokuments, erscheint nach den Positionen.
show_contactdataNotrue zeigt die im Mandanten hinterlegten Kontaktdaten auf dem Dokument.
show_prices_typeYesPreisdarstellung: 'net' Nettopreise, 'gross' Bruttopreise. Danach werden die Werte in item_single_price gelesen.
payment_conditionsNoZahlungsbedingungen als Text auf dem Dokument. Ein Fälligkeitsdatum entsteht daraus nicht; das Feld due_days führt dieser Endpunkt nicht.
recurring_intervalNoRhythmus eines Rechnungsplans: 'weekly', 'monthly', 'quarterly' oder 'yearly'. Es entsteht ein dauerhafter Plan, der selbsttätig weitere Rechnungen erzeugt und über die API weder lesbar noch zu beenden ist.
contact_person_nameNoName der Ansprechperson, zum Beispiel Maria Schmidt.
recurring_date_nextNoNächster Termin des Rechnungsplans als YYYY-MM-DD. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. Pflicht, sobald recurring_interval gesetzt ist.
additional_addresslineNoZusätzliche Adresszeile, zum Beispiel Gebäude B.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
createdNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations: warns that the response carries only success and message (no id_by_customer, no invoicenumber) and that no API path exists to read the draft later. It also discloses that the endpoint excludes invoicenumber, due_days, and payment_reference, that it writes to real accounting data, and that there is no undo endpoint. This is unusually rich disclosure for a write operation.

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?

Front-loads what the tool creates and its distinguishing traits before moving to sibling routing and behavioral caveats. The sentences are dense but each carries a specific fact (missing fields, no read path, no undo). Slightly heavy at ~90 words, but no filler.

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 a 24-parameter write tool with an output schema, the description covers the critical behavioral gaps: what is omitted from the response, what the API cannot do afterward, and how it relates to sibling creation endpoints. The output schema handles return shape, so nothing essential 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?

Schema description coverage is 100% and each field already has a detailed description, including field-name remapping (type → invoice_type), enum semantics, format rules, and DATEV warnings. The tool description itself adds no additional parameter-level information, so baseline 3 applies under high coverage.

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 the verb and resource precisely ('Erzeugt in BuchhaltungsButler einen Rechnungsentwurf') and enumerates distinguishing characteristics: no final number, no PDF, but a visible object. It further separates itself from the sibling tools bb_invoices_create and bb_invoices_create_einvoice by name.

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

Usage Guidelines5/5

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

States explicitly when to use it ('solange der Vorgang noch abgestimmt wird, etwa ein Angebot zur internen Durchsicht') and names both alternatives with their distinct roles. The routing between draft, final invoice, and e-invoice is unambiguous.

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

bb_invoices_create_einvoiceE-Rechnung erzeugenA

Erzeugt in BuchhaltungsButler eine E-Rechnung: endgültig, nummeriert, mit PDF und strukturiertem Datensatz nach EN 16931. Zu nehmen für Empfänger, die eine E-Rechnung verlangen, etwa öffentliche Auftraggeber; bb_invoices_create erzeugt die gewöhnliche Rechnung, bb_invoices_create_draft einen Entwurf. Strengste Feldprüfung der API: Die Käuferreferenz e_invoice_id sowie street, zip, city, country und email des Empfängers sind Pflicht, und je Position stehen item_tax_type und item_tax_amount an der Stelle von item_vat. Die API kennt keinen Pfad, eine Rechnung zu lesen; nachsehen lässt sich das Ergebnis nur in der Weboberfläche. Schreibt in die echten Buchhaltungsdaten von BuchhaltungsButler. Die API bietet keinen Endpunkt, das rückgängig zu machen.

ParametersJSON Schema
NameRequiredDescriptionDefault
zipYesPostleitzahl, zum Beispiel "28195".
cityYesOrt, zum Beispiel Bremen.
dateYesRechnungsdatum als YYYY-MM-DD, zum Beispiel 2026-04-26. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. Die Spezifikation nennt hier kein Format; YYYY-MM-DD gilt überall sonst in dieser API.
emailYesE-Mail-Adresse des Empfängers. Hier Pflicht, an bb_invoices_create nicht.
itemsYesDie Positionen der E-Rechnung, je Eintrag eine Zeile des Dokuments. item_amount ist die Menge und nicht der Betrag; der Preis einer Einheit steht in item_single_price. Die Steuer wird hier als Steuerart item_tax_type angegeben, nicht als item_vat. Die BuchhaltungsButler-API nimmt diese Werte als parallele Arrays entgegen (item_name, item_amount, item_unit, item_tax_type, item_tax_amount, item_single_price, item_description); dieses Werkzeug nimmt eine Positionsliste und rechnet sie um, wodurch die Arrays zwingend gleich lang sind.
streetYesStraße und Hausnummer, zum Beispiel Hauptstraße 12.
countryYesLand des Empfängers, deutscher Ländername oder ISO-Code, zum Beispiel DK.
due_daysNoTage bis zur Fälligkeit, Ziffernfolge, zum Beispiel 14. Ohne Angabe gilt 0, die Rechnung ist dann sofort fällig. Nur dieses Feld erzeugt ein Fälligkeitsdatum.
languageNoSprache der festen Beschriftungen: 'de_DE' oder 'en_US', ohne Angabe 'de_DE'. Positionstexte werden nicht übersetzt.
company_nameYesFirmenname des Empfängers, wie er auf dem Dokument erscheint.
e_invoice_idYesKäuferreferenz des Empfängers, in der Norm die Leitweg-Identifikationsnummer. Ohne eigene Referenz '0' senden; öffentliche Auftraggeber geben sie vor.
invoice_typeYesArt des Dokuments: 'invoice' Rechnung, 'credit' Gutschrift, 'offer' Angebot. Heißt in der API type, hier umbenannt: type ist dort siebenfach belegt.
discount_typeNoRabatt auf die gesamte Rechnung: 'percent' Prozent, 'EUR' Euro. Positionsrabatte kennt die API nicht; gemeinsam mit discount_value setzen.
invoicenumberNoRechnungsnummer. Ohne Angabe vergibt BuchhaltungsButler sie aus dem eigenen Nummernkreis.
show_bankdataNotrue zeigt die im Mandanten hinterlegte Bankverbindung auf dem Dokument. Die Bankdaten selbst stammen aus den Mandanteneinstellungen.
correspondenceNoAnschreiben an den Empfänger, erscheint vor den Positionen.
date_of_supplyNoLiefer- oder Leistungsdatum, freier Text oder YYYY-MM-DD. Nur im Format YYYY-MM-DD wird der Wert zusätzlich date_delivery des entstehenden Belegs. Ein Datum nach date verwirft BuchhaltungsButler wegen der DATEV-Regel stillschweigend.
discount_valueNoHöhe des Rabatts mit Dezimalpunkt, zum Beispiel 10 oder 49.50. Die Bedeutung entscheidet discount_type.
customer_numberNoKunden- oder Lieferantennummer des Mandanten.
final_provisionsNoSchlusstext des Dokuments, erscheint nach den Positionen.
show_contactdataNotrue zeigt die im Mandanten hinterlegten Kontaktdaten auf dem Dokument.
show_prices_typeYesPreisdarstellung: 'net' Nettopreise, 'gross' Bruttopreise. Danach werden die Werte in item_single_price gelesen.
payment_referenceNoZahlungsreferenz für die spätere Zuordnung zu einer Zahlung: Amazon-Bestellnummer oder Vorgangsnummer von PayPal oder Stripe.
payment_conditionsNoZahlungsbedingungen als Text auf dem Dokument. Erzeugt kein Fälligkeitsdatum, dafür ist due_days da.
recurring_intervalNoRhythmus eines Rechnungsplans: 'weekly', 'monthly', 'quarterly' oder 'yearly'. Es entsteht ein dauerhafter Plan, der selbsttätig weitere Rechnungen erzeugt und über die API weder lesbar noch zu beenden ist.
contact_person_nameNoName der Ansprechperson, zum Beispiel Maria Schmidt.
recurring_date_nextNoNächster Termin des Rechnungsplans als YYYY-MM-DD. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. Pflicht, sobald recurring_interval gesetzt ist.
additional_addresslineNoZusätzliche Adresszeile, zum Beispiel Gebäude B.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
createdNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already flag a non-idempotent, non-read-only write, but the description goes well beyond them: it warns this writes into real BuchhaltungsButler data, that there is no API endpoint to undo it, that there is no API path to read the resulting invoice back (only the web UI), and that the endpoint applies the strictest field validation in the API. This is exactly the operational caveat an agent needs before calling.

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?

Five dense sentences packed into one paragraph, front-loaded with the purpose and the sibling routing before the validation and irreversibility caveats. Slightly long, but each sentence carries distinct information (routing, required-field deltas, no-read path, irreversibility) rather than filler.

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 28-parameter, 11-required mutation tool this covers the gaps that matter: it duplicates none of the output schema but supplies the irreversibility, the missing read-back path, and the sibling selection rule. Nothing an agent needs in order to call it correctly 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, but the description adds real meaning: it calls out which fields become mandatory here (e_invoice_id plus street, zip, city, country, email) and that positions use item_tax_type/item_tax_amount in place of item_vat, an API renaming the schema does not explain. That goes beyond restating the required list.

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 ('Erzeugt ... eine E-Rechnung: endgültig, nummeriert, mit PDF und strukturiertem Datensatz nach EN 16931') and immediately names the two closest siblings (bb_invoices_create for the ordinary invoice, bb_invoices_create_draft for a draft). An agent can distinguish this from every other invoice tool without opening a schema.

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

Usage Guidelines5/5

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

Explicit when-to-use ('Zu nehmen für Empfänger, die eine E-Rechnung verlangen, etwa öffentliche Auftraggeber') and explicit alternatives with the condition that selects each ('bb_invoices_create erzeugt die gewöhnliche Rechnung, bb_invoices_create_draft einen Entwurf'). Nothing is left to inference.

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

bb_payment_accounts_createZahlungskonto anlegenA

Legt ein manuell geführtes Zahlungskonto in BuchhaltungsButler an, etwa eine Kasse oder ein Kreditkartenkonto. Gedacht für ein Konto ohne Bankanbindung. Die postingaccount_number muss zur gewählten Art passen; die bestehenden Konten und ihre Nummern zeigt bb_payment_accounts_list. Ein Aufwands- oder Ertragskonto ist kein Zahlungskonto und gehört zu bb_postingaccounts_create. is_revision_safe wirkt nur bei einer Kasse und legt dauerhaftes Verhalten fest. Schreibt in die echten Buchhaltungsdaten von BuchhaltungsButler. Die API bietet keinen Endpunkt, das rückgängig zu machen.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesBezeichnung des Zahlungskontos, zum Beispiel Kasse Ladengeschäft.
is_revision_safeNotrue macht eine Kasse revisionssicher: Gespeicherte Zahlungen verschwinden dann nur noch über eine Stornozahlung. Laut Spezifikation wirkt die Angabe nur bei 'cash' und legt dauerhaftes Verhalten fest.
payment_account_typeYesArt des Zahlungskontos: 'cash' für eine Kasse, 'bank/institution' für ein Bank- oder Geldinstitutskonto, 'other' für alles Übrige, etwa eine Kreditkarte. Der API-Parameter heißt type.
postingaccount_numberYesSachkontonummer des neuen Zahlungskontos als ganze Zahl, zum Beispiel 1000 für eine Kasse. Welche Nummern der Mandant schon belegt, zeigt bb_payment_accounts_list.
receipt_creates_transactionNotrue legt zu jedem Beleg, der diesem Zahlungskonto zugeordnet wird, selbsttätig eine Zahlung an.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
createdNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.7/5.0
Behavior5/5

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

Annotations declare non-read-only, non-idempotent, non-destructive, open-world, but the description adds genuinely new behavioral context: it writes to real BuchhaltungsButler data, the API offers no undo endpoint, and is_revision_safe permanently locks in behavior. That irreversibility disclosure is exactly the kind of context the annotations do not carry.

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?

Front-loaded with purpose and dense with useful routing and constraint information; every sentence carries content. There is mild redundancy where the postingaccount_number guidance repeats what the schema property description already states.

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 5-parameter mutation tool with an output schema (so return values need no explanation), the description covers purpose, eligibility, cross-parameter constraints, alternatives, and irreversibility. It does not mention permission/auth prerequisites or error behavior when a posting account number is already taken, leaving a small 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?

Schema coverage is 100%, so the baseline is 3; the description adds a cross-field constraint not in the schema ('Die postingaccount_number muss zur gewählten Art passen') and points to bb_payment_accounts_list for used numbers. It slightly duplicates the schema's own is_revision_safe note, so it is above baseline but not fully additive.

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 ('Legt ein manuell geführtes Zahlungskonto ... an') with concrete examples (Kasse, Kreditkartenkonto) and scopes it to accounts without a bank connection. It also names the sibling it must not be confused with (bb_postingaccounts_create), so an agent can route correctly without opening schemas.

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

Usage Guidelines5/5

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

Explicit when-to-use ('Gedacht für ein Konto ohne Bankanbindung'), explicit when-not ('Ein Aufwands- oder Ertragskonto ist kein Zahlungskonto') with the alternative tool named, plus a pointer to bb_payment_accounts_list for choosing postingaccount_number. Nothing is left to inference.

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

bb_payment_accounts_listZahlungskonten auflistenA
Read-onlyIdempotent

Listet die Zahlungskonten des Mandanten in BuchhaltungsButler auf, also Kassen, Bank- und Kreditkartenkonten. Je Konto kommen genau zwei Felder: name und postingaccount_number. Diese Nummer ist eine Sachkontonummer und bezeichnet trotzdem ein Zahlungskonto; genau dieser Wert gehört in das Feld payment_account_number von bb_receipts_create, bb_receipts_upload und bb_transactions_create. Gedacht zum Nachschlagen, bevor eine Zahlung oder ein Beleg einem Konto zugeordnet wird. Der Endpunkt kennt weder limit noch offset und liefert immer alle Konten. Kontoart, Kontostand und Währung liefert er nicht: Die Kontoart steht als subtype in bb_postingaccounts_search, die Währung gibt die API an keiner Stelle preis.

ParametersJSON Schema
NameRequiredDescriptionDefault
response_formatNo'concise' liefert nur die Felder, die einen Datensatz erkennbar machen und den nächsten Schritt erlauben. 'detailed' liefert den Datensatz so, wie die BuchhaltungsButler-API ihn ausgibt. Mit 'concise' beginnen und nur für die wenigen Datensätze auf 'detailed' wechseln, die wirklich geprüft werden müssen. Dieses Feld ist serverseitig und geht nicht an die API.concise

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
messageNo
successYes
endpointNo
limit_usedNo
offset_usedNo
more_possibleNo
rows_returnedNo
_contract_warningsNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description goes well beyond them: it discloses the absence of limit/offset and that all accounts are always returned, plus negative disclosure of fields the endpoint never provides (Kontoart, Kontostand, Währung). The warning that a Sachkontonummer actually designates a Zahlungskonto is high-value guidance that prevents a real mapping error.

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 paragraph that opens with what the tool lists before moving to return shape, downstream mapping, and limitations. Every sentence carries information, though the density (four distinct concerns in one block) makes it slightly harder to scan than a short structured list would be.

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?

With an output schema present, return values need no restatement, and annotations cover safety; the description fills the remaining gaps (pagination behavior, missing fields, cross-tool value mapping). For a one-parameter list tool, an agent has everything needed to call it correctly and interpret the result.

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% and the single response_format parameter is fully documented in the schema, so the baseline of 3 applies. The description never mentions response_format, adding no meaning beyond the schema, but nothing is left ambiguous either.

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 ('Listet die Zahlungskonten des Mandanten') and immediately enumerates the resource scope (Kassen, Bank- und Kreditkartenkonten). It is clearly distinguishable from the sibling bb_payment_accounts_create and from bb_postingaccounts_search, which it explicitly names as a different source.

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

Usage Guidelines5/5

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

Gives an explicit use case ('Gedacht zum Nachschlagen, bevor eine Zahlung oder ein Beleg einem Konto zugeordnet wird') and routes the agent to the correct alternative for a different need ('Kontoart ... steht als subtype in bb_postingaccounts_search'). It also names the downstream consumers of the returned value, so the agent knows exactly when and why to call this tool.

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

bb_postingaccounts_createSachkonto anlegenA

Legt ein neues Sachkonto im Kontenrahmen des Mandanten in BuchhaltungsButler an. Gedacht für ein eigenes Aufwandskonto, etwa 4931 für Softwarelizenzen. Das neue Konto erbt seine Eigenschaften, darunter die Steuerbehandlung, vom Vorlagekonto parent_postingaccount_number; dieses vorher mit bb_postingaccounts_search heraussuchen. Kundenkonten legt bb_debtors_create an, Lieferantenkonten bb_creditors_create, Zahlungskonten bb_payment_accounts_create. Schreibt in die echten Buchhaltungsdaten von BuchhaltungsButler. Die API bietet keinen Endpunkt, das rückgängig zu machen.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesBezeichnung des neuen Sachkontos, zum Beispiel Softwarelizenzen Cloud.
postingaccount_numberYesNummer des neuen Sachkontos als ganze Zahl, zum Beispiel 4931. Sie muss frei sein und in den Kontenrahmen des Mandanten passen; belegte Nummern zeigt bb_postingaccounts_search.
parent_postingaccount_numberYesNummer des Vorlagekontos als ganze Zahl, zum Beispiel 4930. Das neue Konto erbt dessen Eigenschaften, etwa die Steuerbehandlung. Nachschlagen mit bb_postingaccounts_search.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
createdNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly=false, idempotent=false, openWorld=true, destructive=false. The description meaningfully adds that it writes to real accounting data and that the API exposes no endpoint to undo the creation — a genuine irreversibility warning that isn't in 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?

What the tool does is front-loaded, followed by use case, inheritance/lookup requirement, alternatives, and side effects in an efficient sequence. Every sentence carries distinct information with no padding.

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?

With an output schema present, return values need no explanation. Prerequisites, exclusions, sibling routing and irreversibility are all covered, leaving nothing an agent needs to call this 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 description coverage is 100%, so all three parameters are already documented with examples. The description restates the inheritance-from-parent semantic but adds no syntax or format detail beyond the schema, so the 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 (legt ein neues Sachkonto im Kontenrahmen des Mandanten an) and explicitly distinguishes this from customer, supplier and payment accounts by naming the sibling tools that handle those cases. An agent can select it without opening any schema.

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

Usage Guidelines5/5

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

Gives an explicit use case (eigenes Aufwandskonto, e.g. 4931 für Softwarelizenzen), names the alternative tools with their conditions (bb_debtors_create, bb_creditors_create, bb_payment_accounts_create), and states the prerequisite of looking up the parent account with bb_postingaccounts_search first.

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

bb_postingaccounts_updateSachkonto überschreibenA
DestructiveIdempotent

Überschreibt die Bezeichnung eines Sachkontos in BuchhaltungsButler. Gedacht für eine berichtigte Kontobezeichnung. Mehr als den Namen ändert dieser Endpunkt nicht: Nummer, Vorlagekonto und Steuerbehandlung bleiben, wie sie sind. Bestehende Buchungen verweisen weiter auf dieses Konto und erscheinen danach unter dem neuen Namen; die Buchungen selbst bleiben unverändert. Den alten Namen vorher mit bb_postingaccounts_search lesen. Überschreibt Stammdaten im echten Mandanten von BuchhaltungsButler. Die API liefert die vorherigen Werte nicht zurück; ohne vorher gelesenen Datensatz ist die Änderung nicht rückgängig zu machen.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesNeue Bezeichnung des Sachkontos, zum Beispiel Softwarelizenzen Cloud 19% USt.
postingaccount_numberYesNummer des zu ändernden Sachkontos als ganze Zahl, zum Beispiel 4931. Sie ist der Identifikator und lässt sich nicht ändern. Nachschlagen mit bb_postingaccounts_search.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
changedNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.7/5.0
Behavior5/5

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

Annotations declare destructiveHint=true and idempotentHint=true, but the description adds crucial context beyond them: existing bookings continue to reference the account and remain unchanged, the API does not return prior values, and the change is irreversible without a prior read. This goes well past the annotation set.

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 front-loaded with the core action, then flows through scope, prerequisite, and irreversibility warning. Every sentence carries distinct information, and the ordering is efficient for an agent scanning for pre-flight steps.

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?

Despite a live-tenant mutation with no rollback and an output schema that only returns the new state, the description covers the missing pieces: read-first requirement, referential behavior of existing postings, and irreversibility. Nothing an agent needs to call this safely 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?

Schema description coverage is 100%, so both parameters are already documented with examples ("Softwarelizenzen Cloud 19% USt", "4931"). The description reinforces the immutability of postingaccount_number, but adds no syntax or format detail the schema lacks, so the 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?

The description states a precise verb+resource in German ("Überschreibt die Bezeichnung eines Sachkontos") and immediately scopes exactly what changes versus what stays fixed (Nummer, Vorlagekonto, Steuerbehandlung). This lets an agent distinguish it from bb_postingaccounts_create and bb_postingaccounts_search without opening any schema.

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

Usage Guidelines5/5

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

It explicitly names the prerequisite workflow ("Den alten Namen vorher mit bb_postingaccounts_search lesen") and states the tool is intended for a corrected account label, effectively excluding general editing. The condition that selects the read sibling is spelled out.

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

bb_postings_assign_receiptBeleg an freie Buchung bindenA

Bindet in BuchhaltungsButler einen vorhandenen Beleg an eine vorhandene freie Buchung. Zu nehmen, wenn eine freie Buchung nachträglich ihren Beleg bekommen soll, etwa weil bb_postings_create_free ohne Belegbezug gebucht hat; die Zuordnung eines Belegs zu einer Zahlung leistet stattdessen bb_transactions_assign_receipt. Ändert den Buchungssatz nicht, sondern nur die Verknüpfung, und legt keine Buchung an. posting_id_by_customer muss auf eine freie Buchung zeigen, sonst lehnt die API mit error_code 10 ab. Schreibt in die echten Buchhaltungsdaten von BuchhaltungsButler. Die API bietet keinen Endpunkt, das rückgängig zu machen.

ParametersJSON Schema
NameRequiredDescriptionDefault
posting_id_by_customerYesDie mandantenbezogene Nummer der freien Buchung, an die der Beleg gebunden wird, zu finden über bb_postings_search. Der Wert muss auf eine freie Buchung zeigen: Sie erkennt man daran, dass receipt_id_by_customer und transaction_id_by_customer beide null sind, oder am Filter account_filter mit dem Wert 'free booking'. In Suchergebnissen erscheint sie als String; hier ohne Anführungszeichen übergeben.
receipt_id_by_customerYesDie mandantenbezogene Nummer des Belegs, der gebunden wird, zu finden über bb_receipts_search. In Suchergebnissen erscheint sie als String; hier ohne Anführungszeichen übergeben.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
changedNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond annotations to disclose key traits: it changes only the linkage and not the posting record, creates no posting, requires posting_id_by_customer to point to a free posting or the API rejects with error_code 10, writes to real accounting data, and cannot be undone as no API endpoint exists. Annotations (readOnlyHint=false, idempotentHint=false) are consistent and amplified.

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?

Front-loads the core action, then scenarios, sibling routing, hard constraint, data impact, and irreversibility. All sentences carry information, but it is dense and could be slightly tightened; still appropriately sized for a destructive, irreversible mutation.

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?

With an output schema present, return values need not be explained. The description covers the mutation's side effects, precondition (free posting), failure signal (error_code 10), data scope, and irreversibility — everything an agent needs to call it correctly.

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 meaning: posting_id_by_customer must reference a free posting and rejection yields error_code 10. The schema already documents how to find free postings and the string-vs-int note, so the description complements rather than duplicates.

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 ('Bindet') and resources ('vorhandenen Beleg an eine vorhandene freie Buchung'), and explicitly distinguishes itself from bb_transactions_assign_receipt by naming that sibling and the condition (Zahlung) under which it applies. An agent can tell this apart from the transaction-assignment sibling without opening schemas.

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

Usage Guidelines5/5

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

Gives explicit when-to-use ('wenn eine freie Buchung nachträglich ihren Beleg bekommen soll'), a concrete trigger scenario ('etwa weil bb_postings_create_free ohne Belegbezug gebucht hat'), and names the alternative tool for the other case ('die Zuordnung eines Belegs zu einer Zahlung leistet stattdessen bb_transactions_assign_receipt').

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

bb_postings_cancelBuchung stornierenA
Destructive

Storniert in BuchhaltungsButler eine einzelne Buchungszeile. Zu nehmen, wenn eine festgeschriebene Buchung zu korrigieren ist; eine nicht festgeschriebene entfernen bb_postings_unconfirm_for_receipt, bb_postings_unconfirm_for_transaction und bb_postings_unconfirm_free rückstandslos. War die Buchung festgeschrieben, entsteht eine dauerhaft sichtbare Stornobuchung, sonst verschwindet sie; die Antwort unterscheidet beides nicht, deshalb vorher fixed mit bb_postings_search lesen. Storniert genau eine Zeile: eine Splitbuchung mit fünf Zeilen braucht fünf Aufrufe, und ein Zwischenstand ist ein unausgeglichener Buchungsstand. Entfernt Daten aus dem echten Mandanten von BuchhaltungsButler: die genannte Buchungszeile. Die betroffenen Datensätze vorher lesen und dem Nutzer vorlegen.

ParametersJSON Schema
NameRequiredDescriptionDefault
posting_id_by_customerYesDie mandantenbezogene Nummer der zu stornierenden Buchungszeile, zu finden über bb_postings_search. Das Feld fixed derselben Zeile sagt vorher, welche der beiden Wirkungen eintritt: Storno bei '1', ersatzloses Entfernen bei '0'. In Suchergebnissen erscheint sie als String; hier ohne Anführungszeichen übergeben.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
messageNo
removedNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations declare destructiveHint=true and non-idempotent, and the description adds meaningfully beyond that: a fixed posting produces an irreversible, permanently visible Stornobuchung whereas a non-fixed one disappears, and the API response does not distinguish the two. It also discloses the split-posting constraint (five lines = five calls, intermediate state is unbalanced) and that data is removed from the real tenant.

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?

Dense but front-loaded: purpose first, then condition, then effects, then constraints. Minor redundancy in restating the removal target ('die genannte Buchungszeile') after the purpose sentence, but no filler.

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?

An output schema exists so return values need not be explained, and the description nonetheless flags the one thing the output hides (that it does not tell the caller which of the two effects occurred). With the pre-read requirement, single-line scope, and split warning, an agent has everything needed to call this safely.

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 single parameter is already fully documented, including the fixed=1 vs 0 consequence and the string-vs-integer search-result caveat. The description repeats rather than extends this, so the baseline 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 ('Storniert ... eine einzelne Buchungszeile') and immediately scopes it to exactly one line, distinguishing it from the unconfirm siblings by name. An agent can tell what this does and what it does not do without opening the schema.

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

Usage Guidelines5/5

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

Gives an explicit when-to-use rule ('wenn eine festgeschriebene Buchung zu korrigieren ist') and routes the non-fixed case to three named alternatives. It even warns that a fixed line leaves a permanent reversal entry while a non-fixed one vanishes, so the agent knows to pre-read 'fixed' via bb_postings_search before choosing.

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

bb_postings_create_for_receiptBuchungen zu Beleg anlegenA

Legt die Buchungssätze zu einem bereits vorhandenen Beleg in BuchhaltungsButler an. Zu nehmen, wenn die id_by_customer eines Belegs vorliegt und dieser gebucht werden soll; bb_postings_create_for_transaction, wenn stattdessen eine Zahlung der Ausgangspunkt ist, und bb_postings_create_free, wenn weder Beleg noch Zahlung vorliegt. Buchungsdatum und Buchungsrichtung kommen vom Beleg und sind keine Argumente. Setzt voraus, dass im Mandanten die Kreditoren- oder Debitorenbuchung eingeschaltet ist. Die Antwort nennt die erzeugten Buchungen nicht; nachsehen mit bb_postings_search. Schreibt in die echten Buchhaltungsdaten von BuchhaltungsButler. Eine festgeschriebene Buchung lässt sich nicht löschen, sondern nur mit bb_postings_cancel stornieren; der Storno bleibt dauerhaft sichtbar.

ParametersJSON Schema
NameRequiredDescriptionDefault
debtorYesDebitorenkonto als Gegenkonto, zum Beispiel 10001. Gilt für Ausgangsrechnungen und setzt die eingeschaltete Debitorenbuchung voraus. Die Spezifikation führt das Feld als Pflicht, seine eigene Beschreibung nennt es nur bei passender Belegrichtung nötig; dieser Widerspruch ist nicht aufgelöst. Passt das Konto nicht zur Belegrichtung, antwortet die API mit error_code 8. Debitoren nachschlagen mit bb_debtors_search.
creditorYesKreditorenkonto als Gegenkonto, zum Beispiel 70001. Gilt für Eingangsrechnungen und setzt die eingeschaltete Kreditorenbuchung voraus. Die Spezifikation führt das Feld als Pflicht, seine eigene Beschreibung nennt es nur bei passender Belegrichtung nötig; dieser Widerspruch ist nicht aufgelöst. Passt das Konto nicht zur Belegrichtung, antwortet die API mit error_code 8. Kreditoren nachschlagen mit bb_creditors_search.
positionsYesDie Buchungssätze zu diesem Beleg, je Eintrag eine Zeile. Mehrere Einträge ergeben eine Splitbuchung; die Summe der Zeilenbeträge muss dem Belegbetrag entsprechen, sonst lehnt BuchhaltungsButler den Aufruf ab. Die BuchhaltungsButler-API nimmt diese Werte als parallele Arrays entgegen (postingaccounts, postingtexts, vats, cost_locations, cost_locations_two, amounts); dieses Werkzeug nimmt eine Positionsliste und rechnet sie um, wodurch die Arrays zwingend gleich lang sind.
receipt_id_by_customerYesDie mandantenbezogene Nummer des Belegs, zu finden über bb_receipts_search. Keine globale Kennung. In Suchergebnissen erscheint sie als String; hier ohne Anführungszeichen übergeben.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
createdNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.9/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses the tenant-level precondition (creditor/debtor posting must be enabled), that booking date and direction are derived from the receipt rather than supplied, that the response does NOT list created postings (must follow up with bb_postings_search), that it writes to real accounting data, and that a locked posting can only be cancelled via bb_postings_cancel with a permanently visible reversal. This is exactly the context annotations cannot carry.

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?

Dense but front-loaded: purpose first, then routing rules, then preconditions, then side effects and follow-up. Every sentence carries operative information and none is redundant.

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 an output schema exists, return values need no explanation, and the description still covers the mutation's preconditions, irreversibility path, and the retrieval tool for verification. An agent has everything needed to call it correctly.

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 already 100%, so the baseline is 3, but the description adds real value by clarifying that booking date and booking direction are derived from the receipt and are deliberately not arguments, which narrows what the agent must reason about. Parameter-level detail otherwise stays in the schema.

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 ('Legt die Buchungssätze zu einem bereits vorhandenen Beleg an') and immediately distinguishes itself from the two closest siblings, bb_postings_create_for_transaction and bb_postings_create_free. An agent can identify the tool without opening the schema.

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

Usage Guidelines5/5

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

Explicitly names the trigger condition ('Zu nehmen, wenn die id_by_customer eines Belegs vorliegt und dieser gebucht werden soll') and pairs each alternative with the condition that selects it (payment as starting point vs. neither receipt nor payment). Nothing is left to inference.

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

bb_postings_create_for_receipt_batchBuchungen zu Belegen anlegenA

Legt die Buchungssätze zu mehreren vorhandenen Belegen in BuchhaltungsButler in einem Aufruf an. Zu nehmen, wenn viele Belege zu buchen sind, etwa ein Monat Eingangsrechnungen; für einen einzelnen Beleg bb_postings_create_for_receipt. Der Stapel ist nicht transaktional: success auf oberster Ebene sagt nichts über die einzelnen Einträge, das Array errors der Antwort nennt die gescheiterten. Die Antwort nennt die erzeugten Buchungen nicht; nachsehen mit bb_postings_search. Schreibt in die echten Buchhaltungsdaten von BuchhaltungsButler. Eine festgeschriebene Buchung lässt sich nicht löschen, sondern nur mit bb_postings_cancel stornieren; der Storno bleibt dauerhaft sichtbar.

ParametersJSON Schema
NameRequiredDescriptionDefault
receiptsYesDie Belege mit ihren Buchungssätzen, je Eintrag ein Beleg. Der Body-Parameter der API heißt ebenfalls receipts und ist bereits eine Objektliste; umgeformt wird nur die Positionsliste innerhalb eines Eintrags. Höchstens 50 Einträge je Aufruf. Ein abgelehnter Stapel wird nicht teilweise verarbeitet.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
createdNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the annotations: discloses that the batch is non-transactional, that top-level success says nothing about individual entries, that failures appear in the response's errors array, and that the response does not list the created postings. It also warns that data is written to real accounting records and that finalized postings can only be cancelled, not deleted.

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?

Front-loads purpose, then when-to-use and the alternative, then behavioral caveats. Every sentence carries distinct information (batch semantics, follow-up lookup, irreversibility), with no filler.

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 an output schema exists, return values need no restating, yet the description still flags the crucial non-transactional response shape. Combined with the annotations and schema, an agent has everything needed to call this complex batch write correctly and interpret the result.

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%, so the nested receipt/position fields are already fully documented. The description adds no syntax or format detail for the receipts parameter itself (e.g., the 50-entry cap lives in the schema), so the baseline 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 (anlegen), resource (Buchungssätze), and scope (mehrere vorhandene Belege, in einem Aufruf). It explicitly names the singular sibling bb_postings_create_for_receipt, so the agent can distinguish the two without opening either schema.

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

Usage Guidelines5/5

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

Explicitly says when to use it (viele Belege, etwa ein Monat Eingangsrechnungen) and routes the single-receipt case to bb_postings_create_for_receipt. It also points to bb_postings_search for verification and bb_postings_cancel for reversal, covering the surrounding workflow.

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

bb_postings_create_for_transactionBuchungen zu Zahlung anlegenA

Legt die Buchungssätze zu einer bereits vorhandenen Zahlung in BuchhaltungsButler an. Zu nehmen, wenn die id_by_customer einer Zahlung vorliegt und diese gebucht werden soll; bb_postings_create_for_receipt, wenn stattdessen ein Beleg der Ausgangspunkt ist, und bb_postings_create_free, wenn weder Beleg noch Zahlung vorliegt. Je Position lässt sich ein offener Posten ausgleichen. Buchungsdatum, Gegenkonto und Buchungsrichtung kommen von der Zahlung und sind keine Argumente. Die Antwort nennt die erzeugten Buchungen nicht; nachsehen mit bb_postings_search. Schreibt in die echten Buchhaltungsdaten von BuchhaltungsButler. Eine festgeschriebene Buchung lässt sich nicht löschen, sondern nur mit bb_postings_cancel stornieren; der Storno bleibt dauerhaft sichtbar.

ParametersJSON Schema
NameRequiredDescriptionDefault
positionsYesDie Buchungssätze zu dieser Zahlung, je Eintrag eine Zeile. Mehrere Einträge ergeben eine Splitbuchung; die Summe der Zeilenbeträge muss dem Zahlungsbetrag entsprechen, sonst lehnt BuchhaltungsButler den Aufruf ab. Die BuchhaltungsButler-API nimmt diese Werte als parallele Arrays entgegen (postingaccounts, postingtexts, vats, cost_locations, cost_locations_two, amounts, oi_receipts_ids_by_customer); dieses Werkzeug nimmt eine Positionsliste und rechnet sie um, wodurch die Arrays zwingend gleich lang sind.
transaction_id_by_customerYesDie mandantenbezogene Nummer der Zahlung, zu finden über bb_transactions_search. Keine globale Kennung. In Suchergebnissen erscheint sie als String; hier ohne Anführungszeichen übergeben.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
createdNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the annotations (readOnlyHint=false, destructiveHint=false, non-idempotent): it warns that it writes into real accounting data, that a locked posting cannot be deleted but only reversed via bb_postings_cancel with the storno permanently visible, and that the response does not enumerate the created postings. It also states that date, counter account and direction are derived from the payment rather than passed as arguments.

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?

Dense but justified: the routing sentence, the offset note, the 'what is not an argument' clarification and the destructive-behavior warning all earn their place. Slightly long, with the safety warning trailing rather than front-loaded, but no filler.

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?

Covers routing, argument derivation, sum-must-match implications, follow-up lookup via bb_postings_search, and irreversibility. An output schema exists, so return-value explanation is not required, and the note that created postings are not returned is a useful bonus.

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 description coverage is already 100% and includes an unusually thorough positions array doc, so the baseline is 3. The description still adds meaning by noting that open items can be offset per position and that booking date, counter account and direction are implicit in the transaction rather than arguments.

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 ('Legt die Buchungssätze zu einer bereits vorhandenen Zahlung ... an') and immediately distinguishes itself from the two closest siblings (bb_postings_create_for_receipt, bb_postings_create_free). An agent can pick the right posting-creation tool without opening any schema.

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

Usage Guidelines5/5

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

Explicit routing rules: use this when the id_by_customer of a payment exists and it should be posted; use bb_postings_create_for_receipt when a receipt is the starting point; use bb_postings_create_free when neither exists. Both the when and the alternatives are named with their selecting conditions.

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

bb_postings_create_for_transaction_batchBuchungen zu Zahlungen anlegenA

Legt die Buchungssätze zu mehreren vorhandenen Zahlungen in BuchhaltungsButler in einem Aufruf an. Zu nehmen, wenn ein ganzer Kontoauszug zu buchen ist; für eine einzelne Zahlung bb_postings_create_for_transaction. Der Stapel ist nicht transaktional: success auf oberster Ebene sagt nichts über die einzelnen Einträge, das Array errors der Antwort nennt die gescheiterten. Die Antwort nennt die erzeugten Buchungen nicht; nachsehen mit bb_postings_search. Schreibt in die echten Buchhaltungsdaten von BuchhaltungsButler. Eine festgeschriebene Buchung lässt sich nicht löschen, sondern nur mit bb_postings_cancel stornieren; der Storno bleibt dauerhaft sichtbar.

ParametersJSON Schema
NameRequiredDescriptionDefault
transactionsYesDie Zahlungen mit ihren Buchungssätzen, je Eintrag eine Zahlung. Der Body-Parameter der API heißt ebenfalls transactions und ist bereits eine Objektliste; umgeformt wird nur die Positionsliste innerhalb eines Eintrags. Höchstens 50 Einträge je Aufruf. Ein abgelehnter Stapel wird nicht teilweise verarbeitet.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
createdNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.7/5.0
Behavior5/5

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

Annotations are limited to readOnlyHint=false / destructiveHint=false / idempotentHint=false / openWorldHint=true, and the description adds substantial non-redundant behavior: the batch is NOT transactional, top-level success does not imply per-entry success, failures appear in an errors array, the created postings are not returned, writes hit real client data, and confirmed postings cannot be deleted but only cancelled with a permanently visible storno.

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?

Five sentences, each carrying distinct information (scope, alternative, non-transactionality, verification path, write semantics, storno permanence), with the batch-vs-single distinction front-loaded. No filler or restatement of the name.

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?

An output schema and full annotation set exist, yet the description still supplies the things annotations cannot express: partial-failure semantics, where failures surface, and irreversible-confirmation behavior. Nothing an agent needs to call this mutation safely 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?

Schema description coverage is 100% and the schema itself is unusually thorough (VAT enum semantics, amount pattern, account/receipt lookup pointers). The description adds no parameter-level detail, but the baseline of 3 applies when the schema already carries the load; there is no gap for the description to compensate for.

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 (anlegen von Buchungssätzen zu mehreren vorhandenen Zahlungen) and explicitly names the single-payment sibling bb_postings_create_for_transaction that it is not. An agent can distinguish it from the batch of free postings and the single-transaction variant without opening any schema.

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

Usage Guidelines5/5

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

Gives an explicit selection rule: use this when an entire bank statement is to be posted, otherwise use bb_postings_create_for_transaction for one payment. It also routes follow-up actions (bb_postings_search to verify, bb_postings_cancel to reverse), covering when-to-use and what to do next.

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

bb_postings_create_freeFreie Buchung anlegenA

Legt in BuchhaltungsButler eine freie Buchung an, also einen vollständigen Buchungssatz ohne Beleg- und Zahlungsbezug, etwa eine Umbuchung zwischen zwei Sachkonten. Zu nehmen, wenn weder ein Beleg noch eine Zahlung vorliegt; liegt ein Beleg vor, ist bb_postings_create_for_receipt richtig, liegt eine Zahlung vor, bb_postings_create_for_transaction. Der Aufruf erzeugt genau eine Buchungszeile; eine Splitbuchung über mehrere Zeilen nehmen die beiden genannten Werkzeuge über ihre Positionsliste entgegen. Soll- und Habenkonto werden hier ausdrücklich angegeben. Die Antwort nennt die erzeugte id_by_customer nicht. Schreibt in die echten Buchhaltungsdaten von BuchhaltungsButler. Eine festgeschriebene Buchung lässt sich nicht löschen, sondern nur mit bb_postings_cancel stornieren; der Storno bleibt dauerhaft sichtbar.

ParametersJSON Schema
NameRequiredDescriptionDefault
vatYesSteuerschlüssel der Buchungszeile. '_pre' steht für Vorsteuer (Eingangsumsätze), '_vat' für Umsatzsteuer (Ausgangsumsätze), '_both' für Fälle mit beidem, etwa Reverse Charge nach §13b. Welcher Schlüssel zulässig ist, hängt vom Konto, vom Buchungsdatum und von den Mandanteneinstellungen ab. Die deutschen Bezeichnungen aller 23 Schlüssel stehen in der Resource bb://vat-keys.
dateYesBuchungsdatum der freien Buchung als YYYY-MM-DD, zum Beispiel 2026-04-26. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. Die Parameterbeschreibung der Spezifikation nennt hier kein Format; YYYY-MM-DD ist aus dem Beispiel der Stapeldefinition abgeleitet.
amountYesBetrag der Buchungszeile. Dezimalpunkt, kein Tausendertrennzeichen, zum Beispiel 123.99. Negative Beträge lehnt BuchhaltungsButler ab; eine Gegenbuchung entsteht durch Vertauschen von postingaccount_debit und postingaccount_credit.
postingtextYesBuchungstext der Zeile, höchstens 128 Zeichen.
cost_locationNoKostenstelle, mandantenbezogen, nachschlagen mit bb_cost_locations_search. Höchstens 10 Zeichen.
cost_location_twoNoKostenstelle der zweiten Ebene, mandantenbezogen, nachschlagen mit bb_cost_locations_search. Höchstens 10 Zeichen.
postingaccount_debitYesSollkonto der Buchung als Sachkontonummer, zum Beispiel 4980. Nachschlagen mit bb_postingaccounts_search. In der Leseantwort von bb_postings_search heißt dasselbe Konto debit_postingaccount_number.
postingaccount_creditYesHabenkonto der Buchung als Sachkontonummer, zum Beispiel 1600. Muss sich vom Sollkonto unterscheiden. Nachschlagen mit bb_postingaccounts_search. In der Leseantwort von bb_postings_search heißt dasselbe Konto credit_postingaccount_number.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
createdNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark this as a non-read-only, open-world, non-idempotent write, but the description adds substantial behavioral detail: exactly one posting line is created, debit and credit accounts must be explicitly provided, the response does not include id_by_customer, real accounting data is written, and a locked posting cannot be deleted but must be cancelled with bb_postings_cancel, with the cancellation remaining permanently visible.

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 front-loaded with the core action and then layers on usage routing, constraints, and cancellation behavior. Despite its length, every sentence carries decision-relevant information for a complex mutation tool.

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 mutation semantics, rich schema, and presence of an output schema, the description is complete. It covers when to use the tool, alternatives, line behavior, return-value limitation, data impact, and post-lock cancellation behavior.

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 nearly all parameter meaning is already supplied by the schema. The description only adds high-level context that debit and credit accounts are explicitly specified, which is useful but does not go beyond the schema's own parameter documentation.

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: creates a free posting, a complete journal entry without receipt or payment reference. It gives a concrete example (transfer between two general ledger accounts) and distinguishes the tool from bb_postings_create_for_receipt and bb_postings_create_for_transaction.

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

Usage Guidelines5/5

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

Explicitly says to use this tool when neither a receipt nor a payment exists, and names the correct alternatives when either does exist. It also clarifies that split postings must use the other two tools via their line-item lists.

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

bb_postings_create_free_batchFreie Buchungen anlegenA

Legt in BuchhaltungsButler mehrere freie Buchungen in einem Aufruf an, also vollständige Buchungssätze ohne Beleg- und Zahlungsbezug. Zu nehmen, wenn viele Umbuchungen auf einmal anfallen, etwa Abgrenzungen zum Jahreswechsel; für eine einzelne bb_postings_create_free. Jeder Eintrag erzeugt genau eine Buchungszeile, eine Klammer über mehrere Zeilen gibt es nicht. Der Stapel ist nicht transaktional: success auf oberster Ebene sagt nichts über die einzelnen Einträge, das Array errors der Antwort nennt die gescheiterten. Schreibt in die echten Buchhaltungsdaten von BuchhaltungsButler. Eine festgeschriebene Buchung lässt sich nicht löschen, sondern nur mit bb_postings_cancel stornieren; der Storno bleibt dauerhaft sichtbar.

ParametersJSON Schema
NameRequiredDescriptionDefault
free_postingsYesDie freien Buchungen, je Eintrag genau eine Buchungszeile. Der Body-Parameter der API heißt ebenfalls free_postings und ist bereits eine Objektliste; umgeformt wird nichts. Höchstens 50 Einträge je Aufruf. Ein abgelehnter Stapel wird nicht teilweise verarbeitet.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
createdNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the annotations (readOnly=false, destructive=false, idempotent=false, openWorld=true) the description discloses the non-transactional batch semantics ('success auf oberster Ebene sagt nichts über die einzelnen Einträge', failed entries named in the errors array), the one-line-per-entry rule, and the permanent-visibility consequence of a reversal. This is substantive behavioral context the annotations do not convey, and it does not contradict them.

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?

Purpose is front-loaded and most sentences carry distinct operational information (use case, alternative, transactional caveat, cancel path). It is somewhat dense and a couple of clauses restate schema-level facts, but nothing is idle filler.

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 batch mutation tool with an output schema present, the description covers what an agent needs to call it correctly: inputs are one-per-line, the batch is not atomic, and the failure signal lives in the response's errors array. Return-value detail is rightly left to the output 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 100%, so the schema already documents the single free_postings array and its item fields in depth. The description's parameter-adjacent claims (one line per entry, max 50 entries) largely restate what the schema already declares, so it adds only marginal meaning over the structured data — the baseline for high coverage.

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 states a specific verb and resource ('legt ... mehrere freie Buchungen in einem Aufruf an') and scopes them precisely as 'vollständige Buchungssätze ohne Beleg- und Zahlungsbezug'. It explicitly distinguishes itself from the single-item sibling bb_postings_create_free, so an agent can route without opening either schema.

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

Usage Guidelines5/5

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

It gives an explicit use condition ('wenn viele Umbuchungen auf einmal anfallen, etwa Abgrenzungen zum Jahreswechsel') and names the alternative for the single case (bb_postings_create_free). It also routes the reversal case to bb_postings_cancel, leaving little to inference.

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

bb_postings_unconfirm_for_receiptBuchungen eines Belegs entfernenA
Destructive

Hebt in BuchhaltungsButler die Bestätigung der Buchungen eines Belegs auf und entfernt sie damit. Zu nehmen, um eine falsche Belegbuchung zurückzunehmen, solange sie nicht festgeschrieben ist; hängen die Buchungen an einer verknüpften Zahlung, ist bb_postings_unconfirm_for_transaction zuständig, bei einer freien Buchung bb_postings_unconfirm_free. Entfernt immer alle Zeilen des Belegs, nie eine einzelne Zeile einer Splitbuchung, und lässt den Beleg selbst unverändert. Festgeschriebene Buchungen bleiben stehen; dort hilft nur bb_postings_cancel. Entfernt Daten aus dem echten Mandanten von BuchhaltungsButler: alle nicht festgeschriebenen Buchungszeilen des genannten Belegs. Die betroffenen Datensätze vorher lesen und dem Nutzer vorlegen.

ParametersJSON Schema
NameRequiredDescriptionDefault
receipt_id_by_customerYesDie mandantenbezogene Nummer des Belegs, dessen Buchungen entfernt werden, zu finden über bb_receipts_search. Adressiert wird der Beleg, nicht die einzelne Buchungszeile.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
messageNo
removedNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.8/5.0
Behavior5/5

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

The annotations (destructiveHint: true, readOnlyHint: false) already disclose the destructive nature, but the description adds crucial behavioral context: it removes data from the real client tenant, affects only non-finalized posting lines of the specified receipt, leaves the receipt itself unchanged, and requires reading the affected records first and presenting them to the user.

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?

The description is well-structured: it front-loads the core action, then adds usage routing, scope constraints, and safety warnings. It is appropriately sized for a destructive, risky operation. Every sentence carries meaning, though a bit long.

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 destructive nature, the presence of an output schema (so return values need not be explained), and the single fully described parameter, the description covers all needed context: scope, alternatives, implications, and a data-safety instruction. It is complete for an agent to call it correctly and safely.

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 schema already fully documents the single parameter, including that it addresses the receipt (not an individual posting line) and how to find it via bb_receipts_search. The description reinforces that it is the receipt that is addressed, but adds little beyond the schema's 100% coverage.

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 states a highly specific verb+resource in German: it un-confirms the postings of a receipt, thereby removing them. It distinguishes itself from bb_postings_unconfirm_for_transaction and bb_postings_unconfirm_free by naming those alternatives and the conditions under which they apply.

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

Usage Guidelines5/5

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

It gives explicit when-to-use guidance ('to reverse an incorrect receipt posting while it is not yet finalized') and routes the agent: for linked transactions use bb_postings_unconfirm_for_transaction, for free postings use bb_postings_unconfirm_free, and for finalized postings use bb_postings_cancel. It also states exclusions: always removes all lines, not a single split line.

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

bb_postings_unconfirm_for_transactionBuchungen einer Zahlung entfernenA
Destructive

Hebt in BuchhaltungsButler die Bestätigung der Buchungen einer Zahlung auf und entfernt sie damit. Zu nehmen, um eine falsche Zahlungsbuchung zurückzunehmen, solange sie nicht festgeschrieben ist; ist ein Beleg der Ausgangspunkt, ist bb_postings_unconfirm_for_receipt zuständig, bei einer freien Buchung bb_postings_unconfirm_free. Entfernt immer alle Zeilen der Zahlung, nie eine einzelne Zeile einer Splitbuchung, und lässt die Zahlung selbst unverändert. Festgeschriebene Buchungen bleiben stehen; dort hilft nur bb_postings_cancel. Entfernt Daten aus dem echten Mandanten von BuchhaltungsButler: alle nicht festgeschriebenen Buchungszeilen der genannten Zahlung. Die betroffenen Datensätze vorher lesen und dem Nutzer vorlegen.

ParametersJSON Schema
NameRequiredDescriptionDefault
transaction_id_by_customerYesDie mandantenbezogene Nummer der Zahlung, deren Buchungen entfernt werden, zu finden über bb_transactions_search. Adressiert wird die Zahlung, nicht die einzelne Buchungszeile. In Suchergebnissen erscheint sie als String; hier ohne Anführungszeichen übergeben.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
messageNo
removedNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true and idempotentHint=false, but the description adds substantive behavior: it always removes ALL lines of the transaction and never a single split line, leaves the transaction itself unchanged, and does nothing to locked (festgeschriebene) postings. It also warns that real-tenant data is deleted and instructs reading the records first for user confirmation.

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?

Front-loaded with the core action, then routing, then behavioral constraints and the safety warning. Slightly repetitive in restating that all non-locked posting lines are removed in both sentence two and five, but every sentence still contributes actionable information.

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?

With an output schema present, return values need no explanation. The description covers purpose, alternatives, destructive scope, locked-posting limits, and a read-before-write safety instruction, leaving no gap an agent needs to call it 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 description coverage is 100% and the single parameter already documents lookup via bb_transactions_search and the string-vs-integer nuance, so the schema carries the burden. The description only references 'der genannten Zahlung' without adding syntax or format detail, matching the baseline 3.

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+resource ('Hebt die Bestätigung der Buchungen einer Zahlung auf und entfernt sie damit') and names the exact siblings it is not (bb_postings_unconfirm_for_receipt, bb_postings_unconfirm_free). An agent can distinguish it from every other unconfirm/cancel tool without opening a schema.

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

Usage Guidelines5/5

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

Explicitly gives the use case ('um eine falsche Zahlungsbuchung zurückzunehmen, solange sie nicht festgeschrieben ist') and routes to alternatives by trigger condition: receipt-based → unconfirm_for_receipt, free posting → unconfirm_free, locked postings → bb_postings_cancel. When-to-use and when-not are both covered.

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

bb_postings_unconfirm_freeFreie Buchung entfernenA
Destructive

Hebt in BuchhaltungsButler die Bestätigung einer einzelnen freien Buchung auf und entfernt sie damit. Zu nehmen, um eine falsche freie Buchung zurückzunehmen, solange sie nicht festgeschrieben ist; für die Buchungen eines Belegs ist bb_postings_unconfirm_for_receipt zuständig, für die einer Zahlung bb_postings_unconfirm_for_transaction. Adressiert wird die Buchung selbst, deshalb posting_id_by_customer und nicht die Nummer eines Belegs. Zeigt der Wert auf eine Beleg- oder Zahlungsbuchung, lehnt die API mit error_code 7 ab; ist die Buchung festgeschrieben, hilft nur bb_postings_cancel. Entfernt Daten aus dem echten Mandanten von BuchhaltungsButler: die genannte freie Buchung. Die betroffenen Datensätze vorher lesen und dem Nutzer vorlegen.

ParametersJSON Schema
NameRequiredDescriptionDefault
posting_id_by_customerYesDie mandantenbezogene Nummer der freien Buchung, zu finden über bb_postings_search. Eine freie Buchung erkennt man daran, dass receipt_id_by_customer und transaction_id_by_customer beide null sind, oder am Filter account_filter mit dem Wert 'free booking'. In Suchergebnissen erscheint sie als String; hier ohne Anführungszeichen übergeben.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
messageNo
removedNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds real value: it says data is removed from the live BuchhaltungsButler tenant, that the API rejects receipt/transaction postings with error_code 7, and instructs the agent to read the affected records and present them to the user first. It does not cover permissions or how a repeated call behaves beyond the finalization note, so it falls just short of the top mark.

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?

Front-loaded with the action, then routing, then identifier semantics, then failure modes. Sentences are long and dense but each carries distinct information; a small amount of redundancy around the sibling names costs it the top score.

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?

An output schema exists, so return values need no explanation. Given a single-parameter destructive mutation, the description covers purpose, selection criteria, identifier semantics, error behavior, and the pre-read safety workflow — everything an agent needs to call it correctly.

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, but the description adds meaning the schema does not: it explains that the parameter addresses the posting itself rather than a receipt number, and that supplying a receipt or transaction posting id yields error_code 7. This disambiguates the identifier beyond the schema's own 'how to find it' text.

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 precise verb and resource: lifting the confirmation of a single free booking, which removes it. It explicitly separates itself from the sibling variants (bb_postings_unconfirm_for_receipt, bb_postings_unconfirm_for_transaction) and from bb_postings_cancel, so an agent can distinguish it without opening any schema.

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

Usage Guidelines5/5

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

Gives an explicit when-to-use condition (undo a wrong free booking that is not yet finalized), names the two alternative tools with the conditions that select them, and states the fallback (finalized booking -> bb_postings_cancel). Nothing about tool selection is left to inference.

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

bb_receipts_createBeleg anlegenA

Legt in BuchhaltungsButler einen Beleg ohne Datei an, zum Beispiel den Datensatz einer Eingangsrechnung aus einem Vorsystem; Belegart, Gegenpartei, Rechnungsnummer, Belegdatum, Betrag und Währung sind Pflicht. Gibt es eine Belegdatei, stattdessen bb_receipts_upload nehmen: Nachträglich lässt sich an einen Beleg keine Datei mehr hängen. Mehrere Belege auf einmal legt bb_receipts_create_batch an. Erzeugt weder eine Buchung noch eine Zahlung. Schreibt in die echten Buchhaltungsdaten von BuchhaltungsButler. Rückgängig nur mit bb_receipts_delete, das den Beleg lediglich als gelöscht markiert; die API kennt keinen Endpunkt, der einen Beleg endgültig entfernt.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesBelegdatum, also das Ausstellungsdatum, als YYYY-MM-DD, zum Beispiel 2026-04-26. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen.
amountYesBruttobetrag des Belegs. Dezimalpunkt, kein Tausendertrennzeichen, zum Beispiel 123.99. 0.00 ist kein gültiger Betrag. Ein negativer Betrag kennzeichnet eine Rückabwicklung, zum Beispiel -12.30.
currencyYesDie Spezifikation nennt an /receipts/add nur USD, GBP und CHF, an der Stapelvariante dagegen 48 Codes und zugleich EUR als einzigen Enum-Wert. Die drei Angaben widersprechen sich; dieses Werkzeug prüft den Wert deshalb nicht vorab. EUR ist der Regelfall. Lehnt BuchhaltungsButler eine Währung ab, nennt die Fehlermeldung den erlaubten Vorrat.
vat_rateNoUmsatzsteuersatz des Belegs in Prozent als Zahl, zum Beispiel 19 oder 0. Weglassen, wenn der Beleg keinen oder mehrere Steuersätze trägt. In der Antwort des Einzelabrufs heißt das Feld vat.
counterpartyYesGegenpartei des Belegs: bei einer Eingangsrechnung der Rechnungssteller, bei einer Ausgangsrechnung der Empfänger, zum Beispiel Bürobedarf Nordwest GmbH. Ein leerer Wert wird abgelehnt.
receipt_typeYesBelegart, kleingeschrieben und mit Leerzeichen. 'invoice inbound' ist eine Eingangsrechnung, 'invoice outbound' eine Ausgangsrechnung, 'credit inbound' eine Eingangsgutschrift nach § 14 UStG, 'credit outbound' eine Ausgangsgutschrift nach § 14 UStG. Der Parameter heißt in der API type; dieser Name ist dort siebenfach mit verschiedener Bedeutung belegt, deshalb der eindeutige Werkzeugname.
date_deliveryNoLeistungs- oder Lieferdatum als YYYY-MM-DD, zum Beispiel 2026-04-26. Wegen der DATEV-Kompatibilität nimmt BuchhaltungsButler kein Leistungsdatum nach dem Belegdatum an. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen.
invoice_numberYesRechnungsnummer des Belegs, zum Beispiel ER-2026-0001, höchstens 60 Zeichen. Die API ließe hier auch einen leeren Wert zu; dieser Server lehnt leere Zeichenketten grundsätzlich ab, weil sie an fast allen Feldern dieser API ein Validierungsfehler sind. In der Antwort der Suche heißt das Feld invoicenumber, ohne Unterstrich.
creditor_debtorNoNummer des Personenkontos, dem der Beleg zugeordnet wird: bei Eingangsbelegen ein Kreditor, bei Ausgangsbelegen ein Debitor, zum Beispiel 70001. Nachschlagen mit bb_postingaccounts_search, das Sachkonten, Zahlungskonten, Debitoren und Kreditoren gemeinsam führt und sie über die Spalte type unterscheidet. Nutzbar nur, wenn Debitoren und Kreditoren beim Mandanten aktiviert sind, und passend zur Belegart.
date_payment_dueNoFälligkeitsdatum als YYYY-MM-DD, zum Beispiel 2026-05-26. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. In der Antwort der Suche heißt das Feld due_date, im Einzelabruf date_payment_due.
payment_referenceNoTechnische Zahlungsreferenz, zum Beispiel eine Amazon-Bestellnummer oder eine Vorgangsnummer von PayPal oder Stripe. Kein Verwendungszweck als Freitext. Stimmt sie, findet BuchhaltungsButler die passende Zahlung von selbst.
payment_account_numberNoSachkontonummer, die ein Zahlungskonto bezeichnet, zum Beispiel '1200'. Nicht das Sachkonto, auf das gebucht wird. Zahlungskonten auflisten mit bb_payment_accounts_list. Gesetzt wird der Beleg damit unmittelbar diesem Zahlungskonto zugeordnet; das Konto muss beim Mandanten als Zahlungskonto bestehen. Der Parameter heißt in der API account.
link_to_receipt_id_by_customerNoDie mandantenbezogene Nummer eines anderen Belegs, zu finden über bb_receipts_search. Keine globale Kennung. In Suchergebnissen erscheint sie als String; hier ohne Anführungszeichen übergeben. Beide Belege werden gemeinsam einer Zahlung zugeordnet, sobald einer von ihnen von Hand zugeordnet wird.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
createdNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.6/5.0
Behavior5/5

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

Adds substantial context beyond the annotations: it creates neither a posting nor a payment, writes to real accounting data, and reverting is only via bb_receipts_delete which merely marks the receipt deleted (no permanent-removal endpoint). This clarifies reversibility and side effects the structured hints do not.

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?

Front-loaded with the core purpose, then alternatives, side effects, and reversibility. Dense but every sentence carries routing or behavioral information; slightly long but no obvious padding.

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?

An output schema exists, so return values needn't be described. For a 13-parameter mutation tool, the description covers purpose, siblings, required fields, side effects, and undo path — everything an agent needs to call it 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 description coverage is 100%, so each of the 13 parameters is already documented in the schema with rich semantics (formats, valid values, cross-field rules). The description only restates the six required fields, adding no meaning beyond the schema. 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?

States a specific verb+resource+scope: creates a receipt WITHOUT a file in BuchhaltungsButler. It explicitly contrasts with bb_receipts_upload (file present) and bb_receipts_create_batch (multiple receipts), so an agent can distinguish it from siblings without opening schemas.

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

Usage Guidelines5/5

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

Explicit when-to-use with named alternatives: if a file exists use bb_receipts_upload, for multiple use bb_receipts_create_batch, and notes the file cannot be attached later. Lists the six required fields, giving clear invocation preconditions.

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

bb_receipts_create_batchBelege stapelweise anlegenA

Legt in BuchhaltungsButler bis zu 50 Belege ohne Datei an, beim Import aus einem Vorsystem; höchstens ein Aufruf je fünf Sekunden. Einzeln legt bb_receipts_create an, Belege mit Datei bb_receipts_upload. Erzeugt keine Buchung; Teilerfolg ist der Normalfall. Schreibt in die echten Buchhaltungsdaten von BuchhaltungsButler. Rückgängig nur mit bb_receipts_delete, das den Beleg lediglich als gelöscht markiert; die API kennt keinen Endpunkt, der einen Beleg endgültig entfernt.

ParametersJSON Schema
NameRequiredDescriptionDefault
receiptsYesDie anzulegenden Belege, je Eintrag ein vollständiger Beleg mit denselben Feldern wie bei bb_receipts_create. Ein abgelehnter Einzelbeleg lässt die übrigen unberührt: Die Antwort trägt die angelegten Belege und die abgelehnten getrennt. Höchstens 50 Einträge je Aufruf. Ein abgelehnter Stapel wird nicht teilweise verarbeitet.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
createdNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations, the description discloses important behavioral traits: it writes to real accounting data, does not create a posting, partial success is normal, and undo is only a soft delete via bb_receipts_delete with no permanent-removal endpoint. These are non-obvious side effects and limitations that annotations alone do not convey.

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 front-loaded with the core action and batch limit, then efficiently layers in alternatives, side effects, and undo semantics. Every sentence earns its place, and there is no redundant or filler 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 tool's complexity and the rich input/output schemas, the description covers what an agent needs: scope, rate limit, alternatives, absence of posting creation, real-data impact, partial-success behavior, and reversal limits. Return values are handled by the output schema, so no further detail is required in the description.

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 nested schema already documents every field, format, enum, and constraint in detail. The description adds only the high-level fact that up to 50 file-less receipts are supplied and that each entry uses the same fields as bb_receipts_create; it does not add syntax or meaning beyond the schema. Baseline 3 is appropriate 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.

Purpose5/5

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

The description states a specific verb ('Legt ... an' = creates), the resource ('Belege' = receipts), the batch limit ('bis zu 50'), and the key scoping condition ('ohne Datei', 'beim Import aus einem Vorsystem'). It explicitly distinguishes this tool from bb_receipts_create for single receipts and bb_receipts_upload for receipts with a file, so an agent can identify it without opening sibling schemas.

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

Usage Guidelines5/5

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

It gives clear usage context ('beim Import aus einem Vorsystem'), names the direct alternatives (bb_receipts_create for single records, bb_receipts_upload for records with files), and states the rate limit ('höchstens ein Aufruf je fünf Sekunden'). The conditions selecting this tool over its siblings are explicit.

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

bb_receipts_deleteBeleg als gelöscht markierenA
Destructive

Markiert einen Beleg in BuchhaltungsButler als gelöscht, zum Beispiel einen versehentlich doppelt angelegten Beleg. Der Beleg bleibt erhalten und ist über bb_receipts_search mit deleted true weiter zu finden; für die laufende Buchhaltung zählt er nicht mehr. Entfernt keine Buchung und keine Zuordnung zu einer Zahlung: Hängt eine bestätigte Buchung am Beleg, lehnt die API den Aufruf ab. Die Zuordnung zwischen Beleg und Zahlung löst bb_transactions_unassign_receipt. Schreibt in die echten Buchhaltungsdaten von BuchhaltungsButler. Rückgängig zu machen mit bb_receipts_restore.

ParametersJSON Schema
NameRequiredDescriptionDefault
receipt_id_by_customerYesDie mandantenbezogene Nummer des Belegs, zu finden über bb_receipts_search. Keine globale Kennung. In Suchergebnissen erscheint sie als String; hier ohne Anführungszeichen übergeben.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
messageNo
removedNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.6/5.0
Behavior5/5

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

Despite annotations already flagging destructiveHint=true, the description adds substantial context: the receipt is retained and still discoverable via deleted=true search, the API rejects the call when a confirmed posting is attached, no postings/payment links are removed, it writes to real accounting data, and it is reversible via bb_receipts_restore.

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?

Information-dense and front-loaded with purpose and example, then constraints and alternatives. Every sentence earns its place, though the six-clause structure is slightly long for a single-parameter call.

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?

An output schema exists so return values need no explanation. Together with the annotations, the description covers reversibility, error conditions, side effects, and alternatives, leaving nothing an agent needs before calling 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?

Only one parameter with 100% schema description coverage, so the schema already documents the tenant-scoped ID, its source tool, and the string/number quirk. The description adds no parameter-level detail beyond the schema, so baseline 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 ('als gelöscht markiert') and resource ('Beleg'), plus a concrete example (versehentlich doppelt angelegt). It clearly distinguishes this soft-delete from bb_receipts_restore, bb_receipts_search, and bb_transactions_unassign_receipt.

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

Usage Guidelines5/5

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

Explicitly names when to use it (duplicate receipt), states what it does NOT do (entfernt keine Buchung/Zuordnung) and why (API lehnt ab, wenn bestätigte Buchung hängt), and routes the agent to the two alternative tools for adjacent operations.

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

bb_receipts_getBeleg holenA
Read-onlyIdempotent

Holt genau einen Beleg aus BuchhaltungsButler über seine mandantenbezogene Belegnummer und liefert mehr Felder als die Suche: Buchungs- und Originalwährung, Umrechnungskurs, Steuersatz, Zahlungsreferenz und auf Wunsch die Belegdatei. Beispiel: den Beleg prüfen, den bb_receipts_search mit id_by_customer 4711 geliefert hat. Zum Suchen nach Zeitraum oder Gegenpartei bb_receipts_search, für die zugeordneten Zahlungen bb_receipts_list_transactions. Liefert keine Buchungssätze und keine Liste: Ein Aufruf holt einen Beleg, und die Feldnamen weichen von denen der Suche ab. amount_paid und amount_paid_fixed sind auch hier gemessen stets '0.00'; den Zahlungsstand trägt allein payment_date.

ParametersJSON Schema
NameRequiredDescriptionDefault
get_fileNoWenn true, legt die API die Belegdatei als base64-Zeichenkette in die Antwort, dazu den Dateityp. Der Inhalt erscheint nie im Textteil der Antwort, sondern nur im strukturierten Teil. Große Dateien kosten viel Kontext, deshalb nur setzen, wenn die Datei wirklich gebraucht wird. Dass dieser Zweig funktioniert, ist nicht verifiziert.
response_formatNo'concise' liefert nur die Felder, die einen Datensatz erkennbar machen und den nächsten Schritt erlauben. 'detailed' liefert den Datensatz so, wie die BuchhaltungsButler-API ihn ausgibt. Mit 'concise' beginnen und nur für die wenigen Datensätze auf 'detailed' wechseln, die wirklich geprüft werden müssen. Dieses Feld ist serverseitig und geht nicht an die API.concise
receipt_id_by_customerYesDie mandantenbezogene Nummer des Belegs, zu finden über bb_receipts_search. Keine globale Kennung. In Suchergebnissen erscheint sie als String; hier ohne Anführungszeichen übergeben.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
messageNo
successYes
endpointNo
_contract_warningsNo

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantive behavior the annotations cannot: field names differ from the search output, amount_paid and amount_paid_fixed are always '0.00' so payment status must be read from payment_date, and get_file dumps base64 into the structured part with high context cost and an unverified code path. These are exactly the traps an agent would hit.

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?

Purpose and sibling routing are front-loaded, and every clause carries information. It is on the dense side, with several trailing caveats (no postings, no list, differing field names, 0.00 amounts), which is justified but costs some tightness.

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?

An output schema exists, so return values need not be explained; the description instead supplies the workflow context it must supply — how to get the ID, which sibling to use for the other two read patterns, and the known gotchas in the returned data. Nothing needed to call it correctly 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 baseline is 3, but the description goes beyond the schema by explaining how to obtain receipt_id_by_customer (via bb_receipts_search, e.g. id_by_customer 4711) and by framing get_file as an on-demand file fetch with a context cost. Remaining parameter detail is redundantly covered in the schema, so it does not reach 5.

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 precise verb+resource in the very first clause ('Holt genau einen Beleg ... über seine mandantenbezogene Belegnummer') and immediately scopes it against siblings by naming what it is not (kein Liste-Tool). It even names the search tool that produces the needed ID, so the intended role 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 Guidelines5/5

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

Explicit routing: 'Zum Suchen nach Zeitraum oder Gegenpartei bb_receipts_search, für die zugeordneten Zahlungen bb_receipts_list_transactions.' A concrete worked example (the receipt returned by search with id_by_customer 4711) anchors the when-to-use case rather than leaving it to inference.

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

bb_receipts_list_transactionsZahlungen eines BelegsA
Read-onlyIdempotent

Listet die Zahlungen, die in BuchhaltungsButler einem bestimmten Beleg zugeordnet sind, etwa um zu prüfen, ob eine Eingangsrechnung schon bezahlt wurde. Die umgekehrte Richtung liefert bb_transactions_list_receipts, den Beleg selbst bb_receipts_get. Liefert keine Belegfelder und keinen Zuordnungsstand: Ob eine Zuordnung bestätigt ist, zeigt erst der Vergleich zweier Aufrufe mit confirmed_only true und false.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmed_onlyNoWenn true, liefert die API nur bestätigte Zuordnungen zwischen Beleg und Zahlung, also solche, hinter denen eine bestätigte Buchung steht. Ohne Angabe kommen alle Zuordnungen.
response_formatNo'concise' liefert nur die Felder, die einen Datensatz erkennbar machen und den nächsten Schritt erlauben. 'detailed' liefert den Datensatz so, wie die BuchhaltungsButler-API ihn ausgibt. Mit 'concise' beginnen und nur für die wenigen Datensätze auf 'detailed' wechseln, die wirklich geprüft werden müssen. Dieses Feld ist serverseitig und geht nicht an die API.concise
receipt_id_by_customerYesDie mandantenbezogene Nummer des Belegs, zu finden über bb_receipts_search. Keine globale Kennung. In Suchergebnissen erscheint sie als String; hier ohne Anführungszeichen übergeben. Die Antwort trägt dagegen die Nummern der Zahlungen.

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
messageNo
successYes
endpointNo
limit_usedNo
offset_usedNo
more_possibleNo
rows_returnedNo
_contract_warningsNo

TDQS

A4.4/5.0
Behavior4/5

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

Die Annotations deklarieren bereits readOnlyHint=true, idempotentHint=true und destructiveHint=false, sodass die Sicherheitsprofile bekannt sind. Die Beschreibung ergänzt wertvollen Kontext: sie liefert keine Belegfelder und keinen Zuordnungsstand, und erklärt, wie man den Bestätigungsstatus durch Vergleich zweier Aufrufe mit confirmed_only true/false ermittelt. Das ist über die Annotations hinaus nützlich; lediglich Pagination- oder Rate-Limit-Informationen fehlen.

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?

Drei Sätze, jeder mit klarem Zweck: Zweck, Abgrenzung zu Alternativen und wichtige Verhaltenslücke. Front-loading ist optimal, keine Wiederholungen.

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?

Da ein Output-Schema existiert, muss die Beschreibung keine Rückgabewerte erklären. Sie deckt Zweck, Abgrenzung und einen wichtigen Verhaltensaspekt (fehlender Zuordnungsstand) ab. Die fehlende Erwähnung von Pagination oder Antwortformat ist angesichts des Output-Schemas und der 100% Schemaabdeckung akzeptabel, aber ein kleiner Gap bleibt.

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?

Die Schema-Beschreibungsabdeckung ist 100%, sodass das Schema alle drei Parameter inklusive confirmed_only und receipt_id_by_customer bereits ausführlich dokumentiert. Die Beschreibung fügt keine zusätzlichen Parameterdetails hinzu, die über das Schema hinausgehen. Baseline 3 ist korrekt, wenn das Schema die Hauptlast trägt.

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?

Die Beschreibung nennt ein klares Verb und Ressource ('Listet die Zahlungen ... einem bestimmten Beleg zugeordnet') und grenzt sich explizit von den Geschwistertools bb_transactions_list_receipts (umgekehrte Richtung) und bb_receipts_get (der Beleg selbst) ab. Ein Agent kann das Tool ohne Schema-Öffnung von Alternativen unterscheiden.

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

Usage Guidelines5/5

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

Die Beschreibung liefert einen konkreten Anwendungsfall ('etwa um zu prüfen, ob eine Eingangsrechnung schon bezahlt wurde') und benennt die Alternativen mit ihren Richtungen. Es bleibt nichts zu inferieren.

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

bb_receipts_restoreBeleg wiederherstellenA

Nimmt in BuchhaltungsButler die Löschmarkierung eines Belegs zurück, sodass er wieder für die Buchhaltung zählt; typischer Fall ist ein versehentlich als gelöscht markierter Beleg. Als gelöscht markierte Belege findet bb_receipts_search mit deleted true. Legt keinen Beleg an und stellt keine Datei wieder her: Der Beleg war nie weg, nur markiert. Schreibt in die echten Buchhaltungsdaten von BuchhaltungsButler. Rückgängig zu machen mit bb_receipts_delete.

ParametersJSON Schema
NameRequiredDescriptionDefault
receipt_id_by_customerYesDie mandantenbezogene Nummer des Belegs, zu finden über bb_receipts_search mit deleted true. Keine globale Kennung. In Suchergebnissen erscheint sie als String; hier ohne Anführungszeichen übergeben.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
changedNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, and openWorldHint=true. The description adds that this writes to real accounting data, that it toggles a deletion flag rather than restoring a file or creating a receipt, and that it is reversible via bb_receipts_delete. It does not address idempotency or error behavior, but adds meaningful context beyond 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?

Front-loaded with the core purpose, followed by usage context, disambiguation, and reversibility. Four tight clauses with no filler; every sentence earns its place.

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 one-parameter mutation with an output schema and annotations already carrying the safety profile, the description supplies everything an agent needs: what it does, how to find the target, what it does not do, and how to undo it. No critical agent-facing gap remains.

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 parameter's schema description already explains the tenant-scoped ID, the string/integer distinction, and where to find the value. The tool description adds no further parameter format or meaning beyond what the schema already provides, so the baseline of 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?

States a specific verb and resource: it reverses the deletion mark of a receipt in BuchhaltungsButler. It distinguishes itself from siblings by naming bb_receipts_search for finding deleted receipts, bb_receipts_delete for undoing, and explicitly denying that it creates a receipt or restores a file.

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

Usage Guidelines5/5

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

Explicitly gives the typical use case (accidentally marked as deleted), tells how to locate the target receipt via bb_receipts_search with deleted true, explains what it does not do (create or restore files), and names the alternative action bb_receipts_delete for reversal. No inference is needed.

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

bb_receipts_uploadBelegdatei hochladenA

Lädt eine Belegdatei nach BuchhaltungsButler, legt daraus einen Beleg an und stößt die Texterkennung an; Pflicht sind nur die Datei und die Belegart, alles Weitere liest BuchhaltungsButler aus der Datei. Beispiel: eine Eingangsrechnung als PDF übergeben und die erkannten Felder danach mit bb_receipts_get prüfen. Für einen Beleg ohne Datei bb_receipts_create, für viele davon bb_receipts_create_batch. Einen Stapelupload gibt es nicht, und an einen bestehenden Beleg lässt sich nachträglich keine Datei hängen. Bei einer E-Rechnung ignoriert die API alle mitgegebenen Metadaten. Eigenes Limit: zehn Aufrufe je Minute. Schreibt in die echten Buchhaltungsdaten von BuchhaltungsButler. Rückgängig nur mit bb_receipts_delete, das den Beleg lediglich als gelöscht markiert; die API kennt keinen Endpunkt, der einen Beleg endgültig entfernt.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoBelegdatum, also das Ausstellungsdatum, als YYYY-MM-DD, zum Beispiel 2026-04-26. Ohne Angabe wird es aus der Datei gelesen.
fileYesDie Belegdatei in einer von drei Formen: als base64-Zeichenkette, was immer geht, als https-Adresse oder als file-Adresse. Die beiden Adressformen nimmt der Server nur an, wenn der Betreiber sie freigegeben hat; sonst lehnt er den Aufruf ab, bevor etwas hinausgeht. Angenommene Dateiarten sind PDF, XML, JPEG, PNG, BMP und TIFF; der Typ wird am Inhalt bestimmt und nicht am Namen. Bei der base64-Form gehört der Dateiname in file_name.
amountNoBruttobetrag des Belegs. Dezimalpunkt, kein Tausendertrennzeichen, zum Beispiel 123.99. 0.00 ist kein gültiger Betrag; ein negativer Betrag kennzeichnet eine Rückabwicklung. Ohne Angabe wird er aus der Datei gelesen.
currencyNoDie Spezifikation sagt hier „Has to be 'EUR' if specified“ und widerspricht damit dem Vorrat von /receipts/add mit USD, GBP und CHF. Dass nur 'EUR' gilt, ist nicht verifiziert; dieses Werkzeug prüft den Wert deshalb nicht vorab.
vat_rateNoUmsatzsteuersatz des Belegs in Prozent als Zahl, zum Beispiel 19 oder 0. Weglassen, wenn der Beleg keinen oder mehrere Steuersätze trägt.
file_nameNoDateiname einschließlich Endung, zum Beispiel rechnung-2026-0001.pdf. Bei der base64-Form verlangt die API ihn; fehlt er, kann der Server einen Namen aus dem erkannten Dateityp bilden. Pfadanteile und Steuerzeichen werden entfernt.
counterpartyNoGegenpartei des Belegs: bei einer Eingangsrechnung der Rechnungssteller, bei einer Ausgangsrechnung der Empfänger. Ohne Angabe liest BuchhaltungsButler sie aus der Datei.
receipt_typeYesBelegart, kleingeschrieben und mit Leerzeichen. 'invoice inbound' ist eine Eingangsrechnung, 'invoice outbound' eine Ausgangsrechnung, 'credit inbound' eine Eingangsgutschrift nach § 14 UStG, 'credit outbound' eine Ausgangsgutschrift nach § 14 UStG. Der Parameter heißt in der API type; dieser Name ist dort siebenfach mit verschiedener Bedeutung belegt, deshalb der eindeutige Werkzeugname.
date_deliveryNoLeistungs- oder Lieferdatum als YYYY-MM-DD, zum Beispiel 2026-04-26. Wegen der DATEV-Kompatibilität nimmt BuchhaltungsButler kein Leistungsdatum nach dem Belegdatum an.
invoice_numberNoRechnungsnummer des Belegs, zum Beispiel ER-2026-0001, höchstens 60 Zeichen. Ohne Angabe wird sie aus der Datei gelesen.
creditor_debtorNoNummer des Personenkontos, dem der Beleg zugeordnet wird: bei Eingangsbelegen ein Kreditor, bei Ausgangsbelegen ein Debitor, zum Beispiel 70001. Nachschlagen mit bb_postingaccounts_search, das Sachkonten, Zahlungskonten, Debitoren und Kreditoren gemeinsam führt. Nutzbar nur, wenn Debitoren und Kreditoren beim Mandanten aktiviert sind, und passend zur Belegart.
date_payment_dueNoFälligkeitsdatum als YYYY-MM-DD, zum Beispiel 2026-05-26. In der Antwort der Suche heißt das Feld due_date.
payment_referenceNoTechnische Zahlungsreferenz, zum Beispiel eine Amazon-Bestellnummer oder eine Vorgangsnummer von PayPal oder Stripe. Kein Verwendungszweck als Freitext. Stimmt sie, findet BuchhaltungsButler die passende Zahlung von selbst.
payment_account_numberNoSachkontonummer, die ein Zahlungskonto bezeichnet, zum Beispiel '1200'. Nicht das Sachkonto, auf das gebucht wird. Zahlungskonten auflisten mit bb_payment_accounts_list. Der Beleg wird damit unmittelbar diesem Zahlungskonto zugeordnet. Der Parameter heißt in der API account.
link_to_receipt_id_by_customerNoDie mandantenbezogene Nummer eines anderen Belegs, zu finden über bb_receipts_search. Keine globale Kennung; hier ohne Anführungszeichen übergeben. Beide Belege werden gemeinsam einer Zahlung zugeordnet, sobald einer von ihnen von Hand zugeordnet wird.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
createdNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.8/5.0
Behavior5/5

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

Discloses behavior beyond annotations: rate limit (10 calls/minute), E-Rechnung ignores metadata, writes to real accounting data ('Schreibt in die echten Buchhaltungsdaten'), undo semantics only via bb_receipts_delete which merely marks as deleted (no endpoint for permanent removal). Annotations cover safety profile but description adds depth on irreversibility.

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?

Dense but front-loaded with action and requirements first, then routing, then caveats. Long but every clause carries operational value (rate limit, E-Rechnung, undo semantics). Slightly dense for agent parsing but no filler.

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 15-param, non-idempotent, open-world write tool with an output schema, description covers requirements, alternatives, limitations (no batch, no attach), rate limits, and non-reversible deletion semantics. Sufficient for correct invocation.

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 schema does most work. Description adds value by clarifying requirements ('Pflicht sind nur die Datei und die Belegart, alles Weitere liest BuchhaltungsButler aus der Datei') and flagging the E-Rechnung metadata-ignore behavior plus the currency spec contradiction.

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?

Specific verb+resource: 'Lädt eine Belegdatei nach BuchhaltungsButler, legt daraus einen Beleg an und stößt die Texterkennung an'. Explicitly distinguishes from siblings bb_receipts_create (receipt without file) and bb_receipts_create_batch (many). Also states what is NOT possible (no batch upload, no attaching file to existing receipt).

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

Usage Guidelines5/5

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

Explicit routing: 'Für einen Beleg ohne Datei bb_receipts_create, für viele davon bb_receipts_create_batch'. States the negative case (no batch upload, cannot attach to existing receipt). Example workflow (upload PDF then verify with bb_receipts_get) provided.

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

bb_records_collectBestand zählen und summierenA
Read-onlyIdempotent

Läuft serverseitig über alle Seiten von Belegen, Zahlungen oder Buchungen und liefert Anzahl und Summe statt aller Zeilen; Einzelzeilen erst ab max_rows. Beantwortet 'wie viele offenen Eingangsrechnungen gibt es', 'was ist im März über PayPal gelaufen' und 'finde Rechnung 4711 in beiden Richtungen'. Ersetzt für Zählen und Summieren bb_receipts_search, bb_transactions_search und bb_postings_search; für einzelne Felder, Sortierung oder weitere Filter bleiben diese Werkzeuge zuständig. Summen erscheinen nur, wenn der Bestand vollständig gelesen wurde. Höchstens 10 Aufrufe an die API, list_direction 'both' verdoppelt sie; der Token-Eimer ist prozesslokal, zwei Clients auf demselben Mandanten teilen ihn nicht.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoZahlungskonto, nur bei resource 'transactions'. Kontoname ODER Kontonummer, zum Beispiel PayPal oder 1201. Ein Name wird über die Kontenliste aufgelöst; bei mehreren oder keinem Treffer bricht der Aufruf vor dem ersten Listenabruf ab und nennt die Kandidaten, statt zu raten. Entspricht payment_account_number in bb_transactions_search, nimmt aber zusätzlich einen Namen entgegen.
date_toNoSpätestes Datum, eingeschlossen, als YYYY-MM-DD, zum Beispiel 2026-01-31. Bei resource 'postings' Pflicht, sonst dringend empfohlen. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen.
group_byNoServerseitige Gruppierung der gelesenen Zeilen. 'month' fasst nach Kalendermonat zusammen, 'counterparty' nach Gegenpartei (nicht bei 'postings'), 'none' liefert keine Gruppen. Vorgabe ist 'month'. Gruppen und Summen erscheinen nur, wenn der Bestand vollständig gelesen wurde.
max_rowsNoHöchstzahl der Einzelzeilen in der Antwort, 0 bis 200, VORGABE 0. Null heißt: nur Kennzahlen, keine Einzelzeilen. Für eine Kontoauszugsansicht auf 50 setzen. Der Wert wirkt serverseitig; gelesen und ausgewertet werden immer alle Seiten bis zur Aufrufobergrenze.
resourceYesWas gezählt wird. 'receipts' sind Belege, also Eingangs- und Ausgangsrechnungen; 'transactions' sind Zahlungen, also Kontoumsätze; 'postings' sind Buchungssätze. Pflichtangabe. Bei 'postings' sind date_from und date_to ebenfalls Pflicht.
date_fromNoFrühestes Datum, eingeschlossen, als YYYY-MM-DD, zum Beispiel 2026-01-01. Bei resource 'postings' Pflicht, sonst dringend empfohlen: Ohne Zeitraum läuft das Blättern gegen die Aufrufobergrenze. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen.
counterpartyNoGegenpartei als Filter, nur bei resource 'receipts'. Bei Eingangsbelegen der Rechnungssteller, bei Ausgangsbelegen der Empfänger. Freitext des Belegs; die Schreibweise kann von der des Kontonamens abweichen.
invoicenumberNoRechnungsnummer als Filter, nur bei resource 'receipts'. Zusammen mit list_direction 'both' ist das der Weg, eine Rechnung zu finden, ohne ihre Richtung zu kennen.
list_directionNoRichtung der Belegliste, nur bei resource 'receipts'. 'inbound' sind Eingangsbelege, also Rechnungen, die der Mandant erhalten hat; 'outbound' sind Ausgangsbelege, also Rechnungen, die der Mandant stellt; 'both' läuft über beide Richtungen und verdoppelt dabei die Zahl der Aufrufe. Vorgabe ist 'both'. Die API kennt nur die beiden Einzelwerte; 'both' ist eine Zutat dieses Servers und wird in zwei getrennten Läufen abgebildet.
payment_statusNoZahlungsstand als Filter, nur bei resource 'receipts'. 'unpaid' ist die Antwort auf die Frage nach den offenen Belegen, 'paid' auf die nach den bezahlten. Der Filter arbeitet auf dem Server von BuchhaltungsButler. Ein offener Betrag wird daraus NICHT abgeleitet: Die Felder amount_paid und amount_paid_fixed sind in diesem Mandanten gemessen auch bei bezahlten Belegen 0.00, und Teilzahlungen sind in der Belegliste nicht erkennbar.
response_formatNo'concise' liefert nur die Felder, die einen Datensatz erkennbar machen und den nächsten Schritt erlauben. 'detailed' liefert den Datensatz so, wie die BuchhaltungsButler-API ihn ausgibt. Mit 'concise' beginnen und nur für die wenigen Datensätze auf 'detailed' wechseln, die wirklich geprüft werden müssen. Dieses Feld ist serverseitig und geht nicht an die API.concise

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsNo
notesNo
bundleYes
filterNo
groupsNo
accountNo
successYes
resourceYes
rows_readYes
directionsNo
sum_of_rows_readNo
account_candidatesNo
duplicates_discardedNo
sum_of_rows_read_centsNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, but the description adds operational context that annotations cannot: a cap of 10 API calls, that list_direction 'both' doubles them, that the token bucket is process-local and not shared between two clients on the same tenant, and that sums/groups only appear when the set was read completely. The payment_status caveat (amount_paid measured as 0.00 even for paid receipts, partial payments invisible) is exactly the kind of hidden behavior an agent needs.

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?

Purpose is front-loaded and every sentence carries weight — replacement scope, caveats, limits, token-bucket warning. The sentences are long and semicolon-chained, which costs some scannability, but there is no filler.

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 an 11-parameter aggregation tool with an output schema, the description covers the remaining risk surface: which sibling it supersedes, the API-call budget, the 'both' expansion, the completeness precondition for sums, and data-quality traps. Nothing needed to invoke it correctly is missing.

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?

Schema coverage is 100% and the schema itself is unusually detailed, but the description still adds meaning beyond it: it discloses that 'both' is not an API value but a server-side construct rendered as two separate runs (relevant to the call budget), and it frames max_rows as a presentation knob while all pages are still read server-side. These are behavioral semantics the schema does not carry.

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 first clause names the specific verb+resource ('zählt serverseitig über alle Seiten von Belegen, Zahlungen oder Buchungen') and states the distinctive output contract (Anzahl und Summe statt aller Zeilen). It then explicitly names the three sibling tools it replaces, so an agent can separate it from bb_receipts_search, bb_transactions_search and bb_postings_search without opening any schema.

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

Usage Guidelines5/5

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

It gives concrete questions the tool answers ('wie viele offenen Eingangsrechnungen gibt es', 'was ist im März über PayPal gelaufen') and draws an explicit boundary: this tool for counting/summing, the *_search tools remain responsible for single fields, sorting and further filters. When-to-use and when-not-to-use are both present.

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

bb_reports_create_bwaBWA anfordernA
Destructive

Stößt in BuchhaltungsButler die Erzeugung einer Betriebswirtschaftlichen Auswertung für einen Zeitraum an und liefert deren id_by_customer zurück. Die Berechnung läuft im Hintergrund; abgeholt wird das Ergebnis danach mit bb_reports_get_bwa und report_id_by_customer, das bis zum Abschluss mit error_code 8 antwortet. Ein zweiter Aufruf vor dem Abschluss scheitert mit error_code 12. Dateien kann dieser Endpunkt nicht anfordern, anders als bb_reports_create_sums. Ersetzt die zuvor in BuchhaltungsButler erzeugte Auswertung desselben Typs. Buchungsdaten ändern sich dabei nicht, und die Auswertung lässt sich jederzeit neu erzeugen.

ParametersJSON Schema
NameRequiredDescriptionDefault
date_toYesLetzter Tag des Auswertungszeitraums als YYYY-MM-DD, zum Beispiel 2026-03-31. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. Der Zeitraum schließt diesen Tag ein; für ein vollständiges erstes Quartal also 2026-03-31 und nicht 2026-04-01.
date_fromYesErster Tag des Auswertungszeitraums als YYYY-MM-DD, zum Beispiel 2026-01-01. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. Der Zeitraum schließt diesen Tag ein.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
createdNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations declare non-read-only, destructive, non-idempotent, open-world; the description goes well beyond them by explaining the async lifecycle, the exact error codes for pending and duplicate calls, the replacement of the prior analysis of the same type (which explains destruktivHint), and that booking data itself is untouched and the report is regenerable.

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?

Six sentences, but the core action is front-loaded and each additional sentence carries operational value (polling contract, error codes, sibling disambiguation, regeneration semantics). Dense but not padded; a slightly tighter grouping of the error-code facts would be ideal.

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?

With an output schema present, return values need not be re-explained, and the description covers what matters for correct invocation: async behavior, the polling handoff, failure codes, side effects on existing reports, and the fact that underlying booking data is unchanged.

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% and the schema already documents both date fields in detail (format, inclusive endpoints, empty-string rejection), so the baseline of 3 applies. The description adds no parameter-level syntax or format information beyond what the schema provides.

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 (anstoßen/generate) plus resource (BWA for a period) and specifies what it returns (id_by_customer). It explicitly distinguishes itself from bb_reports_get_bwa (the retrieval step) and bb_reports_create_sums (the file-capable sibling), so an agent can route correctly without opening any schema.

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

Usage Guidelines5/5

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

Describes the full async workflow: this call triggers generation, the result must be polled with bb_reports_get_bwa using report_id_by_customer, polling returns error_code 8 until done, and a premature second call fails with error_code 12. It also names the alternative (bb_reports_create_sums) for file requests, leaving nothing to inference.

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

bb_reports_create_sumsSummen- und Saldenliste anfordernA
Destructive

Stößt in BuchhaltungsButler die Erzeugung einer Summen- und Saldenliste über alle Konten des Mandanten an und liefert deren id_by_customer zurück; wahlweise entstehen dabei PDF, CSV und ein ZIP-Archiv mit den Kontenblättern. Die Berechnung läuft im Hintergrund; abgeholt wird das Ergebnis danach mit bb_reports_get_sums und report_id_by_customer, das bis zum Abschluss mit error_code 8 antwortet. Ein zweiter Aufruf vor dem Abschluss scheitert mit error_code 12. Eine Filterung auf einzelne Konten kennt die API nicht. Ersetzt die zuvor in BuchhaltungsButler erzeugte Auswertung desselben Typs. Buchungsdaten ändern sich dabei nicht, und die Auswertung lässt sich jederzeit neu erzeugen.

ParametersJSON Schema
NameRequiredDescriptionDefault
baseNoDatum der Periodenzuordnung: 'date' Buchungsdatum, 'date_delivery_else_date' Leistungsdatum und ersatzweise Buchungsdatum. Ohne Angabe 'date'. Die BWA der Weboberfläche wertet nach dem Leistungsdatum aus; beim Vergleich bewusst setzen.
date_toYesLetzter Tag des Auswertungszeitraums als YYYY-MM-DD, zum Beispiel 2026-03-31. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. Der Zeitraum schließt diesen Tag ein; für ein vollständiges erstes Quartal also 2026-03-31 und nicht 2026-04-01.
file_csvNotrue erzeugt zusätzlich eine CSV-Datei. Abgeholt wird sie über bb_reports_get_sums mit get_files; ohne diese Angabe bleibt der Schlüssel csv dort null.
file_pdfNotrue erzeugt zusätzlich ein PDF. Abgeholt wird es über bb_reports_get_sums mit get_files; ohne diese Angabe bleibt der Schlüssel pdf dort null.
date_fromYesErster Tag des Auswertungszeitraums als YYYY-MM-DD, zum Beispiel 2026-01-01. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. Der Zeitraum schließt diesen Tag ein.
archive_exportNotrue erzeugt zusätzlich ein ZIP-Archiv aus CSV-Datei und den Kontenblättern aller bebuchten Konten. Im Objekt files von bb_reports_get_sums heißt es csv_archive, nicht archive_export. Das ersetzt viele Aufrufe von bb_reports_get_ledger.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
createdNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare destructive/non-idempotent, but the description adds substantial independent context: asynchronous background computation, error_code 8 while pending, error_code 12 on premature re-call, replacement of the prior report of the same type, and reassurance that posting data itself is untouched.

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?

Front-loaded with the core action and result handle, then the async/error details. Dense and mostly waste-free, though the final sentence ('Buchungsdaten ändern sich nicht... jederzeit neu erzeugen') is somewhat redundant given the earlier statement of replacement semantics.

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 an async creation tool with a rich output schema, the description covers the lifecycle (create → poll → fetch), failure modes, non-filterability and side effects on prior reports. Nothing an agent needs to call it correctly 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?

Schema description coverage is 100%, so the schema already documents all six parameters with formats, examples and downstream get_files keys. The description only gestures at the optional outputs (PDF, CSV, ZIP) generically, adding little beyond the schema; baseline 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 (erzeugt/anstößt) and resource (Summen- und Saldenliste über alle Konten des Mandanten), plus the returned handle id_by_customer. It is clearly differentiable from sibling readers like bb_reports_get_sums and bb_reports_get_bwa.

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

Usage Guidelines5/5

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

Explicitly describes the two-step workflow: create here, then retrieve via bb_reports_get_sums with report_id_by_customer. Also states what is not possible (no filtering to individual accounts) and that a second call before completion fails with error_code 12.

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

bb_reports_get_bwaBWA abholenA
Read-onlyIdempotent

Holt eine zuvor in BuchhaltungsButler erzeugte Betriebswirtschaftliche Auswertung ab, auf Wunsch samt Dateien. Vorbedingung ist ein Lauf von bb_reports_create_bwa; dessen id_by_customer ist hier einzusetzen. Bei aktivem BB_MCP_READ_ONLY ist dieser erste Schritt gesperrt, dann liefert nur bb_reports_get_ledger eine Auswertung. error_code 8 heißt: Erzeugung läuft noch, einige Sekunden warten. error_code 7 heißt: kein Bericht zu dieser Kennung.

ParametersJSON Schema
NameRequiredDescriptionDefault
get_filesNotrue liefert die Dateien base64-kodiert unter csv und pdf mit; ohne Angabe fehlt das Objekt files ganz. bb_reports_create_bwa kennt keinen Parameter, Dateien anzufordern; dass beide deshalb immer null bleiben, ist nicht verifiziert.
response_formatNo'concise' liefert nur die Felder, die einen Datensatz erkennbar machen und den nächsten Schritt erlauben. 'detailed' liefert den Datensatz so, wie die BuchhaltungsButler-API ihn ausgibt. Mit 'concise' beginnen und nur für die wenigen Datensätze auf 'detailed' wechseln, die wirklich geprüft werden müssen. Dieses Feld ist serverseitig und geht nicht an die API.concise
report_id_by_customerYesKennung der zuvor mit bb_reports_create_bwa erzeugten Auswertung, deren id_by_customer. In Suchergebnissen erscheint sie als String; hier ohne Anführungszeichen übergeben. Ohne Bericht dazu antwortet die API mit error_code 7.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
messageNo
successYes
endpointNo
_contract_warningsNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare the safe read profile (readOnly/idempotent/non-destructive), and the description goes further with behavioral facts annotations cannot carry: the read-only-mode workflow constraint and the meaning of error_code 8 (transient, retry) and error_code 7 (permanent, no report). This is exactly the kind of runtime behavior an agent needs before invoking.

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?

Front-loaded with the core action, then preconditions, then error semantics — every sentence carries distinct, necessary information and nothing is repeated from the schema. Dense but zero waste.

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 retrieval tool with an output schema (so return values need not be explained) and full schema coverage, the description still supplies the missing pieces: the creation precondition, the read-only fallback, and the two error codes. Nothing needed to call it correctly is absent.

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, and the schema already documents get_files, response_format, and report_id_by_customer richly. The description adds a cross-tool semantic not present in the schema: that report_id_by_customer is the id_by_customer returned by bb_reports_create_bwa, which clarifies the provenance of the required value.

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 (retrieves/fetches) and resource (a previously created BWA, optionally with files), and explicitly names the sibling that creates the input (bb_reports_create_bwa) and the alternative under read-only mode (bb_reports_get_ledger). An agent can distinguish this retrieval tool from its creation counterpart and its sibling report tool without opening any schema.

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

Usage Guidelines5/5

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

Gives an explicit precondition (bb_reports_create_bwa must have run), tells the agent which value to pass (its id_by_customer), and names the fallback when BB_MCP_READ_ONLY is active (only bb_reports_get_ledger). It also routes on error codes (8 = still running, wait; 7 = no report), so retry vs. abort decisions are fully specified.

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

bb_reports_get_ledgerKontenblatt abrufenA
Read-onlyIdempotent

Liefert das Kontenblatt eines Sachkontos aus BuchhaltungsButler für einen Zeitraum, also dessen Buchungen mit laufendem Saldo. Anders als bb_reports_get_bwa und bb_reports_get_sums braucht es keinen Erzeugungsschritt und bleibt auch bei aktivem BB_MCP_READ_ONLY nutzbar. Weder limit noch offset: Ein stark bebuchtes Konto liefert alles auf einmal, lange Zeiträume also in Monatsfenster zerlegen. Ein leeres Kontenblatt ist kein Fehler, sondern ein Konto ohne Buchung.

ParametersJSON Schema
NameRequiredDescriptionDefault
baseNoDatum der Periodenzuordnung: 'date' Buchungsdatum, 'date_delivery_else_date' Leistungsdatum und ersatzweise Buchungsdatum. Ohne Angabe 'date'. Mit dem zweiten Wert können Buchungen außerhalb des Rechnungsdatums erscheinen; nicht verifiziert.
date_toYesLetzter Tag des Zeitraums als YYYY-MM-DD, zum Beispiel 2026-03-31. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. Der Zeitraum schließt diesen Tag ein.
date_fromYesErster Tag des Zeitraums als YYYY-MM-DD, zum Beispiel 2026-01-01. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. Der Zeitraum schließt diesen Tag ein.
response_formatNo'concise' liefert nur die Felder, die einen Datensatz erkennbar machen und den nächsten Schritt erlauben. 'detailed' liefert den Datensatz so, wie die BuchhaltungsButler-API ihn ausgibt. Mit 'concise' beginnen und nur für die wenigen Datensätze auf 'detailed' wechseln, die wirklich geprüft werden müssen. Dieses Feld ist serverseitig und geht nicht an die API.concise
postingaccount_numberYesNummer des Sachkontos, dessen Kontenblatt geliefert wird, zum Beispiel 4920, als ganze Zahl ohne Anführungszeichen. Nachschlagen mit bb_postingaccounts_search. Zu einem Konto, das es nicht gibt, antwortet die API mit error_code 16.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
messageNo
successYes
endpointNo
_contract_warningsNo

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, the description discloses that there is no limit/offset pagination, that a heavily-posted account returns everything in one response, and that long ranges should be broken into monthly windows — concrete volume/latency behavior an agent needs. It also states the read-only-mode compatibility, which the annotations alone do not express.

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?

Four sentences, each load-bearing: purpose, sibling differentiation, pagination caveat, empty-result semantics. The purpose is front-loaded and no sentence restates the name, title, or schema.

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?

An output schema exists so return values need no explanation, and annotations cover the safety profile. What remains — the absence of pagination, the read-only compatibility, the empty-result behavior, and period-window advice — is all covered, leaving nothing an agent needs missing for 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 description coverage is 100% and each parameter already carries a rich description (formats, enum meanings, error_code 16 for unknown accounts), so the schema does the heavy lifting. The description adds only the negative fact that limit/offset are not supported, which is useful but marginal against a fully documented schema.

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 — delivers the ledger (Kontenblatt) of a general-ledger account for a period, including postings with a running balance — and explicitly contrasts it with bb_reports_get_bwa and bb_reports_get_sums. An agent can distinguish this tool from its report siblings without opening any schema.

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

Usage Guidelines5/5

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

Names the two closest alternatives and the condition that distinguishes this one (no generation step required, usable while BB_MCP_READ_ONLY is active), and adds operational guidance to split long periods into monthly windows. It also states that an empty ledger is not an error, which prevents a wrong retry/recovery path.

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

bb_reports_get_sumsSummen- und Saldenliste abholenA
Read-onlyIdempotent

Holt eine zuvor in BuchhaltungsButler erzeugte Summen- und Saldenliste ab, auf Wunsch samt Dateien. Vorbedingung ist ein Lauf von bb_reports_create_sums; dessen id_by_customer ist hier einzusetzen. Bei aktivem BB_MCP_READ_ONLY ist dieser erste Schritt gesperrt, dann liefert nur bb_reports_get_ledger eine Auswertung. Die Salden stehen im Objekt sums, geschlüsselt nach Kontonummer. error_code 8 heißt: Erzeugung läuft noch. error_code 7 heißt: kein Bericht zu dieser Kennung.

ParametersJSON Schema
NameRequiredDescriptionDefault
get_filesNotrue liefert die Dateien base64-kodiert unter csv, pdf und csv_archive mit. Geliefert wird nur, was bb_reports_create_sums angefordert hat, alles andere ist null. Ohne Angabe fehlt das Objekt files ganz.
response_formatNo'concise' liefert nur die Felder, die einen Datensatz erkennbar machen und den nächsten Schritt erlauben. 'detailed' liefert den Datensatz so, wie die BuchhaltungsButler-API ihn ausgibt. Mit 'concise' beginnen und nur für die wenigen Datensätze auf 'detailed' wechseln, die wirklich geprüft werden müssen. Dieses Feld ist serverseitig und geht nicht an die API.concise
report_id_by_customerYesKennung der zuvor mit bb_reports_create_sums erzeugten Auswertung, deren id_by_customer. In Suchergebnissen erscheint sie als String; hier ohne Anführungszeichen übergeben. Ohne Bericht dazu antwortet die API mit error_code 7.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
messageNo
successYes
endpointNo
_contract_warningsNo

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already cover safety (readOnlyHint, idempotentHint, destructiveHint=false). The description adds valuable behavioral context: the prerequisite creation step, the read-only mode restriction, the structure of the sums object, and the meaning of error codes 7 and 8. It does not detail rate limits or pagination, but with annotations covering the safety profile, this is strong.

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?

The description is a few sentences, front-loaded with the core purpose, then prerequisites, then error codes. It is efficient and every sentence adds value, though it could be slightly more concise by combining some error code details.

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 tool has an output schema and rich annotations, the description covers all necessary context: prerequisite tool, read-only mode behavior, structure of sums, and error codes. It fully equips an agent to invoke correctly and interpret results.

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. The description goes beyond the schema by explaining that report_id_by_customer is the id_by_customer from bb_reports_create_sums, and that error_code 7 occurs if no report exists. It also mentions 'auf Wunsch samt Dateien' which corresponds to get_files, though the schema already details that parameter. The description adds meaning for the required parameter and error conditions, raising it to 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?

States a specific verb+resource: 'Holt eine zuvor in BuchhaltungsButler erzeugte Summen- und Saldenliste ab, auf Wunsch samt Dateien'. It clearly distinguishes itself from siblings by naming the prerequisite tool bb_reports_create_sums and the alternative bb_reports_get_ledger.

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

Usage Guidelines5/5

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

Explicitly says when to use it: after running bb_reports_create_sums, and provides the condition for an alternative ('Bei aktivem BB_MCP_READ_ONLY ... dann liefert nur bb_reports_get_ledger eine Auswertung'). It also explains what error codes mean, guiding the agent on next steps.

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

bb_reports_runBericht erzeugen und abholenA
Destructive

Erzeugt eine BWA oder eine Summen- und Saldenliste für einen Zeitraum, wartet auf die serverseitige Berechnung und liefert die fertige Auswertung im selben Aufruf zurück. Dabei wird geschrieben: /reports/create/bwa beziehungsweise /reports/create/sums ersetzt den zuvor erzeugten Bericht desselben Typs im ganzen Mandanten, und ein gleichzeitig arbeitender zweiter Nutzer verliert damit seinen Bericht. Ersetzt die zuvor in BuchhaltungsButler erzeugte Auswertung desselben Typs. Buchungsdaten ändern sich dabei nicht, und die Auswertung lässt sich jederzeit neu erzeugen. Viele Clients brechen den Aufruf nach rund 60 Sekunden ab; erzeugt und ersetzt ist der Bericht dann trotzdem und nur noch mit bb_reports_get_bwa oder bb_reports_get_sums abzuholen. Bei aktivem BB_MCP_READ_ONLY gesperrt; lesend bleiben diese beiden und bb_reports_get_ledger. Dateien wie PDF oder CSV liefert es nie.

ParametersJSON Schema
NameRequiredDescriptionDefault
baseNoDatum der Periodenzuordnung, NUR bei report_type 'sums'. 'date' ist das Buchungs- oder Rechnungsdatum, 'date_delivery_else_date' das Leistungsdatum und ersatzweise das Buchungsdatum. Ohne Angabe 'date'. Bei report_type 'bwa' wird das Feld abgelehnt, bevor etwas hinausgeht: /reports/create/bwa kennt es nicht.
date_toYesLetzter Tag des Auswertungszeitraums als YYYY-MM-DD, zum Beispiel 2026-03-31. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. Der Zeitraum schließt diesen Tag ein; für ein vollständiges erstes Quartal also 2026-03-31 und nicht 2026-04-01.
date_fromYesErster Tag des Auswertungszeitraums als YYYY-MM-DD, zum Beispiel 2026-01-01. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. Der Zeitraum schließt diesen Tag ein.
report_typeYesWelche Auswertung erzeugt wird. 'bwa' ist die Betriebswirtschaftliche Auswertung, also Erträge und Aufwendungen im Zeitraum. 'sums' ist die Summen- und Saldenliste, also je Konto die Bewegungen und der Saldo. Der Wert geht nicht an die API, er entscheidet, welcher Endpunkt aufgerufen wird. Beide Arten blockieren sich gegenseitig nicht.
response_formatNo'concise' liefert nur die Felder, die einen Datensatz erkennbar machen und den nächsten Schritt erlauben. 'detailed' liefert den Datensatz so, wie die BuchhaltungsButler-API ihn ausgibt. Mit 'concise' beginnen und nur für die wenigen Datensätze auf 'detailed' wechseln, die wirklich geprüft werden müssen. Dieses Feld ist serverseitig und geht nicht an die API.concise
max_wait_secondsNoWie lange dieser Aufruf höchstens auf die Berechnung wartet, in Sekunden. Ohne Angabe 60, erlaubt 10 bis 240. Läuft die Zeit ab, ist der Bericht trotzdem erzeugt und der vorherige trotzdem ersetzt; die Antwort nennt dann die Kennung, mit der bb_reports_get_bwa beziehungsweise bb_reports_get_sums ihn nachholt. Dasselbe gilt, wenn der Client vorher abbricht: Viele tun das nach etwa 60 Sekunden, verifiziert ist das nicht für jeden. Dann kommt gar keine Antwort an, und die Kennung steht nur noch im stderr-Protokoll dieses Servers. Wer die Frist seines Clients nicht kennt, wählt deshalb höchstens 30. Das Feld ist serverseitig und geht nicht an die API.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
bundleYes
periodNo
statusYes
successYes
wait_msNo
attemptsNo
report_typeYes
integrity_errorNo
report_id_by_customerYes
uncompletedPostingsCountNo

TDQS

A4.8/5.0
Behavior5/5

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

With annotations already declaring destructiveHint=true and idempotentHint=false, the description still adds substantial context beyond them: the replacement wipes the previous same-type report tenant-wide and can destroy a concurrent user's report, posting data is untouched, and a ~60s client timeout can kill the response while the report is still created.

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?

Front-loaded with purpose and the destructive replacement behavior, but it is long and repeats the replacement idea twice ('ersetzt den zuvor erzeugten Bericht desselben Typs...' and 'Ersetzt die zuvor in BuchhaltungsButler erzeugte Auswertung desselben Typs'), slightly diluting density.

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 destructive, timeout-prone generation tool with an output schema already present, the description covers side effects, concurrent-user impact, the abort/recovery path, read-only gating, and what is never returned (no PDF/CSV) — nothing an agent needs to call it correctly 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 still adds operational meaning, e.g. advising max_wait_seconds<=30 when the client timeout is unknown and explaining report_type selects the endpoint rather than being sent to the API, which goes beyond the field-level schema text.

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+resource chain ('Erzeugt eine BWA oder eine Summen- und Saldenliste für einen Zeitraum, wartet auf die serverseitige Berechnung und liefert die fertige Auswertung im selben Aufruf zurück') and implicitly distinguishes itself from bb_reports_get_bwa/bb_reports_get_sums, which it names as the retrieval path.

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

Usage Guidelines5/5

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

Explicitly states when to use it (generate + fetch in one call), what to do when the wait elapses or the client aborts (fetch via bb_reports_get_bwa/get_sums), and the blocking condition (BB_MCP_READ_ONLY), naming the read-only alternatives bb_reports_get_bwa/bb_reports_get_sums/bb_reports_get_ledger.

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

bb_transactions_assign_receiptBeleg einer Zahlung zuordnenA

Ordnet in BuchhaltungsButler einen Beleg einer Zahlung zu. Zu nehmen, wenn Beleg und Zahlung denselben Vorgang betreffen, zum Beispiel eine Eingangsrechnung und die Überweisung über denselben Betrag. Mehrere Paare in einem Aufruf stellt bb_transactions_assign_receipt_batch her. Gebucht wird dabei nichts: Die Zuordnung allein erzeugt keinen Buchungssatz, den legt bb_postings_create_for_transaction an. Welche Belege bereits an einer Zahlung hängen, zeigt bb_transactions_list_receipts. Schreibt in die echten Buchhaltungsdaten von BuchhaltungsButler. Rückgängig zu machen mit bb_transactions_unassign_receipt.

ParametersJSON Schema
NameRequiredDescriptionDefault
receipt_id_by_customerYesDie mandantenbezogene Nummer des Belegs, zu finden über bb_receipts_search. Keine globale Kennung. In Suchergebnissen erscheint sie als String; hier ohne Anführungszeichen übergeben.
transaction_id_by_customerYesDie mandantenbezogene Nummer der Zahlung, zu finden über bb_transactions_search. Keine globale Kennung. In Suchergebnissen erscheint sie als String; hier ohne Anführungszeichen übergeben.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
changedNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.5/5.0
Behavior4/5

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

Die Annotations liefern nur das grobe Profil (kein readOnly, openWorld, nicht idempotent, nicht destruktiv). Die Beschreibung ergänzt wesentliche Wirkungsdetails: es entsteht kein Buchungssatz, es wird in echte Buchhaltungsdaten geschrieben, und die Aktion ist über bb_transactions_unassign_receipt rückgängig zu machen. Nur eine explizite Aussage zur Idempotenz/Wiederholbarkeit fehlt, daher keine volle Punktzahl.

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?

Der Zweck steht vorn, danach folgen in dichten, nicht redundanten Sätzen Einsatzbedingung, Alternativen, Seiteneffekt (keine Buchung), Datenwirkung und Rücknahme. Kein Satz ist Füllwerk.

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?

Trotz vorhandenem Output-Schema und vollständiger Parameterdokumentation liefert die Beschreibung genau die fehlenden Kontextinformationen: Abgrenzung zur Batch- und Unassign-Variante, Hinweis auf fehlende Buchungswirkung und auf das Schreiben in Echtdaten. Für einen Zwei-Parameter-Mutationsaufruf ist das vollständig.

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-Abdeckung ist 100 %, die Parameter (mandantenbezogene IDs, Format ohne Anführungszeichen, Fundort über bb_receipts_search/bb_transactions_search) sind dort bereits vollständig erklärt. Die Beschreibung trägt hier nichts Zusätzliches bei, was dem Baseline-Wert 3 entspricht.

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?

Nennt Verb und Ressource konkret ('Ordnet ... einen Beleg einer Zahlung zu') und grenzt die Fähigkeit sofort gegen Nachbarwerkzeuge ab, indem es die Batch-Variante, das Auflisten (bb_transactions_list_receipts) und das Aufheben (bb_transactions_unassign_receipt) benennt. Ein Agent kann das Werkzeug ohne Schemavergleich einordnen.

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

Usage Guidelines5/5

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

Gibt eine explizite Einsatzbedingung ('wenn Beleg und Zahlung denselben Vorgang betreffen', mit Beispiel) und nennt die Alternativen samt Auswahlkriterium: Batch bei mehreren Paaren, list_receipts zur Prüfung bestehender Zuordnungen.

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

bb_transactions_assign_receipt_batchBelege und Zahlungen im Stapel zuordnenA

Stellt bis zu 50 Zuordnungen aus Beleg und Zahlung in BuchhaltungsButler in einem Aufruf her. Fachlich gleich bb_transactions_assign_receipt, dessen Beschreibung die Einzelheiten trägt; für ein einzelnes Paar dieses Werkzeug nicht nehmen. Gebucht wird dabei nichts. Schreibt in die echten Buchhaltungsdaten von BuchhaltungsButler. Rückgängig zu machen mit bb_transactions_unassign_receipt.

ParametersJSON Schema
NameRequiredDescriptionDefault
assignmentsYesDie Paare aus Beleg und Zahlung, die einander zugeordnet werden sollen. Der Body-Parameter der API heißt transactions_to_receipts. Höchstens 50 Einträge je Aufruf. Ein abgelehnter Stapel wird nicht teilweise verarbeitet.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
changedNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly=false, destructive=false, idempotent=false, so the safety profile is partly covered. The description adds real value beyond them: it discloses that nothing is posted ('Gebucht wird dabei nichts'), that it writes to live accounting data, and that the change is reversible via unassign_receipt. Only the idempotency implication for retried batches is left implicit.

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?

Four tight sentences, front-loaded with capability and batch limit, then routing, then semantics. Every clause carries information with no filler.

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?

An output schema exists, so return values need no explanation. Between the description, full schema coverage and annotations, an agent has everything needed to select and invoke this batch tool 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 description coverage is 100% and the single 'assignments' parameter is well documented in-schema (ID sourcing, max 50, no partial processing). The description adds little parameter-level detail beyond restating the batch limit, 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?

States a specific verb+resource ('Stellt bis zu 50 Zuordnungen aus Beleg und Zahlung ... in einem Aufruf her') and quantifies the batch scope. It also explicitly distinguishes itself from the sibling bb_transactions_assign_receipt, so an agent can route correctly without opening either schema.

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

Usage Guidelines5/5

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

Gives an explicit when-not rule ('für ein einzelnes Paar dieses Werkzeug nicht nehmen') and names the single-pair alternative plus the reverse operation (bb_transactions_unassign_receipt). The batch-vs-single decision is fully resolved in prose.

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

bb_transactions_createZahlung anlegenA

Legt in BuchhaltungsButler eine Zahlung auf einem echten Zahlungskonto an, also einen Kontoumsatz. Zu nehmen für Vorgänge, die kein Bankabruf einspielt, zum Beispiel eine Barzahlung über 47.60 auf dem Kassenkonto. Buchungssätze entstehen dabei nicht: Die legt bb_postings_create_for_transaction an, und einen Beleg verknüpft bb_transactions_assign_receipt. payment_account_number bezeichnet das Zahlungskonto und nicht das Sachkonto der Buchung. Der Umsatz verändert Kontostand und Abstimmung sofort. Schreibt in die echten Buchhaltungsdaten von BuchhaltungsButler. Die API bietet keinen Endpunkt, das rückgängig zu machen.

ParametersJSON Schema
NameRequiredDescriptionDefault
amountYesBetrag der Zahlung, positiv für einen Eingang und negativ für einen Ausgang. Dezimalpunkt, kein Tausendertrennzeichen, als Zeichenkette übergeben, zum Beispiel "123.99". 0.00 ist kein gültiger Betrag.
purposeNoVerwendungszweck der Zahlung. Soll er leer bleiben, das Feld weglassen: Dieser Server lehnt leere Strings an jedem Feld ab, auch wo die Spezifikation sie zulässt.
to_fromYesZahlender oder Empfänger der Zahlung, zum Beispiel 'Muster GmbH'.
currencyNoOhne Angabe bucht BuchhaltungsButler in der Währung des Zahlungskontos; die Spezifikation beschreibt den Betrag ausdrücklich als Betrag in der Kontowährung. Welche Währung ein Zahlungskonto führt, gibt die API an keiner Stelle preis — diesen Wert also nur setzen, wenn er aus dem Vorgang bekannt ist.
bank_codeNoBankleitzahl oder BIC der Gegenseite, zum Beispiel 'BYLADEM1001'.
bank_nameNoName der Bank der Gegenseite.
value_dateNoWertstellungsdatum der Zahlung als YYYY-MM-DD HH:MM:SS, zum Beispiel 2026-04-26 13:45:00. Ein reines Datum YYYY-MM-DD gilt als 23:59:59 dieses Tages. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. Ohne Angabe übernimmt BuchhaltungsButler den Wert von booking_date.
booking_dateYesBuchungsdatum der Zahlung als YYYY-MM-DD HH:MM:SS, zum Beispiel 2026-04-26 13:45:00. Ein reines Datum YYYY-MM-DD gilt als 23:59:59 dieses Tages. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen.
booking_textNoBuchungstext der Zahlung, zum Beispiel 'SEPA-Überweisung'. Soll er leer bleiben, das Feld weglassen.
account_numberNoKontonummer oder IBAN der Gegenseite, zum Beispiel 'DE02120300000000202051'.
transaction_typeNoArt der Zahlung als Freitext, zum Beispiel 'Direct debit'. Der Body-Parameter der API heißt type; dieser Name ist in der Spezifikation mehrfach mit anderer Bedeutung belegt.
payment_referenceNoZahlungsreferenz des Vorgangs. Trifft sie zu, ordnet BuchhaltungsButler die angelegte Zahlung dem passenden Beleg selbst zu.
payment_account_numberYesSachkontonummer, die ein Zahlungskonto bezeichnet, zum Beispiel '1200'. Nicht das Sachkonto, auf das gebucht wird. Zahlungskonten auflisten mit bb_payment_accounts_list. Das Konto muss im Mandanten als Zahlungskonto vorhanden sein. Der Body-Parameter der API heißt account.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
createdNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A5/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses that no Buchungssätze are produced, that Kontostand and Abstimmung change immediately, that it writes into live accounting data, and that the API offers no endpoint to reverse it. These are exactly the operational facts an agent needs and none are in readOnlyHint/openWorldHint/destructiveHint.

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?

Dense and front-loaded: purpose first, then the use case, then the downstream-consequence and irreversibility clauses. Every sentence carries information, with no filler.

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?

An output schema exists, so return values need no explanation, and the description fills the remaining gaps: irreversible write, immediate balance impact, no posting created, and parameter disambiguation. Nothing needed to call it safely is missing.

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?

Schema coverage is already 100%, but the description adds real meaning: payment_account_number refers to the Zahlungskonto and not the posting account (a point the schema's own wording muddies), and it points to bb_payment_accounts_list. This resolves genuine ambiguity beyond the schema text.

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?

Names a specific verb+resource (legt eine Zahlung/Kontoumsatz auf einem echten Zahlungskonto an) and pins the scope: it is for transactions that no bank fetch supplies, with a cash-payment example. It explicitly distinguishes itself from bb_postings_create_for_transaction and bb_transactions_assign_receipt, so an agent can route correctly without opening other schemas.

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

Usage Guidelines5/5

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

States when to use it (Vorgänge, die kein Bankabruf einspielt, z.B. Barzahlung über 47.60 auf dem Kassenkonto), when not to expect postings, and names the sibling tools for posting and receipt-linking. Exclusions and alternatives are both explicit.

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

bb_transactions_create_batchZahlungen im Stapel anlegenA

Legt bis zu 50 Zahlungen in BuchhaltungsButler in einem Aufruf an. Fachlich gleich bb_transactions_create, dessen Beschreibung die Felder erklärt; für eine einzelne Zahlung dieses Werkzeug nicht nehmen. Die API erlaubt nur einen Aufruf je fünf Sekunden. Schreibt in die echten Buchhaltungsdaten von BuchhaltungsButler. Die API bietet keinen Endpunkt, das rückgängig zu machen.

ParametersJSON Schema
NameRequiredDescriptionDefault
transactionsYesDie Zahlungen, die angelegt werden sollen. Ein Eintrag trägt dieselben Felder wie bb_transactions_create; dort heißt account allerdings payment_account_number. Höchstens 50 Einträge je Aufruf. Ein abgelehnter Stapel wird nicht teilweise verarbeitet.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
createdNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.9/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing a rate limit (one call per five seconds), that it writes into real BuchhaltungsButler accounting data, and that no API endpoint exists to reverse it. These are exactly the impact/irreversibility facts an agent needs before a write, and none are derivable from openWorldHint/idempotentHint alone.

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?

Five short, front-loaded sentences with no filler: what it does, which sibling to use instead, the rate limit, the write target, and the irreversibility. Every sentence carries distinct information.

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?

The tool is a batch write with an output schema present, so return values need not be explained. Between the description (scope, routing, rate limit, irreversibility) and the 100%-covered nested schema, an agent has everything needed to invoke it correctly.

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 description coverage is 100%, so the baseline is 3; the description adds value by directing the agent to the sibling's field documentation and warning that the same field is named account here but payment_account_number in bb_transactions_create. It does not restate per-field syntax, which is acceptable given the schema already carries it.

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 (legt bis zu 50 Zahlungen ... an) plus the hard batch ceiling of 50 in one call. It explicitly separates itself from bb_transactions_create, so an agent can pick the right tool without opening either schema.

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

Usage Guidelines5/5

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

Gives an explicit negative routing rule ('für eine einzelne Zahlung dieses Werkzeug nicht nehmen') and names the alternative (bb_transactions_create) whose description explains the fields. The 5-second call limit further constrains when this tool is viable.

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

bb_transactions_getZahlung holenA
Read-onlyIdempotent

Holt genau eine Zahlung aus BuchhaltungsButler über ihre mandantenbezogene Nummer. Zu nehmen, sobald die id_by_customer einer Zahlung vorliegt, etwa aus einem Ergebnis von bb_transactions_search. Dieser Einzelabruf liefert 13 Felder, darunter account, currency und die Bankdaten der Gegenseite; die Liste aus bb_transactions_search führt nur sechs davon. Er sucht nicht und blättert nicht: genau eine Zahlung je Aufruf.

ParametersJSON Schema
NameRequiredDescriptionDefault
response_formatNo'concise' liefert nur die Felder, die einen Datensatz erkennbar machen und den nächsten Schritt erlauben. 'detailed' liefert den Datensatz so, wie die BuchhaltungsButler-API ihn ausgibt. Mit 'concise' beginnen und nur für die wenigen Datensätze auf 'detailed' wechseln, die wirklich geprüft werden müssen. Dieses Feld ist serverseitig und geht nicht an die API.concise
transaction_id_by_customerYesDie mandantenbezogene Nummer der Zahlung, zu finden über bb_transactions_search. Keine globale Kennung. In Suchergebnissen erscheint sie als String; hier ohne Anführungszeichen übergeben.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
messageNo
successYes
endpointNo
_contract_warningsNo

TDQS

A4.5/5.0
Behavior4/5

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

The annotations already cover the safety profile (read-only, idempotent, open-world, non-destructive). The description adds meaningful behavioral context by contrasting the richer single-record output with the search list and by stating that it returns exactly one payment per call with no searching or pagination.

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 front-loaded and four sentences long, with each sentence serving a distinct purpose: what the tool does, when to use it, how its output differs from search, and its one-record scope. No sentence is wasted.

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 annotations, 100% schema coverage, and an existing output schema, the description is complete enough for correct invocation. It adds the key selection context an agent needs: use this after obtaining an id_by_customer, and expect richer fields than the search list.

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 both parameters are already fully documented in the schema. The description adds only a small amount of context about the customer-scoped ID and does not mention response_format, so the baseline of 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 states a specific verb and resource: it fetches exactly one payment from BuchhaltungsButler by its client-scoped number. It explicitly distinguishes this single-record retrieval from bb_transactions_search, noting that the list yields only six fields while this call yields thirteen.

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

Usage Guidelines5/5

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

It gives an explicit trigger: use this as soon as the id_by_customer is available, for example from a bb_transactions_search result. It also states a clear boundary—this tool does not search or paginate—which tells the agent when not to use it.

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

bb_transactions_list_receiptsBelege einer Zahlung auflistenA
Read-onlyIdempotent

Listet die Belege auf, die in BuchhaltungsButler einer bestimmten Zahlung zugeordnet sind. Zu nehmen, um vor einer Buchung zu prüfen, ob eine Zahlung schon einen Beleg trägt. Die Gegenrichtung, also die Zahlungen eines Belegs, liefert bb_receipts_list_transactions. Geliefert werden je Beleg nur id_by_customer und filename, keine Beträge; den Beleg selbst holt bb_receipts_get.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmed_onlyNoNur bestätigte Zuordnungen liefern. Ohne Angabe liefert die API auch unbestätigte; die Vorgabe der Spezifikation ist 'false'.
response_formatNo'concise' liefert nur die Felder, die einen Datensatz erkennbar machen und den nächsten Schritt erlauben. 'detailed' liefert den Datensatz so, wie die BuchhaltungsButler-API ihn ausgibt. Mit 'concise' beginnen und nur für die wenigen Datensätze auf 'detailed' wechseln, die wirklich geprüft werden müssen. Dieses Feld ist serverseitig und geht nicht an die API.concise
transaction_id_by_customerYesDie mandantenbezogene Nummer der Zahlung, zu finden über bb_transactions_search. Keine globale Kennung. In Suchergebnissen erscheint sie als String; hier ohne Anführungszeichen übergeben.

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
messageNo
successYes
endpointNo
limit_usedNo
offset_usedNo
more_possibleNo
rows_returnedNo
_contract_warningsNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false), so the description earns credit for adding return-shape context: only id_by_customer and filename, no amounts, and it routes to bb_receipts_get for the full record. It does not mention pagination or whether unconfirmed assignments appear by default (that lives in the schema), leaving a small gap.

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?

Four compact sentences, front-loaded with the purpose, then usage, then the alternative, then the return caveat. Every sentence carries information; only minor wording inefficiency ('Zu nehmen, um...').

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?

Covers selection criteria, the sibling alternative, and the notable return limitation, while an output schema exists to carry the rest. Nothing needed to call this read-only list tool correctly 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?

Schema description coverage is 100%, so all three parameters are documented in the schema, including the confirmed_only default behavior and response_format semantics. The description adds no parameter-level syntax beyond that, so baseline 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 (listet auf) and resource (Belege einer Zahlung) with the scoping qualifier 'einer bestimmten Zahlung zugeordnet'. It explicitly names the sibling that does the reverse direction (bb_receipts_list_transactions), so an agent can tell them apart immediately.

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

Usage Guidelines5/5

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

Gives the triggering scenario ('vor einer Buchung zu prüfen, ob eine Zahlung schon einen Beleg trägt') and names the complementary tool for the inverse query. When-to-use and the alternative are both explicit.

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

bb_transactions_unassign_receiptZuordnung Beleg zu Zahlung lösenA
Destructive

Löst in BuchhaltungsButler die Zuordnung zwischen einem Beleg und einer Zahlung. Zu nehmen, wenn ein Beleg der falschen Zahlung zugeordnet wurde. Welche Belege an einer Zahlung hängen, zeigt bb_transactions_list_receipts. Der Beleg selbst bleibt erhalten; als gelöscht markiert wird er mit bb_receipts_delete, und die Zahlung bleibt ohnehin unberührt. Hängt an der Zuordnung eine bestätigte Buchung, lehnt BuchhaltungsButler den Aufruf ab; die Buchung zuerst mit bb_postings_unconfirm_for_transaction entfernen. Schreibt in die echten Buchhaltungsdaten von BuchhaltungsButler. Rückgängig zu machen mit bb_transactions_assign_receipt.

ParametersJSON Schema
NameRequiredDescriptionDefault
receipt_id_by_customerYesDie mandantenbezogene Nummer des Belegs, zu finden über bb_receipts_search. Keine globale Kennung. In Suchergebnissen erscheint sie als String; hier ohne Anführungszeichen übergeben. Gelöst wird nur die Zuordnung dieses einen Belegs.
transaction_id_by_customerYesDie mandantenbezogene Nummer der Zahlung, zu finden über bb_transactions_search. Keine globale Kennung. In Suchergebnissen erscheint sie als String; hier ohne Anführungszeichen übergeben.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
messageNo
removedNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already mark this as destructive, non-idempotent and open-world, and the description adds substantial context beyond them: the receipt survives, the payment is untouched, real accounting data is written, and the call is rejected if a confirmed posting is attached. It even names the workaround tool.

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?

Purpose is front-loaded and every sentence carries distinct information (trigger, side effects, precondition, undo). Slightly long, but no filler.

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 destructive mutation with an output schema already defining return values, the description covers trigger, side effects, failure precondition, and reversal, leaving nothing an agent needs to call it safely.

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% and both parameters are thoroughly documented in the schema (tenant-relative IDs, string-vs-integer caveat). The description adds no parameter-level detail, so the baseline 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: it detaches the assignment between a receipt and a payment in BuchhaltungsButler. This is clearly distinguishable from siblings like bb_transactions_assign_receipt or bb_receipts_delete.

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

Usage Guidelines5/5

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

Explicitly names the trigger condition ('wenn ein Beleg der falschen Zahlung zugeordnet wurde') and points to the sibling that lists affected receipts (bb_transactions_list_receipts), the delete path (bb_receipts_delete), the undo path (bb_transactions_assign_receipt), and the required precondition tool (bb_postings_unconfirm_for_transaction).

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. 59 tool updatesv0.1.0
    • First observedbb_assignments_get
    • First observedbb_balances_get
    • First observedbb_comments_create
    • First observedbb_cost_locations_create
    • First observedbb_cost_locations_delete
    • First observedbb_cost_locations_search
    • First observedbb_cost_locations_update
    • First observedbb_creditors_create
    • First observedbb_creditors_create_batch
    • First observedbb_creditors_search
    • First observedbb_creditors_update
    • First observedbb_debtors_create
    • First observedbb_debtors_create_batch
    • First observedbb_debtors_search
    • First observedbb_debtors_update
    • First observedbb_invoices_create
    • First observedbb_invoices_create_draft
    • First observedbb_invoices_create_einvoice
    • First observedbb_masterdata_search
    • First observedbb_payment_accounts_create
    • First observedbb_payment_accounts_list
    • First observedbb_postingaccounts_create
    • First observedbb_postingaccounts_search
    • First observedbb_postingaccounts_update
    • First observedbb_postings_assign_receipt
    • First observedbb_postings_cancel
    • First observedbb_postings_create_for_receipt
    • First observedbb_postings_create_for_receipt_batch
    • First observedbb_postings_create_for_transaction
    • First observedbb_postings_create_for_transaction_batch
    • First observedbb_postings_create_free
    • First observedbb_postings_create_free_batch
    • First observedbb_postings_search
    • First observedbb_postings_unconfirm_for_receipt
    • First observedbb_postings_unconfirm_for_transaction
    • First observedbb_postings_unconfirm_free
    • First observedbb_receipts_create
    • First observedbb_receipts_create_batch
    • First observedbb_receipts_delete
    • First observedbb_receipts_get
    • First observedbb_receipts_list_transactions
    • First observedbb_receipts_restore
    • First observedbb_receipts_search
    • First observedbb_receipts_upload
    • First observedbb_records_collect
    • First observedbb_reports_create_bwa
    • First observedbb_reports_create_sums
    • First observedbb_reports_get_bwa
    • First observedbb_reports_get_ledger
    • First observedbb_reports_get_sums
    • First observedbb_reports_run
    • First observedbb_transactions_assign_receipt
    • First observedbb_transactions_assign_receipt_batch
    • First observedbb_transactions_create
    • First observedbb_transactions_create_batch
    • First observedbb_transactions_get
    • First observedbb_transactions_list_receipts
    • First observedbb_transactions_search
    • First observedbb_transactions_unassign_receipt

TDQS

A3.9/5.0

Scored across 59 tools

Disambiguation3/5

Tools have clearly distinct purposes overall, but several high-level tools (bb_masterdata_search, bb_records_collect, bb_assignments_get, bb_balances_get) explicitly replace or overlap with specific base tools, which can confuse tool selection. Descriptions help, but the functional overlap is real.

Naming Consistency3/5

Naming uses a consistent bb_ prefix and verb_noun pattern, but the convention is mixed with noun-first names like bb_payment_accounts_list, bb_postingaccounts_search, bb_receipts_create, and verb-first names like bb_transactions_assign_receipt, bb_postings_create_for_receipt, making the pattern less predictable.

Tool Count2/5

59 tools is very large for an accounting API wrapper, and the count is inflated by many near-duplicate operations (single vs batch, per-entity unconfirm, separate search/list tools). This heavy surface increases the risk of confusion and misselection.

Completeness3/5

Core CRUD for receipts, postings, master data, reports, and transactions is mostly covered, but there are notable gaps: no read/update/delete for invoices, no comments retrieval/deletion, no attachment handling for existing receipts, and some tools are read-only where write would be expected. These gaps are acknowledged in descriptions and may cause dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

  • Taokeh is accounting software for Malaysian SMEs — double-entry books, LHDN e-Invoice (MyInvois), SST, and full statutory payroll — and this connector opens a company's live books to the AI its owner already uses. 59 tools. The reads answer real questions from the ledger: P&L and balance sheet with server-computed comparisons, cash position, A/R and A/P aging, per-channel marketplace sales, an 8-week cash-flow forecast, tax position, document search with e-Invoice standing, and a one-call daily brief. The writes are drafts only — expenses, invoices, bills, quotes, purchase orders, receipts, credit and debit notes, adjusting journals, bank-statement imports and bank-row suggestions — every figure re-checked by the server, every draft waiting for a human tap in Taokeh. The AI can also work the Shoebox: staff snap paper on free phone logins, and the connector lists the pile, reads each photo, and files the draft with the original attached — the server maps its own stored copy, so the document trail stays byte-perfect. One connection is bound to one company at consent; no tool takes a company argument. Migrating from another system? The same connector stages the chart of accounts, opening balances, contacts, products, historical documents and workspace settings onto the owner's own review screens. Bring your own AI subscription — no per-call fees.

  • Malaysian SME accounting, e-Invoice and payroll for your AI. 64 tools; writes are approved drafts.

  • Set up and run an in-product AI assistant from your AI client: create and tune assistants, connect knowledge sources, host an MCP server on an existing API, and read usage. Every tool is annotated read-only or destructive, so writes ask before they act.

  • Connect Claude or Cursor to books, invoices, bills, payroll, and sealed closes.

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Integrates with the sevdesk German accounting API, providing 76 tools for full CRUD operations across contacts, invoices, vouchers, orders, credit notes, bank accounts, transactions, parts, tags, addresses, and communication ways.
    36 npm
    6
    MIT
  • A
    license
    C
    quality
    A
    maintenance
    Enables AI assistants to manage BuchhaltungsButler bookkeeping through all 48 API endpoints, with safety-categorized tools for read, write, and destructive operations.
    54
    6 npm
    4
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    MCP server exposing BuchhaltungsButler API tools for accounting, invoicing, and receipt management with curated, token-efficient endpoints.
    -
  • A
    license
    B
    quality
    C
    maintenance
    Enables AI assistants to interact with the BuchhaltungsButler accounting API via MCP, providing tools for managing receipts, transactions, invoices, postings, and master data directly from Claude Desktop and other MCP-compatible clients.
    23
    6 npm
    MIT