Buchhaltungsbutler MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| HOST | No | HTTP bind address | 0.0.0.0 |
| PORT | No | HTTP listen port | 3000 |
| BB_API_KEY | Yes | Default customer api_key | |
| BB_BASE_URL | No | Override the API base URL | |
| BB_API_CLIENT | Yes | API Client (Basic-auth username) | |
| BB_API_SECRET | Yes | API Secret (Basic-auth password) | |
| BB_RATE_LIMIT | No | Client-side requests/minute cap | 90 |
| MCP_HTTP_PATH | No | HTTP MCP route | /mcp |
| MCP_TRANSPORT | No | Transport mode: stdio or http | stdio |
| MCP_AUTH_TOKEN | No | Require Authorization: Bearer <token> on /mcp |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| accounts_listA | 🟢 READ-ONLY: Fetches data. Makes no changes to the accounting records. get all the accounts Use to list the bank, cash and credit-card accounts that transactions can be booked against, e.g. to resolve an account name to the numeric Not the chart of accounts. For posting account numbers such as 1200 or 4400, use v1 offers no update or delete endpoint for accounts. An account created here can only be listed afterwards. Endpoint: POST /accounts/get |
| cost_locations_listA | 🟢 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! Use to list the cost centres available for the Endpoint: POST /cost-locations/get |
| creditors_listA | 🟢 READ-ONLY: Fetches data. Makes no changes to the accounting records. get creditors Get all creditors Use to list suppliers, for example to resolve a supplier name to the For customers you invoice, use Supports Endpoint: POST /settings/get/creditors |
| debtors_listA | 🟢 READ-ONLY: Fetches data. Makes no changes to the accounting records. get debitors Get all debitors Use to list customers, for example to resolve a customer name to the For suppliers you buy from, use Supports Endpoint: POST /settings/get/debtors |
| postingaccounts_listA | 🟢 READ-ONLY: Fetches data. Makes no changes to the accounting records. get postingaccounts Get all postingaccounts Use to list the chart of accounts, for example to find the posting account number for office supplies before booking. Not bank accounts. For the bank, cash and credit-card accounts transactions belong to, use Supports Endpoint: POST /settings/get/postingaccounts |
| postings_listA | 🟢 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! Use to read the booking journal, filtered by date range or posting account. Supports Endpoint: POST /postings/get |
| receipts_get_by_idA | 🟢 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. Use to fetch a single receipt whose id you already have. To search or page through receipts, use
Endpoint: POST /receipts/get/id_by_customer |
| receipts_listA | 🟢 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. Use to search receipts by direction, date range or payment status. To fetch one known receipt, use
Endpoint: POST /receipts/get |
| receipts_list_assigned_transactionsA | 🟢 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. Use to see which bank transactions are linked to a given receipt, for example to check whether an invoice has been matched to a payment. For the opposite direction, use Endpoint: POST /receipts/assigned-transactions/get |
| reports_get_bwaA | 🟢 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. Use to read a BWA that Returns nothing useful until generation has finished. If the report is not ready, wait and retry rather than requesting a new one, since a new request replaces the pending one. Endpoint: POST /reports/get/bwa |
| reports_get_sumsA | 🟢 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. Use to read a sums and balances report that For the individual bookings behind one posting account, use Endpoint: POST /reports/get/sums |
| reports_get_sums_ledgerA | 🟢 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. Use to read one posting account's ledger for a bounded date range. For the totals across all posting accounts, use The API returns the ledger on demand; no previously generated sums report or report ID is required. Endpoint: POST /reports/get/sums/ledger |
| transactions_get_by_idA | 🟢 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. Use to fetch a single bank transaction whose id you already have. To search or page through transactions, use
Endpoint: POST /transactions/get/id_by_customer |
| transactions_listA | 🟢 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. Use to search bank transactions by account and date range. To fetch one known transaction, use For multi-page exports, prefer Endpoint: POST /transactions/get |
| transactions_list_assigned_receiptsA | 🟢 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. Use to see which receipts are linked to a given bank transaction, for example to check whether a payment has its invoice attached. For the opposite direction, use Endpoint: POST /transactions/assigned-receipts/get |
| accounts_createA | 🟡 WRITE · creates data: Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent: calling twice may create duplicates. add a basic account Use to register a new bank, cash or credit-card account before importing transactions for it. Not for chart-of-accounts entries. To add a posting account number, use Not idempotent: calling twice with the same name creates two accounts. Check Endpoint: POST /accounts/add |
| comments_createA | 🟡 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. Use to attach a free-text note to one receipt or one transaction, for example to record why a booking was categorised the way it was. Exactly one of Endpoint: POST /comments/add |
| cost_locations_createA | 🟡 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. Use to create a cost centre before referencing it from a posting. Not idempotent. Check Endpoint: POST /cost-locations/add |
| creditors_createA | 🟡 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. Use to create one or more suppliers. For customers you invoice, use Takes one or many: pass an array of creditors in Not idempotent: check Endpoint: POST /settings/add-batch/creditors |
| debtors_createA | 🟡 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. Use to create one or more customers. For suppliers you buy from, use Takes one or many: pass an array of debtors in Not idempotent: check Endpoint: POST /settings/add-batch/debtors |
| invoices_createA | 🟡 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. Use to issue a final outgoing invoice that is booked immediately. For an invoice that should stay editable, use Not idempotent: a second call issues a second invoice with a new number. v1 offers no endpoint to list, change or cancel an invoice once created. Endpoint: POST /invoices/create |
| invoices_create_draftA | 🟡 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. Use to prepare an invoice that a human should review and release in the BuchhaltungsButler web app. A draft is not booked and carries no invoice number. To issue a final invoice directly, use v1 offers no endpoint to list, edit or release drafts. Releasing happens in the web app. Endpoint: POST /invoices/create/draft |
| invoices_create_e_invoiceA | 🟡 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. Use when the recipient requires a structured electronic invoice, for example a German public-sector customer expecting XRechnung. For an ordinary PDF invoice, use Not idempotent. v1 offers no endpoint to list or cancel an e-invoice once created. Endpoint: POST /invoices/create/e-invoice |
| postingaccounts_createA | 🟡 WRITE · creates data: Creates new records (receipts, transactions, postings, invoices, master data). Not idempotent: calling twice may create duplicates. add postingaccount Create a postingaccount. Use to add an account number to the chart of accounts that the standard chart does not cover. To register a bank or cash account, use Not idempotent. v1 offers no delete endpoint, so a posting account created here can only be updated afterwards. Endpoint: POST /settings/add/postingaccount |
| postings_create_for_receiptA | 🟡 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. Use to book one or more receipts that already exist in BuchhaltungsButler, splitting each across posting accounts, VAT rates and cost centres. For a journal entry with no receipt behind it, use Takes one or many: pass an array of receipts in The per-receipt arrays ( Endpoint: POST /postings/add-batch/receipts |
| postings_create_for_transactionA | 🟡 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. Use to book one or more bank transactions, splitting each across posting accounts, VAT rates and cost centres. For a journal entry with no bank transaction behind it, use Takes one or many: pass an array of transactions in The per-transaction arrays are positional and must all have the same length. Not idempotent. Reversible with Endpoint: POST /postings/add-batch/transactions |
| postings_create_freeA | 🟡 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. Use to book a debit/credit pair that is not tied to an existing receipt or bank transaction, such as a manual accrual or a correction. If the booking documents a receipt, use Takes one or many: pass an array of free postings in A "free" posting is BuchhaltungsButler's term for a standalone journal entry: you name both sides yourself via Endpoint: POST /postings/add-batch/free |
| receipts_createA | 🟡 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! Use to record receipts that have no file attached, for example when the document lives in another system. If you have the actual PDF or image, use Takes one or many: pass an array of receipts in Not idempotent: a repeated call creates duplicate receipts. The response reports per-item success, so a partial failure leaves the successful entries in place. Endpoint: POST /receipts/addBatch |
| receipts_uploadA | 🟡 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 Use to send the actual receipt file. BuchhaltungsButler runs document recognition on it and returns the stored filename. To record a receipt without a file, use Rate limited to 10 requests per minute. Not idempotent, so uploading the same file twice creates two receipts. Endpoint: POST /receipts/upload |
| reports_create_bwaA | 🟡 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. Use to request a BWA (Betriebswirtschaftliche Auswertung, the German management report). Step one of two. This only triggers generation. To read the finished report, call Runs asynchronously and returns an id, not the report. A new BWA can only be requested once the previous one has finished, and it replaces the previous one. Endpoint: POST /reports/create/bwa |
| reports_create_sumsA | 🟡 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. Use to request a sums and balances report (Summen- und Saldenliste). Step one of two. To read the finished report, call Runs asynchronously and returns an id. A new report may only be requested once the previous one has finished, and it replaces the previous one. Endpoint: POST /reports/create/sums |
| transactions_createA | 🟡 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. Use to import bank transactions that no bank connection delivers automatically, for example from a CSV export or a cash book. Takes one or many: pass an array of transactions in Not idempotent and there is no duplicate detection: re-importing the same statement books every line a second time. Check Endpoint: POST /transactions/addBatch |
| cost_locations_updateA | 🟡 WRITE · updates data: Modifies existing master data in place. update cost location Update a cost location's name/description. Use to rename an existing cost centre or change its number. Overwrites the fields you send. Read the current record with Endpoint: POST /cost-locations/update |
| creditors_updateA | 🟡 WRITE · updates data: Modifies existing master data in place. update creditor Update a creditor account. Use to change a supplier's address, bank details or payment terms. Overwrites the fields you send. Read the current record with Endpoint: POST /settings/update/creditor |
| debtors_updateA | 🟡 WRITE · updates data: Modifies existing master data in place. update debtor Update a debtor account. Use to change a customer's address, bank details or customer number. Overwrites the fields you send. Read the current record with Endpoint: POST /settings/update/debtor |
| postingaccounts_updateA | 🟡 WRITE · updates data: Modifies existing master data in place. update postingaccount Update a postingaccount. Use to rename a posting account or change its properties. Overwrites the fields you send. Read the current record with Endpoint: POST /settings/update/postingaccount |
| postings_assign_receipt_to_freeA | 🟡 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. Use to attach a receipt to a free posting that was booked without one, so the entry has its supporting document. To link a receipt to a bank transaction rather than a posting, use Endpoint: POST /postings/assign/receipt-to-free-posting |
| transactions_assign_receiptsA | 🟡 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. Use to match receipts to the bank transactions that paid them, one pair or many at once. To attach a receipt to a posting rather than a bank transaction, use Takes one or many: pass an array of transactions to receipts in Reversible with Endpoint: POST /transactions/assign-batch/receipt |
| transactions_unassign_receiptA | 🟡 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. Use to undo a receipt-to-transaction match that was made in error. Removes only the link. Neither the receipt nor the transaction is deleted. Endpoint: POST /transactions/unassign/receipt |
| postings_unconfirm_for_receiptA | 🟡 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. Use to send a receipt posting back to the unconfirmed state so it can be corrected. This keeps the posting and only clears its confirmation. To remove the posting itself, use Only works while the posting is not fixed. Endpoint: POST /postings/unconfirm/receipt |
| postings_unconfirm_for_transactionA | 🟡 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. Use to send a transaction posting back to the unconfirmed state so it can be corrected. This keeps the posting and only clears its confirmation. To remove the posting itself, use Only works while the posting is not fixed. Endpoint: POST /postings/unconfirm/transaction |
| postings_unconfirm_freeA | 🟡 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. Use to send a free posting back to the unconfirmed state so it can be corrected. This keeps the posting and only clears its confirmation. To remove the posting itself, use Only works while the posting is not fixed. Fixed postings can no longer be unconfirmed. Endpoint: POST /postings/unconfirm/free |
| receipts_restoreA | 🟡 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. Use to bring back a receipt that was deleted with Endpoint: POST /receipts/restore/id_by_customer |
| cost_locations_deleteA | 🔴 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. Use to remove a cost centre that is no longer needed. Permanent. Unlike a deleted receipt there is no restore endpoint, so confirm with the user before calling. Endpoint: POST /cost-locations/delete |
| postings_cancelA | 🔴 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. Use to take a booking out of the books entirely. This is stronger than the The effect depends on the posting: one that is not yet fixed is deleted outright, a fixed one stays and is offset by a reversal posting, which leaves two visible entries in the journal. Confirm with the user before calling. Endpoint: POST /postings/cancel |
| receipts_deleteA | 🔴 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. Use to remove a receipt that was filed by mistake. Recoverable: Endpoint: POST /receipts/delete/id_by_customer |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 46 tools
Tools are grouped by resource with clear descriptions separating pairs like accounts vs postingaccounts, creditors vs debtors, and receipts vs transactions. Minor overlap exists between postings_list and reports_get_sums_ledger (both expose postings for an account), so one or two choices could be ambiguous, but most tools are sharply distinct.
All tool names follow a consistent `resource_action` snake_case pattern (e.g. accounts_list, creditors_create, cost_locations_update, receipts_restore). Compound actions like transactions_assign_receipts and postings_unconfirm_for_receipt remain readable and within the same convention.
46 tools is a very large surface for an agent to navigate, well beyond the 'borderline heavy' 16-25 range. Although each endpoint maps to a real API operation, the set is not tightly scoped and would benefit from consolidating related variants.
Several resources are create-only or lack full lifecycle support: invoices cannot be listed, edited, or cancelled after creation; comments cannot be read; accounts/transactions have no update or delete; receipts have no update. These gaps leave agents with dead ends (e.g., issuing an invoice with no way to retrieve or cancel it).