Skip to main content
Glama
dennismenken

BuchhaltungsButler MCP-Server

by dennismenken

Rechnung erzeugen

bb_invoices_create

Creates a final outgoing invoice, credit note, or quote in BuchhaltungsButler — numbered, as PDF, and as an accounting document. Use once a transaction is finalized.

Instructions

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.

Input Schema

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

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
dataNo
createdNo
messageNo
successYes
endpointNo
reversalNo
_contract_warningsNo
fields_not_returnedNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.1.0

TDQS

A4.5/5.0
Behavior4/5

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

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

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

Conciseness4/5

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

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

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

Completeness4/5

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

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

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

Parameters4/5

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

Schema coverage is 100%, so the schema already carries the field-level detail (including the item_amount vs item_single_price distinction and the parallel-array conversion). The description still contributes beyond the schema by flagging the absent currency parameter and illustrating a realistic call ('10 Std. Beratung zu 120.00 je Stunde'), which prevents a foreseeable misuse.

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

Purpose5/5

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

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

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

Usage Guidelines5/5

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

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

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