Skip to main content
Glama
dennismenken

BuchhaltungsButler MCP-Server

by dennismenken

Bestand zählen und summieren

bb_records_collect
Read-onlyIdempotent

Count and sum receipts, payments, or postings across all pages to return totals instead of full row lists. Answers questions like how many open invoices exist or what ran through PayPal in March.

Instructions

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.

Input Schema

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

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
rowsNo
notesNo
bundleYes
filterNo
groupsNo
accountNo
successYes
resourceYes
rows_readYes
directionsNo
sum_of_rows_readNo
account_candidatesNo
duplicates_discardedNo
sum_of_rows_read_centsNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.1.0

TDQS

A4.9/5.0
Behavior5/5

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

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

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

Conciseness4/5

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

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

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

Completeness5/5

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

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

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

Parameters5/5

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

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

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

Purpose5/5

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

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

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

Usage Guidelines5/5

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

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

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