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). You need an active Dinero subscription, and your user must hold a seat on it (assigned under Team in the portal, see Team).
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. A bare name in a request returns Unknown tool..The connector is multi-instance: an additional portal (a second Visma login) is served at its own endpoint, e.g. https://mcp.consile.ai/dinero-2/mcp, with tools named dinero-2__<tool>. Portals are added in the portal by an administrator.
For an account with an active Dinero subscription, tools/list on this endpoint returns the 52 dinero__* tools plus the unprefixed system tool connect_account (no arguments; returns { connect_url, instructions }, a link valid for 10 minutes for connecting the Dinero account in the browser). Without a subscription only connect_account is listed. A user without a seat still sees the tools, but every call is refused. Every Dinero tool is annotated readOnlyHint: true, destructiveHint: false, openWorldHint: false.
Dinero’s public API requires a Dinero Pro subscription on the organization. Non-Pro organizations are rejected on every call except list_organizations and validate_connection (both only enumerate organizations, so they work without Pro; check isPro there). Access tokens are refreshed automatically. See Errors and 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 organization” stored.
integer
required
The Dinero organization id from list_organizations. Required on every org-scoped tool (noted per tool below where it is the only argument).

Pagination

Paged list tools come in three shapes:
  • Collection-backed tools (list_contacts, list_contact_notes, list_invoices, list_invoices_overdue, list_sales, list_credit_notes, list_trade_offers, list_products) return an envelope.
  • list_chart_of_accounts, list_entries and list_entry_changes slice a bare array into a flat page.
  • list_files returns { count, hasMore, files[] }, where hasMore is true whenever the page is full.
Short lookup lists (accounting years, countries, VAT types, deposit accounts, mailouts, reminders) are unpaged and return { count, <items>[] }.
When list_trade_offers filters by status, the response also carries matchedOnPage and statusFilteredClientSide: true, and pagination still describes the unfiltered page.
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.
integer
default:"0"
0-based page index.
integer
default:"20"
Rows per page. Defaults to 20 on the collection-backed lists (invoices, contacts, sales, credit notes, trade offers, products, files) and to 100 on the accounting lists (list_chart_of_accounts, list_entries, list_entry_changes). The maximum is 1000; a larger value is rejected.

Filters & dates

string
UTC timestamp in exactly the form YYYY-MM-DDTHH:mm:ssZ (e.g. 2026-09-01T00:00:00Z; no milliseconds, no offset). Returns only rows created, updated or deleted at or after this time. Accepted by list_contacts, list_invoices, list_sales, list_credit_notes, list_trade_offers, list_products, list_invoice_mailouts, list_invoice_reminders, list_credit_note_mailouts and list_trade_offer_mailouts.
Other date arguments are validated as YYYY-MM-DD. The exception is from/to on the two state-of-account tools, which are passed to Dinero as given (use YYYY-MM-DD there too). All *Guid arguments except fileGuid must be UUIDs.
Values of the structured filter arguments (name, email, phone, vatNumber, eanNumber, externalReference, descriptionContains, contactNameContains, currency, productNumber) cannot contain a single quote ('): Dinero’s filter syntax wraps the value in single quotes with no escape, so Consile refuses the call before it reaches Dinero (the client sees Tool invocation failed.). freeTextSearch and the search argument of list_products are not affected. startDate/endDate (on list_invoices, list_sales, list_credit_notes) must be passed as a pair; the from/to bounds on the state-of-account tools are independent optionals.

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.

PDFs and files

All PDF and file downloads return the file as base64 and are capped at 6 MB; a larger file fails the call. A chat client cannot turn the base64 into a file for the user, so these tools are meant for agents that can decode and save the data.

Organizations & reference


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.
string
required
Accounting-year name as Dinero returns it (e.g. "2025"), from list_accounting_years.
boolean
default:"false"
boolean
default:"false"
integer
integer

Contacts

Dinero keeps one merged customer/supplier register. The debtor/creditor split is only on get_contact, never on the list.

Invoices & reminders


Sales: credit notes & trade offers


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. All PDF and file downloads are capped at 6 MB.

Code examples

Errors

A failed Dinero call returns a normal tools/call result with isError: true and the fixed text Tool invocation failed.. The upstream reason is not passed to the client. Common causes:
  • The grant was revoked at Visma or could not be refreshed. Call connect_account for a fresh connect link, or open the connector in the portal, click Disconnect connector (Afbryd connector in the Danish UI) and connect it again. That button applies only to the first portal; for an extra portal, call connect_account on that portal’s endpoint (for example /dinero-2/mcp). The portal keeps showing the connector as connected until you do.
  • The organization is not on Dinero Pro, or the connected Visma user cannot reach that organizationId.
  • Dinero’s rate limit of about 100 requests per minute per organization. A 429 is retried once after about 2.5 seconds, then the call fails.
  • An invalid argument: a wrong date or changesSince format, startDate without endDate, a single quote in a filter value, a pageSize above 1000, or a scalar where an array is expected (status, extensions).
  • A file over 6 MB, or a call that exceeds the 15-second upstream timeout.
4xx responses from Dinero are never retried. To narrow a failure down: if validate_connection also fails, reconnect; if it succeeds, check organizationId and isPro in list_organizations. Platform refusals return their own explanatory text instead: no Dinero subscription (with a purchase link), account not connected yet (with a connect link), or no seat for your user (an administrator assigns one under Team). See Errors & limits.