Buchhaltungsbutler MCP
This server lets AI assistants (Claude, Cursor, etc.) manage a BuchhaltungsButler accounting system via MCP by exposing the official API as categorized read/write/destructive tools.
đ Read-only: fetch accounts, cost locations, postings, receipts, transactions, creditors/debtors/postingaccounts, and assigned documents.
đ§Ÿ Create data: add receipts, transactions, accounts, cost locations, creditors, debtors, postingaccounts; upload base64 files; create invoices, drafts, and e-invoices; add free/receipt/transaction postings (including batches).
đ Link/unlink: assign or unassign receipts to transactions, assign receipts to free postings, and run batch assignments.
âïž Update/revert: edit cost locations, creditors, debtors, postingaccounts; unconfirm postings; restore deleted receipts.
đïž Destructive: delete cost locations (permanent), delete receipts (restorable), and cancel postings via storno.
đ Reports: create and retrieve BWA and sum/ledger reports (async).
đ Operationally safe: credentials stay server-side, rate-limiting stays under BB limits, and it supports Docker, stdio, HTTP, and optional bearer-token auth.
Click on "Install 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 MCPShow me my unpaid invoices from last month."
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.
ohneben's Buchhaltungsbutler MCP
Verwalte deine BuchhaltungsButler-Buchhaltung in natĂŒrlicher Sprache aus KI-Assistenten wie Claude, Cursor und jedem anderen MCP-Client.
Dieser Model-Context-Protocol-Server stellt die BuchhaltungsButler API v1 bereit â alle 54 Endpunkte, automatisch aus der offiziellen OpenAPI-Spezifikation (Spec-Version 1.9.1) als MCP-Tools generiert. Jedes Tool ist sicherheitskategorisiert (nur lesend / schreibend / destruktiv), damit dein Assistent weiĂ, was eine Aktion tut, bevor er sie ausfĂŒhrt. LĂ€uft ĂŒber stdio (Claude Desktop und andere lokale Launcher) oder Streamable HTTP (gehostet in Docker).
Warum dieser Server
Manche MCP-Server leiten eine API einfach nur weiter. Dieser hier ist darauf ausgelegt, gefahrlos an ein Sprachmodell ĂŒbergeben und im Alltag betrieben werden zu können:
Was du bekommst | Warum das zÀhlt |
Alle 54 Endpunkte, automatisch generiert aus der offiziellen Spec | VollstĂ€ndige Abdeckung von Belegen, Transaktionen, Buchungen, Rechnungen, Auswertungen und Stammdaten â nichts handverlesen, nichts vergessen. |
Jedes Tool ist sicherheitskategorisiert đą / đĄ / đŽ | Ein Banner am Anfang jeder Tool-Beschreibung sagt dem Modell genau, was passiert â lesen, anlegen, Ă€ndern, zurĂŒcknehmen oder löschen â bevor es handelt. |
Maschinenlesbare MCP-Annotationen ( | Hosts, die Annotationen auswerten (Claude gehört dazu), können Lesezugriffe automatisch zulassen und vor destruktiven Aktionen eine BestÀtigung verlangen. |
Zwei Transporte: stdio und Streamable HTTP | Lokal in Claude Desktop nutzen â oder einen dauerhaft laufenden Server betreiben, den beliebig viele MCP-Clients ĂŒber HTTP erreichen. |
Docker + docker-compose, Health-Check, Auto-Restart | Produktionsnahes Deployment ab Werk: |
Optionale Bearer-Token-Authentifizierung am HTTP-Endpunkt | Sichere den Server mit einem gemeinsamen Geheimnis ab, sobald er ĂŒber localhost hinaus erreichbar ist. |
Eingebautes Rate-Limiting | Drosselt sich selbst unter dem BuchhaltungsButler-Limit von 100 Anfragen/Kunde/Minute, damit du nie dagegenlÀufst. |
Deine Zugangsdaten erreichen das Modell nie | Die Credentials liegen in der Server-Umgebung und werden pro Anfrage injiziert â der Assistent sieht nur Tool-Eingaben und API-Antworten. |
Im Vergleich
Nach aktuellem Stand ist dies der einzige dedizierte BuchhaltungsButler-MCP-Server. Alternativ könntest du einen generischen OpenAPIâMCP-Wrapper auf die Spec richten â das lĂ€sst allerdings einiges liegen:
FĂ€higkeit | Dieses Projekt | Generischer OpenAPIâMCP-Wrapper* |
Alle 54 BuchhaltungsButler-Endpunkte als Tools | â | â |
đą / đĄ / đŽ Sicherheitskategorie + Banner pro Tool | â | â |
| â | â |
| â | â |
Eingebautes Rate-Limiting (bleibt unter BBs 100/Kunde/Min.) | â | â |
| â | â |
Streamable-HTTP-Transport | â | â |
Docker + docker-compose, Health-Check, Auto-Restart | â | â |
Optionale Bearer-Token-Auth am Endpunkt | â | â |
Credentials serverseitig injiziert, nie ans Modell gesendet | â | â |
Lizenz | MIT | unterschiedlich |
*Generische OpenAPIâMCP-Wrapper machen aus jeder Swagger-/OpenAPI-Spec MCP-Tools. Sie erreichen dieselben Endpunkte, behandeln aber jede Operation gleich â keine Sicherheitskategorien, keine Betriebsgeschichte, keine auf echte Buchhaltungsdaten abgestimmten Leitplanken. âââ = je nach Werkzeug unterschiedlich / nicht garantiert.
Related MCP server: billforward-mcp
Was du damit machen kannst
Sobald der Server verbunden ist, kannst du deinen Assistenten zum Beispiel bitten:
âListe alle Eingangsbelege vom letzten Monat auf, die noch offen sind.â
âErstelle einen Rechnungsentwurf fĂŒr die ACME GmbH: 10 Stunden Beratung Ă 120 âŹ.â
âBuche diese Banktransaktion auf Sachkonto 4400.â
âLade diesen PDF-Beleg hoch und ordne ihn der passenden Transaktion zu.â
âZeig mir meine Kreditoren und leg einen neuen fĂŒr unseren Hosting-Anbieter an.â
âErstelle mir die BWA fĂŒr das letzte Quartal und zeig mir das Kontenblatt zu Konto 4400.â
Die Tools werden automatisch aus der offiziellen API generiert und in đą nur lesend, đĄ schreibend und đŽ destruktiv gruppiert â ein gut umgesetzter Host kann jede Gruppe unterschiedlich behandeln.
Funktionsweise
Claude / Cursor / beliebiger MCP-Client ââMCPâââș dieser Server ââHTTPSâââș BuchhaltungsButler API (Cloud)Der Server liest die mitgelieferte OpenAPI-Spec ein und macht daraus MCP-Tools (inklusive
Auflösung von $ref-Batch-Payloads und Entfernen von HTML aus den Beschreibungen),
versieht jedes Tool mit seiner Sicherheitskategorie und hÀngt deine Basic-Auth-Credentials
sowie den api_key an jede ausgehende Anfrage. Deine Zugangsdaten bleiben in der
Server-Umgebung â das Modell sieht sie nie und fasst sie nie an.
Voraussetzungen
Ein BuchhaltungsButler-Konto mit API-Zugang â ein API Client + API Secret (Einstellungen â API) sowie ein Kunden-
api_key(siehe API-Zugangsdaten besorgen).Docker (Docker Desktop unter macOS/Windows) fĂŒr den Schnellstart unten â oder Node.js â„ 18, um aus dem Quellcode zu starten.
Schnellstart (Docker)
1. Zugangsdaten hinterlegen. Beispielkonfiguration kopieren und ausfĂŒllen:
cp .env.example .env
# .env bearbeiten â BB_API_CLIENT, BB_API_SECRET, BB_API_KEY setzen
# â MCP_AUTH_TOKEN auf eine lange Zufallszeichenkette setzen,
# falls der Server ĂŒber localhost hinaus erreichbar ist2. Server starten:
docker compose up -d --build3. PrĂŒfen, ob er lĂ€uft:
curl -s http://localhost:3000/health # â {"status":"ok","server":"buchhaltungsbutler-mcp"}4. MCP-Client verbinden. Entfernte Endpunkte werden in Claude als Custom Connector
hinzugefĂŒgt (Einstellungen â Connectors) oder lokal mit
mcp-remote gebrĂŒckt. Trage Folgendes unter
mcpServers in deiner Client-Konfiguration ein und starte die App danach vollstÀndig neu:
{
"mcpServers": {
"buchhaltungsbutler": {
"command": "npx",
"args": [
"mcp-remote",
"http://localhost:3000/mcp",
"--header", "Authorization: Bearer DEIN_MCP_AUTH_TOKEN"
]
}
}
}(Die --header-Zeile entfÀllt, wenn du MCP_AUTH_TOKEN leer gelassen hast.)
Lieber ein fertiges Image?
Jeder Push auf main veröffentlicht ein startbereites Image in der GitHub Container
Registry â damit kannst du den lokalen Build komplett ĂŒberspringen:
docker run -d --name buchhaltungsbutler-mcp -p 3000:3000 --env-file .env \
ghcr.io/ohneben/buchhaltungsbutler-mcp:latestAPI-Zugangsdaten besorgen
BuchhaltungsButler nutzt zwei Authentifizierungsebenen (siehe die offizielle Dokumentation):
HTTP-Basic-Auth â ein API Client + API Secret, deine globalen API-Zugangsdaten. Zu finden bzw. anzulegen in BuchhaltungsButler unter Einstellungen â API.
api_keyâ legt fest, auf welches Kundenkonto sich eine Anfrage bezieht. Er steht in den Firmendaten-Einstellungen des jeweiligen Kunden.
Trage alle drei Werte in .env ein. Der Server hÀngt sie an jede Anfrage an, dein
Assistent bekommt sie also nie zu sehen. Ein einzelner Tool-Aufruf kann optional einen
eigenen api_key mitgeben, um ein anderes Kundenkonto anzusprechen.
Konfiguration
Alles wird in .env gesetzt (kopiert aus .env.example):
Variable | Pflicht | Standard | Beschreibung |
| â | â | API Client (Basic-Auth-Benutzername) |
| â | â | API Secret (Basic-Auth-Passwort) |
| â | â | Standard-Kunden- |
| â |
|
|
| â |
| HTTP-Port, auf dem gelauscht wird |
| â |
| HTTP-Bind-Adresse |
| â |
| HTTP-Route fĂŒr MCP |
| â | (aus) | Verlangt |
| â |
| Clientseitiges Limit an Anfragen pro Minute |
| â | (aus der Spec) | Ăberschreibt die Basis-URL der API |
Nach Ănderungen an .env neu laden mit docker compose up -d --force-recreate.
Sicherheitskategorien der Tools
Jede Tool-Beschreibung beginnt mit einem dieser Banner und trÀgt die passenden MCP-Annotationen:
Banner | Anzahl |
|
| Bedeutung |
đą READ-ONLY | 15 |
|
| Ruft nur Daten ab. UngefÀhrlich. |
đĄ WRITE · legt Daten an | 24 |
|
| Erzeugt DatensĂ€tze (nicht idempotent â mehrfach aufgerufen entstehen Duplikate). |
đĄ WRITE · Ă€ndert Daten | 4 |
|
| Ăndert bestehende Stammdaten direkt. |
đĄ WRITE · verknĂŒpft/löst | 4 |
|
| Ordnet Beleg â Transaktion zu bzw. hebt die Zuordnung auf. Umkehrbar. |
đĄ WRITE · nimmt Zustand zurĂŒck | 4 |
|
| Setzt Buchungen auf unbestÀtigt / stellt Belege wieder her. Umkehrbar. |
đŽ DESTRUCTIVE · löscht | 3 |
|
| Löscht oder storniert einen Datensatz. Vorher bestÀtigen lassen. |
Hosts, die Annotationen respektieren (Claude gehört dazu), können fĂŒr
destructiveHint-Tools eine BestÀtigung verlangen und readOnlyHint-Tools automatisch
vertrauen.
Mit
npm run list-tools(ohne Zugangsdaten) lÀsst sich der vollstÀndige Katalog jederzeit ausgeben.
Tool | Endpunkt |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Tool | Endpunkt |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Tool | Endpunkt | Unterkategorie |
|
| Àndert |
|
| Àndert |
|
| Àndert |
|
| Àndert |
|
| verknĂŒpft |
|
| verknĂŒpft |
|
| verknĂŒpft |
|
| verknĂŒpft |
|
| nimmt zurĂŒck |
|
| nimmt zurĂŒck |
|
| nimmt zurĂŒck |
|
| nimmt zurĂŒck |
Tool | Endpunkt | Hinweis |
|
| Wiederherstellbar ĂŒber |
|
| Nicht wiederherstellbar |
|
| Noch nicht festgeschriebene Buchungen werden gelöscht; festgeschriebene werden durch eine Stornobuchung ausgeglichen |
Aus dem Quellcode starten (stdio, ohne Docker)
Du bevorzugst den klassischen stdio-Modus fĂŒr Claude Desktop? Dann lokal bauen:
npm install
npm run buildAnschlieĂend Claude Desktop in claude_desktop_config.json auf den kompilierten
Einstiegspunkt zeigen lassen:
{
"mcpServers": {
"buchhaltungsbutler": {
"command": "node",
"args": ["/ABSOLUTER/PFAD/Buchhaltungsbutler MCP/dist/index.js"],
"env": {
"MCP_TRANSPORT": "stdio",
"BB_API_CLIENT": "dein-api-client",
"BB_API_SECRET": "dein-api-secret",
"BB_API_KEY": "dein-kunden-api-key"
}
}
}
}Oder den Container stattdessen ĂŒber stdio betreiben:
{
"mcpServers": {
"buchhaltungsbutler": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT=stdio",
"-e", "BB_API_CLIENT", "-e", "BB_API_SECRET", "-e", "BB_API_KEY",
"buchhaltungsbutler-mcp:latest"
],
"env": {
"BB_API_CLIENT": "dein-api-client",
"BB_API_SECRET": "dein-api-secret",
"BB_API_KEY": "dein-kunden-api-key"
}
}
}
}(Das Image vorher bauen: docker build -t buchhaltungsbutler-mcp:latest .)
Spec aktuell halten
Die mitgelieferte spec.json ist die offizielle BuchhaltungsButler-v1-OpenAPI-Spec â die
maĂgebliche Quelle fĂŒr die Tools. So aktualisierst du sie auf einen neueren API-Stand:
curl -s https://app.buchhaltungsbutler.de/docs/api/v1.de.json -o spec.json
npm run buildNeue Pfade werden automatisch ĂŒbernommen; trage sie in PATH_CATEGORY in
src/categories.ts ein, damit sie die richtige Sicherheitskategorie bekommen (nicht
zugeordnete Pfade fallen konservativ auf die Kategorie create zurĂŒck).
Hinweis zur Versionsnummer: BuchhaltungsButler pflegt das Feld
info.versionin der Spec nicht zuverlĂ€ssig â der Inhalt kann sich Ă€ndern, ohne dass die Nummer steigt. Verlass dich beim Abgleich also nicht auf die Version, sondern vergleiche die Pfadliste (paths) und die Parameter der Endpunkte.
Entwicklung
npm install
npm run build # TypeScript â dist/ kompilieren
npm test # Vitest-Suite ausfĂŒhren
npm run list-tools # kategorisierten Tool-Katalog ausgeben (ohne Zugangsdaten)Die CI baut und testet jeden Push unter Node 20 und 22; Pushes auf main veröffentlichen
zusÀtzlich ein Docker-Image in der GitHub Container Registry.
Hinweise & Konventionen
Datumsangaben:
YYYY-MM-DD. BetrÀge: Punkt als Dezimaltrennzeichen (z. B.-12.30).Datei-Uploads (
receipts_upload,receipts_add,receipts_addBatch): Die Datei wird als Base64-Zeichenkette im FeldfileĂŒbergeben.BlĂ€ttern: Die meisten
get-Tools akzeptierenlimitundoffset.Batch-Tools erwarten Arrays von Objekten; die Item-Schemata werden aus den Spec-Definitionen aufgelöst und dem Modell mitgegeben.
Auswertungen (BWA, Summen- und Saldenliste) werden asynchron im Hintergrund erzeugt: erst
reports_create_*aufrufen, dannreports_get_*mit der zurĂŒckgegebenenid_by_customer. Eine neue Auswertung desselben Typs ersetzt die vorherige.Rate-Limit: BuchhaltungsButler erlaubt 100 Anfragen/Kunde/Minute; der Server drosselt sich selbst bei
BB_RATE_LIMIT(Standard 90), um sicher darunter zu bleiben.
Sicherheit
Deine API-Zugangsdaten liegen ausschlieĂlich in
.env, und diese Datei ist von Git ausgeschlossen. Committe niemals echte Geheimnisse. Falls doch etwas abflieĂt, rotiere die Daten unter BuchhaltungsButler â Einstellungen â API.Der HTTP-Endpunkt ist standardmĂ€Ăig nicht authentifiziert (auf localhost unbedenklich). Um ihn ĂŒber deinen Rechner hinaus verfĂŒgbar zu machen, setze
MCP_AUTH_TOKENund sende ihn alsAuthorization: Bearer <Token>-Header â idealerweise hinter TLS.
Die vollstĂ€ndige Richtlinie und den Meldeweg fĂŒr SicherheitslĂŒcken findest du in SECURITY.md.
Credits & Lizenz
Eine inoffizielle Community-Integration fĂŒr BuchhaltungsButler; weder mit BuchhaltungsButler verbunden noch von dort unterstĂŒtzt. Basiert auf dem Model Context Protocol. Veröffentlicht unter der MIT-Lizenz.
Available Tools
54 toolsaccounts_addAccounts: add a basic accountC
đĄ WRITE · creates data â Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent â calling twice may create duplicates. add a basic account Add a basic account
Endpoint: POST /accounts/add
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The name of the basic account. | |
| type | Yes | The type of the basic account. Accepted values: "cash", "bank/institution", "other". | |
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| is_revision_safe | No | If you create a basic account of type cash, you can make this revision_safe. That means, you cannot remove already saved transactions without creating a cancellation transaction. NOTE: This will only work for cash accounts! If specified, the field will be validated. | |
| postingaccount_number | Yes | The postingaccount_number of the basic account. | |
| receipt_creates_transaction | No | If a receipt assigned to this basic account should automatically create a transaction, this parameter should be true. If specified, the field will be validated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description repeats the idempotentHint and mentions it creates data, but the claim that it creates receipts, transactions, etc. is inaccurate for an accounts_add tool, misrepresenting its behavior. This reduces transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description repeats 'Add a basic account' and includes a lengthy generic first sentence that is not specific to this tool, making it somewhat verbose and less concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 6 parameters and no output schema, the description is insufficient. It does not explain what a basic account is, how it differs from other account types, or what the result looks like.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds no parameter-level details beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Add a basic account' but the preceding generic statement 'Creates new records (receipts, transactions, postings, invoices, master data)' is overly broad and misleading, confusing the tool's actual purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus siblings like 'accounts_get' or other account-related tools. No prerequisites or business context provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
accounts_getAccounts: get all the accountsBRead-onlyIdempotent
đą READ-ONLY â Fetches data. Makes no changes to the accounting records. get all the accounts Get all the accounts
Endpoint: POST /accounts/get
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, idempotentHint, and destructiveHint. The description adds 'Fetches data. Makes no changes.' and 'get all the accounts', which clarifies scope (all accounts) but adds no new behavioral traits beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short but contains redundancy: 'get all the accounts' appears twice. The first line with emoji is unnecessary. It could be more concise without losing clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple get-all tool with one optional param and no output schema, the description covers the basic function. However, it omits details like return format, pagination, or filtering capabilities, which would help given the lack of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully describes the single optional parameter (api_key) with good detail. The tool description adds no parameter information, so it provides no additional value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Fetches data' and 'get all the accounts', indicating it retrieves all account records. However, it does not differentiate itself from other get tools like cost_locations_get or postings_get, relying solely on the tool name for distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives (e.g., if only a subset of accounts is needed). The description only emphasizes read-only nature, which is already covered by annotations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
comments_addComments: add comment to transaction or receiptA
đĄ WRITE · creates data â Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent â calling twice may create duplicates. add comment to transaction or receipt Add comment to transaction or receipt. NOTE: You have to submit either a transaction_id_by_customer or a receipt_id_by_customer.
Endpoint: POST /comments/add
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| comment_text | Yes | The comment text as a string between 2 and 210 characters. | |
| receipt_id_by_customer | No | The id_by_customer of the receipt. If specified, the field will be validated. | |
| transaction_id_by_customer | No | The id_by_customer of the transaction. If specified, the field will be validated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description complements annotations by stating 'Not idempotent â calling twice may create duplicates', which is consistent with idempotentHint=false. It also indicates a write operation (readOnlyHint=false, destructiveHint=false). No contradictions; it adds useful duplication warning beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is relatively short and front-loaded with the purpose after a brief generic note. Each sentence serves a purpose: write warning, core function, parameter constraint. The generic WRITE note could be considered redundant if common across tools, but overall it is concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 4 parameters fully described in schema and no output schema, the description covers the key constraint. However, it lacks information on return values, error behavior, or expected response after adding a comment. While the tool is simple, an agent might benefit from knowing what to expect post-call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While the input schema describes all 4 parameters (100% coverage), the description adds critical constraint: 'You have to submit either a transaction_id_by_customer or a receipt_id_by_customer.' This mutual exclusivity is not evident from individual parameter descriptions, adding significant value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'add comment to transaction or receipt', providing a specific verb and resource. The note about needing either transaction_id_by_customer or receipt_id_by_customer further clarifies the scope. This clearly distinguishes it from sibling tools like accounts_add or receipts_add.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes a clear note about the requirement to submit either a transaction_id_by_customer or a receipt_id_by_customer, providing necessary context for when to use this tool. However, it does not explicitly mention when not to use it or compare to alternatives, but the constraint is sufficient for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cost_locations_addCost Locations: add cost locationB
đĄ WRITE · creates data â Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent â calling twice may create duplicates. add cost location Add a new cost location.
Endpoint: POST /cost-locations/add
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | An alphanumeric identifier for the cost location (max 10 chars) | |
| name | Yes | The name/description of the cost location | |
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false and idempotentHint=false. The description explicitly states 'WRITE · creates data' and warns 'Not idempotent â calling twice may create duplicates,' adding useful behavioral context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably concise but includes a generic introductory line that is not specific to this tool, adding minor redundancy. The structure is acceptable but could be more focused.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the basic purpose and non-idempotence, but lacks details on return value, uniqueness constraints for code or name, and does not leverage the absence of an output schema to explain expected response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed parameter descriptions. The description does not add any extra parameter information beyond what the schema provides, so it meets but does not exceed the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Add a new cost location.' The title also specifies the tool's function. However, it does not differentiate from sibling tools like cost_locations_update or cost_locations_delete, and a generic intro line about creating records is included but not specifically tied to cost locations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. The only behavioral note mentions non-idempotence, but there is no context on prerequisites, conditional use, or when to avoid it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cost_locations_deleteCost Locations: delete cost locationBDestructiveIdempotent
đŽ DESTRUCTIVE · deletes data â Deletes or cancels a record. Confirm with the user before calling. Receipt deletes are restorable; cost-location deletes are not. Cancelling a posting deletes it if it is not yet fixed, otherwise it books a reversal posting. delete cost location Delete a cost location.
Endpoint: POST /cost-locations/delete
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The cost location code | |
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate destructive and non-read-only behavior. The description adds meaningful context beyond that: cost-location deletes are not restorable, and the user should confirm before calling. The irrelevant 'cancelling a posting' reversal detail reduces clarity, but the core irreversibility disclosure is valuable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is not concise: 'delete cost location' is repeated in the bold heading and again in the sentence 'Delete a cost location.' It also includes generic receipt and posting cancellation behavior unrelated to cost-location deletion. The destructive warning is front-loaded, but the redundancy and irrelevant content hurt.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive two-parameter tool, the description covers irreversibility, user confirmation, and the endpoint. However, there is no output schema, and the description does not explain expected success or error responses. The irrelevant receipt/posting details also make the overall guidance less complete for this specific tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add any parameter-level meaning beyond what the schema already provides for 'code' and 'api_key'. The endpoint information is useful but does not clarify parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Delete a cost location' and the title reinforces the resource. It is distinct from cost_locations_get/add/update and from restorable receipt deletes. However, the opening 'Deletes or cancels a record' and the unrelated receipt/posting examples add ambiguity about what this specific tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit when-to-use guidance or routing among alternatives. It only warns to confirm with the user before calling. It does not say, for example, to use this when a cost location must be permanently removed, or to use cost_locations_update if changes are needed instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cost_locations_getCost Locations: get cost locationsARead-onlyIdempotent
đą READ-ONLY â Fetches data. Makes no changes to the accounting records. get cost locations Get cost locations for a specified customer account. The response includes the number of returned rows and an array of cost locations data. NOTE: Each request is limited to 1000 cost locations!
Endpoint: POST /cost-locations/get
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | The code of one specific cost location. If provided, only the cost location with this code will be returned. | |
| limit | No | Set a limit of returned postings. NOTE: the maximum limit is 1000! | |
| offset | No | Set an offset for the returned postings. | |
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and destructiveHint; the description adds the POST endpoint and the 1000-limit, which are valuable behavioral details not in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is succinct, uses emoji and bold for emphasis, and front-loads the read-only warning. No superfluous text, though it could be slightly more structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description mentions the response includes row count and data array, but lacks detail about the fields in the array. Without an output schema, more specificity would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with good parameter descriptions. The description only reiterates the limit constraint, adding no new semantic meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool is read-only and fetches cost locations for a customer account, distinguishing it from write siblings like cost_locations_add/update/delete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly marks the tool as READ-ONLY and states its purpose, making it clear when to use it (to get cost locations without modification). However, it does not explicitly compare to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cost_locations_updateCost Locations: update cost locationAIdempotent
đĄ WRITE · updates data â Modifies existing master data in place. update cost location Update a cost location's name/description.
Endpoint: POST /cost-locations/update
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The cost location code | |
| name | Yes | The updated name/description of the cost location | |
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds context beyond annotations by stating 'Modifies existing master data in place' and including the endpoint. Annotations already provide idempotentHint=true and destructiveHint=false, and the description aligns with these.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: one emoji line, one bold statement, and one sentence of purpose. Every word adds value, and it is front-loaded with the action and resource.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description lacks details about the response (e.g., no output schema) and error conditions. However, for a simple update tool, it provides the essential purpose and parameters. More context on behavior when code is missing would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description adds little beyond what is already documented. It reiterates 'name/description,' which matches the schema's parameter description. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Update a cost location's name/description.' It uses the specific verb 'update' and identifies the resource (cost location), distinguishing it from siblings like cost_locations_add (create) and cost_locations_get.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for updating existing cost locations but does not explicitly state when to use this tool versus alternatives like cost_locations_add or cost_locations_delete. No guidance on exclusions or prerequisites is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_createInvoices: create invoiceC
đĄ WRITE · creates data â Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent â calling twice may create duplicates. create invoice Add an invoice for the specified customer.
Endpoint: POST /invoices/create
| Name | Required | Description | Default |
|---|---|---|---|
| zip | No | The zip of the recipient company. If specified, the field will be validated. | |
| city | No | The city of the recipient company. If specified, the field will be validated. | |
| date | Yes | The date of the invoice. | |
| type | Yes | Can be either 'invoice' ("Rechnung"), 'credit' ("Gutschrift") or 'offer' ("Angebot"). | |
| No | The email for sending the invoice. If specified, the field will be validated. | ||
| street | No | The street of the recipient company. If specified, the field will be validated. | |
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| country | No | The country of the recipient company. If specified, the field will be validated. Valid cases are only the German version of the country name [DĂ€nemark] OR the two digit ISO code of the country [DK]. | |
| due_days | No | The number of days between the invoice date and the due date. If specified, the field will be validated. | |
| item_vat | Yes | An array of invoice item vats. Usage: "item_vat" : ['7', '19'] Valid vat rates are floating point numbers between 0 and 100. | |
| language | No | The language for translatable invoice labels (e.g. headings, table headers, payment terms). Can be either 'de_DE' ("Deutsch", default) or 'en_US' ("English"). If omitted, German is used. | |
| item_name | Yes | An array of invoice items. Usage: "item_name" : ['Item 1', 'Item 2'] | |
| item_unit | Yes | An array of invoice items units. Usage: "item_unit" : ['Std.', 'Stk.'] | |
| item_amount | Yes | An array of invoice item amounts. Usage: "item_amount" : ['10', '20'] | |
| company_name | Yes | The company name of the recipient. | |
| discount_type | No | The type of the discount. Can be either 'percent' or 'EUR'. If specified, the field will be validated. | |
| invoicenumber | No | The invoicenumber for the invoice. If not specified, the default BHB number will be created. If specified, the field will be validated. | |
| show_bankdata | No | Show the the bank data on the invoice. If specified, the field will be validated. | |
| correspondence | No | The optional correspondence to the invoice recipient. If specified, the field will be validated. | |
| date_of_supply | No | Date or period of service/delivery. NOTE: The date_of_supply will be displayed on the PDF, but when the date AND the date_of_supply is specified in the format "YYYY-MM-DD", the date_of_supply will also be taken over as date_delivery of the receipt in the 'Belege' or 'Belege/Buchen' view. IMPORTANT: Due to the DATEV compatibility, we cannot accept a date_of_supply that is after the invoice date. In that case it will be ignored! | |
| discount_value | No | The value of granted discount. If specified, the field will be validated. | |
| customer_number | No | The customer number of the recipient. If specified, the field will be validated. | |
| final_provisions | No | The final comment of the invoice. If specified, the field will be validated. | |
| item_description | No | An array of invoice item description. Usage: "item_description" : ['Description Item 1', 'Description Item 2']. If specified, the field will be validated. | |
| show_contactdata | No | Show the contact data on the invoice. If specified, the field will be validated. | |
| show_prices_type | Yes | Can be either 'net' ("Netto") or 'gross' ("Brutto"). | |
| item_single_price | Yes | An array of invoice item single_prices. Usage: "item_single_price" : ['20', '19.99'] | |
| payment_reference | No | The payment reference id. If specified correctly, the resulting receipt of the created invoice will match with the corresponding transaction. NOTE: Currently we support Amazon order id, PayPal transaction id and Stripe transaction id! | |
| payment_conditions | No | The payment conditions of the invoice. If specified, the field will be validated. | |
| recurring_interval | No | An interval for recurring invoices. Can be either 'weekly', 'monthly', 'quarterly' or 'yearly'. If specified, the field will be validated. | |
| contact_person_name | No | The name of the contact person of the recipient company. If specified, the field will be validated. | |
| recurring_date_next | No | The next date of a recurring invoice. IMPORTANT: The field is required, if "recurring_interval" is specified. If specified, the field will be validated. | |
| additional_addressline | No | The additional address information of the recipient company. If specified, the field will be validated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and idempotentHint=false, and the description usefully makes the risk explicit: "Not idempotent â calling twice may create duplicates." That adds a small amount of practical behavior context, but the description otherwise does not disclose side effects, validation failures, or other runtime behavior beyond what annotations already imply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, but it contains redundancy: "**create invoice**" repeats the title, and the opening list "receipts, transactions, postings, invoices, master data" is generic and potentially misleading for a tool specifically creating invoices. The duplicate-risk note and endpoint are useful, but the structure is not tightly focused.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 33 parameters, 9 required fields, no output schema, and multiple closely related siblings, the description is too thin. It does not describe what the agent should expect in return, doesn't mention required fields, and doesn't guide selection between draft/e-invoice variants. An agent would need to inspect the full schema and sibling names to safely invoke this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema itself documents all 33 parameters. The description adds no parameter-level meaning beyond schema fields, which is acceptable under the baseline for high schema coverage, but it also does not highlight which required parameters are central to a successful invoice creation call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a concrete action â "Add an invoice for the specified customer" â with a specific resource and endpoint. However, it does not distinguish this tool from sibling tools like invoices_create_draft or invoices_create_e_invoice, so it falls short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided about when to use this tool versus alternatives such as invoices_create_draft, invoices_create_e_invoice, or receipt creation tools. The generic "Creates new records" line implies broad creation but gives no selection criteria, prerequisites, or exclusion conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_create_draftInvoices: create invoice draftB
đĄ WRITE · creates data â Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent â calling twice may create duplicates. create invoice draft Add an invoice draft for the specified customer.
Endpoint: POST /invoices/create/draft
| Name | Required | Description | Default |
|---|---|---|---|
| zip | No | The zip of the recipient company. If specified, the field will be validated. | |
| city | No | The city of the recipient company. If specified, the field will be validated. | |
| date | Yes | The date of the invoice. | |
| type | Yes | Can be either 'invoice' ("Rechnung"), 'credit' ("Gutschrift") or 'offer' ("Angebot"). | |
| No | The email for sending the invoice. If specified, the field will be validated. | ||
| street | No | The street of the recipient company. If specified, the field will be validated. | |
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| country | No | The country of the recipient company. If specified, the field will be validated. Valid cases are only the German version of the country name [DĂ€nemark] OR the two digit ISO code of the country [DK]. | |
| item_vat | Yes | An array of invoice item vats. Usage: "item_vat" : ['7', '19'] Valid vat rates are floating point numbers between 0 and 100. | |
| language | No | The language for translatable invoice labels (e.g. headings, table headers, payment terms). Can be either 'de_DE' ("Deutsch", default) or 'en_US' ("English"). If omitted, German is used. | |
| item_name | Yes | An array of invoice items. Usage: "item_name" : ['Item 1', 'Item 2'] | |
| item_unit | Yes | An array of invoice items units. Usage: "item_unit" : ['Std.', 'Stk.'] | |
| item_amount | Yes | An array of invoice item amounts. Usage: "item_amount" : ['10', '20'] | |
| company_name | Yes | The company name of the recipient. | |
| discount_type | No | The type of the discount. Can be either 'percent' or 'EUR'. If specified, the field will be validated. | |
| show_bankdata | No | Show the the bank data on the invoice. If specified, the field will be validated. | |
| correspondence | No | The optional correspondence to the invoice recipient. If specified, the field will be validated. | |
| date_of_supply | No | Date or period of service/delivery. NOTE: The date_of_supply will be displayed on the PDF, but when the date AND the date_of_supply is specified in the format "YYYY-MM-DD", the date_of_supply will also be taken over as date_delivery of the receipt in the 'Belege' or 'Belege/Buchen' view. IMPORTANT: Due to the DATEV compatibility, we cannot accept a date_of_supply that is after the invoice date. In that case it will be ignored! | |
| discount_value | No | The value of granted discount. If specified, the field will be validated. | |
| customer_number | No | The customer number of the recipient. If specified, the field will be validated. | |
| final_provisions | No | The final comment of the invoice. If specified, the field will be validated. | |
| item_description | No | An array of invoice item description. Usage: "item_description" : ['Description Item 1', 'Description Item 2']. If specified, the field will be validated. | |
| show_contactdata | No | Show the contact data on the invoice. If specified, the field will be validated. | |
| show_prices_type | Yes | Can be either 'net' ("Netto") or 'gross' ("Brutto"). | |
| item_single_price | Yes | An array of invoice item single_prices. Usage: "item_single_price" : ['20', '19.99'] | |
| payment_conditions | No | The payment conditions of the invoice. If specified, the field will be validated. | |
| recurring_interval | No | An interval for recurring invoices. Can be either 'weekly', 'monthly', 'quarterly' or 'yearly'. If specified, the field will be validated. | |
| contact_person_name | No | The name of the contact person of the recipient company. If specified, the field will be validated. | |
| recurring_date_next | No | The next date of a recurring invoice. IMPORTANT: The field is required, if "recurring_interval" is specified. If specified, the field will be validated. | |
| additional_addressline | No | The additional address information of the recipient company. If specified, the field will be validated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint=false and idempotentHint=false. The description confirms these with 'đĄ WRITE · creates data' and 'Not idempotent â calling twice may create duplicates', and adds the endpoint. However, the generic line 'Creates new records (receipts, transactions, postings, invoices, master data)' is misleading here since this tool only creates an invoice draft, and much of the safety profile repeats the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core sentence 'Add an invoice draft for the specified customer' is concise, but the description is padded with a generic template preface that repeats the WRITE signal and lists record types irrelevant to this tool. There is noticeable redundancy across 'creates data', 'creates new records', 'create invoice draft', and 'Add an invoice draft'.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex 30-parameter creation tool with no output schema and no guidance on how the many item arrays relate (e.g., parallel arrays). The schema is exhaustive at 100% coverage, so parameter semantics are covered, but the description omits return-value expectations, sibling differentiation, and any workflow hints. It is minimally viable but not complete for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 even without parameter info in the tool description. The description adds nothing about parameters â it only mentions 'the specified customer', which is generic. The schema remains the authoritative source for parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource: 'Add an invoice draft for the specified customer' and the heading 'create invoice draft'. This is specific enough to identify what the tool does. However, it does not explicitly distinguish it from sibling tools like invoices_create or invoices_create_e_invoice; one must infer that 'draft' is the differentiator.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance is given. The description never mentions alternatives such as invoices_create or invoices_create_e_invoice, nor does it explain what a draft is for compared to a final invoice. The only usage signal is the tool's own name, which does not count as guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_create_e_invoiceInvoices: create e-invoiceB
đĄ WRITE · creates data â Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent â calling twice may create duplicates. create e-invoice Add an e-invoice for the specified customer.
Endpoint: POST /invoices/create/e-invoice
| Name | Required | Description | Default |
|---|---|---|---|
| zip | Yes | The zip of the recipient company. If specified, the field will be validated. | |
| city | Yes | The city of the recipient company. If specified, the field will be validated. | |
| date | Yes | The date of the invoice. | |
| type | Yes | Can be either 'invoice' ("Rechnung"), 'credit' ("Gutschrift") or 'offer' ("Angebot"). | |
| Yes | The email for sending the invoice. If specified, the field will be validated. | ||
| street | Yes | The street of the recipient company. If specified, the field will be validated. | |
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| country | Yes | The country of the recipient company. If specified, the field will be validated. Valid cases are only the German version of the country name [DĂ€nemark] OR the two digit ISO code of the country [DK]. | |
| due_days | No | The number of days between the invoice date and the due date. If not specified due date will be set to invoice date (due_days = 0). | |
| language | No | The language for translatable invoice labels (e.g. headings, table headers, payment terms). Can be either 'de_DE' ("Deutsch", default) or 'en_US' ("English"). If omitted, German is used. | |
| item_name | Yes | An array of invoice items. Usage: "item_name" : ['Item 1', 'Item 2'] | |
| item_unit | Yes | An array of invoice items units. Usage: "item_unit" : ['Std.', 'Stk.'] | |
| item_amount | Yes | An array of invoice item amounts. Usage: "item_amount" : ['10', '20'] | |
| company_name | Yes | The company name of the recipient. | |
| e_invoice_id | Yes | Buyer reference (default: 0). If you do not have a reference, please enter "0". A valid is mandatory for e-invoices to public contracting authorities and is provided by the recipient. | |
| discount_type | No | The type of the discount. Can be either 'percent' or 'EUR'. If specified, the field will be validated. | |
| invoicenumber | No | The invoicenumber for the invoice. If not specified, the default BHB number will be created. If specified, the field will be validated. | |
| item_tax_type | Yes | An array of invoice item tax types. Usage: "item_vat" : ['S', 'E'] Valid tax types are the following: S - VAT (standard rate) Z - 0% VAT AE - Reverse Charge (§13b) K - EU Supply (Intra-community supply) G - Third Country Supply (Export) E - VAT Exempt Supply & Services | |
| show_bankdata | No | Show the the bank data on the invoice. If specified, the field will be validated. | |
| correspondence | No | The optional correspondence to the invoice recipient. If specified, the field will be validated. | |
| date_of_supply | No | Date or period of service/delivery. NOTE: The date_of_supply will be displayed on the PDF, but when the date AND the date_of_supply is specified in the format "YYYY-MM-DD", the date_of_supply will also be taken over as date_delivery of the receipt in the 'Belege' or 'Belege/Buchen' view. IMPORTANT: Due to the DATEV compatibility, we cannot accept a date_of_supply that is after the invoice date. In that case it will be ignored! | |
| discount_value | No | The value of granted discount. If specified, the field will be validated. | |
| customer_number | No | The customer number of the recipient. If specified, the field will be validated. | |
| item_tax_amount | Yes | Only required if corresponding item_tax_type = 'S' (VAT). An array of invoice item vats. Usage: "item_tax_amount" : ['7', '19'] Valid vat rates are floating point numbers between 0 and 100. | |
| final_provisions | No | The final comment of the invoice. If specified, the field will be validated. | |
| item_description | No | An array of invoice item description. Usage: "item_description" : ['Description Item 1', 'Description Item 2']. If specified, the field will be validated. | |
| show_contactdata | No | Show the contact data on the invoice. If specified, the field will be validated. | |
| show_prices_type | Yes | Can be either 'net' ("Netto") or 'gross' ("Brutto"). | |
| item_single_price | Yes | An array of invoice item single_prices. Usage: "item_single_price" : ['20', '19.99'] | |
| payment_reference | No | The payment reference id. If specified correctly, the resulting receipt of the created invoice will match with the corresponding transaction. NOTE: Currently we support Amazon order id, PayPal transaction id and Stripe transaction id! | |
| payment_conditions | No | The payment conditions of the invoice. If specified, the field will be validated. | |
| recurring_interval | No | An interval for recurring invoices. Can be either 'weekly', 'monthly', 'quarterly' or 'yearly'. If specified, the field will be validated. | |
| contact_person_name | No | The name of the contact person of the recipient company. If specified, the field will be validated. | |
| recurring_date_next | No | The next date of a recurring invoice. IMPORTANT: The field is required, if "recurring_interval" is specified. If specified, the field will be validated. | |
| additional_addressline | No | The additional address information of the recipient company. If specified, the field will be validated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description explicitly says the operation is not idempotent and that calling twice may create duplicates, which is a useful behavioral warning. It also labels the tool as a write operation and says it creates records. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the write/non-idempotency warning, followed by one specific sentence and the endpoint. There is minor redundancy in the generic 'creates data' prefix and the 'create e-invoice' heading, but overall it stays concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with 35 parameters and no output schema, a single sentence is too thin. It does not describe the expected result/response, e-invoice-specific requirements beyond the schema, validation gotchas, or how this tool relates to sibling invoice tools. The rich schema covers parameters, but the description itself leaves significant context for the agent to discover.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameter semantics are already fully documented in the input schema. The description adds no additional parameter-level meaning, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the operation: 'Add an e-invoice for the specified customer', with the endpoint POST /invoices/create/e-invoice. It is specific about the resource type (e-invoice) and action, but does not explicitly distinguish itself from siblings like invoices_create or invoices_create_draft.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance is provided, and no alternative tools are mentioned. The agent is left to infer when an e-invoice is appropriate instead of a regular invoice or draft, and no mention of the typical public-contracting-authority use case is made.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
postings_add_batch_freePostings: add multiple free postingsC
đĄ WRITE · creates data â Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent â calling twice may create duplicates. add multiple free postings Add multiple free postings.
Endpoint: POST /postings/add-batch/free
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| free_postings | Yes | an array of free postings, each free posting has the same field declaration and validation as the postings/add/free endpoint |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds the warning 'Not idempotent â calling twice may create duplicates' beyond the annotations, which declare idempotentHint false. However, it does not describe return values, error handling, or effects on other entities.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The phrase 'add multiple free postings' is repeated verbatim, creating redundancy. The generic write warning at the start may not be specific to this tool, wasting space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema is provided, and the description does not explain what the tool returns on success or failure. For a batch write operation, details on atomicity, partial success, or errors are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for both parameters. The description adds context that free_postings follow the same validation as the single-free-posting endpoint, but otherwise adds no new meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'add multiple free postings' which is a specific verb-resource pair. However, it does not distinguish from the sibling 'postings_add_free' which adds a single free posting, relying on the name to imply batch operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like 'postings_add_free' or other batch posting tools. The description does not mention prerequisites or context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
postings_add_batch_receiptsPostings: add multiple receipt postingsB
đĄ WRITE · creates data â Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent â calling twice may create duplicates. add multiple receipt postings Add postings for specified receipts. Important: Receipt postings are only available if creditor or debtor posting is activated!
IMPORTANT: If you add postings to a receipt with foreign currency, you have to get that receipt (/receipts/get/id_by_customer) and find the calculated amount before performing this request.
Endpoint: POST /postings/add-batch/receipts
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| receipts | Yes | an array of receipt postings, each receipt posting has the same field declaration and validation as the postings/add/receipt endpoint |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly labels it as a write operation (WRITE · creates data) and states it is not idempotent, which aligns with annotations and adds behavioral context. It also notes the prerequisite about activation. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description includes an emoji and repeats the title in bold. The foreign currency note is useful but the structure could be tighter. Key information is front-loaded, but there is some redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description lacks information about return values or error handling. For a write operation with nested objects, this omission leaves the agent uncertain about what to expect. Given no output schema, the description should compensate more.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description adds limited value beyond schema. It mentions that the 'receipts' array structure mirrors the 'postings/add/receipt' endpoint, which is helpful but not detailed. No additional parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The title and description clearly state the tool adds multiple receipt postings. The verb 'add' and resource 'postings' are specific. However, it does not explicitly distinguish this tool from the singular 'postings_add_receipt' or similar batch tools like 'postings_add_batch_transactions'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides important usage notes: only works if creditor/debtor posting is activated, and foreign currency handling requires pre-fetching the receipt. However, it does not guide when to use this tool versus alternatives (e.g., when to use batch vs singular).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
postings_add_batch_transactionsPostings: add multiple transaction postingsA
đĄ WRITE · creates data â Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent â calling twice may create duplicates. add multiple transaction postings Add posting for specified transactions.
Endpoint: POST /postings/add-batch/transactions
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| transactions | Yes | an array of transaction postings, each transaction posting has the same field declaration and validation as the postings/add/transaction endpoint |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description includes write indicator, creation of new records, and idempotency warning ('calling twice may create duplicates'), going beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with write/behavioral warnings, but includes unnecessary formatting (emoji, bold) and endpoint URL, slightly impacting conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Lacks output schema but covers key behavioral aspects (write, idempotency) and parameter structure via schema; no mention of error handling or partial success.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%; description adds only a reference to another endpoint for validation details, not substantially enriching parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Title and description explicitly state 'add multiple transaction postings' and 'add posting for specified transactions', distinguishing from single transaction and batch receipts siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description indicates it's for adding multiple transaction postings in batch, but does not explicitly state when to prefer this over sibling tools like postings_add_transaction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
postings_add_freePostings: add free postingB
đĄ WRITE · creates data â Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent â calling twice may create duplicates. add free posting Add a free posting.
Endpoint: POST /postings/add/free
| Name | Required | Description | Default |
|---|---|---|---|
| vat | Yes | The vat rate of the posting. Possible vats: - 0_none ('keine Ust.') - 19_vat ('19% Ust.') - 7_vat ('7% Ust.') - 19_pre ('19% Vst.') - 7_pre ('7% Vst.') - 19_both_1 ('§13b 19% USt./VSt.') - 19_both_506 ('§13b 19% USt./VSt. (EU §13b Abs. 1)') - 19_both_6506 ('§13b 19% USt. (EU §13b Abs. 1, ohne VSt.)') - 19_both_511 ('§13b 19% USt./VSt. (Drittland §13b Abs. 2 Nr. 1)') - 19_both_6511 ('§13b 19% USt. (Drittland §13b Abs. 2 Nr. 1, ohne VSt.)') - 19_both_6501 ('§13b 19/16% USt. (ohne VSt.)') - 19_both_2 ('I.g.E. 19% USt./VSt.') - 7_both ('I.g.E. 7% USt./VSt.') - 19_both_1_no_pre ('§13b 19/16% USt.') - 19_both_2_no_pre ('i.g.E. 19/16% USt.') - 7_both_no_pre ('i.g.E. 7/5% USt.') - 19_pre_app ('19/16% Aufz. VSt.') - 7_pre_app ('7/5% Aufz. VSt.') - 19_both_app_1 ('§13b 19/16% USt./Aufz. VSt.') - 19_both_app_506 ('§13b 19/16% USt./Aufz. VSt. (EU §13b Abs. 1)') - 19_both_app_511 ('§13b 19/16% USt./Aufz. VSt. (Drittland §13b Abs. 2 Nr. 1)') - 19_both_app_2 ('i.g.E. 19/16% USt./Aufz. VSt.') - 7_both_app ('i.g.E. 7/5% USt./Aufz. VSt.') | |
| date | Yes | The date of the posting. | |
| amount | Yes | The amount of the posting. | |
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| postingtext | Yes | The description of the posting. | |
| cost_location | No | The cost location number. If specified, field will be validated. | |
| cost_location_two | No | The cost location two number. If specified, field will be validated. | |
| postingaccount_debit | Yes | The debit account number of the posting. | |
| postingaccount_credit | Yes | The credit account number of the posting. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a non-idempotent write operation. The description adds the concrete consequence that calling twice may create duplicates, which is useful behavioral context beyond the structured annotation. It does not cover validation or return behavior, but the duplicate warning adds real value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with the write indicator, duplicate warning, action, and endpoint. The generic 'Creates new records (receipts, transactions, postings, invoices, master data)' boilerplate is somewhat unfocused, but overall the description is compact and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The schema fully documents the parameters and annotations cover mutation and non-idempotence. However, the description does not explain what a 'free posting' is, what a successful response looks like, or how this differs from sibling posting tools. It is minimally adequate but leaves notable gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 9 parameters already have meaningful descriptions in the input schema. The description itself adds no additional parameter-level meaning, matching the baseline for fully documented schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the action clearly: 'Add a free posting' and provides the exact endpoint. However, it never explains what distinguishes a 'free' posting from the many sibling add tools, so it is clear about the verb and resource but not about sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as postings_add_batch_free, postings_add_receipt, or postings_add_transaction. No conditions, prerequisites, or exclusions are provided, so an agent cannot reliably decide between this and related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
postings_add_receiptPostings: add receipt postingA
đĄ WRITE · creates data â Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent â calling twice may create duplicates. add receipt posting Add postings for a specified receipt. Important: Receipt postings are only available if creditor or debtor posting is activated!
IMPORTANT: If you add postings to a receipt with foreign currency, you have to get that receipt (/receipts/get/id_by_customer) and find the calculated amount before performing this request.
Endpoint: POST /postings/add/receipt
| Name | Required | Description | Default |
|---|---|---|---|
| vats | Yes | An array of vats. Usage: "vats" : ['vat of posting 1', 'vat of posting 2']. Possible vats: - 0_none ('keine Ust.') - 19_vat ('19% Ust.') - 7_vat ('7% Ust.') - 19_pre ('19% Vst.') - 7_pre ('7% Vst.') - 19_both_1 ('§13b 19% USt./VSt.') - 19_both_506 ('§13b 19% USt./VSt. (EU §13b Abs. 1)') - 19_both_6506 ('§13b 19% USt. (EU §13b Abs. 1, ohne VSt.)') - 19_both_511 ('§13b 19% USt./VSt. (Drittland §13b Abs. 2 Nr. 1)') - 19_both_6511 ('§13b 19% USt. (Drittland §13b Abs. 2 Nr. 1, ohne VSt.)') - 19_both_6501 ('§13b 19/16% USt. (ohne VSt.)') - 19_both_2 ('I.g.E. 19% USt./VSt.') - 7_both ('I.g.E. 7% USt./VSt.') - 19_both_1_no_pre ('§13b 19/16% USt.') - 19_both_2_no_pre ('i.g.E. 19/16% USt.') - 7_both_no_pre ('i.g.E. 7/5% USt.') - 19_pre_app ('19/16% Aufz. VSt.') - 7_pre_app ('7/5% Aufz. VSt.') - 19_both_app_1 ('§13b 19/16% USt./Aufz. VSt.') - 19_both_app_506 ('§13b 19/16% USt./Aufz. VSt. (EU §13b Abs. 1)') - 19_both_app_511 ('§13b 19/16% USt./Aufz. VSt. (Drittland §13b Abs. 2 Nr. 1)') - 19_both_app_2 ('i.g.E. 19/16% USt./Aufz. VSt.') - 7_both_app ('i.g.E. 7/5% USt./Aufz. VSt.') | |
| debtor | Yes | The number of the debtor. IMPORTANT: The field is only required, if you are posting to an outgoing invoice and if debtor posting is activated. If specified, the field will be validated. | |
| amounts | Yes | An array of amounts. Usage: "amounts" : ['amount of posting 1', 'amount of posting 2'] Amount must be in format 0000.00 | |
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| creditor | Yes | The number of the creditor. IMPORTANT: The field is only required, if you are posting to an incoming invoice and if creditor posting is activated. If specified, the field will be validated. | |
| postingtexts | Yes | An array of posting texts. Usage: "postingtexts" : ['text of posting 1', 'text of posting 2'] | |
| cost_locations | No | An array of cost_locations. Usage: "cost_locations" : ['cost_location of posting 1', 'cost_location of posting 2']. If specified, the field will be validated. | |
| postingaccounts | Yes | An array of postingaccount numbers. Usage: "postingaccounts" : ['number of posting 1', 'number of posting 2'] | |
| cost_locations_two | No | An array of cost_locations_two. Usage: "cost_locations_two" : ['cost_location_two of posting 1', 'cost_location_two of posting 2']. If specified, the field will be validated. | |
| receipt_id_by_customer | Yes | The id_by_customer of the receipt. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavioral context beyond annotations: flags WRITE, warns 'Not idempotent â calling twice may create duplicates' (expanding idempotentHint=false), and documents the activation and foreign-currency preconditions. No auth or rate-limit disclosure, but the dupicate-risk and prerequisite caveats are exactly the kind of value-add expected here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the WRITE warning and duplication risk, then the core action, then important prerequisites, then endpoint. Slightly bloated by the generic 'creates records (receipts, transactions, postings, invoices, master data)' line which describes the whole family rather than this tool, but overall compact and well-labeled with IMPORTANT markers.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 10-parameter write operation with no output schema, the description covers the highest-risk aspects: non-idempotency, activation preconditions, and the foreign-currency retrieval workflow. The only real gap is return-value/response behavior, but annotations and the fully-documented schema carry much of the burden.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% â every parameter (vats, amounts, postintexts, creditor/-debtor, api_key, cost_locations, etc.) already carries its own documentation in the input schema. The tool description itself adds no parameter-level detail beyond the foreign-currency note, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource â 'Add postings for a specified receipt' â which clearly distinguishes it from siblings like postings_add_free, postings_add_transaction, and postings_add_batch_receipts. The receipt-scoped resource is unambiguous even before opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two concrete preconditions: receipt postings are only available if creditor or debtor posting is activated, and foreign-currency receipts require a preliminary /receipts/get/id_by_customer call to find the calculated amount. This is clear contextual guidance, though it never names alternatives or states when-not-to-use versus the other postings_add_* tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
postings_add_transactionPostings: add transaction postingC
đĄ WRITE · creates data â Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent â calling twice may create duplicates. add transaction posting Add postings for a specified transaction.
Endpoint: POST /postings/add/transaction
| Name | Required | Description | Default |
|---|---|---|---|
| vats | Yes | An array of vats. Usage: "vats" : ['vat of posting 1', 'vat of posting 2']. Possible vats: - 0_none ('keine Ust.') - 19_vat ('19% Ust.') - 7_vat ('7% Ust.') - 19_pre ('19% Vst.') - 7_pre ('7% Vst.') - 19_both_1 ('§13b 19% USt./VSt.') - 19_both_506 ('§13b 19% USt./VSt. (EU §13b Abs. 1)') - 19_both_6506 ('§13b 19% USt. (EU §13b Abs. 1, ohne VSt.)') - 19_both_511 ('§13b 19% USt./VSt. (Drittland §13b Abs. 2 Nr. 1)') - 19_both_6511 ('§13b 19% USt. (Drittland §13b Abs. 2 Nr. 1, ohne VSt.)') - 19_both_6501 ('§13b 19/16% USt. (ohne VSt.)') - 19_both_2 ('I.g.E. 19% USt./VSt.') - 7_both ('I.g.E. 7% USt./VSt.') - 19_both_1_no_pre ('§13b 19/16% USt.') - 19_both_2_no_pre ('i.g.E. 19/16% USt.') - 7_both_no_pre ('i.g.E. 7/5% USt.') - 19_pre_app ('19/16% Aufz. VSt.') - 7_pre_app ('7/5% Aufz. VSt.') - 19_both_app_1 ('§13b 19/16% USt./Aufz. VSt.') - 19_both_app_506 ('§13b 19/16% USt./Aufz. VSt. (EU §13b Abs. 1)') - 19_both_app_511 ('§13b 19/16% USt./Aufz. VSt. (Drittland §13b Abs. 2 Nr. 1)') - 19_both_app_2 ('i.g.E. 19/16% USt./Aufz. VSt.') - 7_both_app ('i.g.E. 7/5% USt./Aufz. VSt.') | |
| amounts | Yes | An array of amounts. Usage: "amounts" : ['amount of posting 1', 'amount of posting 2'] Amount must be in format 0000.00 | |
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| postingtexts | Yes | An array of posting texts. Usage: "postingtexts" : ['text of posting 1', 'text of posting 2'] | |
| cost_locations | No | An array of cost_locations. Usage: "cost_locations" : ['cost_location of posting 1', 'cost_location of posting 2']. If specified, the field will be validated. | |
| postingaccounts | Yes | An array of postingaccount numbers. Usage: "postingaccounts" : ['number of posting 1', 'number of posting 2'] | |
| cost_locations_two | No | An array of cost_locations_two. Usage: "cost_locations_two" : ['cost_location_two of posting 1', 'cost_location_two of posting 2']. If specified, the field will be validated. | |
| transaction_id_by_customer | Yes | The id_by_customer of the transaction. | |
| oi_receipts_ids_by_customer | Yes | An array of "open item" receipts ids_by_customer . Usage: "oi_receipts_ids_by_customer" : ['id_by_customer of the receipt for posting 1', null ] The receipts specified will be assigned directly to the respective postings. A null value within the array means explicitly assigning no receipt to the partial posting in that position. IMPORTANT: The field is only required, if OI postings are activated in customers account. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false and idempotentHint=false. The description reinforces this by saying 'WRITE · creates data' and 'Not idempotent â calling twice may create duplicates', which adds a small behavioral warning. But it does not explain side effects, validation requirements, or whether an existing transaction must already exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the write warning, but the first sentence is a generic boilerplate covering receipts, invoices, and master data â broader than this tool's actual purpose. The 'add transaction posting' line repeats the title, and the endpoint line adds little for an agent given the tool name and schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex 9-parameter, 6-required write operation with parallel arrays and many sibling tools. The description provides almost no workflow context, such as array alignment, required existence of the transaction, when oi_receipts_ids_by_customer is truly required, or what the consequences of a duplicate call are beyond a generic warning.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the structured schema already documents each parameter in detail. The description itself adds no parameter-level meaning, which is acceptable under the baseline but does not improve understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and object: 'Add postings for a specified transaction.' This disambiguishes it from free/receipt posting tools. However, it does not call out the sibling batch variant or explain the array-based structure, so differentiation is only partial.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given for when to choose this tool versus siblings like postings_add_batch_transactions or postings_add_free. There are no conditions, prerequisites, or exclusions mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
postings_assign_receipt_to_free_postingPostings: assign receipt to free postingB
đĄ WRITE · links/unlinks records â Creates or removes an assignment between records (e.g. receipt â transaction). Reversible. assign receipt to free posting Assign a receipt to a free posting.
Endpoint: POST /postings/assign/receipt-to-free-posting
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| posting_id_by_customer | Yes | The id_by_customer of the posting. | |
| receipt_id_by_customer | Yes | The id_by_customer of the receipt. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the tool is a write operation ('WRITE'), can 'link/unlink records,' and is 'Reversible.' This adds context beyond annotations, but the description ambiguously mentions both creating and removing assignments while the tool name only suggests assignment. No additional details on permissions or side effects are provided.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is fairly concise but includes some repetition (e.g., the bold title line duplicates the purpose). It could be more streamlined by removing the general 'WRITE' note if it applies to a category, but overall it is acceptable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that there is no output schema, the description should at least hint at the return value or side effects of the assignment. It fails to explain what happens after assignment, error conditions, or any consequences, leaving the agent underinformed for a mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description does not add extra meaning beyond what the input schema already provides. The parameters are adequately described in the schema, so the description adds no additional semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Assign a receipt to a free posting.' It distinguishes from siblings like transactions_assign_receipt (which assigns to transactions) and postings_add_free (which creates a free posting). The verb 'assign' combined with the specific resource 'free posting' provides clear scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance is given on when to use this tool versus alternatives. Siblings such as transactions_assign_receipt and transactions_unassign_receipt exist, but the description does not explain that this tool is specifically for free postings or contrast it with other assignment tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
postings_cancelPostings: cancel postingADestructiveIdempotent
đŽ DESTRUCTIVE · deletes data â Deletes or cancels a record. Confirm with the user before calling. Receipt deletes are restorable; cost-location deletes are not. Cancelling a posting deletes it if it is not yet fixed, otherwise it books a reversal posting. cancel posting Cancel a specified posting. Postings that are not fixed are deleted, fixed postings are cancelled by creating a reversal posting.
Endpoint: POST /postings/cancel
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| posting_id_by_customer | Yes | The id_by_customer of the posting. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It discloses substantial behaviorbeyond annotations: destructive semantics, the delete-vs-reversal distinction based on fixec status, restorability of related delete types, and the need to confirm with the user. This fully supplements the destructiveHint and readOnlyHint annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the destructive warning, but the 'cancel posting' section repeats the same fixed-postings-deleted/reversal distinction already stated in the first paragraph. The redundancy makes it less concise than it could be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with no output schema, the description covers the critical behavior, confirmation requirement, and restorability nuances. It does not explain return values or define 'fixed', but it provides enough for an agent to call the tool correctly and safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters adequaely. The description does not add meaning beyond 'specified posting' and the endpoint, giving no extra param semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies a specific verb ('Cancel') and resource ('a specified posting'), and distinguishes it from sibling operations like postings_unconfirm_* by stating that fixed postings are cancelled via a reversal posting while non-fixed ones are deleted. The endpoint and title reinforce the purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use for cancelling postings and explicitly requires user confirmation before calling, but it does not contrast this tool with alternatives such as postings_unconfirm_* or the various delete tools. There is clear context, but no explicit exclusions or alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
postings_getPostings: get postingsARead-onlyIdempotent
đą READ-ONLY â Fetches data. Makes no changes to the accounting records. get postings Get postings for a specified customer account. The response includes the number of returned rows and an array of postings data. NOTE: Each request is limited to 1000 postings!
Endpoint: POST /postings/get
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Set a limit of returned postings. NOTE: the maximum limit is 1000! | |
| order | No | Possible values are "default", "date ASC", "date DESC", "date_last_action ASC", "date_last_action DESC", "id_by_customer ASC", "id_by_customer DESC". The default order is ascending by date as first and date_last_action as second criterion. Please not that the validation of the specified value is case sensitive! | |
| offset | No | Set an offset for the returned postings. | |
| account | No | A comma separated list of accounts. Use the following options: all, all financial accounts, free booking and any of your available accounts as numeric value. The default is "all" | |
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| date_to | Yes | The postings issuing date in format 'YYYY-MM-DD' (e.g. '2017-04-26'). All postings with issuing date including and before given value will be returned. If specified, the field will be validated. An empty string is not considered a valid date. | |
| date_from | Yes | The postings issuing date in format 'YYYY-MM-DD' (e.g. '2017-04-26'). All postings with issuing date including and after given value will be returned. If specified, the field will be validated. An empty string is not considered a valid date. | |
| cost_location | No | Set a specific cost location code. If specified, only postings to this cost location are returned | |
| posting_status | No | Set the status of the posting. You have the following options: all, fixed, unfixed The default is "all" | |
| postingaccount | No | A comma separated list of postingaccounts. Use the following options: all, all postingaccounts, all debtors, all creditors and any of your available postingaccounts as numeric value. The default is "all" | |
| date_last_action_to | No | A date in format 'YYYY-MM-DD'. All postings that were created or modified in status (confirmed, fixed) on or before this date will be returned. If specified, the field will be validated. An empty string is not considered a valid date. | |
| date_last_action_from | No | A date in format 'YYYY-MM-DD'. All postings that were created or modified in status (confirmed, fixed) on or after this date will be returned. If specified, the field will be validated. An empty string is not considered a valid date. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and destructiveHint=false, which the description reinforces. It also adds a key behavioral constraint: each request is limited to 1000 postings. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is relatively concise with a front-loaded safety indicator. However, it includes minor redundancy (repeating 'get postings' and the endpoint) that could be trimmed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description explains the response structure (count and array) and the 1000 limit, but does not provide guidance on how to use pagination parameters (offset/limit) or specify which parameters correspond to 'customer account'. With 12 parameters and no output schema, more context would be helpful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameter descriptions in the schema are comprehensive. The description does not add new semantic meaning beyond what the schema provides, such as format or usage tips for individual parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves postings for a specified customer account, using the verb 'get' and specifying the resource 'postings'. It differentiates from siblings by emphasizing the read-only nature, distinguishing it from write operations like postings_add_*.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for fetching postings based on the name and description, but it does not explicitly state when to use this tool over alternatives like transactions_get or receipts_get. No exclusions or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
postings_unconfirm_freePostings: unconfirm free postingAIdempotent
đĄ WRITE · reverts state â Reverts a prior state change (un-confirm a posting, restore a deleted receipt). Reversible. unconfirm free posting Remove a specified free posting by unconfirming it. This will only work if the posting is not fixed.
Endpoint: POST /postings/unconfirm/free
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| posting_id_by_customer | Yes | The id_by_customer of the free posting. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide destructiveHint=false and idempotentHint=true. The description adds context: 'Reverts a prior state change,' 'Reversible,' and the condition about 'not fixed.' It explains the idempotency implication (reversibility) but does not detail side effects or permissions. Adds value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with key information (write, reverts state) and ends with endpoint. Some redundancy with the emoji and bold formatting, but overall not verbose. Every sentence contributes meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema is provided, and the description does not explain the return value or error cases. For a simple write operation, the action is clear, but the lack of output description leaves a gap. Adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented. The description implies the use of posting_id_by_customer ('specified free posting') but does not add new semantic information. Baseline 3 for high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action: 'Remove a specified free posting by unconfirming it.' It distinguishes from sibling tools like postings_unconfirm_receipt and postings_unconfirm_transaction by specifying 'free posting'. The verb+resource combination is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a condition: 'This will only work if the posting is not fixed.' It implies usage for free postings but does not explicitly contrast with siblings. No when-not guidance, but the context of 'free posting' and sibling names makes it clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
postings_unconfirm_receiptPostings: unconfirm receipt postingAIdempotent
đĄ WRITE · reverts state â Reverts a prior state change (un-confirm a posting, restore a deleted receipt). Reversible. unconfirm receipt posting Remove postings for a specified receipt by unconfirming them. This will only work if the postings are not fixed.
Endpoint: POST /postings/unconfirm/receipt
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| receipt_id_by_customer | Yes | The id_by_customer of the receipt. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate mutation (readOnlyHint=false) and idempotency. The description adds context: it reverts state, is reversible, and requires postings not fixed. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is fairly concise with emoji and bold for emphasis, but includes some redundancy (e.g., 'unconfirm receipt posting' appears twice). Still efficient overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 2 parameters, no output schema, and available annotations, the description provides sufficient context: it explains the operation, condition, and endpoint. Lacks return value info but that's not expected without output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear parameter descriptions. The description references receipt_id_by_customer but adds no significant meaning beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it unconfirms postings for a receipt, using specific verb and resource. It distinguishes from siblings like postings_unconfirm_free and postings_unconfirm_transaction by the resource type (receipt), but does not explicitly differentiate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions a condition ('only work if postings are not fixed'), but does not provide explicit guidance on when to use this tool versus alternatives like postings_unconfirm_free or postings_unconfirm_transaction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
postings_unconfirm_transactionPostings: unconfirm transaction postingAIdempotent
đĄ WRITE · reverts state â Reverts a prior state change (un-confirm a posting, restore a deleted receipt). Reversible. unconfirm transaction posting Remove postings for a specified transaction by unconfirming them. This will only work if the postings are not fixed.
Endpoint: POST /postings/unconfirm/transaction
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| transaction_id_by_customer | Yes | The id_by_customer of the transaction. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, destructiveHint=false, and idempotentHint=true. The description adds that it reverts state and is reversible, which is consistent and provides behavioral context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the purpose and key conditions. It includes an endpoint and is well-structured, though the emoji and formatting could be slightly trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool is a mutation with a specific condition, the description adequately covers the core behavior and condition. Without an output schema, the return value is not explained, but the tool's purpose is sufficiently clear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Parameter descriptions in the input schema are complete (100% coverage), so the description does not need to add more. The tool description does not elaborate on parameters beyond what's in the schema, so baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reverts a prior state change (unconfirms a posting) and specifies the resource (transaction postings). It distinguishes from siblings like postings_unconfirm_free and postings_unconfirm_receipt by focusing on transactions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a condition for use ('only work if the postings are not fixed') and states it is reversible. However, it does not explicitly compare to alternative tools or advise when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipts_addReceipts: add a receiptA
đĄ WRITE · creates data â Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent â calling twice may create duplicates. add a receipt Add a receipt into the specified customer account. NOTE: Use this endpoint, to add a receipt without a file!
Endpoint: POST /receipts/add
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | The receipt's issuing date in format 'YYYY-MM-DD' (e.g. '2017-04-26'). An empty string is not considered a valid date. | |
| type | Yes | Can be 'invoice inbound' ("Eingangsrechnung"), 'invoice outbound' ("Ausgangsrechnung"), 'credit inbound' ("Eingangsgutschrift § 14 UStG"), 'credit outbound' ("Ausgangsgutschrift § 14 UStG"). | |
| amount | Yes | The total amount of the receipt, can be negative to indicate a reversed payment (e.g. -12.30). '0.00' is not considered a valid receipt amount. | |
| account | No | If the receipt shall directly be assigned to a payment account, you can specify its posting account number (e.g. '1200'). If specified, the account must exist as a payment account for the customer. '0' is not considered a valid account. | |
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| currency | Yes | At the moment we accept USD, GBP and CHF. An empty string is not considered a valid currency. | |
| vat_rate | No | The receipt's vat rate (e.g. 19.00 or 0) - may also be an empty string to indicate a non-available or multiple vat rates | |
| counterparty | Yes | The counterparty of the receipt, i.e. the invoicing party for type 'invoice inbound' or the recipient for type 'invoice outbound' (e.g. 'Peter Maier'). An empty string is not considered a valid counterparty. | |
| date_delivery | No | The delivery date in format 'YYYY-MM-DD' (e.g. '2017-04-26'). NOTE: Due to the DATEV compatibility, we cannot accept a delivery date that is after the receipt date! If specified, it will be validated. | |
| invoice_number | Yes | The invoice number (e.g. '1231XU23') with a maximum length of 60 characters - may also be an empty string. | |
| creditor_debtor | No | If the receipt shall directly be assigned to a creditor (for type 'invoice inbound') or debtor (for type 'invoice outbound') account, you can specify its posting account number (e.g. '70001'). If specified, creditors/debtors have to be activated for the customer, the creditor/debtor account must exist for the customer and it must be compatible with the specified receipt type. '0' is not considered a valid creditor/debtor. | |
| date_payment_due | No | The payment due date in format 'YYYY-MM-DD' (e.g. '2017-04-26'). | |
| payment_reference | No | The payment reference id. If specified correctly, the uploaded receipt will match with the corresponding transaction. | |
| link_to_receipt_id_by_customer | No | Has to be a valid id_by_customer of another receipt. If specified, both receipts will be assigned to a transaction if one of them is assigned manually. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate it is not read-only and not idempotent. The description adds context: 'Not idempotent â calling twice may create duplicates' and the đĄ WRITE marker, which reinforces the behavioral traits and provides practical guidance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is relatively concise, with a clear front-loaded warning about write operations and non-idempotency. The content is focused and efficiently conveys the necessary information, though the repetition of 'creates data' and 'not idempotent' could be slightly streamlined.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (14 parameters, no output schema) and the presence of many siblings, the description provides adequate context: it specifies the action, distinguishes the tool from 'receipts_upload', and includes behavioral hints. It does not cover all edge cases but is sufficiently complete for a creation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all 14 parameters. The description does not add additional meaning about parameters beyond the schema details, thus a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The title 'Receipts: add a receipt' and description 'Add a receipt into the specified customer account' clearly state the verb (add) and resource (receipt). It distinguishes itself from sibling 'receipts_upload' by noting this endpoint is for adding without a file.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use this endpoint, to add a receipt without a file!', providing a clear condition for use relative to 'receipts_upload'. However, it does not address other scenarios or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipts_addBatchReceipts: add batch receiptsA
đĄ WRITE · creates data â Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent â calling twice may create duplicates. add batch receipts Add multiple receipts
Note: a request is allowed only every 5 seconds
Endpoint: POST /receipts/addBatch
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| receipts | Yes | list of receipts maximum of 50 receipts are allowed A receipt has the same fields like the /receipts/add endpoint has, same applies for error messages |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate non-idempotent (idempotentHint=false) and non-destructive (destructiveHint=false). The description explicitly states 'Not idempotent â calling twice may create duplicates', which adds value beyond annotations. It also notes the write nature and rate limit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a write warning and purpose. It is somewhat lengthy but structured logically: warning, title, purpose, rate limit. Could be more concise by removing the 'Endpoint' line, but overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema is provided, and the description does not explain return values. It mentions error messages in the schema. The rate limit and non-idempotency are covered, but missing details on response format or success indicators.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed parameter descriptions. The description adds an extra constraint: 'maximum of 50 receipts are allowed', which is not in the schema. This fully compensates for the schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Creates new records' and 'add batch receipts / Add multiple receipts', specifying the verb (add) and resource (batch receipts). It distinguishes from sibling tools like 'receipts_add' (single) and 'receipts_upload'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions a rate limit of one request per 5 seconds but does not provide guidance on when to use this tool vs alternatives (e.g., single receipt add or upload). No explicit when-to-use or when-not-to-use context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipts_assigned_transactions_getReceipts: get all transactions assigned to a specific receiptARead-onlyIdempotent
đą READ-ONLY â Fetches data. Makes no changes to the accounting records. get all transactions assigned to a specific receipt Get all transactions assigned to a specific receipt for a specified customer account by id_by_customer. You can get the "id_by_customer" by using the "/receipts/get method" first.
Endpoint: POST /receipts/assigned-transactions/get
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| confirmed_only | No | If true, only confirmed assignments will be returned. If specified, the field will be validated. | |
| receipt_id_by_customer | Yes | The id_by_customer of the receipt. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly states 'READ-ONLY â Fetches data. Makes no changes', which aligns with and expands on annotations (readOnlyHint, idempotentHint, destructiveHint). No contradictions; adds beyond annotations by emphasizing safety.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: a single line read-only note, a purpose sentence, a prerequisite hint, and the endpoint. Every sentence is essential, with no filler. The read-only indicator is front-loaded for instant clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no output schema, the description could mention the structure of the returned transactions for completeness. However, the description adequately explains what the tool does and how to use it, with the prerequisite step. It's nearly complete but lacks a brief note on response format.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by explaining how to get the key parameter (receipt_id_by_customer via /receipts/get) and briefly noting the confirmed_only filter's effect, going beyond the schema's dry descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves all transactions assigned to a specific receipt, using the verb 'get' and specifying the resource. It distinguishes from sibling tools like 'transactions_assigned_receipts_get' by focusing on the receipt-to-transactions direction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a prerequisite (obtaining receipt_id_by_customer via /receipts/get), offering clear context. However, it does not explicitly state when to use this tool versus alternatives like transactions_assigned_receipts_get.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipts_delete_id_by_customerReceipts: delete receipt by id_by_customerADestructiveIdempotent
đŽ DESTRUCTIVE · deletes data â Deletes or cancels a record. Confirm with the user before calling. Receipt deletes are restorable; cost-location deletes are not. Cancelling a posting deletes it if it is not yet fixed, otherwise it books a reversal posting. delete receipt by id_by_customer Mark a receipt as deleted for a specified customer account by id_by_customer. You can get the "id_by_customer" by using the "/receipts/get method" first.
Endpoint: POST /receipts/delete/id_by_customer
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full disclosure burden. It explicitly marks the operation as destructive, requires user confirmation, and notes that receipt deletes are restorable while cost-location deletes are not. It doesn't cover auth or linked-record effects, but it is more transparent than most delete tool descriptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The destructive warning is front-loaded and useful, but the description includes a bold heading that repeats the tool name and a generic 'deletes or cancels a record' passage with cancellation details that are not specific to this receipt deletion tool. It's serviceable but not tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool deletes data and has no output schema or annotations, so the description should fully explain how to invoke it and what to expect. It leaves a critical gap: id_by_customer is central to the operation but is absent from the input schema, and no return behavior or post-delete effects are described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents api_key well and coverage is 100%. The description adds useful guidance on obtaining id_by_customer, but that value does not appear as a parameter in the schema, so the added instruction is ambiguous about how the agent should supply it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Mark a receipt as deleted for a specified customer account by id_by_customer.' It clearly differentiates from sibling tools like receipts_get, receipts_get_id_by_customer, and receipts_restore_id_by_customer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit user instructions: confirm before calling and first get id_by_customer via the receipts/get method. It doesn't enumerate when-not-to-use alternatives, but the context is clear enough for a destructive delete tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipts_getReceipts: get receiptsBRead-onlyIdempotent
đą READ-ONLY â Fetches data. Makes no changes to the accounting records. get receipts Get receipts for a specified customer account. The response includes the number of returned rows and an array of receipts data.
Endpoint: POST /receipts/get
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | A limit of returned data. If no limit is given, the default will be 500. Also the maximum limit is 500. If specified, the field will be validated. | |
| order | No | Possible fields are: date amount invoicenumber (invoice_number) invoicingparty (counterparty) Allowed values are 'ASC' and 'DESC' Example: {"date": "ASC"} {"date": "ASC", "amount": "DESC"} | |
| offset | No | The offset for paging returned data. If no offset is given, the default will be 0. If specified, the field will be validated. | |
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| date_to | No | The receipt's issuing date in format 'YYYY-MM-DD' (e.g. '2017-04-26'). All receipts with issuing date including and before given value will be returned. If specified, the field will be validated. An empty string is not considered a valid date. | |
| deleted | No | If true, only deleted receipts will be returned. If specified, the field will be validated. | |
| due_date | No | The receipt's issuing due date in format 'YYYY-MM-DD' (e.g. '2017-04-26'). All receipts with the same due date given value will be returned. If specified, the field will be validated. An empty string is not considered a valid due date. | |
| date_from | No | The receipt's issuing date in format 'YYYY-MM-DD' (e.g. '2017-04-26'). All receipts with issuing date including and after given value will be returned. If specified, the field will be validated. An empty string is not considered a valid date. | |
| counterparty | No | The counterparty of the receipt, i.e. the invoicing party for type 'inbound' or the recipient for type 'outbound' (e.g. 'Peter Maier'). If specified, the field will be validated. | |
| invoicenumber | No | The invoicenumber for the invoice. If specified, the receipts with the same invoicenumber will be retrieved. | |
| include_offers | No | If true, offers will be included. If specified, the field will be validated. | |
| list_direction | Yes | Can be either 'inbound' ("Eingangsbelege") or 'outbound' ("Ausgangsbelege"). | |
| payment_status | No | Can be either 'paid' ("bezahlt") or 'unpaid' ("unbezahlt"). If specified, the field will be validated. | |
| date_since_last_modified | No | A date and time in format 'YYYY-MM-DD HH:MM:SS' (e.g. '2017-04-26 13:45:00'). If only 'YYYY-MM-DD' is specified, the time defaults to '23:59:59'. All receipts whose date_updated value is later than the specified value will be returned. If specified, the field will be validated. An empty string is not considered a valid date. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly states the tool is READ-ONLY and makes no changes, which reinforces the annotations. It also adds useful behavioral context beyond the annotations: the endpoint is a POST request, and the response includes a row count and an array of receipts data. This is meaningful extra information even though annotations already cover the safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loads the important read-only signal, then gives the operation and endpoint. Minor redundancy exists because 'get receipts' repeats the title, but the description is not bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The schema and annotations carry most of the burden: all parameters are described and safety is clear. The description adds a high-level response summary and endpoint, but with 14 parameters, no output schema, and many sibling tools, it does not fully explain the overall invocation context or how this list endpoint fits with alternatives.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameters are already well documented. The tool description itself adds no parameter-level meaning beyond the schema, which matches the baseline for full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the operation: get receipts for a specified customer account, and notes that the response contains a row count and an array of receipt data. It does not explicitly differentiate from sibling tools like receipts_get_id_by_customer or receipts_assigned_transactions_get, so it falls short of a full 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives. With many receipt-related siblings, the description does not explain why an agent should choose receipts_get over receipts_get_id_by_customer or receipts_assigned_transactions_get, nor does it mention any exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipts_get_id_by_customerReceipts: get receipt by id_by_customerBRead-onlyIdempotent
đą READ-ONLY â Fetches data. Makes no changes to the accounting records. get receipt by id_by_customer Get a single receipt for a specified customer account by id_by_customer. You can get the "id_by_customer" by using the "/receipts/get method" first. The response includes an array of receipt data.
Endpoint: POST /receipts/get/id_by_customer
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| get_file | No | If true, the file will be included as a base64 encoded string (e_invoice_type = 0 -> standard pdf file, e_invoice_type = 1 -> ZUGFeRD pdf file, e_invoice_type = 2 -> xRechnung xml file). If specified, the field will be validated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description repeats the read-only nature but adds minimal behavioral context beyond that (e.g., response returns an array of receipt data). It does not elaborate on rate limits, required permissions, or error conditions. The description adds little value over annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is somewhat verbose with repetitive elements (emoji, bold title, endpoint). It contains three sentences plus the endpoint line; some parts are unnecessary (e.g., repeating the tool name). Could be more concise and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description mentions that the response includes an array of receipt data but lacks details about receipt fields or pagination. It also does not summarize parameter purposes beyond what the schema provides. Given the tool's simplicity, it is marginally adequate but incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, with both parameters (api_key and get_file) fully described. The description adds no additional meaning or syntax details for these parameters beyond what the schema provides. Baseline of 3 is appropriate given high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Get') and the resource ('a single receipt for a specified customer account by id_by_customer'). It explains the need to first retrieve the identifier from another endpoint. However, the name and title are redundant and confusing ('id_by_customer' is awkward), and it does not explicitly contrast with siblings like receipts_get.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions how to obtain the required identifier ('using /receipts/get method first'), which provides a prerequisite. But it does not specify when to use this tool over alternatives (e.g., receipts_get) or when not to use it. No explicit when-to-use or when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipts_restore_id_by_customerReceipts: restore deleted receipt by id_by_customerAIdempotent
đĄ WRITE · reverts state â Reverts a prior state change (un-confirm a posting, restore a deleted receipt). Reversible. restore deleted receipt by id_by_customer Restore a marked as deleted receipt for a specified customer account by id_by_customer. You can get the "id_by_customer" by using the "/receipts/get method" first.
Endpoint: POST /receipts/restore/id_by_customer
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a write operation (readOnlyHint=false) and non-destructive (destructiveHint=false). The description adds context: 'WRITE', 'reverts state', 'reversible', and explains it restores a deleted receipt, aligning with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is somewhat verbose with redundant phrasing ('reverts state â Reverts a prior state change... Reversible'). It could be more concise while maintaining clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple restore tool with one optional parameter and no output schema, the description adequately covers the action, reversal nature, and how to obtain the identifier. Lacks discussion of error scenarios but is sufficiently complete for the complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a clear description for the only parameter (api_key). The description does not add parameter-specific information beyond what is in the schema, so it meets the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('restore'), the resource ('deleted receipt'), and the identifier ('id_by_customer'). It distinguishes from the inverse sibling receipts_delete_id_by_customer by specifying it reverts a prior state change.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context ('Reverts a prior state change', 'Reversible') and tells how to get id_by_customer via /receipts/get, but does not explicitly state when to use this tool vs alternatives, nor when not to use it (e.g., if receipt is not deleted).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipts_uploadReceipts: upload receiptA
đĄ WRITE · creates data â Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent â calling twice may create duplicates. upload receipt Upload a receipt into the specified customer account. The receipt will be processed by the BuchhaltungsButler technology. The response includes the filename (without extension) of the receipt as it is stored.
Note: max 10 requests per minute
Endpoint: POST /receipts/upload
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | The receipt's issuing date in format 'YYYY-MM-DD' (e.g. '2017-04-26'). If specified, the field will be validated. An empty string is not considered a valid date. NOTE: This parameter will be ignored when you upload an e-invoice! | |
| file | Yes | The receipt file as real file upload or as base64 encoded string. Accepted file types are: application/pdf, text/xml, application/xml, image/jpeg, image/png, image/bmp, image/tiff | |
| type | Yes | Can be 'invoice inbound' ("Eingangsrechnung"), 'invoice outbound' ("Ausgangsrechnung"), 'credit inbound' ("Eingangsgutschrift § 14 UStG"), 'credit outbound' ("Ausgangsgutschrift § 14 UStG"). | |
| amount | No | The total amount of the receipt, can be negative to indicate a reversed payment (e.g. -12.30). If specified, the field will be validated. '0.00' is not considered a valid receipt amount. NOTE: This parameter will be ignored when you upload an e-invoice! | |
| account | No | If the receipt shall directly be assigned to a payment account, you can specify its posting account number (e.g. '1200'). If specified, the account must exist as a payment account for the customer. '0' is not considered a valid account. | |
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| currency | No | Has to be 'EUR' if specified. If specified, the field will be validated. An empty string is not considered a valid currency. NOTE: This parameter will be ignored when you upload an e-invoice! | |
| vat_rate | No | The receipt's vat rate (e.g. 19.00 or 0) - may also be an empty string to indicate a non-available or multiple vat rates. NOTE: This parameter will be ignored when you upload an e-invoice! | |
| file_name | No | The name of the file. NOTE: This is required for files sent as base64 encoded string and will be ignored for files sent as real upload. | |
| counterparty | No | The counterparty of the receipt, i.e. the invoicing party for type 'invoice inbound' or the recipient for type 'invoice outbound' (e.g. 'Peter Maier'). If specified, the field will be validated. An empty string is not considered a valid counterparty. NOTE: This parameter will be ignored when you upload an e-invoice! | |
| date_delivery | No | The delivery date in format 'YYYY-MM-DD' (e.g. '2017-04-26'). NOTE: Due to the DATEV compatibility, we cannot accept a delivery date that is after the receipt date! If specified, it will be validated. NOTE: This parameter will be ignored when you upload an e-invoice! | |
| invoice_number | No | The invoice number (e.g. '1231XU23') with a maximum length of 60 characters - may also be an empty string. NOTE: This parameter will be ignored when you upload an e-invoice! | |
| creditor_debtor | No | If the receipt shall directly be assigned to a creditor (for type 'invoice inbound') or debtor (for type 'invoice outbound') account, you can specify its posting account number (e.g. '70001'). If specified, creditors/debtors have to be activated for the customer, the creditor/debtor account must exist for the customer and it must be compatible with the specified receipt type. '0' is not considered a valid creditor/debtor. | |
| date_payment_due | No | The payment due date in format 'YYYY-MM-DD' (e.g. '2017-04-26'). NOTE: This parameter will be ignored when you upload an e-invoice! | |
| payment_reference | No | The payment reference id. If specified correctly, the uploaded receipt will match with the corresponding transaction. Currently we support Amazon order id, PayPal transaction id and Stripe transaction id. NOTE: This parameter will be ignored when you upload an e-invoice! | |
| link_to_receipt_id_by_customer | No | Has to be a valid id_by_customer of another receipt. If specified, both receipts will be assigned to a transaction if one of them is assigned manually. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description adds context beyond annotations: it clearly states the tool is not idempotent (may create duplicates) and includes a rate limit. Annotations already indicate it's a write operation (readOnlyHint=false). No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is fairly concise, with a clear opening line distinguishing the tool type. The inclusion of the endpoint and rate limit adds value, though some repetition of the purpose exists. Could be trimmed slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 16 parameters and no output schema, the description explains the general purpose and response (filename), but does not summarize parameter interactions (e.g., e-invoice ignoring certain params) or provide more detail on processing. Adequate but not fully comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters thoroughly. The tool description does not add extra parameter-specific meaning, but the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool uploads a receipt into a customer account, with a specific verb ('upload') and resource ('receipt'). It distinguishes from siblings like receipts_add by emphasizing file upload and processing by BuchhaltungsButler technology.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions a rate limit (10 requests per minute) and implies it is for file uploads, but does not explicitly state when to use this tool over alternatives like receipts_add or receipts_addBatch. No when-not or alternative names given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reports_create_bwaReports: create bwa reportA
đĄ WRITE · creates data â Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent â calling twice may create duplicates. create bwa report Triggers the creation of a BWA report ("Betriebswirtschaftliche Auswertung").
The report is generated asynchronously in the background. The response contains the id_by_customer of the created report, which may be used to retrieve it once the generation has been finished.
A new report may only be requested once the generation of a previously requested report of the same type has been finished.
Endpoint: POST /reports/create/bwa
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| date_to | Yes | The last day of the period the report is created for, in format 'YYYY-MM-DD' (e.g. '2026-03-31'). | |
| date_from | Yes | The first day of the period the report is created for, in format 'YYYY-MM-DD' (e.g. '2026-01-01'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations that already indicate a non-idempotent write, the description adds material behavioral detail: the report is generated asynchronousy, the response contains id_by_customer, and concurrent requests of the same type are restricted. This is exactly the kind of context agents need beyond annotation flags.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The main body is relatively compact and includes endpoint, async behavior, and response info. However, the leading ' WRITE · creates data â Creates new records...' boilerplate is redundant with the title and annotations, and the bold 'create bwa report' heading repeats the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write tool with no output schema, the description conveys the response contract (id_by_customer), the asynchronous nature, and the single-flight constraint. It only stops short of explicitly naming reports_get_bwa as the follow-up retrieval tool, though that sibling is present in the list.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema fully documents date_from, date_to, and api_key including formats and defaults. The description itself adds no parameter-level detail, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action and resource: it 'Triggers the creation of a BWA report' and provides the endpoint. It is distinguishable from siblings like reports_create_sums by name and content, though the opening boilerplate about 'receipts, transactions, postings...' is generic and not specific to BWA reports.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides one important usage constraint: a new report may only be requested after a previous report of the same type has finished generating. However, it does not explicitly tell an agent when to choose this tool over reports_create_sums or when to pair it with reports_get_bwa, leaving some usage routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reports_create_sumsReports: create sums reportA
đĄ WRITE · creates data â Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent â calling twice may create duplicates. create sums report Triggers the creation of a sums report ("Summen- und Saldenliste"). The report is always created for all of the customer's postingaccounts.
The report is generated asynchronously in the background. The response contains the id_by_customer of the created report, which may be used to retrieve it once the generation has been finished.
A new report may only be requested once the generation of a previously requested report of the same type has been finished.
Endpoint: POST /reports/create/sums
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | The date the postings are taken into account by. Can be either 'date' ("Buchungsdatum") or 'date_delivery_else_date' ("Buchungs- und Leistungsdatum"). If specified, the field will be validated. | |
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| date_to | Yes | The last day of the period the report is created for, in format 'YYYY-MM-DD' (e.g. '2026-03-31'). | |
| file_csv | No | If true, a csv file will be created for the report additionally. If specified, the field will be validated. | |
| file_pdf | No | If true, a pdf file will be created for the report additionally. If specified, the field will be validated. | |
| date_from | Yes | The first day of the period the report is created for, in format 'YYYY-MM-DD' (e.g. '2026-01-01'). | |
| archive_export | No | If true, a zip archive containing the csv file and the postingaccount ledgers ("Kontenblätter") will be created for the report additionally. If specified, the field will be validated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnly=false, idempotent=false), it discloses asynchronous generation, the id_by_customer response handle, and the one-at-a-time concurrency rule. The generic preface 'creates new records (receipts, transactions, postings, invoices, master data)' is not accurate for this specific report-creation tool and slightly undermines transparency, though it does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The main content is well-structured with a bolded operation, short paragraphs, and endpoint. The opening 'WRITE · creates data â Creates new records...' line is redundant and partly off-target, but the rest of the description stays compact and action-oriented.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-output-schema asynchronous creation endpoint, it covers the essential calling context: response contains id_by_customer, retrieval happens after generation finishes, duplicate creation is possible, and only one same-type report may be pending. The file/date parameters are already fully documented in the input schema, so no additional parameter detail is required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds no parameter-level detail beyond the schema; it only states the report period and that all postingaccounts are included, which relates to behavior rather than the individual parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly says 'Triggers the creation of a sums report' and names the German report type, so an agent can tell this is the sums-report creation endpoint rather than reports_get_sums. However, it does not explicitly contrast with sibling reports_create_bwa or retrieval endpoints, and the generic 'creates data â creates receipts/transactions/postings/invoices/master data' preface is broader and slightly distracting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context: the report is always for all postingaccounts, is asynchronous, and only one pending same-type report is allowed at a time. It does not explicitly say 'use reports_get_sums to retrieve the result' or 'use reports_create_bwa for a different report type,' but the constraints are enough to guide correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reports_get_bwaReports: get bwa reportARead-onlyIdempotent
đą READ-ONLY â Fetches data. Makes no changes to the accounting records. get bwa report Returns a previously created BWA report ("Betriebswirtschaftliche Auswertung").
Reports are generated asynchronously, so a report is only available once its generation has been finished. Note that creating a new report of the same type replaces the previously created one.
Endpoint: POST /reports/get/bwa
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| get_files | No | If true, the report's files will be included as base64 encoded strings. If specified, the field will be validated. | |
| report_id_by_customer | Yes | The id_by_customer of the report, as returned when the report was created |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only/idempotent/non-destructive, and the description reinforces this with 'READ-ONLY â Fetches data. Makes no changes'. It adds valuable extra context about asynchronous generation and the replacement of a previously created report, which goes beyond the annotations. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loads the safety statement, then states the operation, async timing, replacement caveat, and endpoint. There is slight redundancy between the bolded title 'get bwa report' and the action sentence, but no unnecessary clutter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only getter with three schema-documented parameters and no output schema, the description covers the key behavioral context: only fetch when generation is finished, and be aware that newer generation replaces the report. It doesn't describe the return payload shape, but no output schema exists and the tool is simple enough that this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: all three parameters (api_key, get_files, report_id_by_customer) have descriptions in the schema. The tool description adds no parameter-specific meaning, so it stays at the baseline for fully covered schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action and resource: 'Returns a previously created BWA report'. This distinguishes the tool from creation siblings like reports_create_bwa, but it does not explicitly differentiate it from other report getters (e.g., reports_get_sums), leaving some ambiguity for the agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides concrete usage context: the report must exist ('previously created') and generation is asynchronous, so it is only available after finishing. It also warns that creating a new report replaces the old one. It doesn't, however, name alternatives or state when not to use this tool versus other report getters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reports_get_sumsReports: get sums reportARead-onlyIdempotent
đą READ-ONLY â Fetches data. Makes no changes to the accounting records. get sums report Returns a previously created sums report ("Summen- und Saldenliste").
Reports are generated asynchronously, so a report is only available once its generation has been finished. Note that creating a new report of the same type replaces the previously created one.
Endpoint: POST /reports/get/sums
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| get_files | No | If true, the report's files will be included as base64 encoded strings. If specified, the field will be validated. | |
| report_id_by_customer | Yes | The id_by_customer of the report, as returned when the report was created |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds value beyond annotations by disclosing the asynchronous generation behavior and that creating a new report of the same type replaces the previous one. This gives useful expectations about data availability and freshness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the READ-ONLY emoji and safety note appear first, followed by a one-line purpose, then two essential behavioral caveats, and the endpoint. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple fetch tool with full schema coverage and clear annotations, the description covers the key non-obvious aspects: async generation, report replacement, and endpoint. It does not describe the response format, but no output schema exists and the purpose is straightforward, so this is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters are already documented in the schema. The tool description itself does not add further parameter semantics, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'Returns a previously created sums report' with a specific resource type. However, it does not explicitly distinguish itself from the sibling reports_get_sums_ledger, which could be confused as another sums report variant.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: the report must already exist, is only available after async generation finishes, and can be replaced by creating a new report. It does not explicitly mention when to prefer this tool over alternatives like reports_get_sums_ledger, but the usage context is strong enough for an agent to infer the right situation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reports_get_sums_ledgerReports: get sums report postingaccount ledgerARead-onlyIdempotent
đą READ-ONLY â Fetches data. Makes no changes to the accounting records. get sums report postingaccount ledger Returns the postingaccount ledger ("Kontenblatt") of one postingaccount, holding its postings of the requested period.
The postingaccount numbers available for a sums report are provided by reports/get/sums, both as the keys of the 'sums' object and as its entries' 'postingaccount_number'.
In contrast to the report itself the ledger is created on the fly, so no report has to be created beforehand. Note that retrieving the ledger of a postingaccount holding a lot of postings may take a while.
Endpoint: POST /reports/get/sums/ledger
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | The date the postings are taken into account by. Can be either 'date' ("Buchungsdatum") or 'date_delivery_else_date' ("Buchungs- und Leistungsdatum"). If specified, the field will be validated. | |
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| date_to | Yes | The last day of the period the ledger is returned for, in format 'YYYY-MM-DD' (e.g. '2026-03-31'). | |
| date_from | Yes | The first day of the period the ledger is returned for, in format 'YYYY-MM-DD' (e.g. '2026-01-01'). | |
| postingaccount_number | Yes | The number of the postingaccount to return the ledger for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description's main added value is explaining that the ledger is generated on the fly, no report must be created beforehand, and large ledgers may take a while. This is useful behavioral context beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably compact and front-loads the read-only nature and the core purpose. There is some redundancy, such as repeating the tool name as a bold heading and restating read-only behavior already present in annotations, but it remains clear and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description provides the essential invocation context: what the ledger contains, where valid postingaccount numbers come from, the on-the-fly generation, and a performance caveat. It does not describe the exact output structure, but that is not strictly necessary for correct selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all five parameters with useful details including date formats and api_key behavior, so the baseline is 3. The description adds meaningful guidance by telling the agent that valid postingaccount_number values can be obtained from reports/get/sums, which helps avoid invalid calls.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Returns') and the resource ('postingaccount ledger' / 'Kontenblatt') for one postingaccount. It also distinguishes this from the aggregated sums report by explicitly mentioning the report itself is created on the fly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains that postingaccount numbers come from reports/get/sums, and contrasts this ledger with the report itself, implying when this tool is appropriate without needing to create a report first. It does not explicitly enumerate alternative tools or exclusions, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_add_batch_creditorsSettings: create creditor batchB
đĄ WRITE · creates data â Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent â calling twice may create duplicates. create creditor batch Create multiple creditor accounts.
Endpoint: POST /settings/add-batch/creditors
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| creditors | Yes | an array of creditors, each creditor has the field declaration and validation from the single add/creditor endpoint |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description adds some context beyond annotations: indicates write operation and non-idempotence, but annotations already convey these. Adds some more specific record types.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is short but includes a generic header line that could be trimmed. Overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Missing context on batch processing constraints (size limits, validation), no mention of return values or typical use cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline 3. Description does not add extra meaning about parameters beyond what schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Create multiple creditor accounts' with specific verb and resource. Distinguishes from siblings like single creditor add and batch debtors.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs alternatives like settings_add_creditor or settings_update_creditor. Only mentions behavior, not usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_add_batch_debtorsSettings: create debtors batchB
đĄ WRITE · creates data â Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent â calling twice may create duplicates. create debtors batch Create multiple debtor accounts.
Endpoint: POST /settings/add-batch/debtors
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| debtors | Yes | an array of debtors, each debtor has the field declaration and validation from the single add/debtor endpoint |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false, idempotentHint=false) are consistent with the description's 'WRITE' and non-idempotency warning. The description adds context that it creates data, but includes a generic sentence listing other record types (receipts, transactions, etc.) which is inaccurate for this tool, slightly reducing transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately concise but includes a generic template line that is irrelevant to this specific tool (listing other record types), which detracts from clarity. The bold header helps structure, but the generic part could cause confusion.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description should cover return values or response behavior, but it does not. It also lacks details on batch size limits, validation errors, or overall process flow. The generic sentence introduces ambiguity about the tool's scope.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with detailed parameter descriptions. The tool description itself adds no additional parameter-specific information beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Create multiple debtor accounts' (specific verb and resource) and opens with 'create debtors batch', clearly distinguishing from sibling tools like 'settings_add_debtor' (single debtor) and 'settings_add_batch_creditors' (batch creditors).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description warns about non-idempotency but provides no explicit guidance on when to use this tool versus the single debtor creation sibling ('settings_add_debtor'), nor does it mention prerequisites or scenarios where batch creation is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_add_creditorSettings: create creditorA
đĄ WRITE · creates data â Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent â calling twice may create duplicates. create creditor Create a creditor account.
Endpoint: POST /settings/add/creditor
| Name | Required | Description | Default |
|---|---|---|---|
| bic | No | The bic of your new creditor account. If specified, the field will be validated. | |
| zip | No | The zip of your new creditor account. If specified, the field will be validated. | |
| city | No | The city of your new creditor account. If specified, the field will be validated. | |
| iban | No | The iban of your new creditor account. If specified, the field will be validated. | |
| name | Yes | The name of your new creditor account | |
| No | The email of your new creditor account. If specified, the field will be validated. | ||
| street | No | The street of your new creditor account. If specified, the field will be validated. | |
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| country | No | The country of your new creditor account. If specified, the field will be validated. Valid cases are only the German version of the country name [DĂ€nemark] OR the two digit ISO code of the country [DK]. | |
| due_in_days | No | The due in days of your new debtor account. If specified, the field will be validated. | |
| sales_tax_id | No | The sales tax id of your new creditor account. If specified, the field will be validated. | |
| contact_person_name | No | The contact person name of your new creditor account. If specified, the field will be validated. | |
| postingaccount_number | No | The postingaccount number of your new creditor account. If not specified, the next possible number will be created. If specified, the field will be validated. | |
| additional_address_line | No | The additional address line of your new creditor account. If specified, the field will be validated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate non-idempotency and non-readOnly. The description explicitly states 'Not idempotent â calling twice may create duplicates' and marks the tool as 'WRITE · creates data', adding behavioral context beyond annotations. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short but includes an initial broad statement 'Creates new records (receipts, transactions, postings, invoices, master data)' which is misleading as this tool only creates a creditor account. This fluff reduces conciseness and clarity. The important non-idempotency warning is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 14 parameters and no output schema, the description covers the action and non-idempotency but omits return value details (e.g., does it return created creditor ID?). The endpoint is provided. The initial overbroad statement slightly detracts from completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all 14 parameters have detailed descriptions. The tool description adds no additional parameter meaning, so it meets the baseline. No need for extra elaboration.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it creates a creditor account, distinguishing it from sibling create tools like settings_add_debtor or settings_add_postingaccount. The verb 'create' and resource 'creditor account' are specific, and the 'WRITE' label emphasizes mutation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through its purpose but provides no explicit guidance on when to use this tool versus alternatives (e.g., settings_add_debtor). The non-idempotency warning is a caution but not a usage rule. No context of prerequisites or conflicting tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_add_debtorSettings: create debtorA
đĄ WRITE · creates data â Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent â calling twice may create duplicates. create debtor Create a debtor account.
Endpoint: POST /settings/add/debtor
| Name | Required | Description | Default |
|---|---|---|---|
| bic | No | The bic of your new debtor account. If specified, the field will be validated. | |
| zip | No | The zip of your new debtor account. If specified, the field will be validated. | |
| city | No | The city of your new debtor account. If specified, the field will be validated. | |
| iban | No | The iban of your new debtor account. If specified, the field will be validated. | |
| name | Yes | The name of your new debtor account | |
| No | The email of your new debtor account. If specified, the field will be validated. | ||
| street | No | The street of your new debtor account. If specified, the field will be validated. | |
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| country | No | The country of your new debtor account. If specified, the field will be validated. Valid cases are only the German version of the country name [DĂ€nemark] OR the two digit ISO code of the country [DK]. | |
| sales_tax_id | No | The sales tax id of your new debtor account. If specified, the field will be validated. | |
| customer_number | No | The customer_number of your new debtor account. If specified, the field will be validated. | |
| contact_person_name | No | The contact person name of your new debtor account. If specified, the field will be validated. | |
| postingaccount_number | No | The postingaccount number of your new debtor account. If not specified, the next possible number will be created. If specified, the field will be validated. | |
| additional_address_line | No | The additional address line of your new debtor account. If specified, the field will be validated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the tool is not idempotent and may create duplicates, which aligns with annotations (idempotentHint=false, readOnlyHint=false). It also indicates validation behavior for optional fields. This adds value beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with a brief generic header and two specific sentences. It is front-loaded with the write/duplicate warning, then the specific action. No unnecessary text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the schema covers all parameters, the description lacks information about return values (no output schema) and any post-creation steps or prerequisites. For a creation tool with 14 parameters, more context would be helpful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed descriptions for all 14 parameters. The tool description does not add additional meaning to the parameters beyond what is in the schema, so it meets the baseline expectation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Create a debtor account' and uses a specific verb-resource pair. The title and description clearly indicate this tool creates debtor records, distinguishing it from sibling tools like settings_update_debtor or settings_add_creditor.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit guidance on when to use this tool versus alternatives such as settings_add_batch_debtors for bulk creation or settings_update_debtor for modifications. Usage is only implied by the name and description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_add_postingaccountSettings: add postingaccountB
đĄ WRITE · creates data â Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent â calling twice may create duplicates. add postingaccount Create a postingaccount.
Endpoint: POST /settings/add/postingaccount
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The name of your new postingaccount. | |
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| postingaccount_number | Yes | The postingaccount number of your new postingaccount. | |
| parent_postingaccount_number | Yes | The parent postingaccount number of your new postingaccount.This is the postingaccount from which your individually created postingaccount inherits their properties. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false and idempotentHint=false. The description adds a warning about duplicates from repeated calls, which is useful. However, it does not disclose potential side effects, required permissions, or return values, missing opportunities to fully inform the agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is relatively concise but includes a generic boilerplate line ('đĄ WRITE · creates data') that does not add tool-specific value. The specific part is short, but the structure could be tighter by removing redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With full schema coverage and a simple structure, the description adequately covers the purpose and non-idempotency. However, it lacks details on expected responses, error conditions, or typical usage patterns, leaving some gaps for the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear parameter descriptions. The description adds no additional parameter-level meaning beyond what is in the schema, so it meets the baseline without adding value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Create a postingaccount' and mentions the endpoint, making the action clear. However, it does not differentiate from similar tools like settings_update_postingaccount, which might cause confusion about when to use create vs update.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. It mentions non-idempotency but does not compare to sibling tools like settings_add_creditor or settings_update_postingaccount, leaving the agent to infer usage from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_get_creditorsSettings: get creditorsBRead-onlyIdempotent
đą READ-ONLY â Fetches data. Makes no changes to the accounting records. get creditors Get all creditors
Endpoint: POST /settings/get/creditors
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | limit of the results, default is 25 results | |
| offset | No | offset of the results, default is 0 | |
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true and destructiveHint=false. The description adds 'READ-ONLY' and 'Makes no changes', which aligns but adds no new behavioral insights. There is a slight inconsistency: claiming 'Get all creditors' while supporting pagination, which is not explained. Beyond that, no additional behavioral traits are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, with key info front-loaded in the first line. However, it repeats 'get creditors' (title, description, inline code) and includes an endpoint line that may not be essential. Still, it's efficient and avoids verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 3 optional params, no output schema. The description does not explain pagination behavior (limit/offset defaults, response structure). For a simple list tool, this might suffice, but it leaves gaps about how to retrieve all creditors and what the output contains. More detail on pagination and response would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% description coverage: all three parameters have descriptions. The tool description adds no extra meaning to parameters; it merely restates the tool's purpose. Baseline is 3 because schema already provides sufficient semantic info.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as fetching creditors with the phrase 'get creditors' and 'Get all creditors'. The title and emoji reinforce the read-only nature. The sibling tools include distinct actions like add/update, so differentiation is clear. However, the term 'all' contradicts the pagination parameters (limit/offset), slightly reducing clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool vs alternatives. The name and sibling set imply it is for reading creditors, not adding or updating. Usage context is implied but not stated, leaving ambiguity for an AI agent that might need to choose between get_creditors and add_creditor.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_get_debtorsSettings: get debitorsBRead-onlyIdempotent
đą READ-ONLY â Fetches data. Makes no changes to the accounting records. get debitors Get all debitors
Endpoint: POST /settings/get/debtors
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | limit of the results, default is 25 results | |
| offset | No | offset of the results, default is 0 | |
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description repeats the read-only nature already indicated by annotations (readOnlyHint=true) but adds no new behavioral traits. The endpoint method (POST) is a minor detail not found in annotations, but overall value is limited given annotation richness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, using only two lines plus an endpoint line. It front-loads the read-only nature and immediately states the action. Every sentence serves a purpose, with no extraneous content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is minimal and lacks context about returns (e.g., a list of debtors) or pagination behavior. For a simple read-only tool with no output schema, it is adequate but leaves gaps in understanding the full scope.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema fully documents all three parameters. The description adds no additional meaning or explanation to parameters like limit, offset, or api_key, meeting the baseline expectation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Get') and resource ('debitors'), making the tool's purpose unambiguous. However, it does not explicitly distinguish itself from sibling tools like settings_get_creditors, which limits contextual clarity slightly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. There is no mention of prerequisites, use cases, or exclusions, leaving the agent to infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_get_postingaccountsSettings: get postingaccountsARead-onlyIdempotent
đą READ-ONLY â Fetches data. Makes no changes to the accounting records. get postingaccounts Get all postingaccounts
Endpoint: POST /settings/get/postingaccounts
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | limit of the results, default is 1000 results. If specified, the field will be validated. | |
| order | No | the order of the results.The following options are valid:postingaccount_number ASC | DESCname ASC | DESCtype ASC | DESC. If specified, the field will be validated. | |
| offset | No | offset of the results, default is 0. If specified, the field will be validated. | |
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| exclude_debtors | No | exclude all debtor postingaccounts from result. If specified, the field will be validated. | |
| exclude_accounts | No | exclude all base accounts (e.g. bank accounts) from result. If specified, the field will be validated. | |
| exclude_creditors | No | exclude all creditor postingaccounts from result. If specified, the field will be validated. | |
| exclude_postingaccounts | No | exclude all postingaccounts from result. If specified, the field will be validated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description reinforces read-only behavior but adds minimal new insight beyond stating the method (POST) and the fact that no changes are made.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with the key action ('get postingaccounts') and read-only indicator. It includes an emoji for visual clarity but could be slightly more streamlined.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having 8 parameters and no output schema, the description does not explain return format, pagination behavior, or how the filter parameters (exclude_*) interact. This leaves significant gaps for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed parameter descriptions. The tool description does not add any additional meaning or context for parameters beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'get postingaccounts' and 'Get all postingaccounts', making the verb and resource explicit. It distinguishes from sibling tools like settings_get_debtors and settings_get_creditors.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates read-only usage but does not provide specific when-to-use or when-not-to-use guidance relative to alternatives. It lacks explicit exclusions or alternative tool references.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_update_creditorSettings: update creditorAIdempotent
đĄ WRITE · updates data â Modifies existing master data in place. update creditor Update a creditor account.
Endpoint: POST /settings/update/creditor
| Name | Required | Description | Default |
|---|---|---|---|
| bic | No | The new bic of the creditor account. If specified, the field will be validated. | |
| zip | No | The new zip of the creditor account. If specified, the field will be validated. | |
| city | No | The new city of the creditor account. If specified, the field will be validated. | |
| iban | No | The new iban of the creditor account. If specified, the field will be validated. | |
| name | No | The new name of the creditor account | |
| No | The email of the creditor account. If specified, the field will be validated. | ||
| street | No | The new street of the creditor account. If specified, the field will be validated. | |
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| country | No | The new country of the creditor account. If specified, the field will be validated. Valid cases are only the German version of the country name [DĂ€nemark] OR the two digit ISO code of the country [DK]. | |
| due_in_days | No | The due in days of your new debtor account. If specified, the field will be validated. | |
| sales_tax_id | No | The new sales tax id of the creditor account. If specified, the field will be validated. | |
| contact_person_name | No | The new contact person name of the creditor account. If specified, the field will be validated. | |
| postingaccount_number | Yes | The postingaccount_number of the creditor account | |
| additional_address_line | No | The new additional address line of the creditor account. If specified, the field will be validated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false, destructiveHint=false, idempotentHint=true. The description adds 'đĄ WRITE · updates data' and 'Modifies... in place', which aligns but doesn't provide additional behavioral context like authorization needs or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with key info (WRITE label, verb, resource). However, the 'updates data' phrase is redundant with the WRITE label. Overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 14 parameters and no output schema, the description lacks information about return values, confirmation of changes, or what happens after a successful update. This leaves the agent underinformed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed parameter descriptions. The description does not add extra meaning beyond the schema; it only mentions the endpoint.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'update' and the resource 'creditor account', and distinguishes it from add/get siblings by specifying 'Modifies existing master data in place'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Minimal guidance: it says 'Modifies existing master data in place' implying it's for existing creditors, but no explicit when-to-use, prerequisites, or alternatives compared to sibling tools like settings_add_creditor.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_update_debtorSettings: update debtorBIdempotent
đĄ WRITE · updates data â Modifies existing master data in place. update debtor Update a debtor account.
Endpoint: POST /settings/update/debtor
| Name | Required | Description | Default |
|---|---|---|---|
| bic | No | The new bic of the debtor account. If specified, the field will be validated. | |
| zip | No | The new zip of the debtor account. If specified, the field will be validated. | |
| city | No | The new city of the debtor account. If specified, the field will be validated. | |
| iban | No | The new iban of the debtor account. If specified, the field will be validated. | |
| name | No | The new name of the new debtor account | |
| No | The email of the debtor account. If specified, the field will be validated. | ||
| street | No | The new street of the debtor account. If specified, the field will be validated. | |
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| country | No | The new country of the debtor account. If specified, the field will be validated. Valid cases are only the German version of the country name [DĂ€nemark] OR the two digit ISO code of the country [DK]. | |
| sales_tax_id | No | The new sales tax id of the debtor account. If specified, the field will be validated. | |
| customer_number | No | The new customer_number of the debtor account. If specified, the field will be validated. | |
| contact_person_name | No | The new contact person name of the debtor account. If specified, the field will be validated. | |
| postingaccount_number | Yes | The postingaccount_number of the debtor account | |
| additional_address_line | No | The new additional address line of the debtor account. If specified, the field will be validated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false and destructiveHint=false. The description adds no additional behavioral context beyond stating it modifies data. No contradiction with annotations, but no extra transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and to the point, containing only essential information. However, it redundantly repeats the title and endpoint. Still efficient overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of 14 parameters and no output schema, the description lacks completeness. It does not specify that postingaccount_number is required to identify the debtor, nor does it explain the return value or update behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has high description coverage (100%), and each parameter is well-documented with validation details. The description adds no additional meaning beyond what is already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Update a debtor account' and 'Modifies existing master data in place,' which specifies the verb and resource. The sibling tools include separate create and read operations, providing good differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not provide guidance on when to use this tool versus alternatives like settings_add_debtor. The context implies it is for updating existing debtors, but no explicit when-to-use or when-not-to-use instructions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_update_postingaccountSettings: update postingaccountCIdempotent
đĄ WRITE · updates data â Modifies existing master data in place. update postingaccount Update a postingaccount.
Endpoint: POST /settings/update/postingaccount
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The new name of the postingaccount to update. | |
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| postingaccount_number | Yes | The postingaccount number of the postingaccount to update. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false. The description adds minimal value by stating 'WRITE · updates data' and 'modifies existing master data in place', but it does not disclose error handling, authentication needs, or rate limits. The endpoint URL is provided but not behavioral.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and uses emoji/bold for emphasis. It includes the endpoint but repeats the tool name. It is concise and front-loaded with the purpose, though slightly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should explain return value or success indicators, but it does not. It also lacks context about the tool's role among siblings (e.g., only for existing records). The description is too minimal to be considered complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema fully describes all three parameters. The description adds no additional details beyond what the schema provides, thus baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Update a postingaccount' with a verb and resource. However, it does not explicitly distinguish from sibling tools like settings_add_postingaccount or settings_get_postingaccounts, though the verb 'update' inherently differentiates it from creation or retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives (e.g., settings_add_postingaccount for creation, settings_get_postingaccounts for listing). The description lacks any context about prerequisites or typical scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transactions_addTransactions: add transactionB
đĄ WRITE · creates data â Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent â calling twice may create duplicates. add transaction Add a transaction to a payment account of the specified customer.
Endpoint: POST /transactions/add
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | The transaction type (e.g. 'Direct debit'). If specified, the field will be validated. An empty string is not considered a valid type. | |
| amount | Yes | The transaction's amount (positive for incoming and negative for outgoing payments) in the account's currency. '0.00' is not considered a valid transaction amount. | |
| account | Yes | The posting account number (e.g. '1200') of the account to which to add the transaction. The account must exist as a payment account for the customer. | |
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| purpose | No | The transaction purpose - may also be an empty string. | |
| to_from | Yes | The payment recipient or sender | |
| currency | No | The transaction currency. Currently we support the following currencies: AED, AUD, BGN, BRL, CAD, CHF, CNY, COP, CYP, CZK, DKK, EUR, GBP, HKD, HRK, HUF, IDR, ILS, INR, ISK, JPY, KRW, LTL, LVL, MTL, MXN, MYR, NOK, NZD, PEN, PHP, PLN, QAR, ROL, RON, RUB, SEK, SGD, SIT, SKK, THB, TRL, TRY, UAH, USD, VND, ZAR If specified, the field will be validated. An empty string is not considered a valid type. | |
| bank_code | No | The bank code (or BIC) of the payment recipient or sender. If specified, the field will be validated. An empty string is not considered a valid bank code. | |
| bank_name | No | The bank name of the payment recipient or sender. If specified, the field will be validated. An empty string is not considered a valid bank name. | |
| value_date | No | The transaction's value date in format 'YYYY-MM-DD HH:II:SS' (e.g. '2017-04-26 00:00:00'). If not specified, the value date will be set to the same value as the booking date. If specified, the field will be validated. An empty string is not considered a valid date. | |
| booking_date | Yes | The transaction's booking date in format 'YYYY-MM-DD HH:II:SS' (e.g. '2017-04-26 00:00:00'). | |
| booking_text | No | The booking text - may also be an empty string. | |
| account_number | No | The account number (or IBAN) of the payment recipient or sender. If specified, the field will be validated. An empty string is not considered a valid account number. | |
| payment_reference | No | The payment reference id. If specified correctly, the added transaction will match with the corresponding receipt. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false. The description adds value by stating 'WRITE · creates data' and 'Not idempotent â calling twice may create duplicates', but does not go beyond annotations significantly. No additional context on permissions or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise: two sentences plus the endpoint, with a clear emoji and warning. No unnecessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having 14 parameters and no output schema, the description does not explain return values, error handling, or the structure of the response. For a write operation, this is a significant gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% coverage with descriptions for all 14 parameters. The tool description does not add any extra meaning beyond the schema; it only mentions the endpoint. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Add a transaction to a payment account of the specified customer' along with the endpoint. The title 'Transactions: add transaction' also reinforces the purpose. It distinguishes from siblings like 'transactions_addBatch' by focusing on a single transaction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, such as 'transactions_addBatch' for batch additions or other transaction-related tools. It does not mention preconditions or exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transactions_addBatchTransactions: add batch transactionA
đĄ WRITE · creates data â Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent â calling twice may create duplicates. add batch transaction Add multiple transactions
Note: a request is allowed only every 5 seconds
Endpoint: POST /transactions/addBatch
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| transactions | Yes | list of transactions maximum of 50 transactions are allowed A transaction has the same fields like the /transactions/add endpoint has, same applies for error messages |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (destructiveHint=false, idempotentHint=false), description adds 'WRITE · creates data', explicit non-idempotency warning, and rate-limit constraint. This is valuable behavioral context. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Contains some redundancy ('add batch transaction' then 'Add multiple transactions'), and includes the endpoint path which is not essential. Information is generally front-loaded but could be more streamlined.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
High schema coverage and parameter count low (2), but missing return value description (no output schema) and error handling details are vaguely referenced ('same applies for error messages'). Adequate but not thorough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so baseline is 3. Description adds the maximum batch size (50) and references the single-transaction endpoint for field details, which adds useful context beyond schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it creates new records and adds multiple transactions, using a specific verb and resource. However, the description lists multiple record types (receipts, transactions, etc.) which is slightly broad and could confuse the exact scope. No explicit differentiation from sibling batch tools like receipts_addBatch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides some guidance: not idempotent (duplicate warning) and rate limit (5 seconds). However, it does not explicitly compare to alternative tools (e.g., transactions_add for single transactions) or specify when to choose this over others.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transactions_assign_batch_receiptTransactions: assign multiple receipts to transactionsB
đĄ WRITE · links/unlinks records â Creates or removes an assignment between records (e.g. receipt â transaction). Reversible. assign multiple receipts to transactions Assign multiple receipts to transactions.
Endpoint: POST /transactions/assign-batch/receipt
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| transactions_to_receipts | Yes | list of receipts to transactions maximum of 50 element are allowed |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable context beyond annotations: it explicitly states the operation is a write ('WRITE'), reversible, and links/unlinks records. This complements the annotations (readOnlyHint=false, destructiveHint=false) and informs the agent about the non-destructive, reversible nature. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, with key information front-loaded (action, reversibility, endpoint). It uses an emoji for quick visual categorization and avoids redundancy. A minor improvement could be removing the repeated 'Assign multiple receipts to transactions.' line.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core operation and reversibility but lacks some context: it doesn't mention the 50-element batch limit from the schema, nor does it describe return values (no output schema). For a batch tool, additional context like error handling or prerequisites would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the input schema already documents both parameters (api_key and transactions_to_receipts). The description does not add additional parameter semantics beyond what the schema provides, such as format or constraints. Baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it assigns multiple receipts to transactions, using a specific verb and resource. However, it does not explicitly distinguish itself from sibling tools like transactions_assign_receipt (single) or transactions_unassign_receipt (removal), relying on the name 'batch' to imply the difference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. It does not mention using this for batch operations and the single-assignment counterpart for individual operations, leaving the agent to infer from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transactions_assigned_receipts_getTransactions: get all receipts assigned to a specific transactionARead-onlyIdempotent
đą READ-ONLY â Fetches data. Makes no changes to the accounting records. get all receipts assigned to a specific transaction Get all receipts assigned to a specific transaction for a specified customer account by id_by_customer. You can get the "id_by_customer" by using the "/transactions/get method" first.
Endpoint: POST /transactions/assigned-receipts/get
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| confirmed_only | No | If true, only confirmed assignments will be returned. If specified, the field will be validated. | |
| transaction_id_by_customer | Yes | The id_by_customer of the transaction. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description reiterates read-only and non-destructive behavior, which is already provided via annotations (readOnlyHint, destructiveHint). It adds minimal behavioral context beyond stating the endpoint method (POST) and confirming it fetches data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise: one line with a visual indicator, a bold statement of purpose, a brief sentence, and a usage hint. Every sentence serves a purpose with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, full schema coverage, and comprehensive annotations, the description is complete. It covers the main input, a prerequisite, and read-only nature. It could optionally describe the output (list of receipts) but is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all parameters. The description mentions 'transaction_id_by_customer' but does not add extra meaning beyond the schema's field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'get all receipts assigned to a specific transaction', specifying the verb 'get' and resource 'receipts assigned to a transaction'. It distinguishes from sibling tools like 'transactions_assign_receipt' and 'receipts_get'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells when to use this tool: after obtaining the transaction's id_by_customer via '/transactions/get method'. It provides a prerequisite but does not explicitly exclude use cases or mention alternatives for similar lookups.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transactions_assign_receiptTransactions: assign receipt to transactionB
đĄ WRITE · links/unlinks records â Creates or removes an assignment between records (e.g. receipt â transaction). Reversible. assign receipt to transaction Assign a receipt to a transaction.
Endpoint: POST /transactions/assign/receipt
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| receipt_id_by_customer | Yes | The id_by_customer of the receipt. | |
| transaction_id_by_customer | Yes | The id_by_customer of the transaction. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false and destructiveHint=false. The description adds value by marking the action as WRITE, describing it as 'links/unlinks records,' and noting it is reversible. However, it does not elaborate on required permissions or side effects beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is relatively concise, with key information front-loaded in the first line. However, it contains slight redundancy (e.g., repeating 'assign receipt to transaction' in two forms) and could be tightened without loss of clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with two required parameters and no output schema, the description covers the basic behavior and endpoint. Lacking guidance on usage context and sibling differentiation, it is adequate but not fully complete for an agent to confidently select it over alternatives.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the input schema already describes all parameters adequately. The description does not add any additional meaning or usage hints for the parameters, so it provides no extra value beyond the schema's descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it creates or removes an assignment between a receipt and transaction, using specific verbs (links/unlinks, assign). However, it lacks explicit differentiation from sibling tools like transactions_assign_batch_receipt and transactions_unassign_receipt, which could cause confusion about whether this tool handles both actions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool over alternatives such as transactions_unassign_receipt or transactions_assign_batch_receipt. The description implies it can both assign and unassign, but the existence of a dedicated unassign sibling suggests this is inaccurate, leaving the agent without clear usage rules.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transactions_getTransactions: get transactionsARead-onlyIdempotent
đą READ-ONLY â Fetches data. Makes no changes to the accounting records. get transactions Get transactions for a specified customer account. The response includes the number of returned rows and an array of transaction datas.
Endpoint: POST /transactions/get
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | A limit of returned data. If no limit is given, the default will be 500. Also the maximum limit is 500. If specified, the field will be validated. | |
| offset | No | The offset for paging returned data. If no offset is given, the default will be 0. If specified, the field will be validated. | |
| account | No | The account number of the account the transaction is stored to. If specified, the field will be validated. | |
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| date_to | No | The transaction's booking date in format 'YYYY-MM-DD' (e.g. '2017-04-26'). All transaction with booking date including and before given value will be returned. An empty string is not considered a valid date. | |
| to_from | No | The payer/payee of the transaction. If specified, the field will be validated. | |
| date_from | No | The transaction's booking date in format 'YYYY-MM-DD' (e.g. '2017-04-26'). All transactions with booking date including and after given value will be returned. An empty string is not considered a valid date. | |
| id_by_customer_to | No | The id_by_customer as an integer. All transactions to given value will be returned. The transaction with the given value will NOT be returned! NOTE: By specifying this, the sort changes to id_by_customer ASC, even if you use this in combination with date params. If specified, the field will be validated. | |
| id_by_customer_from | No | The id_by_customer as an integer. All transactions after given value will be returned. The transaction with the given value will NOT be returned! NOTE: By specifying this, the sort changes to id_by_customer ASC, even if you use this in combination with date params. If specified, the field will be validated. | |
| date_since_last_modified | No | A date and time in format 'YYYY-MM-DD HH:MM:SS' (e.g. '2017-04-26 13:45:00'). If only 'YYYY-MM-DD' is specified, the time defaults to '23:59:59'. All transactions whose date_updated value is later than the specified value will be returned. If specified, the field will be validated. An empty string is not considered a valid date. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The read-only behavior is already provided by annotations, but the description adds useful behavioral context beyond the schema: the response includes the number of returned rows and an array of transaction data. It also explicitly states the HTTP endpoint. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loaded with the read-only signal, and uses bold headers effectively. Minor redundancy exists: the 'READ-ONLY' line repeats annotation information and '**get transactions**' duplicates the tool name, but overall the content is compact and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich input schema, optional parameters, and no output schema, the description provides a reasonable but not exhaustive overview. It covers the core purpose and response shape, but does not help an agent choose between the many transaction-related sibling tools or understand the behavioral quirks documented in parameters like id_by_customer_to/from.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline holds. The description only highlights 'a specified customer account,' which adds little beyond the schema's own account parameter description. It does not explain filtering combinations or pagination behavior beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource: 'Get transactions for a specified customer account.' It also emphasizes read-only behavior. However, it does not explicitly differentiate itself from sibling tools like transactions_get_id_by_customer or transactions_assigned_receipts_get, so it is clear but not fully distinguished.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool: when you need to fetch transaction data for an account. But it provides no explicit alternatives or exclusions, and given many transaction-related sibling tools exist, the routing guidance is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transactions_get_id_by_customerTransactions: get transaction by id_by_customerARead-onlyIdempotent
đą READ-ONLY â Fetches data. Makes no changes to the accounting records. get transaction by id_by_customer Get a single transaction for a specified customer account by id_by_customer. You can get the "id_by_customer" by using the "/transactions/get method" first. The response includes an array of transaction data.
Endpoint: POST /transactions/get/id_by_customer
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description reinforces the READ-ONLY nature already declared in annotations, stating 'đą READ-ONLY â Fetches data. Makes no changes.' No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately concise, but includes some redundancy (e.g., repeating the tool title in bold). It front-loads the READ-ONLY indicator and effectively uses two short paragraphs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with one optional parameter and no output schema, the description adequately explains the return: 'The response includes an array of transaction data.' However, it could clarify what 'id_by_customer' represents.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single parameter 'api_key' already well-described in the schema. The description adds no additional parameter insight beyond the schema, so baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get a single transaction for a specified customer account by id_by_customer.' It distinguishes from the sibling 'transactions_get' which retrieves all transactions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description advises obtaining the 'id_by_customer' via another endpoint first: 'You can get the "id_by_customer" by using the "/transactions/get method".' This provides a prerequisite, though it doesn't explicitly cover when not to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transactions_unassign_receiptTransactions: unassign a specific receipt from a transactionB
đĄ WRITE · links/unlinks records â Creates or removes an assignment between records (e.g. receipt â transaction). Reversible. unassign a specific receipt from a transaction Unassign a specific receipt from a transaction.
Endpoint: POST /transactions/unassign/receipt
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional. The BB customer api_key to act on. Defaults to the BB_API_KEY configured on the server â only set this to target a different customer. | |
| receipt_id_by_customer | Yes | The id_by_customer of the receipt to unassign. | |
| transaction_id_by_customer | Yes | The id_by_customer of the transaction. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate mutability (readOnlyHint=false) and non-destructiveness. The description adds 'Reversible', which is useful context, but does not elaborate on side effects or required permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is verbose and redundant (repeats 'unassign a specific receipt from a transaction' twice). The character emoji and generic 'links/unlinks' intro add unnecessary length without clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple unassignment action, the description covers the core behavior. However, without an output schema, it fails to mention return values or confirmation of success, leaving a gap in completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents parameters. The description adds no additional meaning beyond what is in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'unassign a specific receipt from a transaction', using a specific verb and resource. The title reinforces this. It is easily distinguished from sibling tools like transactions_assign_receipt.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives (e.g., transactions_assign_batch_receipt). No prerequisites or conditions for unassignment are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
14 tool updates
v1.0.2- Changed
invoices_create1 field changed- added
Input schema / properties / languageAdded value: +{ + "description": "The language for translatable invoice labels (e.g. headings, table headers, payment terms). Can be either 'de_DE' (\"Deutsch\", default) or 'en_US' (\"English\").\n\nIf omitted, German is used.", + "type": "string" +}
- Changed
invoices_create_draft1 field changed- added
Input schema / properties / languageAdded value: +{ + "description": "The language for translatable invoice labels (e.g. headings, table headers, payment terms). Can be either 'de_DE' (\"Deutsch\", default) or 'en_US' (\"English\").\n\nIf omitted, German is used.", + "type": "string" +}
- Changed
invoices_create_e_invoice1 field changed- added
Input schema / properties / languageAdded value: +{ + "description": "The language for translatable invoice labels (e.g. headings, table headers, payment terms). Can be either 'de_DE' (\"Deutsch\", default) or 'en_US' (\"English\").\n\nIf omitted, German is used.", + "type": "string" +}
- Changed
postings_add_free1 field changed- changed
Input schema / properties / vat / descriptionPrevious value: -"The vat rate of the posting.\n\nPossible vats:\n- 0_none ('keine Ust.')\n- 19_vat ('19% Ust.')\n- 7_vat ('7% Ust.')\n- 19_pre ('19% Vst.')\n- 7_pre ('7% Vst.')\n- 19_both_1 ('§13b 19% USt./VSt.')\n- 19_both_2 ('I.g.E. 19% USt./VSt.')\n- 7_both ('I.g.E. 7% USt./VSt.')\n- 19_both_1_no_pre ('§13b 19/16% USt.')\n- 19_both_2_no_pre ('i.g.E. 19/16% USt.')\n- 7_both_no_pre ('i.g.E. 7/5% USt.')\n- 19_pre_app ('19/16% Aufz. VSt.')\n- 7_pre_app ('7/5% Aufz. VSt.')\n- 19_both_app_1 ('§13b 19/16% USt./Aufz. VSt.')\n- 19_both_app_2 ('i.g.E. 19/16% USt./Aufz. VSt.')\n- 7_both_app ('i.g.E. 7/5% USt./Aufz. VSt.')"New value: +"The vat rate of the posting.\n\nPossible vats:\n- 0_none ('keine Ust.')\n- 19_vat ('19% Ust.')\n- 7_vat ('7% Ust.')\n- 19_pre ('19% Vst.')\n- 7_pre ('7% Vst.')\n- 19_both_1 ('§13b 19% USt./VSt.')\n- 19_both_506 ('§13b 19% USt./VSt. (EU §13b Abs. 1)')\n- 19_both_6506 ('§13b 19% USt. (EU §13b Abs. 1, ohne VSt.)')\n- 19_both_511 ('§13b 19% USt./VSt. (Drittland §13b Abs. 2 Nr. 1)')\n- 19_both_6511 ('§13b 19% USt. (Drittland §13b Abs. 2 Nr. 1, ohne VSt.)')\n- 19_both_6501 ('§13b 19/16% USt. (ohne VSt.)')\n- 19_both_2 ('I.g.E. 19% USt./VSt.')\n- 7_both ('I.g.E. 7% USt./VSt.')\n- 19_both_1_no_pre ('§13b 19/16% USt.')\n- 19_both_2_no_pre ('i.g.E. 19/16% USt.')\n- 7_both_no_pre ('i.g.E. 7/5% USt.')\n- 19_pre_app ('19/16% Aufz. VSt.')\n- 7_pre_app ('7/5% Aufz. VSt.')\n- 19_both_app_1 ('§13b 19/16% USt./Aufz. VSt.')\n- 19_both_app_506 ('§13b 19/16% USt./Aufz. VSt. (EU §13b Abs. 1)')\n- 19_both_app_511 ('§13b 19/16% USt./Aufz. VSt. (Drittland §13b Abs. 2 Nr. 1)')\n- 19_both_app_2 ('i.g.E. 19/16% USt./Aufz. VSt.')\n- 7_both_app ('i.g.E. 7/5% USt./Aufz. VSt.')"
- Changed
postings_add_receipt1 field changed- changed
Input schema / properties / vats / descriptionPrevious value: -"An array of vats.\n\nUsage:\n\"vats\" : ['vat of posting 1', 'vat of posting 2'].\n\nPossible vats:\n- 0_none ('keine Ust.')\n- 19_vat ('19% Ust.')\n- 7_vat ('7% Ust.')\n- 19_pre ('19% Vst.')\n- 7_pre ('7% Vst.')\n- 19_both_1 ('§13b 19% USt./VSt.')\n- 19_both_2 ('I.g.E. 19% USt./VSt.')\n- 7_both ('I.g.E. 7% USt./VSt.')\n- 19_both_1_no_pre ('§13b 19/16% USt.')\n- 19_both_2_no_pre ('i.g.E. 19/16% USt.')\n- 7_both_no_pre ('i.g.E. 7/5% USt.')\n- 19_pre_app ('19/16% Aufz. VSt.')\n- 7_pre_app ('7/5% Aufz. VSt.')\n- 19_both_app_1 ('§13b 19/16% USt./Aufz. VSt.')\n- 19_both_app_2 ('i.g.E. 19/16% USt./Aufz. VSt.')\n- 7_both_app ('i.g.E. 7/5% USt./Aufz. VSt.')"New value: +"An array of vats.\n\nUsage:\n\"vats\" : ['vat of posting 1', 'vat of posting 2'].\n\nPossible vats:\n- 0_none ('keine Ust.')\n- 19_vat ('19% Ust.')\n- 7_vat ('7% Ust.')\n- 19_pre ('19% Vst.')\n- 7_pre ('7% Vst.')\n- 19_both_1 ('§13b 19% USt./VSt.')\n- 19_both_506 ('§13b 19% USt./VSt. (EU §13b Abs. 1)')\n- 19_both_6506 ('§13b 19% USt. (EU §13b Abs. 1, ohne VSt.)')\n- 19_both_511 ('§13b 19% USt./VSt. (Drittland §13b Abs. 2 Nr. 1)')\n- 19_both_6511 ('§13b 19% USt. (Drittland §13b Abs. 2 Nr. 1, ohne VSt.)')\n- 19_both_6501 ('§13b 19/16% USt. (ohne VSt.)')\n- 19_both_2 ('I.g.E. 19% USt./VSt.')\n- 7_both ('I.g.E. 7% USt./VSt.')\n- 19_both_1_no_pre ('§13b 19/16% USt.')\n- 19_both_2_no_pre ('i.g.E. 19/16% USt.')\n- 7_both_no_pre ('i.g.E. 7/5% USt.')\n- 19_pre_app ('19/16% Aufz. VSt.')\n- 7_pre_app ('7/5% Aufz. VSt.')\n- 19_both_app_1 ('§13b 19/16% USt./Aufz. VSt.')\n- 19_both_app_506 ('§13b 19/16% USt./Aufz. VSt. (EU §13b Abs. 1)')\n- 19_both_app_511 ('§13b 19/16% USt./Aufz. VSt. (Drittland §13b Abs. 2 Nr. 1)')\n- 19_both_app_2 ('i.g.E. 19/16% USt./Aufz. VSt.')\n- 7_both_app ('i.g.E. 7/5% USt./Aufz. VSt.')"
- Changed
postings_add_transaction1 field changed- changed
Input schema / properties / vats / descriptionPrevious value: -"An array of vats.\n\nUsage:\n\"vats\" : ['vat of posting 1', 'vat of posting 2'].\n\nPossible vats:\n- 0_none ('keine Ust.')\n- 19_vat ('19% Ust.')\n- 7_vat ('7% Ust.')\n- 19_pre ('19% Vst.')\n- 7_pre ('7% Vst.')\n- 19_both_1 ('§13b 19% USt./VSt.')\n- 19_both_2 ('I.g.E. 19% USt./VSt.')\n- 7_both ('I.g.E. 7% USt./VSt.')\n- 19_both_1_no_pre ('§13b 19/16% USt.')\n- 19_both_2_no_pre ('i.g.E. 19/16% USt.')\n- 7_both_no_pre ('i.g.E. 7/5% USt.')\n- 19_pre_app ('19/16% Aufz. VSt.')\n- 7_pre_app ('7/5% Aufz. VSt.')\n- 19_both_app_1 ('§13b 19/16% USt./Aufz. VSt.')\n- 19_both_app_2 ('i.g.E. 19/16% USt./Aufz. VSt.')\n- 7_both_app ('i.g.E. 7/5% USt./Aufz. VSt.')"New value: +"An array of vats.\n\nUsage:\n\"vats\" : ['vat of posting 1', 'vat of posting 2'].\n\nPossible vats:\n- 0_none ('keine Ust.')\n- 19_vat ('19% Ust.')\n- 7_vat ('7% Ust.')\n- 19_pre ('19% Vst.')\n- 7_pre ('7% Vst.')\n- 19_both_1 ('§13b 19% USt./VSt.')\n- 19_both_506 ('§13b 19% USt./VSt. (EU §13b Abs. 1)')\n- 19_both_6506 ('§13b 19% USt. (EU §13b Abs. 1, ohne VSt.)')\n- 19_both_511 ('§13b 19% USt./VSt. (Drittland §13b Abs. 2 Nr. 1)')\n- 19_both_6511 ('§13b 19% USt. (Drittland §13b Abs. 2 Nr. 1, ohne VSt.)')\n- 19_both_6501 ('§13b 19/16% USt. (ohne VSt.)')\n- 19_both_2 ('I.g.E. 19% USt./VSt.')\n- 7_both ('I.g.E. 7% USt./VSt.')\n- 19_both_1_no_pre ('§13b 19/16% USt.')\n- 19_both_2_no_pre ('i.g.E. 19/16% USt.')\n- 7_both_no_pre ('i.g.E. 7/5% USt.')\n- 19_pre_app ('19/16% Aufz. VSt.')\n- 7_pre_app ('7/5% Aufz. VSt.')\n- 19_both_app_1 ('§13b 19/16% USt./Aufz. VSt.')\n- 19_both_app_506 ('§13b 19/16% USt./Aufz. VSt. (EU §13b Abs. 1)')\n- 19_both_app_511 ('§13b 19/16% USt./Aufz. VSt. (Drittland §13b Abs. 2 Nr. 1)')\n- 19_both_app_2 ('i.g.E. 19/16% USt./Aufz. VSt.')\n- 7_both_app ('i.g.E. 7/5% USt./Aufz. VSt.')"
- Added
postings_cancel - Changed
receipts_get1 field changed- added
Input schema / properties / date_since_last_modifiedAdded value: +{ + "description": "A date and time in format 'YYYY-MM-DD HH:MM:SS' (e.g. '2017-04-26 13:45:00'). If only 'YYYY-MM-DD' is specified, the time defaults to '23:59:59'. All receipts whose date_updated value is later than the specified value will be returned.\n\nIf specified, the field will be validated. An empty string is not considered a valid date.", + "type": "string" +}
- Added
reports_create_bwa - Added
reports_create_sums - Added
reports_get_bwa - Added
reports_get_sums - Added
reports_get_sums_ledger - Changed
transactions_get1 field changed- added
Input schema / properties / date_since_last_modifiedAdded value: +{ + "description": "A date and time in format 'YYYY-MM-DD HH:MM:SS' (e.g. '2017-04-26 13:45:00'). If only 'YYYY-MM-DD' is specified, the time defaults to '23:59:59'. All transactions whose date_updated value is later than the specified value will be returned.\n\nIf specified, the field will be validated. An empty string is not considered a valid date.", + "type": "string" +}
48 tool updates
v1.0.0- First observed
accounts_add - First observed
accounts_get - First observed
comments_add - First observed
cost_locations_add - First observed
cost_locations_delete - First observed
cost_locations_get - First observed
cost_locations_update - First observed
invoices_create - First observed
invoices_create_draft - First observed
invoices_create_e_invoice - First observed
postings_add_batch_free - First observed
postings_add_batch_receipts - First observed
postings_add_batch_transactions - First observed
postings_add_free - First observed
postings_add_receipt - First observed
postings_add_transaction - First observed
postings_assign_receipt_to_free_posting - First observed
postings_get - First observed
postings_unconfirm_free - First observed
postings_unconfirm_receipt - First observed
postings_unconfirm_transaction - First observed
receipts_add - First observed
receipts_addBatch - First observed
receipts_assigned_transactions_get - First observed
receipts_delete_id_by_customer - First observed
receipts_get - First observed
receipts_get_id_by_customer - First observed
receipts_restore_id_by_customer - First observed
receipts_upload - First observed
settings_add_batch_creditors - First observed
settings_add_batch_debtors - First observed
settings_add_creditor - First observed
settings_add_debtor - First observed
settings_add_postingaccount - First observed
settings_get_creditors - First observed
settings_get_debtors - First observed
settings_get_postingaccounts - First observed
settings_update_creditor - First observed
settings_update_debtor - First observed
settings_update_postingaccount - First observed
transactions_add - First observed
transactions_addBatch - First observed
transactions_assign_batch_receipt - First observed
transactions_assign_receipt - First observed
transactions_assigned_receipts_get - First observed
transactions_get - First observed
transactions_get_id_by_customer - First observed
transactions_unassign_receipt
TDQS
Most tools have distinct purposes, but some overlap exists, e.g., between receipts_upload and receipts_add (both add receipts) and between multiple posting add tools. However, descriptions clarify differences, so confusion is minimal.
Naming is mostly verb_noun with underscores, but there are inconsistencies like 'add' vs 'create' (e.g., transactions_add vs invoices_create) and 'batch' naming (transactions_addBatch vs settings_add_batch_creditors). Plural/singular also varies.
With 48 tools, the server is overloaded. While the accounting domain has many entities, this count is higher than typical MCP servers and may overwhelm agents. Some tools could be merged (e.g., batch and single variants).
The tool set covers many CRUD operations for most entities, but notable gaps exist: no update or delete for transactions, no update for receipts, no delete for postings, accounts, or settings. This may force agent workarounds.
Maintenance
Related MCP Connectors
Malaysian SME accounting, e-Invoice and payroll for your AI. 61 tools; writes are approved drafts.
QuickBooks Online in Claude and ChatGPT: 211 tools, full ledger, multi-company, Canada + US, FR/EN.
1Log, query, and edit expenses, budgets, and accounts in Manilo (formerly Ledgy) from any MCP-compatible AI assistant.
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 gradedqualityAmaintenanceEnables AI assistants to interact with QuickFile UK accounting software, providing access to invoicing, client management, purchases, banking, and financial reporting through 40+ tools covering the complete QuickFile API.4MIT
- AlicenseAqualityBmaintenanceEnables LLMs to interact with Billforward's billing and subscription management API, providing tools for accounts, subscriptions, invoices, payments, and more with read-only safety by default.23653MIT
- AlicenseNot gradedqualityBmaintenanceIntegrates with the sevdesk German accounting API, providing 76 tools for full CRUD operations across contacts, invoices, vouchers, orders, credit notes, bank accounts, transactions, parts, tags, addresses, and communication ways.716MIT
- AlicenseNot gradedqualityDmaintenanceProvides comprehensive AI-agnostic access to all Firefly III personal finance features via 66 tools, enabling natural language management of accounts, transactions, budgets, and more.1323MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ohneben/Buchhaltungsbutler-MCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server