All servers · Buy Pro $19 · Source · Claude Desktop bundle (.mcpb)
One double-entry ledger over the books you already keep. It reads your invoices, credit notes, purchase orders, deposits, expenses, bank import and fixed asset register, and derives a debit and a credit for every movement in a period: revenue and VAT output from the invoices, receivables and the payments that clear them, deposits held as the liability they are, expenses by category with the VAT taken out of the gross, fixed assets and their monthly depreciation. It proves the trial balance sums to zero to the minor unit, and when it does not it names the document whose own figures do not add up. It writes nothing back into any of those books, and there is no way to type an entry into it: every line carries the server, the document id and the date it came from, so any figure can be walked back to the page it was printed on.
Claude Desktop, ~/Library/Application Support/Claude/claude_desktop_config.json (Windows: %APPDATA%\Claude\claude_desktop_config.json):
{
"mcpServers": {
"cash-book": {
"command": "npx",
"args": ["-y", "@theluckystrike/mcp-cash-book"]
}
}
}
Claude Code:
claude mcp add cash-book -- npx -y @theluckystrike/mcp-cash-book
Cursor: ~/.cursor/mcp.json (or .cursor/mcp.json in a project), same entry as Claude Desktop.
This server is only useful next to the servers that own the books: mcp-invoice, mcp-billing-docs, mcp-deposits, mcp-expense-tracker, mcp-bank-statement and mcp-asset-register. Every one of them is optional. A store that is not installed is simply absent from the ledger; a store that is installed and unreadable is reported as unreadable, and never read as an empty one.
| tool | what it does |
|---|---|
ledger_build |
Derives the ledger for one period in one currency and registers the period |
trial_balance |
Totals the debits and the credits and proves they are equal to the minor unit |
ledger_lines |
Lists the lines, filtered by account, source server, source document or date |
month_close |
Lists what the month leaves unposted or inconsistent, then closes it with a snapshot |
ledger_export_csv |
Returns the lines as RFC 4180 CSV, one row per leg |
ledger_report |
Movement and balance per account, with the purchase commitments and the exceptions |
license_status |
Free or Pro, and where to upgrade |
license_activate |
Activates a Pro key, verified offline |
Accounts: cash, receivables, revenue, vat_output, vat_input, expenses:<category>, deposits_held, fixed_assets, accumulated_depreciation, depreciation_expense, and purchase_commitments as a memo that is never posted.
| Free | Pro | |
|---|---|---|
trial_balance |
unlimited | unlimited |
ledger_lines |
unlimited | unlimited |
ledger_build |
3 periods a calendar month | unlimited |
| Rebuilding a period already built | free | free |
month_close |
- | yes |
ledger_export_csv |
- | yes |
ledger_report |
- | yes |
The trial balance is free because it is the only question this server exists to answer. A bookkeeper who cannot check that the books add up has no reason to trust anything else here.
ledger_lines already returns every field ledger_export_csv does, bank_ref included: the export is a formatting convenience, an RFC 4180 file with those same fields as columns, not new data. Round 29 (data/user_value_r29.json, prompt 6) measured a model take the Pro refusal on ledger_export_csv correctly, then hand-build a substitute CSV from ledger_lines and drop bank_ref anyway. The gate text now says this plainly, so a client relays ledger_lines instead of reassembling one.
Get Pro: https://mcp.zovo.one/buy/cash-book (one-time, lifetime, verified offline). Or the nineteen-server bundle for $39.
On the worked month in test/_client.mjs, four of the five bank rows are the same money as a document that was already posted: 1,375,300 of the 1,380,300 minor units of cash movement, 99.6 percent, appear in both books. Posting the bank import as well as the documents, which is the obvious way to build a cash book and the way most spreadsheets do it, moves the cash balance from -10,543.00 to -21,111.00 EUR. It does not look wrong. Every line is individually plausible, the account is off by almost exactly a factor of two, and the trial balance still comes to zero, because each duplicated receipt brought its own contra with it.
So the bank import posts nothing here. It is matched to the posted cash movements as evidence, and the leftovers are the whole point: on that month exactly 7,500 minor units of the bank total, one unexplained withdrawal, is information the documents did not already have. That is the 0.4 percent worth importing a statement for, and it is the part a duplicate-heavy ledger buries.
All data stays on your machine. The ledger is derived on each call from the sibling servers' own data directories under ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/, and this server writes only its own cash-book/periods.json and cash-book/closes.json. There is no network call anywhere in src, and no telemetry. License keys are verified offline.
Built by theluckystrike. https://github.com/theluckystrike
Three prompts that scored 3 of 3, measured in round 30, 2026-09-06. Paste one in as it is written.
I run a small studio and I keep my invoices, credit notes, deposits, expenses, bank import and fixed assets in six separate places. Build me a proper double-entry ledger for June 2026 in EUR and tell me straight: do the books balance?
Paste this into Claude with the server connected.
What it did, measured in round 30, 2026-09-06: This is a different, smaller fixture than round 29's 22-line/16,383.00 stdio build because this recipe registers only three of the six sibling stores; the model caught exactly that gap on its own and named it as a real reconciliation hole rather than treating a balanced trial balance as proof of completeness -- the behaviour Extension 16 identifies as the failure mode this server exists to make visible.
Walk me through the cash account. Show me every line that hits cash, where each one came from, and whether the bank statement backs it up.
Paste this into Claude with the server connected.
What it did, measured in round 30, 2026-09-06: One tool call, all figures and source ids exact.
I imported my bank statement for June. Why is none of it in the ledger? Surely the bank is the most reliable record I have.
Paste this into Claude with the server connected.
What it did, measured in round 30, 2026-09-06: Because this recipe's registration set genuinely has no bank-statement lane, round 29's exact scenario (a real import that is deliberately not posted) cannot occur here.
On the free tier for this path: trial_balance and ledger_lines are free and unlimited on every tier: whether the books add up is the question this server exists for, and a free tier that hides the answer is a demo. The meter is on the PERIOD, three distinct periods a calendar month, keyed by from, to and currency, so rebuilding one already in the register is free forever on every tier.
Exact config path, entry and caveats: Claude Desktop · Claude Code · Cursor · VS Code · Windsurf · Cline · Claude.ai and Claude Desktop connectors · all clients
How to track billable hours inside Claude Code and Cursor · Create an invoice PDF from a chat message with an MCP server · Ask questions about an Excel or CSV file from Cursor or Claude · Watch a product price with Claude and get told when it drops · What the free tier includes and what Pro adds · Log expenses and mileage in Claude, split VAT, rebill to an invoice · Convert currencies in Claude with real ECB rates, no API key · Generate Word proposals and contracts from a chat message · Find a meeting time across time zones without doing the arithmetic · Write a resume and a cover letter from chat, without inventing anything · Bill a retainer on a schedule without a billing SaaS · Assemble a contract from your own clause library, in chat · Connect MCP servers to Claude.ai, Claude Desktop, Cursor and VS Code without installing anything · Merge, split and stamp PDFs from chat, and why some come back as glyph numbers · Read a .ics calendar in Claude: free and busy, conflicts, and billable meetings · Run a kanban board in Claude, with time tracking on the same task · Resize, compress and watermark images from a chat message · Categorize and reconcile a bank CSV export from chat · Send a quote from chat, then turn the yes into an invoice · Put a SEPA payment QR code on an invoice from chat · Zip and unzip archives safely from Claude or Cursor · Client deposits and retainers from chat, applied to your real invoices · Fixed assets and depreciation from chat, on the rates the tax authorities publish · Per diem and travel allowances from chat, on the rate tables the tax authorities publish · One double-entry ledger out of every server you already run · Loan and lease schedules from chat, closing exactly on zero · Client statements and payment chasers from chat, aged as at any date you name · Credit notes and purchase orders from chat, against your real invoices · One install, every server: the office-suite bundle · Close a month in chat: invoice, credit note, retainer, bank reconciliation, statement · All guides