BooksKey features

Bookkeeping, AI-assisted

Let the bots do the data entry. You keep the ledger.

Books is a bookkeeping workspace where AI does the repetitive heavy lifting - syncing the bank feed, categorizing transactions, reading receipts and invoices, deriving the bank reconciliation workpaper, and drafting journal entries - and a person reviews, posts, and signs. You can even connect your own AI agent over MCP. Nothing shaky lands in the ledger without a human confirming it, and no reconciliation is signed by anything but a person. The screens below are illustrative and use synthetic sample data only. Here is each feature and how it flows.

AI bot

Does the repetitive heavy lifting — reading, extracting, drafting, matching.

You

Keep the judgement calls — review, correct, approve, and sign off.

Platform

Moves data between modules so nothing is re-typed or re-uploaded.

Connect an AI agent (MCP)

Point your AI agent at your books and let it work

Book exposes an MCP server, so you can connect an AI agent - Google Antigravity, Claude Code, or any MCP client - and have it do real bookkeeping tasks against your data instead of just answering questions in a chat window.

The old way
AI assistance meant copying figures out of the accounting system into a chatbot and pasting suggestions back by hand. The assistant never actually touched the books.
What the bot does now
Connected over MCP, the agent uses real Book tools - reading transactions and reports, creating journal entries as OneDrive files, importing and validating them, attaching supporting documents, and running payroll and operations helpers.
Where you sign off
Access is scoped, and the things that move money or hit the ledger - posting a journal entry, for example - stay a deliberate human step. The agent drafts; you post.

Grounded in the Book MCP tool registry (src/lib/mcp/book/tool-registry.ts) and its registered tool sets - books, journals, journals-drive, operations, firm-admin, and payroll.

What it looks like

Google Antigravitybook.workpaperos.com/api/book/mcp
Where are we on the June books?
Feeds are synced and categorized - 38 proposals await your approval, and the June operating-cash workpaper derives to a $0.00 difference with two adjusting entries sitting as drafts. Nothing posts without you, and I cannot sign it.
book_je_drive_create{ memo: "Depreciation - Mar" }done
book_je_drive_import{ file: "je-2026-03.csv" }done
book_je_post{ batch: "..." }awaiting your review

Your own assistant - Antigravity, Claude, or ChatGPT - calling real WorkpaperOS tools over MCP. Anything that changes the file waits for your review and sign-off in the app. Synthetic data shown.

How it flows

Point your AI agent at your books and let it work: Open your AI agent then Connect via MCP then It runs real tools then Review + postYouOpen your AI agentAntigravity, Claude...PlatformConnect via MCPscoped accessAI botIt runs real toolson your booksYouReview + postyou commit it

Bank feeds

Bank and card transactions arrive on their own

Connect an account once and Books pulls transactions in automatically over a secure bank feed, so day-to-day data entry stops being a job.

The old way
Someone downloads a CSV from the bank each week, cleans it up, and imports it - or types transactions off a paper statement.
What the bot does now
A Plaid-powered feed links the account, verifies it, and syncs new transactions into Books on an ongoing basis, keeping cash current without manual exports.
Where you sign off
You approve which accounts are connected and confirm the verification step. From there the feed runs, but you still own what gets posted to the ledger.

Grounded in the Book Plaid bank-feed routes (/api/book/bank-feeds/plaid/*) and the books_bank_feeds_plaid migration.

How it flows

Bank and card transactions arrive on their own: Connect account then Sync transactions then Prepare for review then Own what postsYouConnect accountone-time, verifiedPlatformSync transactionsongoing feedAI botPrepare for reviewready to categorizeYouOwn what postsyou decide

AI categorization

Suggest the right account for every transaction

Books proposes a category for each incoming transaction with a confidence level and a plain-English reason - so categorization becomes a quick confirm, not a decision from scratch.

The old way
A bookkeeper reads each payee and memo and manually picks a GL account, transaction by transaction, every month.
What the bot does now
The categorization engine ranks candidates from your firm rules, your firm's historical categorization of similar counterparties, and heuristics - returning a top suggestion, alternates to consider, and a confidence score.
Where you sign off
Low-confidence items wait for you; only high-confidence matches under an explicit rule can auto-post. You accept, change, or split the categorization - the ledger reflects your call, not the bot's guess.

Grounded in src/lib/accounting/bank/ai-categorization.ts (rule / history / heuristic tiers, confidence, auto_post gate) and the bank_ai_categorization migration.

What it looks like

book.workpaperos.com/banking

For review - checking ****2841

Bank feed synced - AI suggested a category for each

Feed live
Cedar Point Fuel Stop-84.206210 - Vehicle fuelrule - auto - 95%
Northgate Office Depot-212.996130 - Office suppliestop match - 88%
ACH Deposit - Sample Advocacy Group+3,500.004000 - Consulting revenueconfirm - 74%
SQ *Riverside Cafe-41.756410 - Meals (50%)confirm - 58%

Only a high-confidence rule match auto-posts; the rest wait for you to confirm. Synthetic transactions.

How it flows

Suggest the right account for every transaction: New transaction then Rank candidates then Score confidence then Confirm or changePlatformNew transactionfrom the feedAI botRank candidatesrule, history, heuristicAI botScore confidence+ reasonYouConfirm or changeyou code it

Document inbox

Pull the fields off a receipt or invoice for you

Drop a receipt, bill, or invoice into the inbox and Books reads it, extracts the vendor, date, amount, tax, and currency, and pre-fills the form - keeping the original file as the source of record.

The old way
You squint at a receipt and retype the vendor, date, and totals into a bill form, then file the paper somewhere you hope to find it again.
What the bot does now
A tiered extractor runs a fast OCR pass, escalates to Google Document AI's invoice/expense parser for real structured fields and confidences, falls back to an LLM and then heuristics, and maps everything onto the bill form with per-field confidence.
Where you sign off
When overall or a key field's confidence is below the review threshold, the item is flagged for review with the reasons listed - it will not silently post a shaky number. You confirm the fields before it becomes a transaction.

Grounded in src/lib/accounting/documents/docai-inbox.ts + inbox-extraction.ts (Doc AI -> LLM -> heuristic tiers, reviewRequired at 82/72 confidence), the tiered OCR in file-indexing/ocr-escalate.ts, and the book_document_review_flags migration.

What it looks like

book.workpaperos.com/inbox

Original file

receipt-mar08.pdf kept as source

Extracted fields

2 fields flagged for review
VendorHarbor Freight Ltd.96%
Date2026-03-0894%
Amount1,248.50 USD91%
Tax78.50 USD63%
Account6120 - Shop supplies71%
Confirm & saveYou approve before it posts. Synthetic data.

How it flows

Pull the fields off a receipt or invoice for you: Upload document then Extract fields then Flag low confidence then Confirm + saveYouUpload documentoriginal keptAI botExtract fieldsDoc AI + fallbacksAI botFlag low confidencewith reasonsYouConfirm + saveyou approve

Reconciliation

The bank reconciliation workpaper, derived instead of typed

One Recons tab opens the six-sheet workpaper every CPA already knows - Reconciliation, Reconciling Items, Journal Entries, Book Register, Bank Activity, and How this works. The difference between bank and books is never a bare number: it decomposes into named, categorised, sourced items, each stating whether it needs a journal entry.

The old way
Reconciliation sat under each bank account as a tick-off screen. You ticked statement lines against the ledger one at a time, and when the last few cents would not close you had nothing but a number to argue with.
What the bot does now
Books rebuilds the workpaper from the ledger and the bank feed every time you open it - outstanding checks, deposits in transit, bank service charges, interest, NSF returns, and bank debits and credits not yet on the books. The statement ending balance is calculated from the feed or from a statement you upload. Anything the matcher cannot confidently place is surfaced as its own reviewable item, never folded into Outstanding Checks and never hidden.
Where you sign off
Bank-side items are timing and need no entry; book-side items are missing entries and always do - and those arrive as drafts you review and post, never auto-posted. A closed period stops the whole batch and asks you to open it rather than re-dating the entry into a month it did not happen in. The statement balance stays editable, and a figure you type wins over the derived one. A person signs as preparer and a different person signs as reviewer.

Grounded in src/lib/book/recons/derive.ts (the workpaper is re-derived from the ledger on every call; whether an item needs a journal entry is asserted to be exactly whether it is book-side) and the /api/book/recons routes - post-entries, finalize, signoff, and reopen.

How it flows

The bank reconciliation workpaper, derived instead of typed: Derive the workpaper then Name every item then Post the drafts then Prepare + reviewPlatformDerive the workpaperledger + bank feedAI botName every itemtype, side, sourceYouPost the draftsyou pick whichYouPrepare + reviewan AI cannot sign

Human sign-off

An AI can prepare the reconciliation. It cannot sign it.

Everything in Recons is reachable by an AI connected over MCP, because everything else is work. Sign-off is not work - it is a named person asserting they did the work and stand behind it - so it is the one door an AI is refused at.

The old way
Sign-off was a checkbox with whatever user account happened to be logged in behind it, which told a reviewer nothing about who actually looked at the workpaper.
What the bot does now
Your assistant can derive the workpaper, explain each reconciling item, draft the adjusting entries, and drive the difference to zero - the whole preparation, end to end.
Where you sign off
The sign-off route turns an MCP caller away outright and says why, rather than recording a human's user id against something that human did not do. A preparer signs first; the reviewer must be a different person; and a workpaper cannot be finalized until a preparer has signed it.

Grounded in the sign-off route's MCP refusal (HUMAN_SIGNOFF_REQUIRED), its SELF_REVIEW and PREPARER_REQUIRED checks, and the finalize gate that requires a prepared sign-off before a workpaper can complete.

How it flows

An AI can prepare the reconciliation. It cannot sign it.: Prepares everything then Preparer signs then A second person reviews then FinalizeAI botPrepares everythingover MCPYouPreparer signsa named personYouA second personreviewsnever the preparerPlatformFinalizerefused without a signature

OneDrive journal entries

Draft journal entries in OneDrive, then post them yourself

An AI assistant connected over MCP can create a journal entry as a file in your OneDrive, run it through validation, and hand you a draft - but the entry only hits the ledger when a person posts it.

The old way
You build a journal entry by hand in a spreadsheet, retype it into the accounting system, and hope the debits and credits balance.
What the bot does now
The Book journal MCP tools write the JE as a CSV into a dedicated OneDrive folder, import it once (idempotent by file hash) through the existing import-validate-draft pipeline, and attach any supporting OneDrive docs.
Where you sign off
Posting is a deliberate step, and the OneDrive batch is locked to the journal on post and becomes immutable. If you ask your assistant to post the queue it can, and the entry is still undoable afterwards - a true undo that removes the effect rather than stacking a reversal - until you lock the period.

Grounded in src/lib/mcp/book/tools/books-journals-drive.ts (book_je_drive_create / import / attach, post-lock immutability) and the book_journal_drive_folder migration.

How it flows

Draft journal entries in OneDrive, then post them yourself: Draft JE in OneDrive then Import + validate then Review the draft then Post to ledgerAI botDraft JE in OneDriveas a filePlatformImport + validatedebits = creditsYouReview the draftyou check itYouPost to ledgerlocked on post

Review, undo, lock

Let an AI keep the books without losing control of them

Posting is not what makes work final in Books. There are two states - posted, which is still a draft, and locked, which is final - and only you can move work between them.

The old way
You either let software post automatically and hope, or you approve every line by hand and lose the time the automation was supposed to save.
What the bot does now
Your assistant categorizes, matches, splits, excludes, and posts through MCP - and will summarize what it intends to post and where before it acts, if you ask it to. When it hits a locked period it reports the lock instead of routing around it.
Where you sign off
A posted row is still a draft: one click undoes it, and the undo removes the effect rather than posting a reversal. That holds until you set a closing date - then the period cannot be posted into or undone out of at all, by you or by the assistant, without your password. Signing a bank reconciliation records who prepared and who reviewed it and freezes that report as signed; it does not freeze the ledger, and we say so rather than implying a second lock. Your closing date is your acceptance of the month, and it is the only thing that makes one final.

Grounded in src/lib/book/bank-undo-guards.ts, which now carries exactly one guard - the closing date - on the shared executor both the app and MCP queue into, and the matching closing-date check in src/lib/accounting/journal-entry-engine.ts that refuses to post into a locked period.

How it flows

Let an AI keep the books without losing control of them: Posts the work then Review the ledger then Undo anything then Lock the periodAI botPosts the workor proposes firstYouReview the ledgerat your paceYouUndo anythingone click, no reversalYouLock the periodnow it is final

Clean books with less typing.

Start a 5-day trial of Books. The bots draft the entries and categorize the transactions; you review and post. No card required.

Start Books free