SolariumSolariumDocs
Browse The Docs

Docs/Get Started

Use With AI (MCP)

Connect Claude, ChatGPT or any MCP app so it can read and change your books.

Solarium runs a hosted MCP server, so Claude, ChatGPT, Claude Code, Cursor and other MCP clients can work in your books directly. There's no API key to copy: the app signs you in to Solarium, you pick the business, and you choose whether it may only look or also make changes.

Server address: https://mcp.trysolarium.com/mcp

Connect

  • Claude: Settings, Connectors, Add custom connector, then paste the address.
  • ChatGPT: add a custom connector (developer mode) with the address.
  • Claude Code: claude mcp add --transport http solarium https://mcp.trysolarium.com/mcp
  • Anything else: any MCP client that supports remote servers with OAuth sign-in.

See Solarium in Claude and ChatGPT for the walkthrough.

How Changes Work

Tools that change your books take an apply argument. Without it, or with apply: false, the tool previews what it would do and keeps nothing. Your AI app should show you the preview and only call it again with apply: true once you agree. Every applied change is logged in Settings, under MCP Access. A connection only ever sees the one business you picked.

Tools That Only Read

ToolWhat it does
audit_qbo_totalsList synced transactions whose QuickBooks total or sales tax differs from the books, between two dates (default the last 90 days), largest first, with the difference per payment account (a card or bank). Also lists any that are gone from QuickBooks. Read only.
compare_with_qboCompare Solarium's books with QuickBooks', account by account, on a date (default today): QuickBooks' trial balance next to Solarium's, with the difference. Amounts are debit minus credit; P&L accounts are the fiscal year to date. Lists QuickBooks accounts Solarium doesn't have. Read only.
find_qbo_matchesFind the QuickBooks transactions something probably already is: same amount within 3 days, or a bill / vendor credit with the same invoice number or vendor within 45 days, with their attachments and whether Solarium has them. Pass a receipt_id, an event_id, or the raw facts (amount + date, optionally vendor, doc_number, currency) for something not in Solarium yet. Flags likely double bills. Read-only.
get_connectionWho this connection is: the organization's name and id, who connected it, what it may do (look only, or look and make changes), and a stable account id for this person in this organization. Read-only.
get_eventOne transaction in full: its lines (staged and booked), receipts (amount, currency, card, line items, in QuickBooks; get_receipt for a receipt's full text and file), FX, duplicate and closed-period flags, notes, and its QuickBooks link and sync state.
get_qbo_accountOne QuickBooks account as QuickBooks has it: name, type, subtype, active, balance and SyncToken, plus the Solarium account mapped to it. Pass qb_id or name. Read-only.
get_qbo_transactionRead one QuickBooks transaction: its total, tax, date, payee, lines (ids, accounts, tax codes, received from) and attachments, plus the Solarium event linked to it. Read-only.
get_receiptOne receipt or invoice in full: its text as read, line items (freight, fees and tax lines included), invoice number, card, payment method, totals, the transaction it's on and whether it's in QuickBooks, plus a link to the file (valid for an hour). Use it to check a document against a bill or a charge, line by line.
list_categoriesThe chart of accounts: each account's id, name, type, tax code, card number and QuickBooks mapping. Filter by account_type; inactive accounts only with include_inactive.
list_contactsCustomers and vendors: id, name, type, email, phone and balance. Filter by contact_type (customer or vendor) or name (contains). Use a contact's id with book_invoice, record_customer_payment or report_account_lines.
list_eventsFind transactions, newest first. Filter by status, category_id, payment_account_id, payment_account_type (credit_card, bank…), vendor (contains), date_from / date_to, amount_min / amount_max (home currency), and has_document (whether a receipt is attached). Ignored transactions are left out unless status=ignored or include_ignored. Page with limit and offset.
list_op_runsThe history of operations applied to these books: who ran what, when, from where (chat, API, command), what it changed (including QuickBooks writes and whether they checked out), or why it was refused. Newest first.
list_receiptsReceipts and invoices sent in (by email, text, upload or Drive). By default only those not on any transaction yet and not dismissed: the ones to attach, book (promote_receipts) or dismiss. unmatched=false lists all. Filter by vendor (contains) and date_from / date_to. Newest first.
reconcile_card_statementHold a card or bank statement up against the books (read-only). Pass the statement as rows (date, description, amount, is_debit, optional foreign_amount + foreign_currency; without is_debit a negative amount is a credit) or an uploaded PDF (s3_key). Returns matches, FX corrections (with the set_event_fx to run), lines missing from the books, transactions not on the statement, possible doubles, and foreign-transaction fees.
report_account_linesThe booked lines behind a report number: every line posted to these accounts in the range, with the transaction (event_id) each came from. Narrow to one vendor (a report_spending_by_vendor key) or one contact (a contact id, or 'none'). Capped at 500 lines (truncated says so).
report_balance_sheetBalance sheet as of a date: assets, liabilities and equity by account (net income to date included), optionally side by side with compare_as_of. out_of_balance is zero unless something posted unbalanced.
report_open_balancesOpen balances, aged (current, 31-60, 61-90, over 90 days): side=receivable lists customers who owe you, side=payable lists vendors you owe. Each row's key is the contact id for report_account_lines.
report_profit_and_lossProfit and loss for a date range: income, cost of sales, expenses and other items by account, with gross profit and net income, one column per month or quarter. Amounts are in the org's home currency. Only booked (confirmed or synced) transactions count. Use report_account_lines to see what's behind a number.
report_qbo_account_linesOne QuickBooks account's register between two dates (default the last 30 days): each line's date, type, QuickBooks id, name, memo and amount, and the Solarium event it is (or none, if the books don't have it). Use it next to report_account_lines to find where a bank, card or loan differs. Read only.
report_sales_taxThe sales tax report for a period, in the form the org's country files: in Canada the GST/HST return (collected, input tax credits, net owing or refund, filing deadline) plus any PST/QST return; in the US sales tax collected by state; elsewhere tax collected and claimed back by tax. Only booked transactions count, and cards not booked yet are reported as a warning.
report_spending_by_vendorSpending by vendor for a date range, one column per month or quarter, largest first. Each vendor's key and the account_ids go to report_account_lines (as vendor and account_ids) to list its transactions.
send_feedbackTell the Solarium team when you can't do what the user asked with these tools, or something looks wrong: a tool you needed that doesn't exist, a missing field or option, a result that didn't match the books or QuickBooks, an error, or a description that misled you. Say what you were trying to do and what would have helped. It doesn't change the books. Don't include card numbers, passwords or other secrets.
unmapped_card_numbersList card numbers read off receipts that belong to no payment account (read-only).

Tools That Change Your Books

ToolWhat it does
attach_receipt_to_eventAttach an existing unmatched receipt to an already-booked event (moves it — no duplicate receipt row). If the event is in QuickBooks, the document is pushed as an attachable after commit.
book_deductionBook a retailer/distributor deduction: DR expense line(s) / CR the clearing account. From an existing pre-confirm event, an unmatched receipt (promoted first), or new (merchant + txn_date).
book_invoiceBook a customer invoice: DR A/R (gross, that customer) / CR revenue (net) / CR sales tax.
book_processor_incomeBook income received through a payment processor (e.g. PayPal) with its fee split out: CR revenue (gross) / DR fees / DR processor (net). Foreign currency uses the processor's own converted amounts.
book_receiptBook a receipt in one call: make it a transaction, set its category and card (defaults to the card read off the receipt), tax (tax_amount, or tax_included to work it out at your rate), and a note. It stays in review unless confirm is true, which also runs confirm_event's QuickBooks checks.
book_reclassReclassify an amount: DR to_account / CR from_account, posted as a journal entry.
book_remittanceBook a retailer/distributor remittance: DR bank (net) + DR discount line(s) / CR the clearing account (gross). Rolled-in coupon events are ignored with a note so they aren't booked twice.
book_vendor_creditBook a vendor's credit memo (damaged goods, short shipment, price fix) against what the business owes them: DR Accounts Payable / CR the category (net) / CR the input tax credit. In QuickBooks it becomes a VendorCredit for that vendor, which is applied when the bill is paid. Give the QuickBooks bill_id it credits (its vendor, A/P account and category are used), or a vendor and category. Pass the positive amount from the memo and its tax. Refuses if QuickBooks already has a credit for that vendor and amount.
categorize_eventSet a review item's category and payment account (tax kept unless tax_amount is given), or make it a transfer between two accounts (from_account_id / to_account_id).
confirm_eventBook a review item and send it to QuickBooks. Refuses when an account isn't in QuickBooks, or when QuickBooks already has the same transaction (same amount within 3 days, or a bill with the same invoice number or vendor within 45) — set allow_qbo_match only after checking it's really different.
confirm_high_confidenceConfirm NEEDS_REVIEW events that pass every high-confidence check (including a QuickBooks duplicate check).
create_categoryCreate a category (account) from its tax code — its type follows the code — and add it to QuickBooks with the right subtype, or link the QuickBooks account that already has that name. Pass account_type instead of tax_code only where your country has no tax codes.
create_transactionAdd a transaction by hand (a cash expense, a missing card charge, a transfer). It goes to review, not the books: confirm it with confirm_event. With category_id and payment_account_id the lines are staged (for a transfer, payment_account_id is from and category_id is to); tax_amount adds a tax line. Warns about a likely duplicate already in Solarium.
daily_receiptsRun the daily receipts routine: classify every unmatched receipt (attach / promote / dismiss / review), apply attach + promote, and report the rest. With auto_confirm=true, high-confidence promotions are also confirmed (booked, and sent to QuickBooks when connected); off by default.
deactivate_categoryHide a category you no longer use, in Solarium and QuickBooks. Refuses while it has a balance, unbooked transactions use it (category, card or any split line), it has active sub-accounts, or vendor rules file into it.
dismiss_receiptsDismiss unmatched receipts that aren't receipts (logos, signatures, duplicates).
edit_eventChange a review item's date, memo, title or type.
import_qbo_transactionBring one QuickBooks transaction that's missing from the books into Solarium (for example a journal entry the import skipped), through the same path as the nightly sync: synced when every account maps, else in review, and linked to an existing event that's the same transaction. Refuses one already in the books.
import_stripe_balanceImport a Stripe account's activity from Stripe's export: charges as revenue, Stripe's processing fees (their sales tax as an input tax credit), refunds, Connect transfers, and payouts to the bank. Accepts the Balance summary report's itemized CSVs (Reports > Balance: 'Balance change from activity' and 'Payouts', each Export > CSV > Itemized) or the older balance history export. Nothing booked twice: anything already in the books is skipped, a payout already on the bank feed is linked. Ends by tying the Stripe account to the export; if it doesn't tie, nothing is written. Preview first, then apply.
link_to_qbo_entityLink a needs review event to the QuickBooks transaction that already records it (booked directly in QuickBooks, never imported), then rebuild its entry from QuickBooks and attach its receipts there.
merge_eventsFold a duplicate (donor_id) into the one to keep (keep_id): receipts, evidence and bank links move over and the duplicate is archived. If the duplicate is already in QuickBooks, it's removed there first.
promote_receiptsPromote unmatched receipts to NEEDS_REVIEW events with full enrichment (vendor, rules, dedup, tax).
push_receipts_to_qboAttach an event's receipts to its QuickBooks transaction (skips ones already there).
push_to_qboSend a confirmed transaction that never reached QuickBooks. QuickBooks is checked first for the same amount around that date (it may have been entered there by hand); a match refuses unless check_qbo is false. Refuses anything already in QuickBooks or kept in Solarium only. Reads the result back.
qbo_remove_attachmentRemove one attachment (like a duplicate PDF) from a QuickBooks transaction. The transaction itself isn't changed. Refuses to remove the last attachment unless allow_last is set. When a Solarium receipt is that file, pass points_to: the attachment still on the transaction that holds the same document.
qbo_set_purchase_taxRepair a synced purchase whose QuickBooks total doesn't match the books because the sales tax was dropped or rounded differently: put its expense lines on the given QuickBooks tax code so QuickBooks' total and tax equal the books exactly (where QuickBooks' rounding can't land on the books' tax, a cent or two moves to an untaxed line). Every line is echoed by id, and it's read back. Use get_qbo_transaction first to see the lines and tax codes.
recategorize_eventRebook a confirmed event's type and DR/CR lines in place (rebuilds its JE + tax), e.g. income that was really a customer payment. Refused for events already in QuickBooks (void + rebook there instead).
recategorize_eventsMove many booked transactions to another category at once, in Solarium and QuickBooks. Pick them by event_ids, or by from_category_id (optionally narrowed by vendor and date_from / date_to). The preview lists which would move and which would be refused (e.g. changed in QuickBooks since the last sync).
record_customer_paymentRecord a customer paying an invoice: DR bank / CR A/R (that customer). Never touches revenue. Optionally rebooks the bank-feed deposit event for the payment.
reject_eventSet a review item aside (it won't be booked), recording why. Booked items can't be rejected.
replace_with_qbo_twinReplace a needs review event with the copy QuickBooks already has: its receipts move to the imported event, the review event is archived, and the document is pushed to QuickBooks. Finds the twin when not given. Amounts must match unless accept_difference is true: then QuickBooks' amount is kept and the gap is reported. Check the document first (get_receipt) to see which amount is right.
restate_event_fxRecord that a booked (or synced) charge was really in another currency — e.g. 455.50 USD for the 648.27 CAD the card charged — keeping the home-currency amount booked. Nothing in the ledger or QuickBooks changes; only the foreign amount, currency and the card's actual rate are recorded. To change the booked amount too, use the edit drawer.
resync_event_from_qbRebuild events from their QuickBooks copy when Solarium has drifted (QuickBooks is only read). Checks the entry balances and moves the bank or card by the QuickBooks total.
set_card_last_fourRecord a card number on a card or bank account, then file receipts waiting on that number and fill the payment account on their needs review events.
set_event_fxSay a review item was in another currency: original_currency (e.g. USD), optionally original_amount (the foreign amount, if it differs) and charged_amount (what your card or bank charged in your home currency, which keeps their rate including fees). Without charged_amount the Bank of Canada rate is used.
update_categoryRename a category, and/or set its QuickBooks subtype from its tax code (fix_subtype), in Solarium and QuickBooks together — so the nightly sync doesn't change it back.

Every Tool In Detail

attach_receipt_to_event

Attach an existing unmatched receipt to an already-booked event (moves it — no duplicate receipt row). If the event is in QuickBooks, the document is pushed as an attachable after commit. *Changes your books (previews unless apply is true), reaches QuickBooks.*

ArgumentTypeRequiredDescription
receipt_idstringYes
event_idstringYes

audit_qbo_totals

List synced transactions whose QuickBooks total or sales tax differs from the books, between two dates (default the last 90 days), largest first, with the difference per payment account (a card or bank). Also lists any that are gone from QuickBooks. Read only. *Read-only.*

ArgumentTypeRequiredDescription
sincestringNo
untilstringNo
limitintegerNoHow many to list. Default 100.

book_deduction

Book a retailer/distributor deduction: DR expense line(s) / CR the clearing account. From an existing pre-confirm event, an unmatched receipt (promoted first), or new (merchant + txn_date). *Changes your books (previews unless apply is true), reaches QuickBooks.*

ArgumentTypeRequiredDescription
clearing_account_idstringYes
expense_linesarrayYes
source_event_idstringNo
source_receipt_idstringNo
merchantstringNo
txn_datestringNo
notesstringNo
check_qbobooleanNo
dedup_keystringNo
pushbooleanNo

book_invoice

Book a customer invoice: DR A/R (gross, that customer) / CR revenue (net) / CR sales tax. *Changes your books (previews unless apply is true).*

ArgumentTypeRequiredDescription
ar_account_idstringYes
revenue_account_idstringYes
contact_idstringYes
netstringYes
tax_linesarrayNo
txn_datestringYes
referencestringYesInvoice number / memo (also the dedup key)

book_processor_income

Book income received through a payment processor (e.g. PayPal) with its fee split out: CR revenue (gross) / DR fees / DR processor (net). Foreign currency uses the processor's own converted amounts. *Changes your books (previews unless apply is true), reaches QuickBooks.*

ArgumentTypeRequiredDescription
revenue_account_idstringYes
fee_account_idstringYes
processor_account_idstringYes
grossstringYesGross in the org's functional currency
feestringYesFee in the org's functional currency
txn_datestringYes
payerstringYes
processor_txn_idstringYesThe processor's transaction id (dedup key)
original_currencystringNo
original_grossstringNo
check_qbobooleanNo
pushbooleanNo

book_receipt

Book a receipt in one call: make it a transaction, set its category and card (defaults to the card read off the receipt), tax (tax_amount, or tax_included to work it out at your rate), and a note. It stays in review unless confirm is true, which also runs confirm_event's QuickBooks checks. *Changes your books (previews unless apply is true), reaches QuickBooks.*

ArgumentTypeRequiredDescription
receipt_idstringYes
category_idstringYes
payment_account_idstringNo
tax_amountstringNo
tax_includedbooleanNoThe total includes sales tax at the standard rate
tax_codestringNo
notestringNo
confirmbooleanNo

book_reclass

Reclassify an amount: DR to_account / CR from_account, posted as a journal entry. *Changes your books (previews unless apply is true), reaches QuickBooks.*

ArgumentTypeRequiredDescription
from_account_idstringYesAccount credited (amount moves out)
to_account_idstringYesAccount debited (amount moves in)
amountstringYes
txn_datestringYes
memostringYes
dedup_keystringNo
pushbooleanNo

book_remittance

Book a retailer/distributor remittance: DR bank (net) + DR discount line(s) / CR the clearing account (gross). Rolled-in coupon events are ignored with a note so they aren't booked twice. *Changes your books (previews unless apply is true), reaches QuickBooks.*

ArgumentTypeRequiredDescription
bank_account_idstringYes
clearing_account_idstringYes
grossstringYes
discount_linesarrayNo
txn_datestringYes
memostringYes
source_event_idstringNoThe bank-feed deposit event for the net (optional)
rolled_in_event_idsarrayNo
check_qbobooleanNo
dedup_keystringNo
pushbooleanNo

book_vendor_credit

Book a vendor's credit memo (damaged goods, short shipment, price fix) against what the business owes them: DR Accounts Payable / CR the category (net) / CR the input tax credit. In QuickBooks it becomes a VendorCredit for that vendor, which is applied when the bill is paid. Give the QuickBooks bill_id it credits (its vendor, A/P account and category are used), or a vendor and category. Pass the positive amount from the memo and its tax. Refuses if QuickBooks already has a credit for that vendor and amount. *Changes your books (previews unless apply is true), reaches QuickBooks.*

ArgumentTypeRequiredDescription
amountstringYesThe credit's total including tax, positive (69.18).
referencestringYesThe vendor's credit memo number (9967152).
bill_idstringNoQuickBooks Bill Id it credits (find_qbo_matches or get_qbo_transaction).
vendorstringNoQuickBooks vendor name, when there's no bill_id.
category_account_idstringNoDefaults to the bill's category.
tax_amountstringNoTax on the credit (0 for zero-rated goods).
sales_tax_codestringNohst, gst, pst or qst (when taxed).
txn_datestringYesThe credit memo's date.
descriptionstringNoWhat it's for, like damaged sugar.
receipt_idstringNoThe credit memo's receipt, attached to it.
check_qbobooleanNoRefuse if QuickBooks has it already. Default true.

categorize_event

Set a review item's category and payment account (tax kept unless tax_amount is given), or make it a transfer between two accounts (from_account_id / to_account_id). *Changes your books (previews unless apply is true).*

ArgumentTypeRequiredDescription
event_idstringYes
category_idstringNo
payment_account_idstringNo
tax_amountstringNoTotal tax on it; '0' removes tax
tax_codestringNoe.g. hst, gst (from list_categories / the tax line)
from_account_idstringNo
to_account_idstringNo

compare_with_qbo

Compare Solarium's books with QuickBooks', account by account, on a date (default today): QuickBooks' trial balance next to Solarium's, with the difference. Amounts are debit minus credit; P&L accounts are the fiscal year to date. Lists QuickBooks accounts Solarium doesn't have. Read only. *Read-only.*

ArgumentTypeRequiredDescription
as_ofstringNo
only_differencesbooleanNoDefault true.

confirm_event

Book a review item and send it to QuickBooks. Refuses when an account isn't in QuickBooks, or when QuickBooks already has the same transaction (same amount within 3 days, or a bill with the same invoice number or vendor within 45) — set allow_qbo_match only after checking it's really different. *Changes your books (previews unless apply is true), reaches QuickBooks.*

ArgumentTypeRequiredDescription
event_idstringYes
allow_qbo_matchbooleanNo

confirm_high_confidence

Confirm NEEDS_REVIEW events that pass every high-confidence check (including a QuickBooks duplicate check). *Changes your books (previews unless apply is true), reaches QuickBooks.*

ArgumentTypeRequiredDescription
event_idsarrayNo
since_daysintegerNoOnly events created in the last N days
limitintegerNo

create_category

Create a category (account) from its tax code — its type follows the code — and add it to QuickBooks with the right subtype, or link the QuickBooks account that already has that name. Pass account_type instead of tax_code only where your country has no tax codes. *Changes your books (previews unless apply is true), reaches QuickBooks.*

ArgumentTypeRequiredDescription
namestringYes
tax_codestringNoe.g. 8320 purchases (see list_categories)
account_typestringNo
parent_idstringNo

create_transaction

Add a transaction by hand (a cash expense, a missing card charge, a transfer). It goes to review, not the books: confirm it with confirm_event. With category_id and payment_account_id the lines are staged (for a transfer, payment_account_id is from and category_id is to); tax_amount adds a tax line. Warns about a likely duplicate already in Solarium. *Changes your books (previews unless apply is true).*

ArgumentTypeRequiredDescription
vendorstringYesWho it was paid to or received from.
amountstringYesThe total in home currency, like 42.50.
datestringYes
event_typeexpense, fee, fee_rebate, fraud_dispute, income, loan_proceeds, loan_repayment, owner_contribution, owner_draw, personal_holding, refund, tax_payment, transferNoDefaults to expense.
category_idstringNoThe category account (or the to-account).
payment_account_idstringNoThe bank or card (or the from-account).
tax_amountstringNoSales tax included in amount.
tax_codestringNoThe tax code, like HST ON.

daily_receipts

Run the daily receipts routine: classify every unmatched receipt (attach / promote / dismiss / review), apply attach + promote, and report the rest. With auto_confirm=true, high-confidence promotions are also confirmed (booked, and sent to QuickBooks when connected); off by default. *Changes your books (previews unless apply is true), reaches QuickBooks.*

ArgumentTypeRequiredDescription
since_daysintegerNoReceipts created in the last N days (default 14)
auto_confirmbooleanNoAlso book high-confidence promotions (default false).

deactivate_category

Hide a category you no longer use, in Solarium and QuickBooks. Refuses while it has a balance, unbooked transactions use it (category, card or any split line), it has active sub-accounts, or vendor rules file into it. *Changes your books (previews unless apply is true), reaches QuickBooks.*

ArgumentTypeRequiredDescription
account_idstringYes

dismiss_receipts

Dismiss unmatched receipts that aren't receipts (logos, signatures, duplicates). *Changes your books (previews unless apply is true).*

ArgumentTypeRequiredDescription
receipt_idsarrayYes
reasonstringYes

edit_event

Change a review item's date, memo, title or type. *Changes your books (previews unless apply is true).*

ArgumentTypeRequiredDescription
event_idstringYes
transaction_datestringNoYYYY-MM-DD
memostringNo
titlestringNo
event_typeexpense, fee, fee_rebate, fraud_dispute, income, loan_proceeds, loan_repayment, owner_contribution, owner_draw, personal_holding, refund, tax_payment, transferNo

find_qbo_matches

Find the QuickBooks transactions something probably already is: same amount within 3 days, or a bill / vendor credit with the same invoice number or vendor within 45 days, with their attachments and whether Solarium has them. Pass a receipt_id, an event_id, or the raw facts (amount + date, optionally vendor, doc_number, currency) for something not in Solarium yet. Flags likely double bills. Read-only. *Read-only, reaches QuickBooks.*

ArgumentTypeRequiredDescription
receipt_idstringNo
event_idstringNo
amountstringNoThe total, like 455.50 (with date, instead of an id).
datestringNo
vendorstringNo
doc_numberstringNoThe invoice or bill number.
currencystringNoThree letters, like USD. Defaults to home currency.

get_connection

Who this connection is: the organization's name and id, who connected it, what it may do (look only, or look and make changes), and a stable account id for this person in this organization. Read-only. *Read-only.*

get_event

One transaction in full: its lines (staged and booked), receipts (amount, currency, card, line items, in QuickBooks; get_receipt for a receipt's full text and file), FX, duplicate and closed-period flags, notes, and its QuickBooks link and sync state. *Read-only.*

ArgumentTypeRequiredDescription
event_idstringYes

get_qbo_account

One QuickBooks account as QuickBooks has it: name, type, subtype, active, balance and SyncToken, plus the Solarium account mapped to it. Pass qb_id or name. Read-only. *Read-only, reaches QuickBooks.*

ArgumentTypeRequiredDescription
qb_idstringNo
namestringNo

get_qbo_transaction

Read one QuickBooks transaction: its total, tax, date, payee, lines (ids, accounts, tax codes, received from) and attachments, plus the Solarium event linked to it. Read-only. *Read-only, reaches QuickBooks.*

ArgumentTypeRequiredDescription
entityBill, Purchase, Deposit, JournalEntry, SalesReceipt, VendorCredit, BillPayment, Payment, Invoice, Transfer, CreditCardPaymentTxn, RefundReceipt, CreditMemoYes
qb_idstringYesThe QuickBooks transaction id

get_receipt

One receipt or invoice in full: its text as read, line items (freight, fees and tax lines included), invoice number, card, payment method, totals, the transaction it's on and whether it's in QuickBooks, plus a link to the file (valid for an hour). Use it to check a document against a bill or a charge, line by line. *Read-only.*

ArgumentTypeRequiredDescription
receipt_idstringYes

import_qbo_transaction

Bring one QuickBooks transaction that's missing from the books into Solarium (for example a journal entry the import skipped), through the same path as the nightly sync: synced when every account maps, else in review, and linked to an existing event that's the same transaction. Refuses one already in the books. *Changes your books (previews unless apply is true).*

ArgumentTypeRequiredDescription
entityBill, Purchase, Deposit, JournalEntry, SalesReceipt, VendorCredit, BillPayment, Payment, Invoice, Transfer, CreditCardPaymentTxn, RefundReceipt, CreditMemoYes
qb_idstringYesThe QuickBooks transaction id

import_stripe_balance

Import a Stripe account's activity from Stripe's export: charges as revenue, Stripe's processing fees (their sales tax as an input tax credit), refunds, Connect transfers, and payouts to the bank. Accepts the Balance summary report's itemized CSVs (Reports > Balance: 'Balance change from activity' and 'Payouts', each Export > CSV > Itemized) or the older balance history export. Nothing booked twice: anything already in the books is skipped, a payout already on the bank feed is linked. Ends by tying the Stripe account to the export; if it doesn't tie, nothing is written. Preview first, then apply. *Changes your books (previews unless apply is true).*

ArgumentTypeRequiredDescription
csvstringYesThe export's text (Balance change from activity, or history).
payouts_csvstringNoThe Payouts itemized export, with the Balance summary.
stripe_account_idstringYesThe bank-type account that is Stripe's balance.
bank_account_idstringYesWhere Stripe pays out to.
revenue_account_idstringYesWhere charges go (sales).
fees_account_idstringYesWhere Stripe's fees go.
transfers_account_idstringNoConnect platforms: where transfers to connected accounts go (cost of sales).
allow_window_mismatchbooleanNoBook even if Stripe's total over the export's days doesn't tie (exports that overlap).

link_to_qbo_entity

Link a needs review event to the QuickBooks transaction that already records it (booked directly in QuickBooks, never imported), then rebuild its entry from QuickBooks and attach its receipts there. *Changes your books (previews unless apply is true), reaches QuickBooks.*

ArgumentTypeRequiredDescription
event_idstringYes
entityBill, Purchase, VendorCredit, Deposit, SalesReceiptYes
qb_idstringYes

list_categories

The chart of accounts: each account's id, name, type, tax code, card number and QuickBooks mapping. Filter by account_type; inactive accounts only with include_inactive. *Read-only.*

ArgumentTypeRequiredDescription
account_typestringNo
include_inactivebooleanNo

list_contacts

Customers and vendors: id, name, type, email, phone and balance. Filter by contact_type (customer or vendor) or name (contains). Use a contact's id with book_invoice, record_customer_payment or report_account_lines. *Read-only.*

ArgumentTypeRequiredDescription
contact_typecustomer, vendorNo
namestringNoPart of the name.
include_inactivebooleanNo
limitintegerNoAt most 200 (default 50).
offsetintegerNo

list_events

Find transactions, newest first. Filter by status, category_id, payment_account_id, payment_account_type (credit_card, bank…), vendor (contains), date_from / date_to, amount_min / amount_max (home currency), and has_document (whether a receipt is attached). Ignored transactions are left out unless status=ignored or include_ignored. Page with limit and offset. *Read-only.*

ArgumentTypeRequiredDescription
statusingested, enriched, auto_confirmed, awaiting_confirmation, needs_review, confirmed, syncing, synced, reconciled, pending, ignored, error, disputedNo
category_idstringNoAn account id from list_categories.
payment_account_idstringNoThe bank or card account id.
payment_account_typestringNocredit_card, bank, and so on.
vendorstringNoPart of the vendor name.
date_fromstringNo
date_tostringNo
amount_minstringNoHome-currency amount, like 25.00.
amount_maxstringNoHome-currency amount, like 250.00.
has_documentbooleanNoOnly with (true) or without (false) a receipt.
include_ignoredbooleanNoAlso list ignored transactions.
limitintegerNoAt most 200 (default 50).
offsetintegerNoSkip this many (for the next page).

list_op_runs

The history of operations applied to these books: who ran what, when, from where (chat, API, command), what it changed (including QuickBooks writes and whether they checked out), or why it was refused. Newest first. *Read-only.*

ArgumentTypeRequiredDescription
opstringNo
limitintegerNo

list_receipts

Receipts and invoices sent in (by email, text, upload or Drive). By default only those not on any transaction yet and not dismissed: the ones to attach, book (promote_receipts) or dismiss. unmatched=false lists all. Filter by vendor (contains) and date_from / date_to. Newest first. *Read-only.*

ArgumentTypeRequiredDescription
unmatchedbooleanNoOnly receipts on no transaction (default true).
vendorstringNo
date_fromstringNo
date_tostringNo
limitintegerNoAt most 200 (default 50).
offsetintegerNo

merge_events

Fold a duplicate (donor_id) into the one to keep (keep_id): receipts, evidence and bank links move over and the duplicate is archived. If the duplicate is already in QuickBooks, it's removed there first. *Changes your books (previews unless apply is true), reaches QuickBooks.*

ArgumentTypeRequiredDescription
keep_idstringYes
donor_idstringYes

promote_receipts

Promote unmatched receipts to NEEDS_REVIEW events with full enrichment (vendor, rules, dedup, tax). *Changes your books (previews unless apply is true).*

ArgumentTypeRequiredDescription
receipt_idsarrayYes

push_receipts_to_qbo

Attach an event's receipts to its QuickBooks transaction (skips ones already there). *Changes your books (previews unless apply is true), reaches QuickBooks.*

ArgumentTypeRequiredDescription
event_idstringYes

push_to_qbo

Send a confirmed transaction that never reached QuickBooks. QuickBooks is checked first for the same amount around that date (it may have been entered there by hand); a match refuses unless check_qbo is false. Refuses anything already in QuickBooks or kept in Solarium only. Reads the result back. *Changes your books (previews unless apply is true), reaches QuickBooks.*

ArgumentTypeRequiredDescription
event_idstringYes
check_qbobooleanNoLook for it in QuickBooks first. Default true.

qbo_remove_attachment

Remove one attachment (like a duplicate PDF) from a QuickBooks transaction. The transaction itself isn't changed. Refuses to remove the last attachment unless allow_last is set. When a Solarium receipt is that file, pass points_to: the attachment still on the transaction that holds the same document. *Changes your books (previews unless apply is true), reaches QuickBooks.*

ArgumentTypeRequiredDescription
entityBill, Purchase, Deposit, JournalEntry, SalesReceipt, VendorCredit, BillPayment, Payment, Invoice, Transfer, CreditCardPaymentTxn, RefundReceipt, CreditMemoYes
qb_idstringYesThe QuickBooks transaction id
attachable_idstringYes
allow_lastbooleanNo
points_tostringNoThe remaining attachment that is the same document as the receipt being removed.

qbo_set_purchase_tax

Repair a synced purchase whose QuickBooks total doesn't match the books because the sales tax was dropped or rounded differently: put its expense lines on the given QuickBooks tax code so QuickBooks' total and tax equal the books exactly (where QuickBooks' rounding can't land on the books' tax, a cent or two moves to an untaxed line). Every line is echoed by id, and it's read back. Use get_qbo_transaction first to see the lines and tax codes. *Changes your books (previews unless apply is true), reaches QuickBooks.*

ArgumentTypeRequiredDescription
event_idstringYes
tax_codestringYesQuickBooks tax code name or id, like H or HST ON.

recategorize_event

Rebook a confirmed event's type and DR/CR lines in place (rebuilds its JE + tax), e.g. income that was really a customer payment. Refused for events already in QuickBooks (void + rebook there instead). *Changes your books (previews unless apply is true).*

ArgumentTypeRequiredDescription
event_idstringYes
event_typeexpense, fee, fee_rebate, fraud_dispute, income, loan_proceeds, loan_repayment, owner_contribution, owner_draw, personal_holding, refund, tax_payment, transferYes
linesarrayYes
contact_idstringNo
reasonstringYes

recategorize_events

Move many booked transactions to another category at once, in Solarium and QuickBooks. Pick them by event_ids, or by from_category_id (optionally narrowed by vendor and date_from / date_to). The preview lists which would move and which would be refused (e.g. changed in QuickBooks since the last sync). *Changes your books (previews unless apply is true), reaches QuickBooks.*

ArgumentTypeRequiredDescription
to_category_idstringYes
event_idsarrayNo
from_category_idstringNo
vendorstringNo
date_fromstringNo
date_tostringNo

reconcile_card_statement

Hold a card or bank statement up against the books (read-only). Pass the statement as rows (date, description, amount, is_debit, optional foreign_amount + foreign_currency; without is_debit a negative amount is a credit) or an uploaded PDF (s3_key). Returns matches, FX corrections (with the set_event_fx to run), lines missing from the books, transactions not on the statement, possible doubles, and foreign-transaction fees. *Read-only.*

ArgumentTypeRequiredDescription
account_idstringYesThe card or bank account (see list_categories)
rowsarrayNo
s3_keystringNo
date_fromstringNo
date_tostringNo

record_customer_payment

Record a customer paying an invoice: DR bank / CR A/R (that customer). Never touches revenue. Optionally rebooks the bank-feed deposit event for the payment. *Changes your books (previews unless apply is true).*

ArgumentTypeRequiredDescription
bank_account_idstringYes
ar_account_idstringYes
contact_idstringYes
amountstringYes
txn_datestringYes
referencestringYes
source_event_idstringNoThe bank-feed deposit event (pre-confirm)
allow_overpaymentbooleanNo

reject_event

Set a review item aside (it won't be booked), recording why. Booked items can't be rejected. *Changes your books (previews unless apply is true).*

ArgumentTypeRequiredDescription
event_idstringYes
reasonstringYes

replace_with_qbo_twin

Replace a needs review event with the copy QuickBooks already has: its receipts move to the imported event, the review event is archived, and the document is pushed to QuickBooks. Finds the twin when not given. Amounts must match unless accept_difference is true: then QuickBooks' amount is kept and the gap is reported. Check the document first (get_receipt) to see which amount is right. *Changes your books (previews unless apply is true), reaches QuickBooks.*

ArgumentTypeRequiredDescription
event_idstringYes
qbo_event_idstringNo
accept_differencebooleanNoReplace even though the amounts differ, keeping QuickBooks' amount (default false).

report_account_lines

The booked lines behind a report number: every line posted to these accounts in the range, with the transaction (event_id) each came from. Narrow to one vendor (a report_spending_by_vendor key) or one contact (a contact id, or 'none'). Capped at 500 lines (truncated says so). *Read-only.*

ArgumentTypeRequiredDescription
account_idsarrayYesAccount ids to list.
start_datestringNoFirst day, YYYY-MM-DD. Omit for all time.
end_datestringNoLast day, YYYY-MM-DD. Omit for all time.
vendorstringNoA vendor key from report_spending_by_vendor.
contactstringNoA contact id, or 'none' for lines with no contact.

report_balance_sheet

Balance sheet as of a date: assets, liabilities and equity by account (net income to date included), optionally side by side with compare_as_of. out_of_balance is zero unless something posted unbalanced. *Read-only.*

ArgumentTypeRequiredDescription
as_ofstringYesThe balance sheet date, YYYY-MM-DD.
compare_as_ofstringNoAn earlier date to compare against.

report_open_balances

Open balances, aged (current, 31-60, 61-90, over 90 days): side=receivable lists customers who owe you, side=payable lists vendors you owe. Each row's key is the contact id for report_account_lines. *Read-only.*

ArgumentTypeRequiredDescription
sidepayable, receivableYesreceivable or payable.
as_ofstringYesAge balances as of this date, YYYY-MM-DD.

report_profit_and_loss

Profit and loss for a date range: income, cost of sales, expenses and other items by account, with gross profit and net income, one column per month or quarter. Amounts are in the org's home currency. Only booked (confirmed or synced) transactions count. Use report_account_lines to see what's behind a number. *Read-only.*

ArgumentTypeRequiredDescription
start_datestringYesFirst day, YYYY-MM-DD.
end_datestringYesLast day, YYYY-MM-DD (inclusive).
granularitymonth, quarterNoOne column per month (default) or per quarter.

report_qbo_account_lines

One QuickBooks account's register between two dates (default the last 30 days): each line's date, type, QuickBooks id, name, memo and amount, and the Solarium event it is (or none, if the books don't have it). Use it next to report_account_lines to find where a bank, card or loan differs. Read only. *Read-only.*

ArgumentTypeRequiredDescription
account_idstringYesThe Solarium account (mapped to QuickBooks).
sincestringNo
untilstringNo

report_sales_tax

The sales tax report for a period, in the form the org's country files: in Canada the GST/HST return (collected, input tax credits, net owing or refund, filing deadline) plus any PST/QST return; in the US sales tax collected by state; elsewhere tax collected and claimed back by tax. Only booked transactions count, and cards not booked yet are reported as a warning. *Read-only.*

ArgumentTypeRequiredDescription
start_datestringYesFirst day, YYYY-MM-DD.
end_datestringYesLast day, YYYY-MM-DD (inclusive).

report_spending_by_vendor

Spending by vendor for a date range, one column per month or quarter, largest first. Each vendor's key and the account_ids go to report_account_lines (as vendor and account_ids) to list its transactions. *Read-only.*

ArgumentTypeRequiredDescription
start_datestringYesFirst day, YYYY-MM-DD.
end_datestringYesLast day, YYYY-MM-DD (inclusive).
granularitymonth, quarterNoOne column per month (default) or per quarter.

restate_event_fx

Record that a booked (or synced) charge was really in another currency — e.g. 455.50 USD for the 648.27 CAD the card charged — keeping the home-currency amount booked. Nothing in the ledger or QuickBooks changes; only the foreign amount, currency and the card's actual rate are recorded. To change the booked amount too, use the edit drawer. *Changes your books (previews unless apply is true).*

ArgumentTypeRequiredDescription
event_idstringYes
original_currencystringYes
original_amountstringYes
charged_amountstringNoOptional check: must equal the booked amount

resync_event_from_qb

Rebuild events from their QuickBooks copy when Solarium has drifted (QuickBooks is only read). Checks the entry balances and moves the bank or card by the QuickBooks total. *Changes your books (previews unless apply is true).*

ArgumentTypeRequiredDescription
event_idsarrayYes

send_feedback

Tell the Solarium team when you can't do what the user asked with these tools, or something looks wrong: a tool you needed that doesn't exist, a missing field or option, a result that didn't match the books or QuickBooks, an error, or a description that misled you. Say what you were trying to do and what would have helped. It doesn't change the books. Don't include card numbers, passwords or other secrets. *Read-only.*

ArgumentTypeRequiredDescription
kindmissing_tool, wrong_result, error, confusing, otherYes
messagestringYesWhat you were trying to do, what was missing or wrong, and what would have helped.
toolstringNoThe tool it's about, if any.
examplestringNoThe call you made or wanted to make, and what came back.

set_card_last_four

Record a card number on a card or bank account, then file receipts waiting on that number and fill the payment account on their needs review events. *Changes your books (previews unless apply is true).*

ArgumentTypeRequiredDescription
account_idstringYes
last_fourstringYes

set_event_fx

Say a review item was in another currency: original_currency (e.g. USD), optionally original_amount (the foreign amount, if it differs) and charged_amount (what your card or bank charged in your home currency, which keeps their rate including fees). Without charged_amount the Bank of Canada rate is used. *Changes your books (previews unless apply is true).*

ArgumentTypeRequiredDescription
event_idstringYes
original_currencystringYes
original_amountstringNo
charged_amountstringNo

unmapped_card_numbers

List card numbers read off receipts that belong to no payment account (read-only). *Read-only.*

ArgumentTypeRequiredDescription
since_daysintegerNo

update_category

Rename a category, and/or set its QuickBooks subtype from its tax code (fix_subtype), in Solarium and QuickBooks together — so the nightly sync doesn't change it back. *Changes your books (previews unless apply is true), reaches QuickBooks.*

ArgumentTypeRequiredDescription
account_idstringYes
namestringNo
fix_subtypebooleanNo

Example

Request
# Claude Code
claude mcp add --transport http solarium https://mcp.trysolarium.com/mcp

# What your AI app sends (JSON-RPC over POST https://mcp.trysolarium.com/mcp)
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "report_profit_and_loss",
    "arguments": { "start_date": "2026-01-01", "end_date": "2026-09-30", "granularity": "quarter" }
  }
}
Response
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "isError": false,
    "structuredContent": {
      "op": "report_profit_and_loss",
      "applied": false,
      "summary": "Net Income 41250.18 CAD (2026-01-01 To 2026-09-30).",
      "data": { "periods": ["…"], "sections": ["…"], "net_income": { "total": "41250.18" } }
    }
  }
}