Skip to main content
All Dinero tools are read-only and called via tools/call over POST /dinero/mcp. The connector is connected through OAuth (Visma Connect; see Forbind Dinero).
Endpoint: https://mcp.consile.ai/dinero/mcp. Dinero is its own named connector with only its own tools. Tool names are namespaced dinero__<tool> in Claude/ChatGPT; the bare names are used here for readability.
Dinero’s public API requires a Dinero Pro subscription on the organisation. Non-Pro organisations return 403 on every call except list_organizations. The connector surfaces this as DineroProRequiredError. Access tokens are refreshed silently; a revoked grant surfaces as AccessTokenExpiredError (“reconnect required”). See Errors & limits.

Shared conventions

organizationId

Dinero auth is user-based, so almost every tool requires an organizationId. Get the integer id (and the isPro flag) from list_organizations; there is no single “selected organisation” stored.
organizationId
integer
required
The Dinero organisation id from list_organizations. Required on every org-scoped tool (noted per tool below where it is the only argument).

Pagination

List tools come in two shapes. Tools backed by a Dinero collection endpoint return an envelope; tools that slice a bare array return a flat page.
// envelope (e.g. list_invoices, list_contacts, list_sales)
{ "items": [ ... ], "pagination": { "page": 0, "pageSize": 100, "result": 100, "totalWithoutFilter": 412, "hasMore": true } }

// client-sliced (e.g. list_chart_of_accounts, list_entries, reports)
{ "items": [ ... ], "totalCount": 100, "page": 0, "pageSize": 100, "hasMore": true }
totalWithoutFilter is the row count ignoring any filter — it is NOT the filtered total. Dinero exposes no filtered total, so never answer “how many overdue invoices?” from totalWithoutFilter; count the returned items or page through with hasMore.
page
integer
default:"0"
0-based page index.
pageSize
integer
default:"100"
Rows per page.

Filters & dates

changesSince
string (ISO 8601 UTC)
On supported list tools, return only records changed at/after this timestamp. Use it for incremental pulls.
Free-text filter values cannot contain a single quote (') — Dinero’s filter syntax wraps the value in single quotes with no escape, so such a clause is rejected with a friendly error. Date ranges (startDate/endDate, from/to) must be passed as a pair.

Read-via-POST calculators

Two tools (calculate_invoice_totals, preview_invoice_reminder) issue a POST to a Dinero …/fetch endpoint. They are read-only: they compute a result for a prospective input and persist nothing upstream.

Organisations & reference

ToolDescriptionKey argumentsReturns
list_organizationsDinero organisations the connected user can reach, with the id every other tool needs and the isPro flag.(none){ count, organizations[] } (id, name, vatNumber, countryKey, isPro, …)
validate_connectionConnectivity/credential health check; lists reachable orgs (works without Pro).(none){ connected, organizationCount, organizations[] }
list_accounting_yearsThe org’s accounting years with fromDate/toDate and the year name used by the report tools.organizationId{ count, years[] }
list_countriesCountry keys Dinero accepts on contacts (account-global).search? (client-side){ count, countries[] }
list_vat_typesThe org’s VAT types/codes, to interpret vatCode on accounts and entries.organizationId{ count, vatTypes[] }
get_sales_settingsDefault invoicing settings (default account, payment terms, reminder fee/interest, default template).organizationIdsales-settings object

Bookkeeping & accounting

The four report tools are Dinero’s only balance source. They take no date range — balances are whole-year totals keyed by the accounting-year name (from list_accounting_years). They share the same arguments.
accountingYear
string
required
Accounting year name as Dinero returns it (e.g. "2025"), from list_accounting_years.
includeZeroAccounts
boolean
default:"false"
includeSummaryAccounts
boolean
default:"false"
accountNumberFrom
integer
accountNumberTo
integer
ToolDescriptionKey argumentsReturns
list_chart_of_accountsEntry accounts with VAT code and category. Rows carry no balance — use the report tools.organizationId, category?, accountNumberFrom?, accountNumberTo?, includeHidden?, page, pageSize{ items, totalCount, page, pageSize, hasMore }
list_deposit_accountsDeposit (bank/Stripe/MobilePay) accounts incl. default flag.organizationId, includeHidden?, includeBankDetails?{ count, accounts[] }
get_saldo_balance_reportSaldobalance: per-account year totals for all accounts (P&L + balance sheet). The workhorse for balance questions.report args{ accountingYear, count, rows[] } (accountNumber, accountName, amount)
get_result_reportResultatopgørelse (P&L): income/expense accounts with year totals.report args{ accountingYear, count, rows[] }
get_balance_reportBalance sheet: asset & liability accounts at booked position.report args{ accountingYear, count, rows[] }
get_primo_balance_reportOpening (primo) balances per account.report args{ accountingYear, count, rows[] }
get_account_balanceYear-total balance for specific account number(s) (fetches the saldo report, returns only those rows).organizationId, accountingYear, accountNumbers (1–20 ints){ accountingYear, accounts[], notFound[] }
list_entriesPosted bookkeeping entries for a date range within one accounting year. The discovery path for purchase/manual voucher guids.organizationId, fromDate, toDate, includePrimo?, accountNumber?, voucherType?, page, pageSize{ items, totalCount, page, pageSize, hasMore }
list_entry_changesEntries added in a window of ≤31 days (filters on added date) — incremental follow-up to list_entries.organizationId, changesFrom, changesTo (≤31 days later), includePrimo?, page, pageSize{ items, totalCount, page, pageSize, hasMore }

Contacts

Dinero keeps one merged customer/supplier register. The debtor/creditor split is only on get_contact, never on the list.
ToolDescriptionKey argumentsReturns
list_contactsSearch/list the merged contact register.organizationId, name?, email?, phone?, vatNumber?, eanNumber?, externalReference?, isPerson?, changesSince?, deletedFilter?, page, pageSize{ items, pagination }
get_contactFull single contact incl. isDebitor/isCreditor, SE/P numbers, preferred language/currency.organizationId, contactGuidcontact object
list_contact_notesNotes on a contact (full text, author, timestamps).organizationId, contactGuid, deletedOnly?, page, pageSize{ items, pagination }
get_contact_state_of_accountKontoudtog: summed income/expenses + dated entries with a running balance. hideClosed=true = open-items view (“what does this customer owe?”).organizationId, contactGuid, from?, to?, hideClosed?, maxEntries? (1–500){ contactGuid, income, expenses, entryCount, truncated, entries[] }
download_contact_state_of_account_pdfThe kontoudtog as a PDF (base64).organizationId, contactGuid, from?, to?, hideClosed?{ contactGuid, fileName, mimeType, base64 }

Invoices & reminders

ToolDescriptionKey argumentsReturns
list_invoicesList/search invoices. status is a 5-value filter (Draft/Booked/Paid/OverPaid/Overdue). Drafts ignore the date filter.organizationId, status?, startDate?/endDate?, freeTextSearch?, contactGuid?, externalReference?, descriptionContains?, changesSince?, deletedOnly?, sort?, sortOrder?, page, pageSize{ items, pagination }
list_invoices_overdueOutstanding receivables: invoices past payment date.organizationId, includeNotYetDue?, page, pageSize{ items, pagination }
get_invoiceFull single invoice: product lines, totals/VAT, FIK code, mailout status.organizationId, invoiceGuidinvoice object
download_invoice_pdfInvoice PDF (base64). PDFs exist only for booked invoices.organizationId, invoiceGuid{ invoiceGuid, fileName, mimeType, base64 }
list_invoice_paymentsPayments on an invoice + paid/remaining amounts.organizationId, invoiceGuidpayments object
calculate_invoice_totalsRead-via-POST calculator: compute totals/VAT/payment date for a prospective set of lines. Persists nothing.organizationId, productLines[], contactGuid?, date?, currency?, …computed totals object
list_invoice_mailoutsDelivery/engagement history for an invoice (received/opened/bounced, download count).organizationId, invoiceGuid, includeSms?, changesSince?{ count, mailouts[] }
list_invoice_remindersAll reminders (rykkere, max 3) for one booked invoice: fee, interest, accumulated fees.organizationId, invoiceGuid, changesSince?{ count, reminders[] }
get_invoice_reminderOne reminder with full fee/interest breakdown incl. Danish legal text.organizationId, invoiceGuid, reminderIdreminder object
download_invoice_reminder_pdfA reminder as PDF (base64).organizationId, invoiceGuid, reminderId{ …, fileName, mimeType, base64 }
get_next_invoice_reminderPreview the next reminder Dinero would generate for an overdue invoice. Persists nothing.organizationId, invoiceGuidreminder preview object
preview_invoice_reminderRead-via-POST calculator: reminder preview for a chosen date + fee/interest toggles. Persists nothing.organizationId, invoiceGuid, date, withFee, withInterestFee, withCompensationFee, withDebtCollectionWarningreminder preview object

Sales: credit notes & trade offers

ToolDescriptionKey argumentsReturns
list_salesAll sales vouchers in one feed — invoices AND credit notes (type tells them apart).organizationId + same filter surface as list_invoices{ items, pagination }
list_credit_notesList sales credit notes (kreditnotaer).same filter surface as list_sales{ items, pagination }
get_credit_noteFull single credit note incl. creditNoteFor (the credited invoice guid).organizationId, creditNoteGuidcredit note object
download_credit_note_pdfBooked credit note as PDF (base64).organizationId, creditNoteGuid{ creditNoteGuid, fileName, mimeType, base64 }
list_credit_note_paymentsPayments/settlement of a booked credit note.organizationId, creditNoteGuidpayments object
list_credit_note_mailoutsDelivery history for a credit note.organizationId, creditNoteGuid, changesSince?{ count, mailouts[] }
list_trade_offersList/search trade offers (tilbud). No server-side status filterstatus filters the returned page client-side.organizationId, status?, contactNameContains?, descriptionContains?, externalReference?, currency?, number?, date?, freeTextSearch?, changesSince?, deletedOnly?, sort?, sortOrder?, page, pageSize{ items, pagination }
get_trade_offerFull single trade offer: lines, totals, status, history timeline, generatedVouchers.organizationId, tradeOfferGuidtrade offer object
download_trade_offer_pdfA trade offer as PDF (base64).organizationId, tradeOfferGuid{ tradeOfferGuid, fileName, mimeType, base64 }
list_trade_offer_mailoutsDelivery log for a trade offer.organizationId, tradeOfferGuid, includeSms?, changesSince?{ count, mailouts[] }

Purchases, products & files

Dinero has no list endpoint for purchase vouchers, purchase credit notes or manual vouchers — they are fetched by guid. Discover guids via list_entries (with a voucherType filter), get_purchase_vouchers_by_file, or known references.
ToolDescriptionKey argumentsReturns
get_purchase_voucherOne purchase voucher (køb) by guid: status, dates, contact, lines, totals, attached fileGuid.organizationId, voucherGuidvoucher object
get_purchase_voucher_paymentsPayments on a credit purchase voucher / purchase credit note.organizationId, voucherGuid{ count, payments[] }
get_purchase_vouchers_by_fileReverse lookup: fileGuid → guid(s) of purchase voucher(s) referencing it.organizationId, fileGuid{ fileGuid, voucherGuids[] }
get_purchase_credit_noteOne purchase credit note by guid.organizationId, creditNoteGuidvoucher object
get_manual_voucherOne manual voucher (kassekladde) by guid: lines, balancing accounts/VAT, FX, booking metadata.organizationId, voucherGuidmanual voucher object
list_productsThe product register (varekartotek) with prices, units, account mapping.organizationId, search?, productNumber?, externalReference?, changesSince?, deletedOnly?, page, pageSize{ items, pagination }
get_productOne product by guid (incl. the comment field the list omits).organizationId, productGuidproduct object
list_filesThe file archive (uploaded receipts/docs): name, extension, size, upload date/user, linked vouchers.organizationId, extensions?, uploadedAfter?, uploadedBefore?, fileStatus?, page, pageSize{ count, hasMore, files[] }
download_fileDownload an archive file (receipt image/PDF) as base64. Capped at 6 MB.organizationId, fileGuid{ fileGuid, base64 }
list_document_attachmentsAttachments bound to a sales document (invoice/trade offer/credit note).organizationId, documentGuid{ documentGuid, count, attachments[] }

Code examples

{
  "name": "dinero__list_invoices_overdue",
  "arguments": { "organizationId": 123456, "includeNotYetDue": false }
}
Error contract: 401 → reconnect required (AccessTokenExpiredError); 403 → no Dinero Pro or no access to that org (DineroProRequiredError); 429 → rate limit (≈100 requests/min/org; retried once, then DineroRateLimitError); 480 → a deprecated Dinero endpoint. 4xx responses are never retried. See Errors & limits.