Using Snapbooks with AI Assistants
Overview
Snapbooks supports the Model Context Protocol (MCP), which allows AI assistants like Claude, ChatGPT and Grok to help you with your accounting tasks using natural language.
With MCP enabled, you can ask your assistant to:
- Search and analyze journal entries
- Find documents and read what they say
- Look up business partners and customers
- Generate trial balance reports
- Query bank transactions and post them against the invoices they pay
- Check upcoming reporting deadlines
- Search the Snapbooks help documentation
The assistant works with your Snapbooks data securely and only sees what your Snapbooks user has permission to access.
Connecting your assistant
Snapbooks MCP uses OAuth 2.1 with automatic discovery — you only need the server URL. The assistant handles client registration, authorization, and token refresh for you; you sign in to Snapbooks in your browser and approve access. Untick write access on the consent screen to connect read-only.
Server URL:
https://api.snapbooks.com/mcp
Claude
claude.ai, Claude Desktop and Cowork: install Snapbooks from the connector directory or the plugin directory, or add it yourself:
- Go to Settings → Connectors
- Choose Add custom connector
- Enter the server URL above and save
- Click Connect — you’ll be redirected to Snapbooks to log in and authorize access
- Once authorized, Claude can securely access your Snapbooks data
Claude Code (CLI): install the Snapbooks plugin, which adds the server and skills for bookkeeping, month-end checks and supplier invoice review:
/plugin marketplace add snapbooks-app/snapbooks-ai-plugin
/plugin install snapbooks@snapbooks
Or add only the server:
claude mcp add --transport http snapbooks https://api.snapbooks.com/mcp
Then authenticate with /mcp inside the session.
ChatGPT
Install Snapbooks from the plugin directory in ChatGPT, then connect it and sign in to Snapbooks when asked.
Until the listing is live, or to add the server yourself (your workspace must allow custom MCP servers): open Plugins, select + → Add custom MCP server, enter the server URL above with OAuth authentication, confirm the risk warning and choose Create as a plugin.
Grok
- Open grok.com/connectors (on mobile: Settings → Connectors)
- Choose New Connector → Custom
- Enter the server URL above
- Sign in to Snapbooks and authorize access when asked
In Grok Business, an admin first adds the connector in the xAI console (+ Add Connector → Other, with the server URL); each member then connects their own Snapbooks user.
Grok Build reads the same plugin as Claude Code.
Other MCP clients:
Any MCP client that supports the streamable HTTP transport and OAuth 2.1 can connect. The client discovers everything it needs from the standard metadata endpoints — see OAuth Discovery:
/.well-known/oauth-authorization-server— authorization, token, and registration endpoints/.well-known/oauth-protected-resource— protected resource metadata for the MCP endpoint
Tokens are audience-bound to the MCP endpoint (RFC 8707), so a token issued for another resource will be rejected.
Revoking access:
You can revoke an assistant’s access anytime by deleting its client under API access in your profile menu in the Snapbooks web app.
Available Tools
When connected, the assistant sees who you are and which client accounts you can access, and gets these tools:
Read-only tools
| Tool | Description |
|---|---|
get_user_context |
Your user identity and the client accounts you can access |
search_journal_entries |
Find journal entries by date range, account code, document, payment, kind of entry, amount or free text |
search_business_partners |
Find customers and suppliers by name, organization number, or country |
search_bank_transactions |
Find bank transactions by bank account, date, amount, category, or free text |
get_gl_accounts |
Look up the chart of accounts, filtered by code range or search term |
get_tax_codes |
List VAT/tax codes with rates and associated accounts |
get_trial_balance_report |
Trial balance for a period, per account: opening balance, movements, closing balance |
get_period_lock |
The date up to which the books are locked, and why |
get_accounting_rules |
A company’s accounting rules, the standing instructions the automation follows when a document arrives: its own and those of its accounting firm that cover it, and for a firm the rules it has for its clients |
get_calendar_events |
Upcoming reporting deadlines (VAT returns and other events) |
get_tax_claims_and_payments |
Open claims at Skatteetaten (VAT, tax withholding, employer contribution, taxes, fees) with each instalment’s due date, KID and account number, credits and unplaced payments, and optionally the payments and payouts in a period. Read live; needs early access and Altinn access to Krav og betalinger |
search_documents |
Find documents (supplier invoices, receipts, sales invoices, payslips, …) by direction, keyword or meaning, likeness to another document, partner, type and date; unpaid_only / overdue_only give the open payables and receivables, including what is owed to someone who paid privately (paid_privately_by) |
read_document |
One document’s extracted details, item lines, payment lines and requests, reconciliation lines, journal entry, open questions and full text (chunked) |
search_payment_requests |
Payment requests to the bank by status, document, partner or payment date, with what each pays and any rejection reason |
search_items |
The company’s items (products and services) with unit, VAT code and price |
get_open_questions |
The accountant’s open questions, each linked to a voucher or bank transaction |
search_employees |
Employees with an employment contract: whether the national identity number is registered, e-mail, bank account, contract terms and the tax card for a year, each null when missing |
search_payroll_runs |
Payroll runs by period and draft/posted state, with employee count and totals |
read_payroll_run |
One payroll run’s lines per employee and wage code, payment lines and journal entry |
get_payroll_item_types |
The wage codes (payroll item types): category, unit, whether the engine calculates them |
search_documentation |
Semantic search across the Snapbooks help documentation |
read_documentation |
Read a help document, or list the available documents |
Search results for journal entries, documents, bank transactions, payroll runs and accounting rules, and open questions about a document or bank transaction, include a link of the form snapbooks://<record-type>/<id> that Snapbooks clients resolve to the record; other consumers can treat it as an opaque reference.
National identity numbers are never returned over MCP. The business partner field ssn (fødselsnummer or D-number) is left out of every tool’s input schema and replaced in every result: search_employees only says whether one is registered. Enter or check national identity numbers in the Snapbooks app.
No tool moves money. Payments to the bank (payment requests) are made in the Snapbooks app or the online bank; search_payment_requests shows them, and create_posted_payment records a payment that has already gone through the bank.
Action tools
| Tool | Description |
|---|---|
create_journal_entry |
Prepare a journal entry with balanced debit/credit lines |
cancel_journal_entry |
Prepare a reversing entry to cancel an existing journal entry |
set_period_lock |
Prepare a move of the period lock: to a later date that has passed, to lock more days, or to an earlier date, to reopen them; on approval the lock is moved |
save_accounting_rule |
Prepare an accounting rule, or a new version of one: which documents it applies to and what Snapbot does with them, for one company or for an accounting firm’s clients (optionally in an industry). The preview shows its verdict on the closest documents of the last year and the other rules that match them; on approval it is saved and runs on documents as they arrive. Early access |
create_business_partner |
Prepare a new customer or supplier |
patch_business_partner |
Prepare changes to an existing business partner |
create_item |
Prepare a new item (product or service) for invoicing |
create_invoice |
Prepare a sales invoice, optionally with attached files and a comment; on approval it is numbered, booked and sent |
create_credit_note |
Prepare a credit note for a sales invoice, in full or in part (never more than the invoice’s total, counting earlier credit notes), for an invoice issued outside Snapbooks, or for a credit not tied to one invoice; on approval it is numbered, booked and sent |
create_posted_payment |
Prepare the posting of a bank transaction against the open documents it settles and/or accounts; on approval the payment and its journal entry are booked and the transaction is reconciled |
reconcile_line |
Prepare the reconciliation of a statement or annual report line (from read_document) with the books: a balance against account balances or sub-balances by dimension, a movement against its postings, with reconciling items for an explained difference |
upload_document |
Prepare the upload of a file as a document, so it enters the document workflow: a file attached in ChatGPT or a Snapbot chat, a public link, or the file’s bytes (base64, or sent to a one-time upload URL) |
create_employment_contract |
Prepare an employment contract for an employee (business partner); on approval the employee’s tax card is fetched |
patch_employment_contract |
Prepare changes to a contract; deactivating one submits an a-melding with the end date on approval |
create_bank_account |
Prepare a bank account for a business partner, such as the account an employee’s salary is paid to |
create_house_bank_account |
Prepare one of the company’s own bank accounts, such as its current or withholding tax account |
create_asset |
Prepare an asset for the asset register; its cost is booked with the asset’s dimension |
create_incoming_balance |
Prepare the opening balance from a previous system: the document, its journal entry and the start date |
fetch_tax_cards |
Prepare a fetch of employees’ tax cards from Skatteetaten for an income year; it runs in the background on approval |
create_payroll_run |
Prepare a payroll run for a period: every payroll-default employee with salary, tax, employer tax, vacation pay and pension calculated |
add_payroll_line |
Prepare a wage line (bonus, hours, deduction) on a draft payroll run; the run is recalculated |
patch_payroll_line |
Prepare a change to a wage line on a draft payroll run |
delete_payroll_line |
Prepare the removal of a wage line from a draft payroll run |
post_payroll_run |
Prepare the posting of a payroll run; on approval the journal entry is booked, payslips are e-mailed and the a-melding for the period is submitted |
send_email |
Draft an email to be sent on your behalf |
contact_snapbooks_support |
Draft feedback, a bug report or a question for the Snapbooks developers; they reply to you by email |
Every tool declares the MCP risk hints readOnlyHint, destructiveHint and openWorldHint, which assistants such as ChatGPT use to decide which calls to approve on their own:
- Destructive and open world:
create_invoice,create_credit_note,send_email,post_payroll_runandpatch_employment_contractsend something outside Snapbooks that cannot be taken back (an invoice or credit note, an email, payslips and an a-melding). - Open world:
fetch_tax_cardsasks Skatteetaten for data without changing anything there. - Destructive:
patch_business_partner,patch_payroll_lineanddelete_payroll_lineoverwrite or remove existing data,set_period_lockcan reopen periods that may already be reported,create_posted_paymentmarks the invoices it settles as paid, andcancel_journal_entryreverses a booked entry and removes its reconciliations. - Neither: the other action tools add records or change their status inside Snapbooks.
contact_snapbooks_supportsends your message, and any document you attach, to the Snapbooks developers.
Action tools require the write scope. A client that requests no scope asks for read write, and the user can untick write access on the consent screen. A token granted only read doesn’t list the action tools; to grant write later, disconnect and reconnect the client. Calling an action tool anyway returns HTTP 403 with WWW-Authenticate: Bearer error="insufficient_scope", …, scope="read write". See Authentication for the scope model.
Action tools run in preview mode. They validate the request and return exactly what would be created or changed, but they do not commit anything to your books or send anything on your behalf. Nothing is saved or sent until you press the button on an approval card or accept the change in the assistant’s own approval dialog (both below). In an assistant with neither, use them to have the assistant prepare and validate work — the numbers, accounts, and VAT codes — and then record the result yourself in the Snapbooks app.
Exception: approval cards. In assistants that render MCP Apps (Claude, Claude Desktop, ChatGPT and Grok), every action tool also shows what it prepared as a card in the conversation, and pressing Approve on the card carries out exactly what it shows. Before it does, the card runs the preview again and refuses if the result has changed since the card was made, for example because an open amount was paid in the meantime.
Every action tool shares one card that lays out the change the way the Snapbooks chat does: the invoice or credit note lines and totals, the journal entry lines, the payroll run per employee, the email and its recipients. A card whose approval sends something outside Snapbooks says what goes where, for example that the invoice is sent by EHF to an organization number, or that posting a payroll run submits the a-melding. For example:
create_posted_paymentshows the bank transaction, what it settles and the journal entry, and books the payment, the entry and the reconciliation. Once one card for a transaction is booked, any other card for it is refused.set_period_lockshows the new lock and the one it replaces. A card that moves the lock back says so and warns that reports already filed for the reopened days may need correcting. It refuses if the lock has moved since the card was made, for example because another card was approved first.save_accounting_ruleshows the rule as the app’s rule card reads it (who it is for, when it runs, what it applies to, what Snapbot should do), what a new version changes, its verdict on the closest documents, that it makes drafts until it is switched to automatic posting in the rule list, and each other rule that matches the same documents with whether it gives way, wins or runs together with this one. It refuses if another rule has been saved since the card was made that changes that picture.
Each card can be approved once and expires after 30 minutes. A card shown again later, after you reopen the conversation, says whether it was approved.
Approval dialog. An assistant without MCP Apps that can ask you during a tool call (MCP elicitation in form mode, on protocol version 2026-07-28), such as Claude Code, shows the same summary as the card in its own confirmation dialog, in the language its requests name or else the company’s accounting language. Accepting carries out exactly what it shows, with the same checks as the card; declining or closing the dialog saves nothing. The tool call waits for your answer and then returns what happened.
Assistants with neither keep the preview-only behaviour, and each action result tells the assistant that nothing was saved.
Uploading files. An assistant can give upload_document a file in several ways, depending on what it can do:
- ChatGPT passes a file you attached in the conversation (the tool declares
openai/fileParams). - A public link: Snapbooks downloads the file itself, from public addresses only.
- Base64: the file’s bytes in the call, for small files.
- An upload URL: with
request_upload_url, the tool answers a one-time URL that the assistantPUTs the file to from its code sandbox (for examplecurl -T receipt.pdf <upload_url>), and then callsupload_documentagain with thefile_idthat answers. The URL works once, for 15 minutes, for your user and that company only. Getting one changes nothing in your books, so it shows no card. In Claude, a conversation that has run code calls Snapbooks from its sandbox, where cards can’t show: ask for the upload by itsfile_idin a new conversation to get the card.
Files can be up to 10 MB. The upload card shows the file’s name, size and where it came from. A file fetched from a link is fetched again on approval and refused if it changed.
The card carries out its change through two tools that the assistant only lists for the card, never for the model itself: approve_proposal and get_proposal. Keeping them from the model is up to the assistant, as Claude does; any client you connect with the write scope can approve a card.
Usage Examples
Once connected, you can interact with Snapbooks through Claude using natural language:
Example 1: Search Journal Entries
You: Show me all journal entries from January 2025 for my company
Claude: I'll search for those journal entries. I found 15 entries from January 2025.
Here are the highlights:
- 5 sales transactions totaling 125,000 NOK
- 3 expense entries for office supplies
- 7 bank reconciliation entries
Would you like me to show you the details of any specific entry?
Example 2: Prepare a Journal Entry
You: Prepare a journal entry for a 1,000 NOK customer payment to the bank
Claude: Here's the validated entry:
- Debit Bank (1920): 1,000.00 NOK
- Credit Sales (3000): 1,000.00 NOK
- Description: Customer payment
The entry balances and the accounts exist in your chart of accounts.
Record it in the Snapbooks app to post it to your books.
Example 3: Check Deadlines
You: What reporting deadlines do I have coming up this quarter?
Claude: You have two deadlines in this period:
- VAT return (3rd period) due 31 August, covering May–June
- VAT return (4th period) due 10 October, covering July–August
Security & Privacy
- The assistant can only access client accounts that your Snapbooks user has access to
- All operations respect your account’s access controls
- National identity numbers are never sent to the assistant
- Snapbooks does not receive your conversation, only the tool calls the assistant makes; see the privacy notice for AI assistant connectors
- Action tools run in preview mode — nothing is committed to your books over MCP unless you press Approve on an approval card
- Tokens are audience-bound to the MCP endpoint and refreshed automatically
- You can revoke access anytime under API access in the Snapbooks web app
Troubleshooting
Authorization Issues
Problem: The connect/authorize flow doesn’t start or fails
Solutions:
- Check that you entered exactly
https://api.snapbooks.com/mcp(HTTPS, no trailing path) - Try removing the connector and adding it again to trigger a fresh registration
- Make sure you complete the Snapbooks login in the browser window that opens
Problem: “Token audience validation failed” error
Solutions:
- This means the token wasn’t issued for the MCP endpoint
- Disconnect and reconnect the connector to trigger a new OAuth flow with the correct
resourceparameter
Connection Issues
Problem: Claude shows “Connection failed” or the tools don’t appear
Solutions:
- Make sure you’ve completed the authorization flow (the connector shows as connected)
- In Claude Desktop, restart the app completely after connecting
- Check the connector is enabled for the current conversation (tools can be toggled per chat)
Authentication Errors
Problem: Getting “Unauthorized” or 401 errors after it previously worked
Solutions:
- Tokens are refreshed automatically, but a revoked or expired grant requires re-authorizing — disconnect and reconnect the connector
- Check that your Snapbooks user still has access to the client accounts you’re querying
Server Errors
Problem: A call answers “An unexpected error occurred. Request id: …”, or a tool answers with a similarly generic error.
Solutions:
- The failure is on our side, not in your call. The message is deliberately generic: the underlying exception text can carry database statements, hostnames and server paths, so it is only written to our logs.
- Send the request id to support and we can find the exact traceback. It is in
the message and in the
X-Request-Idresponse header. - A message that names something concrete (a client account you cannot reach, a field that failed validation, an argument the tool does not take) is a problem with the call itself and is safe to act on.
Need More Help?
If you’re still having issues:
- Contact your Snapbooks administrator
- Reach out to Snapbooks support at hei@snapbooks.no
Learn More
- Authentication - OAuth2 flows and the scope model
- OAuth Discovery - The metadata endpoints MCP clients use to configure themselves
- Download Claude Desktop - Get the Claude Desktop app
- Model Context Protocol - Learn about the MCP standard