BuchhaltungsButler MCP-Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@BuchhaltungsButler MCP-ServerZeig mir die offenen Rechnungen aus dem letzten Monat"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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.nodederpackage.json. Sie kommt daher, dass die HTTP-Schichtundici@8benutzt, das selbst>=22.19.0verlangt. 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 setupDer Einrichtungsassistent
prüft Ihre Node-Version und sucht die auf Ihrem Rechner vorhandenen MCP-Clients,
fragt die drei Zugangsdaten maskiert ab,
testet die Verbindung mit einem einzigen lesenden Aufruf und sagt Ihnen im Klartext, ob API Client, API Secret oder der API Key nicht stimmt,
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,
fragt, ob der Server über
npxoder fest installiert gestartet werden soll,fragt, wo die Zugangsdaten liegen sollen: in einer eigenen Datei mit den Rechten
0600(Vorgabe), direkt in der Clientkonfiguration, oder nirgends,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,sagt je Client, was noch zu tun ist, etwa Claude Desktop vollständig zu beenden,
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-only5. 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 |
| nur im aktuellen Projekt | nein |
|
| nur im aktuellen Projekt | ja, über die Versionsverwaltung |
|
| in allen Projekten | nein |
|
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.jsonWindows:
%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-mcpOder 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-mcpMit --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 |
| auch über das Symbol „MCPs" im Cascade-Bereich erreichbar |
Zed |
| 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: | Tragen Sie unter |
Continue |
| MCP wirkt in Continue nur im Agent-Modus. YAML, Ablageort projektabhängig, deshalb nur Ausgabe |
LM Studio |
| lädt den Server nach dem Speichern selbst neu |
Jan | Settings, MCP Servers, „+ Add MCP Server": Command | 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 zedDie 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-mcpDer 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 # WindowsFü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 |
| API Client, Benutzername der Basic-Authentifizierung |
| API Secret, Passwort der Basic-Authentifizierung |
| der |
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 |
| Basis-URL der API. Muss |
|
| Profilname in der Zugangsdatendatei |
|
| Ort der Zugangsdatendatei |
|
|
|
|
| Kommaliste von Werkzeuggruppen. Gesetzt: nur diese Gruppen werden angemeldet (siehe 7.4) | nicht gesetzt, also alle zwölf |
| Kommaliste von Werkzeuggruppen, die abgezogen werden | nicht gesetzt |
| Obergrenze je Aufruf für jedes Stapel- und Positionsarray, zulässig 1 bis 50 |
|
| Betragsgrenze für buchende und anlegende Werkzeuge mit Betragsfeld | nicht gesetzt, also aus |
| Nachfüllrate des Standardeimers je Minute, 10 bis 100 |
|
| Zeitlimit der Stufe „normal", mindestens 5000 |
|
|
|
|
| weiche Kürzungsgrenze je Antwort |
|
| Haltbarkeit des Stammdatenspeichers, |
|
| Liste erlaubter Verzeichnisse für | leer, also kein Dateisystemzugriff |
| erlaubt |
|
|
|
|
| veralteter Name von | 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=turedarf 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 |
|
Windows |
|
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=bundlesDer 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 |
| 12 | 12.213 | Buchungen suchen, anlegen, stornieren, Belege an Buchungen binden |
| 8 | 8.529 | Belege suchen, hochladen, anlegen, löschen, wiederherstellen |
| 8 | 6.661 | Zahlungen suchen und anlegen, Belege an Zahlungen binden |
| 3 | 5.766 | Ausgangsrechnungen, Entwürfe, E-Rechnungen schreiben |
| 4 | 3.341 | Lieferanten nachschlagen, anlegen, ändern |
| 5 | 3.203 | BWA, Summen- und Saldenliste, Kontenblatt |
| 4 | 3.198 | Kunden nachschlagen, anlegen, ändern |
| 3 | 1.877 | Sachkonten nachschlagen, anlegen, ändern |
| 4 | 1.839 | Kostenstellen nachschlagen, anlegen, ändern, löschen |
| 2 | 1.142 | Zahlungskonten auflisten und anlegen |
| 1 | 599 | Kommentar an Beleg oder Zahlung hängen |
| 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 |
| nur die Bündel | 6.852 statt 55.220 |
Claude Desktop, mit Belegerfassung |
| 10 plus die Bündel | 16.523 |
Nur auswerten |
| 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:
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.
Derselbe Name in beiden Variablen. Ein echter Widerspruch; keine Seite gewinnt stillschweigend.
Ein Ausschluss ohne Wirkung, also ein Name in
BB_MCP_TOOL_GROUPS_EXCLUDE, der durchBB_MCP_TOOL_GROUPSohnehin nicht aktiv ist.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=trueStandard 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 |
|
Kontenblatt ( | verfügbar | verfügbar |
Kontostand und Kontenblatt ( | 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 ( | 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_BATCHbegrenzt 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_AMOUNTlehnt anlegende und buchende Aufrufe oberhalb eines Betrags ab. Als Dezimalzeichenkette angeben, etwa10000.00.BB_MCP_RATE_LIMITist 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=onlä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 listWelches 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 |
| anlegend | Hängt einen Kommentar an einen Beleg oder an eine Zahlung in BuchhaltungsButler. |
| 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. |
| anlegend | Legt in BuchhaltungsButler bis zu 50 Belege ohne Datei an, beim Import aus einem Vorsystem; höchstens ein Aufruf je fünf Sekunden. |
| löschend | Markiert einen Beleg in BuchhaltungsButler als gelöscht, zum Beispiel einen versehentlich doppelt angelegten Beleg. |
| 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. |
| lesend | Listet die Zahlungen, die in BuchhaltungsButler einem bestimmten Beleg zugeordnet sind, etwa um zu prüfen, ob eine Eingangsrechnung schon bezahlt wurde. |
| ä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. |
| lesend | Durchsucht die Belege eines Mandanten in BuchhaltungsButler, also Eingangs- und Ausgangsrechnungen samt Gutschriften, und liefert sie seitenweise. |
| 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 |
| ändernd | Ordnet in BuchhaltungsButler einen Beleg einer Zahlung zu. |
| ändernd | Stellt bis zu 50 Zuordnungen aus Beleg und Zahlung in BuchhaltungsButler in einem Aufruf her. |
| anlegend | Legt in BuchhaltungsButler eine Zahlung auf einem echten Zahlungskonto an, also einen Kontoumsatz. |
| anlegend | Legt bis zu 50 Zahlungen in BuchhaltungsButler in einem Aufruf an. |
| lesend | Holt genau eine Zahlung aus BuchhaltungsButler über ihre mandantenbezogene Nummer. |
| lesend | Listet die Belege auf, die in BuchhaltungsButler einer bestimmten Zahlung zugeordnet sind. |
| lesend | Sucht Zahlungen, also Kontoumsätze, in BuchhaltungsButler und liefert sie seitenweise. |
| löschend | Löst in BuchhaltungsButler die Zuordnung zwischen einem Beleg und einer Zahlung. |
Rechnungen
Werkzeug | Wirkung | Was es tut |
| anlegend | Erzeugt in BuchhaltungsButler eine endgültige Ausgangsrechnung, eine Gutschrift oder ein Angebot: nummeriert, als PDF und als Ausgangsbeleg der Buchhaltung. |
| anlegend | Erzeugt in BuchhaltungsButler einen Rechnungsentwurf: ohne endgültige Nummer, ohne PDF, aber als sichtbares Objekt in der Rechnungsstellung des Mandanten. |
| anlegend | Erzeugt in BuchhaltungsButler eine E-Rechnung: endgültig, nummeriert, mit PDF und strukturiertem Datensatz nach EN 16931. |
Buchungen
Werkzeug | Wirkung | Was es tut |
| ändernd | Bindet in BuchhaltungsButler einen vorhandenen Beleg an eine vorhandene freie Buchung. |
| löschend | Storniert in BuchhaltungsButler eine einzelne Buchungszeile. |
| anlegend | Legt die Buchungssätze zu einem bereits vorhandenen Beleg in BuchhaltungsButler an. |
| anlegend | Legt die Buchungssätze zu mehreren vorhandenen Belegen in BuchhaltungsButler in einem Aufruf an. |
| anlegend | Legt die Buchungssätze zu einer bereits vorhandenen Zahlung in BuchhaltungsButler an. |
| anlegend | Legt die Buchungssätze zu mehreren vorhandenen Zahlungen in BuchhaltungsButler in einem Aufruf an. |
| anlegend | Legt in BuchhaltungsButler eine freie Buchung an, also einen vollständigen Buchungssatz ohne Beleg- und Zahlungsbezug, etwa eine Umbuchung zwischen zwei Sachkonten. |
| anlegend | Legt in BuchhaltungsButler mehrere freie Buchungen in einem Aufruf an, also vollständige Buchungssätze ohne Beleg- und Zahlungsbezug. |
| lesend | Liest die Buchungssätze eines Zeitraums aus der Buchhaltung von BuchhaltungsButler. |
| löschend | Hebt in BuchhaltungsButler die Bestätigung der Buchungen eines Belegs auf und entfernt sie damit. |
| löschend | Hebt in BuchhaltungsButler die Bestätigung der Buchungen einer Zahlung auf und entfernt sie damit. |
| löschend | Hebt in BuchhaltungsButler die Bestätigung einer einzelnen freien Buchung auf und entfernt sie damit. |
Stammdaten
Werkzeug | Wirkung | Was es tut |
| anlegend | Legt ein Kreditorenkonto, also ein Lieferantenkonto, in BuchhaltungsButler an. |
| anlegend | Legt mehrere Kreditorenkonten in BuchhaltungsButler in einem Aufruf an. |
| lesend | Listet die Kreditorenkonten des Mandanten in BuchhaltungsButler auf, also die Lieferantenkonten, mit Kontonummer, Name und Anschrift. |
| ändernd | Überschreibt die Stammdaten eines Kreditorenkontos in BuchhaltungsButler, die Bankverbindung eingeschlossen. |
| anlegend | Legt ein Debitorenkonto, also ein Kundenkonto, in BuchhaltungsButler an. |
| anlegend | Legt mehrere Debitorenkonten in BuchhaltungsButler in einem Aufruf an. |
| lesend | Listet die Debitorenkonten des Mandanten in BuchhaltungsButler auf, also die Kundenkonten, mit Kontonummer, Name, Kundennummer und Anschrift. |
| ändernd | Überschreibt die Stammdaten eines Debitorenkontos in BuchhaltungsButler, Anschrift und Bankverbindung eingeschlossen. |
| anlegend | Legt ein manuell geführtes Zahlungskonto in BuchhaltungsButler an, etwa eine Kasse oder ein Kreditkartenkonto. |
| lesend | Listet die Zahlungskonten des Mandanten in BuchhaltungsButler auf, also Kassen, Bank- und Kreditkartenkonten. |
| anlegend | Legt ein neues Sachkonto im Kontenrahmen des Mandanten in BuchhaltungsButler an. |
| lesend | Durchsucht den Kontenrahmen des Mandanten in BuchhaltungsButler. |
| ändernd | Überschreibt die Bezeichnung eines Sachkontos in BuchhaltungsButler. |
Kostenstellen
Werkzeug | Wirkung | Was es tut |
| anlegend | Legt eine Kostenstelle in BuchhaltungsButler an, mit einem selbst gewählten code von höchstens 10 Zeichen und einer Bezeichnung. |
| löschend | Löscht eine Kostenstelle in BuchhaltungsButler über ihren code. |
| lesend | Listet die Kostenstellen des Mandanten in BuchhaltungsButler auf oder holt mit code genau eine. |
| ändernd | Überschreibt die Bezeichnung einer Kostenstelle in BuchhaltungsButler. |
Berichte
Werkzeug | Wirkung | Was es tut |
| anlegend | Stößt in BuchhaltungsButler die Erzeugung einer Betriebswirtschaftlichen Auswertung für einen Zeitraum an und liefert deren id_by_customer zurück. |
| 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. |
| lesend | Holt eine zuvor in BuchhaltungsButler erzeugte Betriebswirtschaftliche Auswertung ab, auf Wunsch samt Dateien. |
| lesend | Liefert das Kontenblatt eines Sachkontos aus BuchhaltungsButler für einen Zeitraum, also dessen Buchungen mit laufendem Saldo. |
| 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 dortfalse, 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 |
| 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. |
| 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. |
| 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'. |
| 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. |
| 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_searchbeantwortet „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_collectbeantwortet „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_getbeantwortet „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 esbb_receipts_get.bb_reports_runerzeugt 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. BeiBB_MCP_READ_ONLY=trueist 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 mitbb_reports_get_bwabeziehungsweisebb_reports_get_sumsabzuholen; 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 Siemax_wait_secondsdeshalb 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 beimax_wait_seconds=60nicht rechtzeitig fertig, wartet der Server allein 60 Sekunden und setzt dazu acht Anfragen ab, liegt also in jedem Fall über der Minute.bb_balances_getbeantwortet „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 |
| verändert nichts |
|
| überschreibt, löscht oder ersetzt Bestehendes |
|
| ein zweiter Aufruf ändert nichts mehr |
|
| spricht mit einem fremden System | überall |
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
autoApproveeintragen.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.
rowsist 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
limitnur 25 Zeilen. Wer die vollständige Liste will, musslimitsetzen.Ein Bericht ersetzt seinen Vorgänger.
bb_reports_create_bwaundbb_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 Einzelabrufdate_delivery; die Fälligkeit heißtdue_datebeziehungsweisedate_payment_due. Der Einzelabruf liefert außerdem mehr Felder als die Liste, die Zahlungsliste zum Beispiel keinaccount. Der Server prüft je Endpunkt gegen das, was dort tatsächlich kommt, und meldet Abweichungen in derselben Antwort.id_by_customerist 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_URLund 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_LEVELein.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-tokenizerin der Kodierungo200k_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 |
| Der Betreiber hat mit |
|
|
Angenommen werden PDF, XML, JPEG, PNG, BMP und TIFF. Der Typ wird am Inhalt bestimmt, nicht an der Endung.
Warnung.
BB_MCP_UPLOAD_DIRSundBB_MCP_UPLOAD_FROM_URLgeben 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 SieBB_MCP_UPLOAD_FROM_URLaus, wenn Sie es nicht ausdrücklich brauchen.
15. Verifikation
npx -y @dennismenken/buchhaltungsbutler-mcp doctorEine 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 |
Jede Antwort beginnt mit „NICHT KONFIGURIERT" | Der Server hat keine Zugangsdaten gefunden | Die Meldung nennt die fehlende Variable. |
| API Client oder API Secret ist falsch. Der API Key wurde damit noch nicht geprüft | Beide Werte in BuchhaltungsButler neu abschreiben |
| 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 |
|
Werkzeuge antworten mit einer Nur-Lesen-Absage |
| Variable entfernen oder auf |
Die Debitorenliste zeigt nur 25 Einträge | Die API liefert an | Den Assistenten bitten, |
Die Kontenliste scheint unvollständig | Zahlungskonten und Sachkonten sind zwei verschiedene Listen |
|
Codex meldet einen Zeitablauf beim Start | Der |
|
Eine gesetzte | Tippfehler im Namen | Der Server warnt auf stderr und nennt den ähnlichsten bekannten Namen. |
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_GROUPSnur 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_deleteundbb_receipts_restoreist 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: falsebei 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:
Die neue Spezifikationsdatei einspielen und
pnpm generateausführen. Die Vollständigkeitsprüfung P1 schlägt fehl und nennt den neuen Pfad.Eine Datei
src/registry/tools/<werkzeugname>.tsanlegen. Der Dateiname ist der Werkzeugname.Den Eintrag nach dem Typ
ToolEntryfüllen: Name, Titel, Pfad, Wirkung, Klasse, Beschreibung mit dem passenden Pflichtsatz, alle Felder,verifyWith, Eimer, Zeitlimitstufe,conciseund Antwortvertrag.pnpm generateerneut 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.pnpm testausfü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 testKein 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 toolsbb_assignments_getVorgang mit Zuordnungen holenARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| max_rows | No | Hö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_only | No | Wenn 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_format | No | '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_customer | No | Die 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_customer | No | Die 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
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| bundle | Yes | |
| record | No | |
| success | Yes | |
| enriched | No | |
| assignments | Yes | |
| not_enriched | No | |
| confirmed_only | No | |
| id_by_customer | No | |
| assignment_count | No | |
| assignments_status | Yes |
TDQS
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.
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.
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.
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.
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.
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 KontenblattARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Datumsgrundlage. 'date' ist das Buchungs- oder Rechnungsdatum, 'date_delivery_else_date' das Leistungsdatum und hilfsweise das Buchungsdatum. Vorgabe ist 'date'. | |
| account | Yes | Das 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_to | Yes | Letzter Tag des Zeitraums, eingeschlossen, als YYYY-MM-DD. Für den heutigen Bestand das heutige Datum setzen. | |
| max_rows | No | Hö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_from | Yes | Erster 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_format | No | '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
| Name | Required | Description |
|---|---|---|
| rows | Yes | |
| bundle | Yes | |
| period | No | |
| account | Yes | |
| success | Yes | |
| rows_shown | No | |
| balance_end | Yes | |
| rows_omitted | No | |
| posting_count | No | |
| standard_chart | No | |
| integrity_error | No | |
| account_candidates | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| comment_text | Yes | Der Kommentartext, 2 bis 210 Zeichen. Für alle Nutzer des Mandanten sichtbar und über die API weder änderbar noch löschbar. | |
| receipt_id_by_customer | No | Die 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_customer | No | Die 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| created | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Alphanumerischer 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. | |
| name | Yes | Bezeichnung der Kostenstelle, zum Beispiel Vertrieb Nord oder Projekt Neubau. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| created | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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öschenADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Code der zu löschenden Kostenstelle, zum Beispiel abc123. Nachschlagen mit bb_cost_locations_search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| message | No | |
| removed | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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_searchKostenstellen auflistenARead-onlyIdempotent
Listet die Kostenstellen des Mandanten in BuchhaltungsButler auf oder holt mit code genau eine. Gedacht zum Nachschlagen, bevor eine Buchungszeile über cost_location einer Kostenstelle zugeordnet wird. Eine numerische Kennung gibt es nicht, der code ist der Schlüssel. Geliefert werden nur code und name, keine Auswertung und keine Summen. Höchstens 1000 Zeilen je Aufruf.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Code genau einer Kostenstelle, zum Beispiel abc123. Mit dieser Angabe liefert der Endpunkt nur diese eine Kostenstelle, ohne sie alle. | |
| limit | No | Zeilen je Aufruf. Harte Obergrenze 1000. Größere Werte lehnt die API ab, sie kappt sie nicht. | |
| offset | No | Zahl der zu überspringenden Zeilen. Die zweite Seite einer Suche mit limit=100 holt offset=100. | |
| response_format | No | '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
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| limit_used | No | |
| offset_used | No | |
| more_possible | No | |
| rows_returned | No | |
| _contract_warnings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, so this description's job is to add beyond that, and it does: it discloses the returned payload (only code and name, no analysis or sums) and the per-call row cap of 1000. It does not state auth requirements or behavior when code yields no match, so not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the primary purpose, then the workflow, key semantics, return shape and row cap. Each sentence carries information, though restating the return fields is mildly redundant given that an output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, workflow placement, identifier semantics, return scope and pagination limits. With an output schema present, return values need not be spelled out, so nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 goes further by clarifying the identifier model (no numeric ID, code is the key), which is genuine semantic meaning for the code parameter and not merely a restatement of the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (listet) plus resource (Kostenstellen des Mandanten), and adds the exact-code retrieval variant in the same breath. An agent can distinguish this read/lookup tool from the create/delete/update 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the use case: lookup before a posting line is assigned via cost_location. That is clear context, but it names no alternatives or exclusions (e.g. when to prefer assignment-time resolution instead of a separate lookup).
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 überschreibenADestructiveIdempotent
Ü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.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Code der zu ändernden Kostenstelle, zum Beispiel abc123. Er ist der Identifikator und lässt sich nicht ändern. Nachschlagen mit bb_cost_locations_search. | |
| name | Yes | Neue Bezeichnung der Kostenstelle, zum Beispiel Vertrieb Nord. Sie ersetzt die bisherige vollständig. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| changed | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| bic | No | BIC der Bankverbindung, zum Beispiel BYLADEM1001. | |
| zip | No | Postleitzahl, zum Beispiel "28195". | |
| city | No | Ort, zum Beispiel Bremen. | |
| iban | No | IBAN der Bankverbindung, zum Beispiel DE02120300000000202051. | |
| name | Yes | Name des Lieferantenkontos, zum Beispiel Musterlieferant GmbH. | |
| No | E-Mail-Adresse, zum Beispiel rechnung@beispiel.de. | ||
| street | No | Straße und Hausnummer, zum Beispiel Hauptstraße 12. | |
| country | No | Land, zum Beispiel Deutschland oder DE. | |
| due_in_days | No | Zahlungsfrist 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_id | No | Umsatzsteuer-Identifikationsnummer, zum Beispiel DE123456789. | |
| contact_person_name | No | Name der Ansprechperson, zum Beispiel Maria Schmidt. | |
| postingaccount_number | No | Kontonummer des neuen Kreditorenkontos als Zeichenkette. Ohne Angabe vergibt BuchhaltungsButler die nächste freie Nummer. Belegte Nummern zeigt bb_creditors_search. | |
| additional_address_line | No | Zusätzliche Adresszeile, zum Beispiel Gebäude B. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| created | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| creditors | Yes | Die 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| created | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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_searchKreditoren auflistenARead-onlyIdempotent
Listet die Kreditorenkonten des Mandanten in BuchhaltungsButler auf, also die Lieferantenkonten, mit Kontonummer, Name und Anschrift. Gedacht zum Nachschlagen, bevor eine Eingangsrechnung einem Lieferanten zugeordnet wird. Sachkonten, Zahlungskonten und Debitoren liefert dieser Endpunkt nicht; dafür bb_postingaccounts_search. Einen Filter kennt er nicht, und die Zahlungsfrist due_in_days liefert er nicht mit. Ohne ausdrückliches limit liefert die API nur 25 Zeilen.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Zeilen je Aufruf. Die API dokumentiert hier keine Obergrenze für limit. Wird der Aufruf mit 'invalid limit specified' abgelehnt, den Wert halbieren. Ohne ausdrückliches limit liefert die API nur 25 Zeilen; dieses Werkzeug sendet deshalb immer ein limit mit. | |
| offset | No | Zahl der zu überspringenden Zeilen. Die zweite Seite einer Suche mit limit=100 holt offset=100. | |
| response_format | No | '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
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| limit_used | No | |
| offset_used | No | |
| more_possible | No | |
| rows_returned | No | |
| _contract_warnings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, open-world). The description adds real behavior: no filtering support, due_in_days is not returned, and the API's 25-row default when no limit is sent. It stops short of describing pagination semantics or the response_format trade-off, which are only in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded: purpose first, then scoping exclusions, then the alternative tool, then the behavioral caveats. Slightly dense in the second half but every sentence adds information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 re-explained. The description covers scope, exclusions, the sibling alternative, and the key API quirk. Only minor gaps remain (pagination chaining between offset/limit is left to the schema).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter (limit, offset, response_format) is documented in detail, including the retry-on-'invalid limit specified' hint. Baseline 3 applies; the description only restates the 25-row default already present in the limit description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('listet die Kreditorenkonten ... Lieferantenkonten') with the returned fields named (Kontonummer, Name, Anschrift). It explicitly excludes Sachkonten, Zahlungskonten and Debitoren and points to bb_postingaccounts_search as the sibling for those, so an agent can distinguish it from every near neighbour.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete when-to-use ('Gedacht zum Nachschlagen, bevor eine Eingangsrechnung einem Lieferanten zugeordnet wird'), explicitly states what it does not cover and where to go instead (bb_postingaccounts_search), and warns about the no-filter limitation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bb_creditors_updateKreditorenkonto überschreibenADestructiveIdempotent
Ü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.
| Name | Required | Description | Default |
|---|---|---|---|
| bic | No | BIC der Bankverbindung, zum Beispiel BYLADEM1001. | |
| zip | No | Postleitzahl, zum Beispiel "28195". | |
| city | No | Ort, zum Beispiel Bremen. | |
| iban | No | IBAN der Bankverbindung, zum Beispiel DE02120300000000202051. | |
| name | No | Neuer Name des Lieferantenkontos, zum Beispiel Musterlieferant GmbH. | |
| No | E-Mail-Adresse, zum Beispiel rechnung@beispiel.de. | ||
| street | No | Straße und Hausnummer, zum Beispiel Hauptstraße 12. | |
| country | No | Land, zum Beispiel Deutschland oder DE. | |
| due_in_days | No | Neue 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_id | No | Umsatzsteuer-Identifikationsnummer, zum Beispiel DE123456789. | |
| contact_person_name | No | Name der Ansprechperson, zum Beispiel Maria Schmidt. | |
| postingaccount_number | Yes | Kontonummer 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_line | No | Zusätzliche Adresszeile, zum Beispiel Gebäude B. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| changed | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| bic | No | BIC der Bankverbindung, zum Beispiel BYLADEM1001. | |
| zip | No | Postleitzahl, zum Beispiel "28195". | |
| city | No | Ort, zum Beispiel Bremen. | |
| iban | No | IBAN der Bankverbindung, zum Beispiel DE02120300000000202051. | |
| name | Yes | Name des Kundenkontos, zum Beispiel Musterkunde GmbH. | |
| No | E-Mail-Adresse, zum Beispiel rechnung@beispiel.de. | ||
| street | No | Straße und Hausnummer, zum Beispiel Hauptstraße 12. | |
| country | No | Land, zum Beispiel Deutschland oder DE. | |
| sales_tax_id | No | Umsatzsteuer-Identifikationsnummer, zum Beispiel DE123456789. | |
| customer_number | No | Kunden- oder Lieferantennummer des Mandanten. | |
| contact_person_name | No | Name der Ansprechperson, zum Beispiel Maria Schmidt. | |
| postingaccount_number | No | Kontonummer des neuen Debitorenkontos als Zeichenkette. Ohne Angabe vergibt BuchhaltungsButler die nächste freie Nummer. Belegte Nummern zeigt bb_debtors_search. | |
| additional_address_line | No | Zusätzliche Adresszeile, zum Beispiel Gebäude B. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| created | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| debtors | Yes | Die 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| created | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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_searchDebitoren auflistenARead-onlyIdempotent
Listet die Debitorenkonten des Mandanten in BuchhaltungsButler auf, also die Kundenkonten, mit Kontonummer, Name, Kundennummer und Anschrift. Gedacht zum Nachschlagen, bevor eine Ausgangsrechnung einem Kunden zugeordnet wird. Sachkonten, Zahlungskonten und Kreditoren liefert dieser Endpunkt nicht; dafür bb_postingaccounts_search. Einen Filter kennt er nicht, gesucht wird in der gelieferten Liste. Ohne ausdrückliches limit liefert die API nur 25 Zeilen.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Zeilen je Aufruf. Die API dokumentiert hier keine Obergrenze für limit. Wird der Aufruf mit 'invalid limit specified' abgelehnt, den Wert halbieren. Ohne ausdrückliches limit liefert die API nur 25 Zeilen; dieses Werkzeug sendet deshalb immer ein limit mit. | |
| offset | No | Zahl der zu überspringenden Zeilen. Die zweite Seite einer Suche mit limit=100 holt offset=100. | |
| response_format | No | '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
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| limit_used | No | |
| offset_used | No | |
| more_possible | No | |
| rows_returned | No | |
| _contract_warnings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/non-destructive, so the safety profile is covered. The description adds genuinely new behavior: no server-side filtering and a 25-row default when no limit is sent, plus the note that the tool always sends a limit. It stops short of describing pagination totals or response shape, which the output schema carries.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences that front-load the purpose, then the alternative, then the paging caveat. The 25-row statement duplicates the schema's limit description, which is the only redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, rich annotations, and fully documented parameters, the description covers everything an agent still needs to know: scope, exclusion, alternative route, no filtering, and the default page size.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the limit/offset/response_format descriptions are already detailed in the schema, including the 25-row default and the 'invalid limit specified' halving advice. The description's limit remark largely repeats what the schema already says, 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Listet die Debitorenkonten des Mandanten') and enumerates the returned fields (Kontonummer, Name, Kundennummer, Anschrift). It explicitly excludes Sachkonten, Zahlungskonten and Kreditoren and names bb_postingaccounts_search as the sibling for those, so an agent can separate it from the many other *_search tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the concrete moment of use ('Nachschlagen, bevor eine Ausgangsrechnung einem Kunden zugeordnet wird') and an explicit an alternative-tool route ('dafür bb_postingaccounts_search'). It also warns that the endpoint has no filter, which is usage-limiting information an agent needs before calling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bb_debtors_updateDebitorenkonto überschreibenADestructiveIdempotent
Ü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.
| Name | Required | Description | Default |
|---|---|---|---|
| bic | No | BIC der Bankverbindung, zum Beispiel BYLADEM1001. | |
| zip | No | Postleitzahl, zum Beispiel "28195". | |
| city | No | Ort, zum Beispiel Bremen. | |
| iban | No | IBAN der Bankverbindung, zum Beispiel DE02120300000000202051. | |
| name | No | Neuer Name des Kundenkontos, zum Beispiel Musterkunde GmbH. | |
| No | E-Mail-Adresse, zum Beispiel rechnung@beispiel.de. | ||
| street | No | Straße und Hausnummer, zum Beispiel Hauptstraße 12. | |
| country | No | Land, zum Beispiel Deutschland oder DE. | |
| sales_tax_id | No | Umsatzsteuer-Identifikationsnummer, zum Beispiel DE123456789. | |
| customer_number | No | Kunden- oder Lieferantennummer des Mandanten. | |
| contact_person_name | No | Name der Ansprechperson, zum Beispiel Maria Schmidt. | |
| postingaccount_number | Yes | Kontonummer 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_line | No | Zusätzliche Adresszeile, zum Beispiel Gebäude B. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| changed | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| zip | No | Postleitzahl, zum Beispiel "28195". | |
| city | No | Ort, zum Beispiel Bremen. | |
| date | Yes | Rechnungsdatum 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. | |
| No | E-Mail-Adresse, zum Beispiel rechnung@beispiel.de. | ||
| items | Yes | Die 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. | |
| street | No | Straße und Hausnummer, zum Beispiel Hauptstraße 12. | |
| country | No | Land des Empfängers, deutscher Ländername oder ISO-Code, zum Beispiel DK. | |
| due_days | No | Tage bis zur Fälligkeit, Ziffernfolge, zum Beispiel 14. Nur dieses Feld erzeugt ein Fälligkeitsdatum. Die Vorgabe ohne Angabe ist hier nicht dokumentiert. | |
| language | No | Sprache der festen Beschriftungen: 'de_DE' oder 'en_US', ohne Angabe 'de_DE'. Positionstexte werden nicht übersetzt. | |
| company_name | Yes | Firmenname des Empfängers, wie er auf dem Dokument erscheint. | |
| invoice_type | Yes | Art des Dokuments: 'invoice' Rechnung, 'credit' Gutschrift, 'offer' Angebot. Heißt in der API type, hier umbenannt: type ist dort siebenfach belegt. | |
| discount_type | No | Rabatt auf die gesamte Rechnung: 'percent' Prozent, 'EUR' Euro. Positionsrabatte kennt die API nicht; gemeinsam mit discount_value setzen. | |
| invoicenumber | No | Rechnungsnummer. Ohne Angabe vergibt BuchhaltungsButler sie aus dem eigenen Nummernkreis. | |
| show_bankdata | No | true zeigt die im Mandanten hinterlegte Bankverbindung auf dem Dokument. Die Bankdaten selbst stammen aus den Mandanteneinstellungen. | |
| correspondence | No | Anschreiben an den Empfänger, erscheint vor den Positionen. | |
| date_of_supply | No | Liefer- 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_value | No | Höhe des Rabatts mit Dezimalpunkt, zum Beispiel 10 oder 49.50. Die Bedeutung entscheidet discount_type. | |
| customer_number | No | Kunden- oder Lieferantennummer des Mandanten. | |
| final_provisions | No | Schlusstext des Dokuments, erscheint nach den Positionen. | |
| show_contactdata | No | true zeigt die im Mandanten hinterlegten Kontaktdaten auf dem Dokument. | |
| show_prices_type | Yes | Preisdarstellung: 'net' Nettopreise, 'gross' Bruttopreise. Danach werden die Werte in item_single_price gelesen. | |
| payment_reference | No | Zahlungsreferenz für die spätere Zuordnung zu einer Zahlung: Amazon-Bestellnummer oder Vorgangsnummer von PayPal oder Stripe. | |
| payment_conditions | No | Zahlungsbedingungen als Text auf dem Dokument. Erzeugt kein Fälligkeitsdatum, dafür ist due_days da. | |
| recurring_interval | No | Rhythmus 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_name | No | Name der Ansprechperson, zum Beispiel Maria Schmidt. | |
| recurring_date_next | No | Nächster Termin des Rechnungsplans als YYYY-MM-DD. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. Pflicht, sobald recurring_interval gesetzt ist. | |
| additional_addressline | No | Zusätzliche Adresszeile, zum Beispiel Gebäude B. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| created | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| zip | No | Postleitzahl, zum Beispiel "28195". | |
| city | No | Ort, zum Beispiel Bremen. | |
| date | Yes | Rechnungsdatum 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. | |
| No | E-Mail-Adresse, zum Beispiel rechnung@beispiel.de. | ||
| items | Yes | Die 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. | |
| street | No | Straße und Hausnummer, zum Beispiel Hauptstraße 12. | |
| country | No | Land des Empfängers, deutscher Ländername oder ISO-Code, zum Beispiel DK. | |
| language | No | Sprache der festen Beschriftungen: 'de_DE' oder 'en_US', ohne Angabe 'de_DE'. Positionstexte werden nicht übersetzt. | |
| company_name | Yes | Firmenname des Empfängers, wie er auf dem Dokument erscheint. | |
| invoice_type | Yes | Art des Dokuments: 'invoice' Rechnung, 'credit' Gutschrift, 'offer' Angebot. Heißt in der API type, hier umbenannt: type ist dort siebenfach belegt. | |
| discount_type | No | Rabatt auf die gesamte Rechnung: 'percent' Prozent, 'EUR' Euro. Positionsrabatte kennt die API nicht; gemeinsam mit discount_value setzen. | |
| show_bankdata | No | true zeigt die im Mandanten hinterlegte Bankverbindung auf dem Dokument. Die Bankdaten selbst stammen aus den Mandanteneinstellungen. | |
| correspondence | No | Anschreiben an den Empfänger, erscheint vor den Positionen. | |
| date_of_supply | No | Liefer- 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_value | No | Höhe des Rabatts mit Dezimalpunkt, zum Beispiel 10 oder 49.50. Die Bedeutung entscheidet discount_type. | |
| customer_number | No | Kunden- oder Lieferantennummer des Mandanten. | |
| final_provisions | No | Schlusstext des Dokuments, erscheint nach den Positionen. | |
| show_contactdata | No | true zeigt die im Mandanten hinterlegten Kontaktdaten auf dem Dokument. | |
| show_prices_type | Yes | Preisdarstellung: 'net' Nettopreise, 'gross' Bruttopreise. Danach werden die Werte in item_single_price gelesen. | |
| payment_conditions | No | Zahlungsbedingungen als Text auf dem Dokument. Ein Fälligkeitsdatum entsteht daraus nicht; das Feld due_days führt dieser Endpunkt nicht. | |
| recurring_interval | No | Rhythmus 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_name | No | Name der Ansprechperson, zum Beispiel Maria Schmidt. | |
| recurring_date_next | No | Nächster Termin des Rechnungsplans als YYYY-MM-DD. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. Pflicht, sobald recurring_interval gesetzt ist. | |
| additional_addressline | No | Zusätzliche Adresszeile, zum Beispiel Gebäude B. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| created | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| zip | Yes | Postleitzahl, zum Beispiel "28195". | |
| city | Yes | Ort, zum Beispiel Bremen. | |
| date | Yes | Rechnungsdatum 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. | |
| Yes | E-Mail-Adresse des Empfängers. Hier Pflicht, an bb_invoices_create nicht. | ||
| items | Yes | Die 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. | |
| street | Yes | Straße und Hausnummer, zum Beispiel Hauptstraße 12. | |
| country | Yes | Land des Empfängers, deutscher Ländername oder ISO-Code, zum Beispiel DK. | |
| due_days | No | Tage 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. | |
| language | No | Sprache der festen Beschriftungen: 'de_DE' oder 'en_US', ohne Angabe 'de_DE'. Positionstexte werden nicht übersetzt. | |
| company_name | Yes | Firmenname des Empfängers, wie er auf dem Dokument erscheint. | |
| e_invoice_id | Yes | Käuferreferenz des Empfängers, in der Norm die Leitweg-Identifikationsnummer. Ohne eigene Referenz '0' senden; öffentliche Auftraggeber geben sie vor. | |
| invoice_type | Yes | Art des Dokuments: 'invoice' Rechnung, 'credit' Gutschrift, 'offer' Angebot. Heißt in der API type, hier umbenannt: type ist dort siebenfach belegt. | |
| discount_type | No | Rabatt auf die gesamte Rechnung: 'percent' Prozent, 'EUR' Euro. Positionsrabatte kennt die API nicht; gemeinsam mit discount_value setzen. | |
| invoicenumber | No | Rechnungsnummer. Ohne Angabe vergibt BuchhaltungsButler sie aus dem eigenen Nummernkreis. | |
| show_bankdata | No | true zeigt die im Mandanten hinterlegte Bankverbindung auf dem Dokument. Die Bankdaten selbst stammen aus den Mandanteneinstellungen. | |
| correspondence | No | Anschreiben an den Empfänger, erscheint vor den Positionen. | |
| date_of_supply | No | Liefer- 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_value | No | Höhe des Rabatts mit Dezimalpunkt, zum Beispiel 10 oder 49.50. Die Bedeutung entscheidet discount_type. | |
| customer_number | No | Kunden- oder Lieferantennummer des Mandanten. | |
| final_provisions | No | Schlusstext des Dokuments, erscheint nach den Positionen. | |
| show_contactdata | No | true zeigt die im Mandanten hinterlegten Kontaktdaten auf dem Dokument. | |
| show_prices_type | Yes | Preisdarstellung: 'net' Nettopreise, 'gross' Bruttopreise. Danach werden die Werte in item_single_price gelesen. | |
| payment_reference | No | Zahlungsreferenz für die spätere Zuordnung zu einer Zahlung: Amazon-Bestellnummer oder Vorgangsnummer von PayPal oder Stripe. | |
| payment_conditions | No | Zahlungsbedingungen als Text auf dem Dokument. Erzeugt kein Fälligkeitsdatum, dafür ist due_days da. | |
| recurring_interval | No | Rhythmus 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_name | No | Name der Ansprechperson, zum Beispiel Maria Schmidt. | |
| recurring_date_next | No | Nächster Termin des Rechnungsplans als YYYY-MM-DD. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. Pflicht, sobald recurring_interval gesetzt ist. | |
| additional_addressline | No | Zusätzliche Adresszeile, zum Beispiel Gebäude B. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| created | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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_masterdata_searchStammdaten durchsuchenARead-onlyIdempotent
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. Ohne query kommt stattdessen der Arbeitskontext für den Sitzungsanfang: Zahlungskonten und Kostenstellen als Liste, der Kontenrahmen als Zusammenfassung. Ersetzt für die Frage nach einer Nummer bb_payment_accounts_list, bb_cost_locations_search, bb_postingaccounts_search, bb_debtors_search und bb_creditors_search; Adresse und Bankverbindung liefern weiterhin nur diese Einzelwerkzeuge. Die Einzelkonten des Kontenrahmens kommen nie vollständig mit, er wiegt grob 60.000 Token. Höchstens 5 Aufrufe an die API; die Antwort sagt in bundle.complete, wenn dabei etwas offen geblieben ist.
| Name | Required | Description | Default |
|---|---|---|---|
| areas | No | Bereiche, in denen gesucht wird; ohne Angabe alle fünf. payment_accounts sind die Zahlungskonten (Kassen, Bank- und Kreditkartenkonten), posting_accounts die Sachkonten des Kontenrahmens, debtors die Kundenkonten, creditors die Lieferantenkonten, cost_locations die Kostenstellen. posting_accounts, debtors und creditors stammen aus demselben Endpunkt und kosten gemeinsam nicht mehr als einer davon. | |
| query | No | Suchbegriff, 2 bis 100 Zeichen. Teilzeichenkette ohne Beachtung der Groß- und Kleinschreibung, geprüft gegen den Namen und gegen die Kontonummer beziehungsweise den code. Beispiel: PayPal, Müller GmbH, 1200. Ohne Angabe kommt der Überblick über die Stammdaten statt einer Trefferliste. | |
| max_hits | No | Höchstzahl der Treffer JE BEREICH, nicht insgesamt, 1 bis 100, Vorgabe 20. Der Wert wirkt serverseitig und geht nicht an die API; gesucht wird immer im vollständig gelesenen Bestand, gekappt wird erst die Ausgabe. | |
| response_format | No | '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
| Name | Required | Description |
|---|---|---|
| areas | No | |
| notes | No | |
| query | No | |
| bundle | Yes | |
| debtors | No | |
| success | Yes | |
| creditors | No | |
| cost_locations | No | |
| payment_accounts | No | |
| posting_accounts | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), yet the description adds non-obvious behavior: a hard cap of 5 API calls, the fact that individual chart-of-accounts entries never come in full because they weigh ~60k tokens, and a bundle.complete flag signalling truncation. These are genuine operational traits an agent could not infer from 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is dense but front-loaded: the core find-anything capability comes first, then no-query mode, then sibling routing, then limits. Sentences are long and clause-heavy but every one carries distinct information; only slight tightening would be possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value documentation is unnecessary, and the description still flags the bundle.complete completion signal. Together with the API-call ceiling, the token warning, and the no-query behavior, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 areas, query, max_hits and response_format in detail. The description adds little parameter-specific guidance beyond what is in the schema, so the baseline of 3 for high coverage applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a concrete verb ('Findet') and enumerates the five resource types it can resolve (Zahlungskonto, Sachkonto, Debitor, Kreditor, Kostenstelle), plus the lookup keys (Name oder Nummer). It also states the key differentiator—you don't need to know which list holds the entry—which instantly distinguishes it from the per-entity search tools in the sibling set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the five sibling tools it replaces for number lookups (bb_payment_accounts_list, bb_cost_locations_search, bb_postingaccounts_search, bb_debtors_search, bb_creditors_search) and carves out the exception where those singles still win (Adresse und Bankverbindung). It also clarifies when to call it without a query (session start context) versus with one.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Bezeichnung des Zahlungskontos, zum Beispiel Kasse Ladengeschäft. | |
| is_revision_safe | No | true 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_type | Yes | Art 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_number | Yes | Sachkontonummer 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_transaction | No | true legt zu jedem Beleg, der diesem Zahlungskonto zugeordnet wird, selbsttätig eine Zahlung an. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| created | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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 auflistenARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | '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
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| limit_used | No | |
| offset_used | No | |
| more_possible | No | |
| rows_returned | No | |
| _contract_warnings | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Bezeichnung des neuen Sachkontos, zum Beispiel Softwarelizenzen Cloud. | |
| postingaccount_number | Yes | Nummer 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_number | Yes | Nummer des Vorlagekontos als ganze Zahl, zum Beispiel 4930. Das neue Konto erbt dessen Eigenschaften, etwa die Steuerbehandlung. Nachschlagen mit bb_postingaccounts_search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| created | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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_searchKontenrahmen durchsuchenARead-onlyIdempotent
Durchsucht den Kontenrahmen des Mandanten in BuchhaltungsButler. Die Liste ist eine Vereinigung: Sachkonten, Zahlungskonten, Debitoren und Kreditoren stehen darin nebeneinander und sind nur an type und subtype zu unterscheiden, etwa 'postingaccount' gegen 'account'. Beide Felder liefert dieses Werkzeug deshalb immer mit. Gedacht zum Nachschlagen einer Sachkontonummer, bevor gebucht wird. Nur die Zahlungskonten mit ihrer zugehörigen Sachkontonummer liefert bb_payment_accounts_list; ein neues Sachkonto legt bb_postingaccounts_create an. Kontostände und Buchungen liefert dieses Werkzeug nicht, dafür bb_reports_get_ledger. Ohne ausdrückliches limit liefert die API 1000 Zeilen; eine Obergrenze dokumentiert sie nicht.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Zeilen je Aufruf. Die API dokumentiert hier keine Obergrenze für limit. Wird der Aufruf mit 'invalid limit specified' abgelehnt, den Wert halbieren. | |
| order | No | Sortierung als Zeichenkette, zum Beispiel 'postingaccount_number ASC'. Sortierbar sind postingaccount_number, name und type, jeweils ASC oder DESC. | |
| offset | No | Zahl der zu überspringenden Zeilen. Die zweite Seite einer Suche mit limit=100 holt offset=100. | |
| exclude_debtors | No | true schließt alle Debitorenkonten aus dem Ergebnis aus. | |
| response_format | No | '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 |
| exclude_accounts | No | true schließt alle Zahlungskonten, also Kassen und Bankkonten aus dem Ergebnis aus. | |
| exclude_creditors | No | true schließt alle Kreditorenkonten aus dem Ergebnis aus. | |
| exclude_postingaccounts | No | true schließt alle Sachkonten aus dem Ergebnis aus. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| limit_used | No | |
| offset_used | No | |
| more_possible | No | |
| rows_returned | No | |
| _contract_warnings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, so safety is covered. The description adds real behavioral value beyond that: the union-of-types structure and that type/subtype are always returned, plus the API's implicit 1000-row default with no documented upper bound. It does not, however, discuss the response_format server-side behavior or pagination edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what the tool is, then the union caveat, then sibling routing, then scope exclusions. Each sentence carries information, though the routing sentences are dense enough that the paragraph runs long. Still efficient and well-ordered.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 annotations cover the safety profile. The description fills the remaining gaps: union composition, always-present type/subtype, intended use case, sibling alternatives, and out-of-scope operations. 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.
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 8 parameters including limit, offset, order, exclusions and response_format. The description's only parameter-relevant addition is the 1000-row API default, which the schema already partly notes. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Durchsucht den Kontenrahmen des Mandanten') and immediately clarifies the non-obvious scope: the result is a union of Sachkonten, Zahlungskonten, Debitoren and Kreditoren distinguished by type/subtype. This differentiates it cleanly from siblings that an agent might confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: use this to look up a Sachkontonummer before booking; use bb_payment_accounts_list for payment accounts, bb_postingaccounts_create to create an account, and bb_reports_get_ledger for balances/postings. It also states what this tool does NOT do, which is exactly the guidance an agent needs to pick the right sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bb_postingaccounts_updateSachkonto überschreibenADestructiveIdempotent
Ü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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Neue Bezeichnung des Sachkontos, zum Beispiel Softwarelizenzen Cloud 19% USt. | |
| postingaccount_number | Yes | Nummer 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
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| changed | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| posting_id_by_customer | Yes | Die 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_customer | Yes | Die 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| changed | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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 stornierenADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| posting_id_by_customer | Yes | Die 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| message | No | |
| removed | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| debtor | Yes | Debitorenkonto 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. | |
| creditor | Yes | Kreditorenkonto 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. | |
| positions | Yes | Die 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_customer | Yes | Die 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| created | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| receipts | Yes | Die 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| created | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| positions | Yes | Die 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_customer | Yes | Die 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| created | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| transactions | Yes | Die 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| created | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vat | Yes | Steuerschlü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. | |
| date | Yes | Buchungsdatum 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. | |
| amount | Yes | Betrag 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. | |
| postingtext | Yes | Buchungstext der Zeile, höchstens 128 Zeichen. | |
| cost_location | No | Kostenstelle, mandantenbezogen, nachschlagen mit bb_cost_locations_search. Höchstens 10 Zeichen. | |
| cost_location_two | No | Kostenstelle der zweiten Ebene, mandantenbezogen, nachschlagen mit bb_cost_locations_search. Höchstens 10 Zeichen. | |
| postingaccount_debit | Yes | Sollkonto 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_credit | Yes | Habenkonto 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| created | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| free_postings | Yes | Die 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| created | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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_searchBuchungen suchenARead-onlyIdempotent
Liest die Buchungssätze eines Zeitraums aus der Buchhaltung von BuchhaltungsButler. Zu nehmen, um vorhandene Buchungen zu sehen, etwa alle Buchungen des ersten Quartals auf dem Sachkonto 4980, oder um nach einem Schreibvorgang nachzusehen, ob er gewirkt hat. date_from und date_to sind Pflicht; einen unbegrenzten Abruf gibt es nicht. Liefert weder Belege noch Zahlungen, sondern die Buchungszeilen selbst: Belege holt bb_receipts_search, Zahlungen bb_transactions_search. Die Felder mit dem Namensanfang receipts_assigned sind keine Listen, sondern verkettete Zeichenketten und taugen zur Anzeige, nicht zur Weiterverarbeitung. Höchstens 1000 Zeilen je Aufruf; rows ist die Zeilenzahl dieser Antwort und nie eine Gesamttrefferzahl, weiter geht es über offset. Die Schreibweise von order unterscheidet Groß- und Kleinschreibung.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Zeilen je Aufruf. Harte Obergrenze 1000. Größere Werte lehnt die API ab, sie kappt sie nicht. | |
| order | No | Sortierung als Zeichenkette. 'default' sortiert aufsteigend nach date und, als zweites Kriterium, nach date_last_action. Die Schreibweise ist case sensitive; die Werte stehen genau so im Enum, wie die API sie erwartet. | |
| offset | No | Zahl der zu überspringenden Zeilen. Die zweite Seite einer Suche mit limit=100 holt offset=100. | |
| date_to | Yes | Spätestes Buchungsdatum der gesuchten Buchungen als YYYY-MM-DD, zum Beispiel 2026-04-26. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. Die Grenze ist eingeschlossen. | |
| date_from | Yes | Frühestes Buchungsdatum der gesuchten Buchungen als YYYY-MM-DD, zum Beispiel 2026-04-26. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. Die Grenze ist eingeschlossen. | |
| cost_location | No | Genau eine Kostenstelle als Filter; geliefert werden dann nur Buchungen auf diese Kostenstelle. Mandantenbezogen, nachschlagen mit bb_cost_locations_search. | |
| account_filter | No | Kommagetrennte Liste von Konten, auf die die Treffer eingegrenzt werden. Erlaubt sind die Schlüsselwörter 'all', 'all financial accounts' und 'free booking' sowie Nummern von Zahlungskonten, zum Beispiel '1200'. Ohne Angabe gilt 'all'. Der Body-Parameter der API heißt account und meint hier kein einzelnes Zahlungskonto, sondern eine Filterliste; Zahlungskonten auflisten mit bb_payment_accounts_list. | |
| posting_status | No | Festschreibungsstatus der Treffer: 'all' liefert alles, 'fixed' nur festgeschriebene, 'unfixed' nur nicht festgeschriebene Buchungen. Ohne Angabe gilt 'all'. | |
| response_format | No | '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 |
| date_last_action_to | No | Spätester Zeitpunkt der Anlage oder Statusänderung als YYYY-MM-DD, zum Beispiel 2026-04-26. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. Die Grenze ist eingeschlossen. | |
| date_last_action_from | No | Frühester Zeitpunkt der Anlage oder Statusänderung als YYYY-MM-DD, zum Beispiel 2026-04-26. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. Gemeint ist die Anlage oder die Statusänderung nach 'confirmed' oder 'fixed', nicht das Buchungsdatum. Nach einem Schreibvorgang ist das der Weg, die eben entstandenen Buchungen zu finden. | |
| postingaccount_filter | No | Kommagetrennte Liste von Sachkonten, auf die die Treffer eingegrenzt werden. Erlaubt sind die Schlüsselwörter 'all', 'all postingaccounts', 'all debtors' und 'all creditors' sowie Kontonummern, zum Beispiel '4980'. Ohne Angabe gilt 'all'. Der Body-Parameter der API heißt postingaccount; nachschlagen mit bb_postingaccounts_search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| limit_used | No | |
| offset_used | No | |
| more_possible | No | |
| rows_returned | No | |
| _contract_warnings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so safety needs no restating. The description adds real behavioral context beyond them: a hard 1000-row cap, the fact that 'rows' is the row count of this response and never a total, pagination via offset, and that receipts_assigned* fields are concatenated strings fit only for display.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, followed by usage, then caveats (mandatory params, pagination, data-format quirks). Dense but every sentence carries actionable information, with only minor restatement of schema facts.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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, and the description still covers the essentials: mandatory date range, hard row cap, offset-based continuation, results not being totals, and cross-references to the right sibling tools. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every one of the 12 parameters is already documented in the schema, including order's case sensitivity, the limit 1000 cap, and the required date range. The description largely restates these rather than adding parameter meaning 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.
Does the description clearly state what the tool does and how it differs from similar tools?
Stated as a specific verb+resource: reads posting records ('Buchungssätze') for a time range from BuchhaltungsButler. It explicitly distinguishes itself from sibling search tools by naming bb_receipts_search and bb_transactions_search and contrasting what each returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use scenarios (view existing postings such as all Q1 postings on account 4980, or verify a write operation took effect) and explicit exclusions pointing to sibling tools for receipts and payments. It also states that date_from/date_to are mandatory with no unlimited retrieval.
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 entfernenADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| receipt_id_by_customer | Yes | Die mandantenbezogene Nummer des Belegs, dessen Buchungen entfernt werden, zu finden über bb_receipts_search. Adressiert wird der Beleg, nicht die einzelne Buchungszeile. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| message | No | |
| removed | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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 entfernenADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| transaction_id_by_customer | Yes | Die 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| message | No | |
| removed | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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 entfernenADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| posting_id_by_customer | Yes | Die 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| message | No | |
| removed | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Belegdatum, also das Ausstellungsdatum, als YYYY-MM-DD, zum Beispiel 2026-04-26. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. | |
| amount | Yes | Bruttobetrag 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. | |
| currency | Yes | Die 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_rate | No | Umsatzsteuersatz 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. | |
| counterparty | Yes | Gegenpartei 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_type | Yes | Belegart, 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_delivery | No | Leistungs- 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_number | Yes | Rechnungsnummer 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_debtor | No | Nummer 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_due | No | Fä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_reference | No | Technische 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_number | No | Sachkontonummer, 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_customer | No | Die 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| created | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| receipts | Yes | Die 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| created | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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 markierenADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| receipt_id_by_customer | Yes | Die 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| message | No | |
| removed | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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 holenARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| get_file | No | Wenn 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_format | No | '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_customer | Yes | Die 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
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| _contract_warnings | No |
TDQS
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.
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.
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.
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.
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.
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 BelegsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| confirmed_only | No | Wenn 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_format | No | '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_customer | Yes | Die 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
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| limit_used | No | |
| offset_used | No | |
| more_possible | No | |
| rows_returned | No | |
| _contract_warnings | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| receipt_id_by_customer | Yes | Die 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| changed | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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_searchBelege suchenARead-onlyIdempotent
Durchsucht die Belege eines Mandanten in BuchhaltungsButler, also Eingangs- und Ausgangsrechnungen samt Gutschriften, und liefert sie seitenweise. Beispiel: alle Eingangsbelege eines Monats über list_direction 'inbound' zusammen mit date_from und date_to. Einen einzelnen Beleg samt Fremdwährungsfeldern holt bb_receipts_get, die einem Beleg zugeordneten Zahlungen listet bb_receipts_list_transactions, Buchungssätze liefert bb_postings_search. Liefert keine Belegdatei und keinen Filter nach Belegart: Gutschriften sind erst am Feld type der Antwort zu erkennen. amount_paid und amount_paid_fixed sind gemessen stets '0.00', auch bei bezahlten Belegen: keine Teilzahlung, kein offener Betrag. Bezahlt sagt payment_date. Höchstens 500 Zeilen je Aufruf, Vorgabe 100, weitere Seiten über offset. Eine Gesamttrefferzahl nennt die API nicht; weniger Zeilen als limit bedeutet Ende des Ergebnisses.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Zeilen je Aufruf, Vorgabe 100. Harte Obergrenze 500. Größere Werte lehnt die API ab, sie kappt sie nicht. Der Server sendet den Wert immer mit. | |
| order | No | Sortierung als Objekt aus Sortierfeld und Richtung, zum Beispiel {"date": "ASC"} oder {"date": "ASC", "amount": "DESC"}. Sortierbar sind date, amount, invoicenumber und invoicingparty; invoicingparty heißt in der Antwort counterparty. Die Reihenfolge der Schlüssel entscheidet über die Reihenfolge der Kriterien. Mindestens ein Feld angeben oder das Feld weglassen. | |
| offset | No | Zahl der zu überspringenden Zeilen. Die zweite Seite einer Suche mit limit=100 holt offset=100. Eine volle Seite bedeutet, dass es wahrscheinlich weitere Zeilen gibt. | |
| date_to | No | Spätestes Belegdatum, eingeschlossen, als YYYY-MM-DD, zum Beispiel 2026-04-26. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. | |
| deleted | No | Wenn true, liefert die API ausschließlich als gelöscht markierte Belege, nicht zusätzlich zu den aktiven. Wiederherstellen lässt sich ein solcher Beleg mit bb_receipts_restore. | |
| due_date | No | Fälligkeitsdatum als YYYY-MM-DD, zum Beispiel 2026-04-26. Geliefert werden nur Belege mit genau diesem Fälligkeitsdatum; eine Bereichsgrenze ist es nicht. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. | |
| date_from | No | Frühestes Belegdatum, eingeschlossen, als YYYY-MM-DD, zum Beispiel 2026-04-26. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. | |
| counterparty | No | Gegenpartei als Filter. Bei Eingangsbelegen ist das der Rechnungssteller, bei Ausgangsbelegen der Empfänger, zum Beispiel Bürobedarf Nordwest GmbH. | |
| invoicenumber | No | Rechnungsnummer als Filter. Geliefert werden die Belege mit genau dieser Rechnungsnummer; in der Antwort heißt das Feld ebenfalls invoicenumber. | |
| include_offers | No | Wenn true, erscheinen zusätzlich Angebote in der Liste. | |
| list_direction | Yes | Richtung der Belegliste. 'inbound' sind Eingangsbelege, also Rechnungen, die der Mandant erhalten hat; 'outbound' sind Ausgangsbelege, also Rechnungen, die der Mandant stellt. Pflichtangabe der API, einen Wert für beide Richtungen zugleich gibt es nicht. | |
| payment_status | No | Zahlungsstand als Filter. 'paid' liefert nur bezahlte, 'unpaid' nur unbezahlte Belege; ohne Angabe liefert die API beide. | |
| response_format | No | '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 |
| date_since_last_modified | No | Zeitpunkt der letzten Änderung als YYYY-MM-DD HH:MM:SS, zum Beispiel 2026-04-26 13:45:00. Geliefert werden die Belege, deren Änderungszeitpunkt später liegt. Ein reines Datum YYYY-MM-DD gilt als 23:59:59 dieses Tages; für einen Abgleich deshalb immer mit Uhrzeit senden. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| limit_used | No | |
| offset_used | No | |
| more_possible | No | |
| rows_returned | No | |
| _contract_warnings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds rich context beyond the annotations: amount_paid/amount_paid_fixed always '0.00', payment status comes from payment_date, max 500 rows per call with default 100, paging via offset, and no total-count from the API (short page = end of results). These are non-obvious quirks not derivable from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then alternatives, then behavioral caveats. Efficient for the amount of information, though somewhat dense and long. Every clause carries actionable content, so nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 14 parameters, nested order object, output schema present, and read-only/idempotent annotations, the description covers the remaining unknowns: paging semantics, payment-amount caveat, credit-note detection, and sibling routing. 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.
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. The description adds the cross-parameter caveat that Gutschriften are only identifiable via type in the response, plus the offset/limit paging contract, which goes slightly beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Stated as a specific verb+resource: durchsucht die Belege eines Mandanten (Eingangs- und Ausgangsrechnungen samt Gutschriften). It explicitly distinguishes itself from siblings by naming bb_receipts_get, bb_receipts_list_transactions, and bb_postings_search with their respective scopes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete usage example (monatliche Eingangsbelege über list_direction 'inbound' mit date_from/date_to) and routes to alternatives with conditions: einzelner Beleg → bb_receipts_get, zugeordnete Zahlungen → bb_receipts_list_transactions, Buchungssätze → bb_postings_search. It also states exclusions (keine Belegdatei, kein Filter nach Belegart).
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Belegdatum, also das Ausstellungsdatum, als YYYY-MM-DD, zum Beispiel 2026-04-26. Ohne Angabe wird es aus der Datei gelesen. | |
| file | Yes | Die 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. | |
| amount | No | Bruttobetrag 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. | |
| currency | No | Die 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_rate | No | Umsatzsteuersatz des Belegs in Prozent als Zahl, zum Beispiel 19 oder 0. Weglassen, wenn der Beleg keinen oder mehrere Steuersätze trägt. | |
| file_name | No | Dateiname 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. | |
| counterparty | No | Gegenpartei des Belegs: bei einer Eingangsrechnung der Rechnungssteller, bei einer Ausgangsrechnung der Empfänger. Ohne Angabe liest BuchhaltungsButler sie aus der Datei. | |
| receipt_type | Yes | Belegart, 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_delivery | No | Leistungs- 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_number | No | Rechnungsnummer des Belegs, zum Beispiel ER-2026-0001, höchstens 60 Zeichen. Ohne Angabe wird sie aus der Datei gelesen. | |
| creditor_debtor | No | Nummer 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_due | No | Fälligkeitsdatum als YYYY-MM-DD, zum Beispiel 2026-05-26. In der Antwort der Suche heißt das Feld due_date. | |
| payment_reference | No | Technische 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_number | No | Sachkontonummer, 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_customer | No | Die 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| created | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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 summierenARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Zahlungskonto, 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_to | No | Spä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_by | No | Serverseitige 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_rows | No | Hö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. | |
| resource | Yes | Was 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_from | No | Frü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. | |
| counterparty | No | Gegenpartei 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. | |
| invoicenumber | No | Rechnungsnummer 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_direction | No | Richtung 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_status | No | Zahlungsstand 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_format | No | '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
| Name | Required | Description |
|---|---|---|
| rows | No | |
| notes | No | |
| bundle | Yes | |
| filter | No | |
| groups | No | |
| account | No | |
| success | Yes | |
| resource | Yes | |
| rows_read | Yes | |
| directions | No | |
| sum_of_rows_read | No | |
| account_candidates | No | |
| duplicates_discarded | No | |
| sum_of_rows_read_cents | No |
TDQS
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.
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.
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.
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.
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.
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 anfordernADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date_to | Yes | Letzter 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_from | Yes | Erster 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| created | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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 anfordernADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Datum 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_to | Yes | Letzter 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_csv | No | true 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_pdf | No | true 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_from | Yes | Erster 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_export | No | true 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| created | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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 abholenARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| get_files | No | true 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_format | No | '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_customer | Yes | Kennung 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| _contract_warnings | No |
TDQS
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.
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.
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.
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.
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.
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 abrufenARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Datum 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_to | Yes | Letzter 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_from | Yes | Erster 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_format | No | '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_number | Yes | Nummer 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| _contract_warnings | No |
TDQS
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.
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.
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.
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.
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.
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 abholenARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| get_files | No | true 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_format | No | '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_customer | Yes | Kennung 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| _contract_warnings | No |
TDQS
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.
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.
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.
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.
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.
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 abholenADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Datum 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_to | Yes | Letzter 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_from | Yes | Erster 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_type | Yes | Welche 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_format | No | '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_seconds | No | Wie 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| bundle | Yes | |
| period | No | |
| status | Yes | |
| success | Yes | |
| wait_ms | No | |
| attempts | No | |
| report_type | Yes | |
| integrity_error | No | |
| report_id_by_customer | Yes | |
| uncompletedPostingsCount | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| receipt_id_by_customer | Yes | Die 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_customer | Yes | Die 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| changed | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| assignments | Yes | Die 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| changed | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | Betrag 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. | |
| purpose | No | Verwendungszweck 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_from | Yes | Zahlender oder Empfänger der Zahlung, zum Beispiel 'Muster GmbH'. | |
| currency | No | Ohne 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_code | No | Bankleitzahl oder BIC der Gegenseite, zum Beispiel 'BYLADEM1001'. | |
| bank_name | No | Name der Bank der Gegenseite. | |
| value_date | No | Wertstellungsdatum 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_date | Yes | Buchungsdatum 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_text | No | Buchungstext der Zahlung, zum Beispiel 'SEPA-Überweisung'. Soll er leer bleiben, das Feld weglassen. | |
| account_number | No | Kontonummer oder IBAN der Gegenseite, zum Beispiel 'DE02120300000000202051'. | |
| transaction_type | No | Art 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_reference | No | Zahlungsreferenz des Vorgangs. Trifft sie zu, ordnet BuchhaltungsButler die angelegte Zahlung dem passenden Beleg selbst zu. | |
| payment_account_number | Yes | Sachkontonummer, 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| created | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| transactions | Yes | Die 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| created | No | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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 holenARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | '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_customer | Yes | Die 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
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| _contract_warnings | No |
TDQS
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.
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.
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.
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.
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.
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 auflistenARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| confirmed_only | No | Nur bestätigte Zuordnungen liefern. Ohne Angabe liefert die API auch unbestätigte; die Vorgabe der Spezifikation ist 'false'. | |
| response_format | No | '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_customer | Yes | Die 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
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| limit_used | No | |
| offset_used | No | |
| more_possible | No | |
| rows_returned | No | |
| _contract_warnings | No |
TDQS
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.
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.
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.
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.
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.
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_searchZahlungen suchenARead-onlyIdempotent
Sucht Zahlungen, also Kontoumsätze, in BuchhaltungsButler und liefert sie seitenweise. Zu nehmen, um den Umsatz zu einem Beleg zu finden, zum Beispiel alle Zahlungen eines Zahlungskontos zwischen date_from 2026-01-01 und date_to 2026-01-31. Eine einzelne, schon bekannte Zahlung holt bb_transactions_get kürzer; die zugeordneten Belege liefert bb_transactions_list_receipts. Diese Liste führt sechs Felder und darunter kein account: Auf welchem Zahlungskonto eine Zahlung liegt, zeigt erst bb_transactions_get. Höchstens 500 Zeilen je Aufruf, danach mit offset weiterblättern; eine Gesamttrefferzahl nennt die API zu keinem Zeitpunkt. date_from und date_to schließen den genannten Tag ein, id_by_customer_from und id_by_customer_to den genannten Wert dagegen nicht.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Zeilen je Aufruf. Harte Obergrenze 500. Größere Werte lehnt die API ab, sie kappt sie nicht. | |
| offset | No | Zahl der zu überspringenden Zeilen. Die zweite Seite einer Suche mit limit=100 holt offset=100. | |
| date_to | No | Spätestes Buchungsdatum der gesuchten Zahlungen als YYYY-MM-DD, zum Beispiel 2026-04-26. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. | |
| to_from | No | Nur Zahlungen dieses Zahlenden oder Empfängers, zum Beispiel 'Muster GmbH'. Ob die API dabei auf Teilwörter vergleicht, sagt die Spezifikation nicht. | |
| date_from | No | Frühestes Buchungsdatum der gesuchten Zahlungen als YYYY-MM-DD, zum Beispiel 2026-04-26. Ein leerer String wird abgelehnt; das Feld stattdessen weglassen. | |
| response_format | No | '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 |
| id_by_customer_to | No | Obere Grenze der mandantenbezogenen Nummer id_by_customer. Geliefert werden Zahlungen mit kleinerer Nummer; die Zahlung mit genau diesem Wert nicht. Setzt die Sortierung auf id_by_customer ASC, auch in Kombination mit date_from und date_to. In Suchergebnissen erscheint sie als String; hier ohne Anführungszeichen übergeben. | |
| id_by_customer_from | No | Untere Grenze der mandantenbezogenen Nummer id_by_customer. Geliefert werden Zahlungen mit größerer Nummer; die Zahlung mit genau diesem Wert nicht. Setzt die Sortierung auf id_by_customer ASC, auch in Kombination mit date_from und date_to. In Suchergebnissen erscheint sie als String; hier ohne Anführungszeichen übergeben. | |
| payment_account_number | No | Nur Zahlungen dieses Zahlungskontos. Sachkontonummer, die ein Zahlungskonto bezeichnet, zum Beispiel '1200'. Nicht das Sachkonto, auf das gebucht wird. Zahlungskonten auflisten mit bb_payment_accounts_list. Der Body-Parameter der API heißt account. | |
| date_since_last_modified | No | Untere Grenze für date_updated 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. Geliefert werden nur Zahlungen, die danach geändert wurden. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| message | No | |
| success | Yes | |
| endpoint | No | |
| limit_used | No | |
| offset_used | No | |
| more_possible | No | |
| rows_returned | No | |
| _contract_warnings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent safety profile, and the description adds substantive behavior beyond them: a hard cap of 500 rows per call with offset-based paging, the fact that the API never reports a total hit count, and that the result set omits the 'account' field so the payment account is only visible via bb_transactions_get. These are exactly the operational details an agent cannot get from 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage example, then alternatives, then constraints. Dense and mostly waste-free, though at roughly six sentences it is longer than strictly necessary and could compress the reference to sibling tools.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 spelled out, and the description instead covers the non-obvious gaps (pagination ceiling, missing total count, absent account field, boundary inclusivity). For a 10-parameter, zero-required search tool this is sufficient to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 boundary semantics not stated in the schema: date_from/date_to include the named day while id_by_customer_from/to exclude the boundary value. It also clarifies the account-vs-Sachkonto distinction already hinted at in the schema, adding marginal value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('Sucht Zahlungen, also Kontoumsätze') plus the delivery mode ('seitenweise'), and differentiates itself from siblings by naming bb_transactions_get and bb_transactions_list_receipts. An agent can tell which transaction tool to pick 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use with a concrete example (finding the Umsatz for a receipt, all payments of one payment account between date_from and date_to) and explicit alternatives: bb_transactions_get for a single known payment, bb_transactions_list_receipts for assigned receipts. 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_transactions_unassign_receiptZuordnung Beleg zu Zahlung lösenADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| receipt_id_by_customer | Yes | Die 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_customer | Yes | Die 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
| Name | Required | Description |
|---|---|---|
| data | No | |
| message | No | |
| removed | No | |
| success | Yes | |
| endpoint | No | |
| reversal | No | |
| _contract_warnings | No | |
| fields_not_returned | No |
TDQS
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.
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.
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.
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.
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.
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.
59 tool updates
v0.1.0- First observed
bb_assignments_get - First observed
bb_balances_get - First observed
bb_comments_create - First observed
bb_cost_locations_create - First observed
bb_cost_locations_delete - First observed
bb_cost_locations_search - First observed
bb_cost_locations_update - First observed
bb_creditors_create - First observed
bb_creditors_create_batch - First observed
bb_creditors_search - First observed
bb_creditors_update - First observed
bb_debtors_create - First observed
bb_debtors_create_batch - First observed
bb_debtors_search - First observed
bb_debtors_update - First observed
bb_invoices_create - First observed
bb_invoices_create_draft - First observed
bb_invoices_create_einvoice - First observed
bb_masterdata_search - First observed
bb_payment_accounts_create - First observed
bb_payment_accounts_list - First observed
bb_postingaccounts_create - First observed
bb_postingaccounts_search - First observed
bb_postingaccounts_update - First observed
bb_postings_assign_receipt - First observed
bb_postings_cancel - First observed
bb_postings_create_for_receipt - First observed
bb_postings_create_for_receipt_batch - First observed
bb_postings_create_for_transaction - First observed
bb_postings_create_for_transaction_batch - First observed
bb_postings_create_free - First observed
bb_postings_create_free_batch - First observed
bb_postings_search - First observed
bb_postings_unconfirm_for_receipt - First observed
bb_postings_unconfirm_for_transaction - First observed
bb_postings_unconfirm_free - First observed
bb_receipts_create - First observed
bb_receipts_create_batch - First observed
bb_receipts_delete - First observed
bb_receipts_get - First observed
bb_receipts_list_transactions - First observed
bb_receipts_restore - First observed
bb_receipts_search - First observed
bb_receipts_upload - First observed
bb_records_collect - First observed
bb_reports_create_bwa - First observed
bb_reports_create_sums - First observed
bb_reports_get_bwa - First observed
bb_reports_get_ledger - First observed
bb_reports_get_sums - First observed
bb_reports_run - First observed
bb_transactions_assign_receipt - First observed
bb_transactions_assign_receipt_batch - First observed
bb_transactions_create - First observed
bb_transactions_create_batch - First observed
bb_transactions_get - First observed
bb_transactions_list_receipts - First observed
bb_transactions_search - First observed
bb_transactions_unassign_receipt
TDQS
Scored across 59 tools
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 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.
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.
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
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
- AlicenseNot gradedqualityBmaintenanceIntegrates 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 npm6MIT
- AlicenseCqualityAmaintenanceEnables AI assistants to manage BuchhaltungsButler bookkeeping through all 48 API endpoints, with safety-categorized tools for read, write, and destructive operations.546 npm4MIT
- FlicenseNot gradedqualityBmaintenanceMCP server exposing BuchhaltungsButler API tools for accounting, invoicing, and receipt management with curated, token-efficient endpoints.-
- AlicenseBqualityCmaintenanceEnables 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.236 npmMIT