Moneybird MCP server for AI agents

Live

OAUTH 2.0

ACCOUNTING

Accounting & Finance

Moneybird gives your agent bookkeeping for your administration: create and send sales invoices and estimates, record purchase invoices and receipts, book bank transactions, log time, and read profit and loss, VAT, and debtors reports.

  • Per-user credentials: each call uses the actual user's token, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
Moneybird
agent · Acme Q3
Run
Which customers have open receivables, and who owes the most?
S
moneybird_get_debtors_report
126ms
Bookkeeping agent
14 customers have open receivables totaling €23,160. Van Dijk Bouw owes the most at €4,850.
Sources: Moneybird debtors report
moneybird
14 customers
18:29
Message Claude...

Tools your bookkeeping agent reaches for on Moneybird, scoped per user.

CALL ANY TOOL
119 tools for accounting in Moneybird: create and send sales invoices and estimates, record purchase invoices, receipts, and payments, book bank mutations, log time entries, and run financial and VAT reports.
moneybird_add_contact_note
Add contact note
Add a note to a contact. Returns the created note including id, administration_id, entity_id, entity_type, user_id, assignee_id, todo. Use to record a remark on the contact timeline.
Parameters
Name
Type
Required
Description
administration_id
string
Required
Id of the Moneybird administration (bookkeeping account) to work in. Use list_administrations to find it.
contact_id
string
Required
Id of the contact. Use list_contacts to find it.
assignee_id
string
Optional
Assign to-do to user. Should be a valid user id. If assignee_id is provided the note will be a to-do. Example: 401892365587990113.
note
string
Optional
**Required**. Text for the note or to-do. Example: Called the customer about the open invoice..
todo
boolean
Optional
If `true` the note is a to-do. Example: sales_invoices.
moneybird_archive_contact
Archive contact
moneybird_bill_estimate
Bill estimate
moneybird_create_contact
Create contact
moneybird_create_estimate
Create estimate
moneybird_create_ledger_account
Create ledger account
moneybird_create_purchase_invoice_payment
Create purchase invoice payment
moneybird_create_sales_invoice
Create sales invoice
moneybird_delete_contact
Delete contact
moneybird_delete_product
Delete product
moneybird_delete_recurring_sales_invoice
Delete recurring sales invoice
moneybird_fetch_contacts_by_ids
Fetch contacts by ids
moneybird_find_sales_invoice_by_invoice_id
Find sales invoice by invoice id
moneybird_get_balance_sheet_report
Get balance sheet report
moneybird_get_contact_by_customer_id
Get contact by customer id
moneybird_get_external_sales_invoice
Get external sales invoice
moneybird_get_ledger_account
Get ledger account
moneybird_get_purchase_invoice
Get purchase invoice
moneybird_get_sales_invoice
Get sales invoice
moneybird_list_administrations
List administrations
moneybird_list_document_styles
List document styles
moneybird_list_general_documents
List general documents
moneybird_list_products
List products
moneybird_list_sales_invoice_versions
List sales invoice versions
moneybird_list_tax_rates
List tax rates
moneybird_send_estimate
Send estimate
moneybird_update_contact
Update contact
moneybird_update_external_sales_invoice
Update external sales invoice
moneybird_update_project
Update project
moneybird_update_recurring_sales_invoice
Update recurring sales invoice

For more tools, view docs.

Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// Moneybird tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["moneybird"], toolNames: [
    "moneybird_get_debtors_report",
    "moneybird_list_sales_invoices",
    "moneybird_send_sales_invoice"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "List customers with open receivables and send their overdue invoices again" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["moneybird"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "List customers with open receivables and send their overdue invoices again" }],
  tools,
});

// Execute the tool call with the user's vaulted Moneybird OAuth token
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["moneybird"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "List customers with open receivables and send their overdue invoices again" }],
  tools,
});

// Tool call runs with the user's vaulted Moneybird OAuth token
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["moneybird"] }, pageSize: 100,
});

const agent = new Agent({
  name: "bookkeeping_agent",
  model: "gemini-2.5-pro",
  instruction: "Moneybird tools scoped to this user",
  tools,
});

await agent.run("List customers with open receivables and send their overdue invoices again");
Try these prompts
Copy any prompt into your agent. Each maps directly to a Moneybird tool. Click to copy, paste into your agent, done.
Invoicing
Copy the prompt
Copied
Create a draft sales invoice for Van Dijk Bouw for 8 hours of advice at €110.
Copy the prompt
Copied
Send invoice 2026-0142 to the customer by email.
Copy the prompt
Copied
Turn the accepted estimate for De Vries into an invoice.
Bookkeeping
Copy the prompt
Copied
List this month's bank mutations that are not processed yet.
Copy the prompt
Copied
Link this bank line to invoice 2026-0138.
Copy the prompt
Copied
Create a receipt for €42.50 of office supplies.
Reports
Copy the prompt
Copied
Show the profit and loss report for Q3.
Copy the prompt
Copied
Get the VAT report for last quarter.
Copy the prompt
Copied
How much do we still owe each supplier?
SEE HOW AUTH WORKS
Each user signs in to Moneybird once, and Scalekit stores and refreshes their tokens. Credentials stay vaulted, every call is scope checked, and every action is logged.
1
Authorize
Your user connects
Moneybird
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
Moneybird
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
Moneybird
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
Moneybird
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other accounting and finance connectors.
GTM and RevOps Teams
Revenue forecast commentary
Pulls open pipeline from Salesforce and HubSpot, calculates coverage against quota, flags at-risk stages, posts commentary to Slack, and logs every snapshot to Google Sheets.
GTM and RevOps Teams
CRM AI agent
Reads the Granola transcript after every call, extracts next steps and updates the HubSpot record, drafts the follow-up in Gmail, and confirms in Slack, all on the rep's own delegated OAuth.
Test other agents
See the same per-user auth pattern across other accounting and finance connectors.
GTM
Revenue forecast agent
Score pipeline coverage against quota across Salesforce and HubSpot, post forecast commentary to Slack, log snapshots to Sheets.
GTM
CRM AI agent
Turn each Granola call transcript into a HubSpot record update, a drafted Gmail follow-up, and a Slack recap.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared Moneybird token looks fine in a demo. In production every invoice and bank booking looks like one service account, and you cannot tell which user triggered it. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared token
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Moneybird today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access Moneybird as the user or through a shared service account?
As the user. Each user signs in to Moneybird once, and Scalekit stores and refreshes their tokens. Invoices, bookings, and payments the agent records are attributed to that user in your audit trail, not a shared service account.
Where is the Moneybird OAuth token stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. Refresh is automatic. Revocation is a single dashboard action. Credentials never appear in prompts, logs, or LLM context.
Can I limit what the agent does in Moneybird?
Yes. Filter by tool name in listScopedTools to expose only what you want, for example the report and list tools without moneybird_delete_contact, which deletes a contact permanently, or moneybird_mark_sales_invoice_uncollectible, which writes an invoice off as bad debt. Scalekit also enforces scope checks before every API call.
What happens when a user revokes Moneybird access?
The connection is invalidated on the next tool call. Subsequent requests for that user fail closed with a clear error. Other users in the tenant remain unaffected. The event is logged for audit.
Which Moneybird administration does the agent work in?
moneybird_list_administrations returns the administrations, or bookkeeping accounts, the signed-in user can access. Every other Moneybird tool takes an administration_id, so one connection can work in any administration that user can reach.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""moneybird"": {
""url"": ""https://mcp.scalekit.com/moneybird"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.moneybird]
url = ""https://mcp.scalekit.com/moneybird""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""moneybird"": {
""url"": ""https://mcp.scalekit.com/moneybird"",
""type"": ""http""
}
}
}