# Use With AI (MCP)

> Solarium docs. Solarium's hosted MCP server is `https://mcp.trysolarium.com/mcp` (Streamable HTTP, OAuth sign-in). Tools that change the books preview unless called with `apply: true`. Index of all pages: https://trysolarium.com/llms.txt

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](https://trysolarium.com/ai) 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

| Tool | What it does |
| --- | --- |
| `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. |
| `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. |
| `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. |
| `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. |
| `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. |
| `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. |
| `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. |
| `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. |
| `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. |
| `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. |
| `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. |
| `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. |
| `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. |
| `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. |
| `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). |
| `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. |
| `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. |
| `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. |
| `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. |
| `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. |
| `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. |
| `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. |
| `unmapped_card_numbers` | List card numbers read off receipts that belong to no payment account (read-only). |

### Tools That Change Your Books

| Tool | What it does |
| --- | --- |
| `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. |
| `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). |
| `book_invoice` | Book a customer invoice: DR A/R (gross, that customer) / CR revenue (net) / CR sales tax. |
| `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. |
| `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. |
| `book_reclass` | Reclassify an amount: DR to_account / CR from_account, posted as a journal entry. |
| `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. |
| `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. |
| `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). |
| `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. |
| `confirm_high_confidence` | Confirm NEEDS_REVIEW events that pass every high-confidence check (including a QuickBooks duplicate check). |
| `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. |
| `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. |
| `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. |
| `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. |
| `dismiss_receipts` | Dismiss unmatched receipts that aren't receipts (logos, signatures, duplicates). |
| `edit_event` | Change a review item's date, memo, title or type. |
| `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. |
| `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. |
| `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. |
| `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. |
| `promote_receipts` | Promote unmatched receipts to NEEDS_REVIEW events with full enrichment (vendor, rules, dedup, tax). |
| `push_receipts_to_qbo` | Attach an event's receipts to its QuickBooks transaction (skips ones already there). |
| `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. |
| `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. |
| `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. |
| `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). |
| `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). |
| `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. |
| `reject_event` | Set a review item aside (it won't be booked), recording why. Booked items can't be rejected. |
| `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. |
| `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. |
| `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. |
| `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. |
| `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. |
| `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. |

### 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `receipt_id` | `string` | Yes |  |
| `event_id` | `string` | Yes |  |

#### 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `since` | `string` | No |  |
| `until` | `string` | No |  |
| `limit` | `integer` | No | How 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `clearing_account_id` | `string` | Yes |  |
| `expense_lines` | `array` | Yes |  |
| `source_event_id` | `string` | No |  |
| `source_receipt_id` | `string` | No |  |
| `merchant` | `string` | No |  |
| `txn_date` | `string` | No |  |
| `notes` | `string` | No |  |
| `check_qbo` | `boolean` | No |  |
| `dedup_key` | `string` | No |  |
| `push` | `boolean` | No |  |

#### 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).*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `ar_account_id` | `string` | Yes |  |
| `revenue_account_id` | `string` | Yes |  |
| `contact_id` | `string` | Yes |  |
| `net` | `string` | Yes |  |
| `tax_lines` | `array` | No |  |
| `txn_date` | `string` | Yes |  |
| `reference` | `string` | Yes | Invoice 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `revenue_account_id` | `string` | Yes |  |
| `fee_account_id` | `string` | Yes |  |
| `processor_account_id` | `string` | Yes |  |
| `gross` | `string` | Yes | Gross in the org's functional currency |
| `fee` | `string` | Yes | Fee in the org's functional currency |
| `txn_date` | `string` | Yes |  |
| `payer` | `string` | Yes |  |
| `processor_txn_id` | `string` | Yes | The processor's transaction id (dedup key) |
| `original_currency` | `string` | No |  |
| `original_gross` | `string` | No |  |
| `check_qbo` | `boolean` | No |  |
| `push` | `boolean` | No |  |

#### 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `receipt_id` | `string` | Yes |  |
| `category_id` | `string` | Yes |  |
| `payment_account_id` | `string` | No |  |
| `tax_amount` | `string` | No |  |
| `tax_included` | `boolean` | No | The total includes sales tax at the standard rate |
| `tax_code` | `string` | No |  |
| `note` | `string` | No |  |
| `confirm` | `boolean` | No |  |

#### 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `from_account_id` | `string` | Yes | Account credited (amount moves out) |
| `to_account_id` | `string` | Yes | Account debited (amount moves in) |
| `amount` | `string` | Yes |  |
| `txn_date` | `string` | Yes |  |
| `memo` | `string` | Yes |  |
| `dedup_key` | `string` | No |  |
| `push` | `boolean` | No |  |

#### 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `bank_account_id` | `string` | Yes |  |
| `clearing_account_id` | `string` | Yes |  |
| `gross` | `string` | Yes |  |
| `discount_lines` | `array` | No |  |
| `txn_date` | `string` | Yes |  |
| `memo` | `string` | Yes |  |
| `source_event_id` | `string` | No | The bank-feed deposit event for the net (optional) |
| `rolled_in_event_ids` | `array` | No |  |
| `check_qbo` | `boolean` | No |  |
| `dedup_key` | `string` | No |  |
| `push` | `boolean` | No |  |

#### 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `amount` | `string` | Yes | The credit's total including tax, positive (69.18). |
| `reference` | `string` | Yes | The vendor's credit memo number (9967152). |
| `bill_id` | `string` | No | QuickBooks Bill Id it credits (find_qbo_matches or get_qbo_transaction). |
| `vendor` | `string` | No | QuickBooks vendor name, when there's no bill_id. |
| `category_account_id` | `string` | No | Defaults to the bill's category. |
| `tax_amount` | `string` | No | Tax on the credit (0 for zero-rated goods). |
| `sales_tax_code` | `string` | No | hst, gst, pst or qst (when taxed). |
| `txn_date` | `string` | Yes | The credit memo's date. |
| `description` | `string` | No | What it's for, like damaged sugar. |
| `receipt_id` | `string` | No | The credit memo's receipt, attached to it. |
| `check_qbo` | `boolean` | No | Refuse 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).*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `event_id` | `string` | Yes |  |
| `category_id` | `string` | No |  |
| `payment_account_id` | `string` | No |  |
| `tax_amount` | `string` | No | Total tax on it; '0' removes tax |
| `tax_code` | `string` | No | e.g. hst, gst (from list_categories / the tax line) |
| `from_account_id` | `string` | No |  |
| `to_account_id` | `string` | No |  |

#### 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `as_of` | `string` | No |  |
| `only_differences` | `boolean` | No | Default 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `event_id` | `string` | Yes |  |
| `allow_qbo_match` | `boolean` | No |  |

#### 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `event_ids` | `array` | No |  |
| `since_days` | `integer` | No | Only events created in the last N days |
| `limit` | `integer` | No |  |

#### 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | `string` | Yes |  |
| `tax_code` | `string` | No | e.g. 8320 purchases (see list_categories) |
| `account_type` | `string` | No |  |
| `parent_id` | `string` | No |  |

#### 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).*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `vendor` | `string` | Yes | Who it was paid to or received from. |
| `amount` | `string` | Yes | The total in home currency, like 42.50. |
| `date` | `string` | Yes |  |
| `event_type` | `expense`, `fee`, `fee_rebate`, `fraud_dispute`, `income`, `loan_proceeds`, `loan_repayment`, `owner_contribution`, `owner_draw`, `personal_holding`, `refund`, `tax_payment`, `transfer` | No | Defaults to expense. |
| `category_id` | `string` | No | The category account (or the to-account). |
| `payment_account_id` | `string` | No | The bank or card (or the from-account). |
| `tax_amount` | `string` | No | Sales tax included in amount. |
| `tax_code` | `string` | No | The 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `since_days` | `integer` | No | Receipts created in the last N days (default 14) |
| `auto_confirm` | `boolean` | No | Also 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `account_id` | `string` | Yes |  |

#### dismiss_receipts

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

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `receipt_ids` | `array` | Yes |  |
| `reason` | `string` | Yes |  |

#### edit_event

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

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `event_id` | `string` | Yes |  |
| `transaction_date` | `string` | No | YYYY-MM-DD |
| `memo` | `string` | No |  |
| `title` | `string` | No |  |
| `event_type` | `expense`, `fee`, `fee_rebate`, `fraud_dispute`, `income`, `loan_proceeds`, `loan_repayment`, `owner_contribution`, `owner_draw`, `personal_holding`, `refund`, `tax_payment`, `transfer` | No |  |

#### 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `receipt_id` | `string` | No |  |
| `event_id` | `string` | No |  |
| `amount` | `string` | No | The total, like 455.50 (with date, instead of an id). |
| `date` | `string` | No |  |
| `vendor` | `string` | No |  |
| `doc_number` | `string` | No | The invoice or bill number. |
| `currency` | `string` | No | Three 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `event_id` | `string` | Yes |  |

#### 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `qb_id` | `string` | No |  |
| `name` | `string` | No |  |

#### 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `entity` | `Bill`, `Purchase`, `Deposit`, `JournalEntry`, `SalesReceipt`, `VendorCredit`, `BillPayment`, `Payment`, `Invoice`, `Transfer`, `CreditCardPaymentTxn`, `RefundReceipt`, `CreditMemo` | Yes |  |
| `qb_id` | `string` | Yes | The 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `receipt_id` | `string` | Yes |  |

#### 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).*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `entity` | `Bill`, `Purchase`, `Deposit`, `JournalEntry`, `SalesReceipt`, `VendorCredit`, `BillPayment`, `Payment`, `Invoice`, `Transfer`, `CreditCardPaymentTxn`, `RefundReceipt`, `CreditMemo` | Yes |  |
| `qb_id` | `string` | Yes | The 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).*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `csv` | `string` | Yes | The export's text (Balance change from activity, or history). |
| `payouts_csv` | `string` | No | The Payouts itemized export, with the Balance summary. |
| `stripe_account_id` | `string` | Yes | The bank-type account that is Stripe's balance. |
| `bank_account_id` | `string` | Yes | Where Stripe pays out to. |
| `revenue_account_id` | `string` | Yes | Where charges go (sales). |
| `fees_account_id` | `string` | Yes | Where Stripe's fees go. |
| `transfers_account_id` | `string` | No | Connect platforms: where transfers to connected accounts go (cost of sales). |
| `allow_window_mismatch` | `boolean` | No | Book 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `event_id` | `string` | Yes |  |
| `entity` | `Bill`, `Purchase`, `VendorCredit`, `Deposit`, `SalesReceipt` | Yes |  |
| `qb_id` | `string` | Yes |  |

#### 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `account_type` | `string` | No |  |
| `include_inactive` | `boolean` | No |  |

#### 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `contact_type` | `customer`, `vendor` | No |  |
| `name` | `string` | No | Part of the name. |
| `include_inactive` | `boolean` | No |  |
| `limit` | `integer` | No | At most 200 (default 50). |
| `offset` | `integer` | No |  |

#### 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `status` | `ingested`, `enriched`, `auto_confirmed`, `awaiting_confirmation`, `needs_review`, `confirmed`, `syncing`, `synced`, `reconciled`, `pending`, `ignored`, `error`, `disputed` | No |  |
| `category_id` | `string` | No | An account id from list_categories. |
| `payment_account_id` | `string` | No | The bank or card account id. |
| `payment_account_type` | `string` | No | credit_card, bank, and so on. |
| `vendor` | `string` | No | Part of the vendor name. |
| `date_from` | `string` | No |  |
| `date_to` | `string` | No |  |
| `amount_min` | `string` | No | Home-currency amount, like 25.00. |
| `amount_max` | `string` | No | Home-currency amount, like 250.00. |
| `has_document` | `boolean` | No | Only with (true) or without (false) a receipt. |
| `include_ignored` | `boolean` | No | Also list ignored transactions. |
| `limit` | `integer` | No | At most 200 (default 50). |
| `offset` | `integer` | No | Skip 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `op` | `string` | No |  |
| `limit` | `integer` | No |  |

#### 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `unmatched` | `boolean` | No | Only receipts on no transaction (default true). |
| `vendor` | `string` | No |  |
| `date_from` | `string` | No |  |
| `date_to` | `string` | No |  |
| `limit` | `integer` | No | At most 200 (default 50). |
| `offset` | `integer` | No |  |

#### 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `keep_id` | `string` | Yes |  |
| `donor_id` | `string` | Yes |  |

#### promote_receipts

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

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `receipt_ids` | `array` | Yes |  |

#### 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `event_id` | `string` | Yes |  |

#### 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `event_id` | `string` | Yes |  |
| `check_qbo` | `boolean` | No | Look 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `entity` | `Bill`, `Purchase`, `Deposit`, `JournalEntry`, `SalesReceipt`, `VendorCredit`, `BillPayment`, `Payment`, `Invoice`, `Transfer`, `CreditCardPaymentTxn`, `RefundReceipt`, `CreditMemo` | Yes |  |
| `qb_id` | `string` | Yes | The QuickBooks transaction id |
| `attachable_id` | `string` | Yes |  |
| `allow_last` | `boolean` | No |  |
| `points_to` | `string` | No | The 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `event_id` | `string` | Yes |  |
| `tax_code` | `string` | Yes | QuickBooks 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).*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `event_id` | `string` | Yes |  |
| `event_type` | `expense`, `fee`, `fee_rebate`, `fraud_dispute`, `income`, `loan_proceeds`, `loan_repayment`, `owner_contribution`, `owner_draw`, `personal_holding`, `refund`, `tax_payment`, `transfer` | Yes |  |
| `lines` | `array` | Yes |  |
| `contact_id` | `string` | No |  |
| `reason` | `string` | Yes |  |

#### 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `to_category_id` | `string` | Yes |  |
| `event_ids` | `array` | No |  |
| `from_category_id` | `string` | No |  |
| `vendor` | `string` | No |  |
| `date_from` | `string` | No |  |
| `date_to` | `string` | No |  |

#### 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `account_id` | `string` | Yes | The card or bank account (see list_categories) |
| `rows` | `array` | No |  |
| `s3_key` | `string` | No |  |
| `date_from` | `string` | No |  |
| `date_to` | `string` | No |  |

#### 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).*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `bank_account_id` | `string` | Yes |  |
| `ar_account_id` | `string` | Yes |  |
| `contact_id` | `string` | Yes |  |
| `amount` | `string` | Yes |  |
| `txn_date` | `string` | Yes |  |
| `reference` | `string` | Yes |  |
| `source_event_id` | `string` | No | The bank-feed deposit event (pre-confirm) |
| `allow_overpayment` | `boolean` | No |  |

#### 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).*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `event_id` | `string` | Yes |  |
| `reason` | `string` | Yes |  |

#### 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `event_id` | `string` | Yes |  |
| `qbo_event_id` | `string` | No |  |
| `accept_difference` | `boolean` | No | Replace 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `account_ids` | `array` | Yes | Account ids to list. |
| `start_date` | `string` | No | First day, YYYY-MM-DD. Omit for all time. |
| `end_date` | `string` | No | Last day, YYYY-MM-DD. Omit for all time. |
| `vendor` | `string` | No | A vendor key from report_spending_by_vendor. |
| `contact` | `string` | No | A 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `as_of` | `string` | Yes | The balance sheet date, YYYY-MM-DD. |
| `compare_as_of` | `string` | No | An 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `side` | `payable`, `receivable` | Yes | receivable or payable. |
| `as_of` | `string` | Yes | Age 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `start_date` | `string` | Yes | First day, YYYY-MM-DD. |
| `end_date` | `string` | Yes | Last day, YYYY-MM-DD (inclusive). |
| `granularity` | `month`, `quarter` | No | One 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `account_id` | `string` | Yes | The Solarium account (mapped to QuickBooks). |
| `since` | `string` | No |  |
| `until` | `string` | No |  |

#### 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `start_date` | `string` | Yes | First day, YYYY-MM-DD. |
| `end_date` | `string` | Yes | Last 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `start_date` | `string` | Yes | First day, YYYY-MM-DD. |
| `end_date` | `string` | Yes | Last day, YYYY-MM-DD (inclusive). |
| `granularity` | `month`, `quarter` | No | One 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).*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `event_id` | `string` | Yes |  |
| `original_currency` | `string` | Yes |  |
| `original_amount` | `string` | Yes |  |
| `charged_amount` | `string` | No | Optional 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).*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `event_ids` | `array` | Yes |  |

#### 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `kind` | `missing_tool`, `wrong_result`, `error`, `confusing`, `other` | Yes |  |
| `message` | `string` | Yes | What you were trying to do, what was missing or wrong, and what would have helped. |
| `tool` | `string` | No | The tool it's about, if any. |
| `example` | `string` | No | The 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).*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `account_id` | `string` | Yes |  |
| `last_four` | `string` | Yes |  |

#### 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).*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `event_id` | `string` | Yes |  |
| `original_currency` | `string` | Yes |  |
| `original_amount` | `string` | No |  |
| `charged_amount` | `string` | No |  |

#### unmapped_card_numbers

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

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `since_days` | `integer` | No |  |

#### 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.*

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `account_id` | `string` | Yes |  |
| `name` | `string` | No |  |
| `fix_subtype` | `boolean` | No |  |

## Example

```
# 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" }
  }
}
```

## Example 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" } }
    }
  }
}
```
