BuchhaltungsButler MCP-Server
This server connects an AI assistant to a BuchhaltungsButler accounting tenant through the Model Context Protocol, offering 59 tools (54 endpoint tools + 5 bundle tools, 19 read-only) to view, create, modify, and manage accounting data.
Receipts: search, fetch single receipts, create with or without a file, batch-create up to 50, upload files (base64, file://, https://), mark as deleted, restore
Payments/transactions: search, fetch single, create and batch-create, assign or unassign receipts to payments
Invoices: create final invoices/credit notes/offers, drafts, and EN 16931 e-invoices
Postings/bookings: search, create free postings, create postings from receipts or transactions (single and batch), cancel postings, remove unconfirmed postings
Master data: search/create/update debtors and creditors, search/create/update posting accounts, list/create payment accounts, manage cost locations
Reports: request and fetch BWA and sums-and-balances reports, retrieve account ledgers
Bundle tools: search across all master data lists, count and sum records across all pages, fetch a record with its assignments, run a report end-to-end with waiting, get an account balance with statement
Operational controls: read-only mode, restrict tool groups to save context, batch and amount limits, duplicate checks, rate limiting, multi-tenant profiles, and credential handling via environment or a protected credentials file
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-Server Zeig 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.964 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.799 | 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.964 |
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.964 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.816 |
Claude Desktop, mit Belegerfassung |
| 10 plus die Bündel | 16.523 |
Nur auswerten |
| 5 plus die Bündel | 10.651 |
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.799 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 49.000 Token (gemessen 48.964), die fünf Bündelwerkzeuge weitere 6.852, zusammen 55.816. 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.
Inputs: max_rows, confirmed_only, response_format, receipt_id_by_customer, +1 more. Returns: kind, bundle, record, success, +7 more
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.
Inputs: account (required), date_to (required), date_from (required), base, +2 more. Returns: rows, bundle, period, account, +8 more
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.
Inputs: comment_text (required), receipt_id_by_customer, transaction_id_by_customer. Returns: data, created, message, success, +4 more
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.
Inputs: code (required), name (required). Returns: data, created, message, success, +4 more
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.
Inputs: code (required). Returns: data, message, removed, success, +4 more
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.
Inputs: code, limit, offset, response_format. Returns: items, message, success, endpoint, +5 more
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.
Inputs: code (required), name (required). Returns: data, changed, message, success, +4 more
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.
Inputs: name (required), bic, zip, city, +9 more. Returns: data, created, message, success, +4 more
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.
Inputs: creditors (required). Returns: data, created, message, success, +4 more
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.
Inputs: limit, offset, response_format. Returns: items, message, success, endpoint, +5 more
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.
Inputs: postingaccount_number (required), bic, zip, city, +9 more. Returns: data, changed, message, success, +4 more
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.
Inputs: name (required), bic, zip, city, +9 more. Returns: data, created, message, success, +4 more
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.
Inputs: debtors (required). Returns: data, created, message, success, +4 more
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.
Inputs: limit, offset, response_format. Returns: items, message, success, endpoint, +5 more
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.
Inputs: postingaccount_number (required), bic, zip, city, +9 more. Returns: data, changed, message, success, +4 more
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.
Inputs: date (required), items (required), company_name (required), invoice_type (required), +23 more. Returns: data, created, message, success, +4 more
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.
Inputs: date (required), items (required), company_name (required), invoice_type (required), +20 more. Returns: data, created, message, success, +4 more
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.
Inputs: zip (required), city (required), date (required), email (required), +24 more. Returns: data, created, message, success, +4 more
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.
Inputs: areas, query, max_hits, response_format. Returns: areas, notes, query, bundle, +6 more
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.
Inputs: name (required), payment_account_type (required), postingaccount_number (required), is_revision_safe, +1 more. Returns: data, created, message, success, +4 more
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.
Inputs: response_format. Returns: items, message, success, endpoint, +5 more
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.
Inputs: name (required), postingaccount_number (required), parent_postingaccount_number (required). Returns: data, created, message, success, +4 more
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.
Inputs: limit, order, offset, exclude_debtors, +4 more. Returns: items, message, success, endpoint, +5 more
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.
Inputs: name (required), postingaccount_number (required). Returns: data, changed, message, success, +4 more
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.
Inputs: posting_id_by_customer (required), receipt_id_by_customer (required). Returns: data, changed, message, success, +4 more
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.
Inputs: posting_id_by_customer (required). Returns: data, message, removed, success, +4 more
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.
Inputs: debtor (required), creditor (required), positions (required), receipt_id_by_customer (required). Returns: data, created, message, success, +4 more
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.
Inputs: receipts (required). Returns: data, created, message, success, +4 more
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.
Inputs: positions (required), transaction_id_by_customer (required). Returns: data, created, message, success, +4 more
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.
Inputs: transactions (required). Returns: data, created, message, success, +4 more
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.
Inputs: vat (required), date (required), amount (required), postingtext (required), +4 more. Returns: data, created, message, success, +4 more
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.
Inputs: free_postings (required). Returns: data, created, message, success, +4 more
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.
Inputs: date_to (required), date_from (required), limit, order, +8 more. Returns: items, message, success, endpoint, +5 more
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.
Inputs: receipt_id_by_customer (required). Returns: data, message, removed, success, +4 more
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.
Inputs: transaction_id_by_customer (required). Returns: data, message, removed, success, +4 more
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.
Inputs: posting_id_by_customer (required). Returns: data, message, removed, success, +4 more
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.
Inputs: date (required), amount (required), currency (required), counterparty (required), +9 more. Returns: data, created, message, success, +4 more
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.
Inputs: receipts (required). Returns: data, created, message, success, +4 more
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.
Inputs: receipt_id_by_customer (required). Returns: data, message, removed, success, +4 more
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.
Inputs: receipt_id_by_customer (required), get_file, response_format. Returns: data, message, success, endpoint, +1 more
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.
Inputs: receipt_id_by_customer (required), confirmed_only, response_format. Returns: items, message, success, endpoint, +5 more
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.
Inputs: receipt_id_by_customer (required). Returns: data, changed, message, success, +4 more
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.
Inputs: list_direction (required), limit, order, offset, +10 more. Returns: items, message, success, endpoint, +5 more
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.
Inputs: file (required), receipt_type (required), date, amount, +11 more. Returns: data, created, message, success, +4 more
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.
Inputs: resource (required), account, date_to, group_by, +7 more. Returns: rows, notes, bundle, filter, +10 more
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.
Inputs: date_to (required), date_from (required). Returns: data, created, message, success, +4 more
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.
Inputs: date_to (required), date_from (required), base, file_csv, +2 more. Returns: data, created, message, success, +4 more
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.
Inputs: report_id_by_customer (required), get_files, response_format. Returns: items, message, success, summary, +3 more
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.
Inputs: date_to (required), date_from (required), postingaccount_number (required), base, +1 more. Returns: items, message, success, summary, +3 more
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.
Inputs: report_id_by_customer (required), get_files, response_format. Returns: items, message, success, summary, +3 more
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.
Inputs: date_to (required), date_from (required), report_type (required), base, +2 more. Returns: data, bundle, period, status, +7 more
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.
Inputs: receipt_id_by_customer (required), transaction_id_by_customer (required). Returns: data, changed, message, success, +4 more
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.
Inputs: assignments (required). Returns: data, changed, message, success, +4 more
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.
Inputs: amount (required), to_from (required), booking_date (required), payment_account_number (required), +9 more. Returns: data, created, message, success, +4 more
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.
Inputs: transactions (required). Returns: data, created, message, success, +4 more
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.
Inputs: transaction_id_by_customer (required), response_format. Returns: data, message, success, endpoint, +1 more
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.
Inputs: transaction_id_by_customer (required), confirmed_only, response_format. Returns: items, message, success, endpoint, +5 more
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.
Inputs: limit, offset, date_to, to_from, +6 more. Returns: items, message, success, endpoint, +5 more
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.
Inputs: receipt_id_by_customer (required), transaction_id_by_customer (required). Returns: data, message, removed, success, +4 more
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 59 tools
Most tools are clearly distinct with detailed descriptions that explicitly reference alternative tools, especially for similar operations like postings creation and report retrieval. However, the sheer number of tools (59) and the presence of batch variants and convenience wrappers (bb_reports_run vs. create/get, bb_assignments_get vs. get+list) introduce some ambiguity, though descriptions mitigate it well.
All tool names follow a highly consistent 'bb_<resource>_<verb>_<qualifier>' pattern, e.g., bb_receipts_create, bb_transactions_assign_receipt, bb_postings_unconfirm_free. No mixed naming conventions (camelCase, hyphenated, etc.) are present; the only minor deviations are unique verbs like 'collect' and 'run', but they still fit the established resource-verb structure.
With 59 tools, the server far exceeds the 50+ threshold defined as an extreme mismatch. Many tools are batch or type-specific variants (e.g., bb_postings_create_for_receipt vs. bb_postings_create_for_receipt_batch) or convenience wrappers (bb_reports_run, bb_assignments_get) that could be consolidated, resulting in an overly large and hard-to-navigate toolset for the domain.
The toolset has significant gaps in the accounting lifecycle. Invoices can be created (including drafts and e-invoices) but cannot be read, searched, updated, or deleted via the API; comments are write-only with no read or delete endpoint; payment accounts lack an update operation. These omissions will cause agent failures when verifying created documents or maintaining account data, indicating an incomplete surface for a comprehensive accounting server.
Maintenance
Related MCP Connectors
Connect ChatGPT and Claude to Fortnox: invoices, customers, reports. Every write needs your OK.
sevdesk MCP server for ChatGPT, Claude and any AI agent: create invoice, send invoice, upload receipt, book voucher and list open invoices in your own sevdesk account. Cotlet works in the account through your Cloud Browser, a real Chrome where you sign in to sevdesk yourself; Cotlet does not store your password and you need no sevdesk API key. About the official sevdesk API: sevdesk has a REST API (checked 14 Oct 2026). It covers almost everything the web app does, but only on the Buchhaltung Pro plan, in Germany, on system version 2.0. Setup and FAQ: https://cotlet.dev/integrations/sevdesk-api-mcp-server
DATEV financial data for AI assistants: P&L, KPIs, bookings, budgets and monthly reporting.
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.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceIntegrates 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.236 npm6MIT
- AlicenseAqualityAmaintenanceEnables AI assistants to manage BuchhaltungsButler bookkeeping through all 48 API endpoints, with safety-categorized tools for read, write, and destructive operations.4623 npm9MIT
- FlicenseNot gradedqualityBmaintenanceMCP server exposing BuchhaltungsButler API tools for accounting, invoicing, and receipt management with curated, token-efficient endpoints.1-
- AlicenseBqualityDmaintenanceEnables 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.2323 npmMIT