Labsco
yuens1002 logo

bookie

from yuens1002

Double-entry bookkeeping MCP server β€” import bank CSVs, categorize, reconcile, tax reports.

πŸ”₯πŸ”₯πŸ”₯βœ“ VerifiedAccount requiredAdvanced setup

bookie

npm Publish to npm

An MCP server that keeps books for freelancers and landlords β€” driven from Claude or GPT instead of QuickBooks.

Ask your LLM to import a bank statement, categorize spending, reconcile a month, or generate a Schedule C. Bookie provides the correct double-entry ledger underneath β€” so the model reasons over real numbers, not a spreadsheet it's improvising on the fly.

This is for you if: you're a solopreneur, freelancer, or rental property owner already living in Claude or GPT, you're comfortable with a 5-minute setup, and you want books that are actually correct.

Not for you if: you want a dashboard UI, you need multi-user access, or you're satisfied with QuickBooks / a spreadsheet.

What you need before starting

  • Node β‰₯ 24
  • neonctl β€” npm install -g neonctl (free Neon account; needed for the DB)
  • An MCP-capable host: Claude Desktop, Claude.ai, Cursor, VS Code, or any host supporting the MCP stdio or HTTP transport

Why no UI?

The host LLM already reads CSVs, sees receipt images, and writes prose. Bookie owns the things an LLM shouldn't improvise: a correct double-entry ledger, integer-cent money math, deterministic categorization rules, and reproducible reports. The model handles language and vision; the server handles the books.

Tools

The full, always-current tool reference lives in docs/TOOLS.md (regenerate with npm run docs:tools). Today:

ToolWhat it does
manage_accountsCreate/list/archive accounts (segment-scoped categories carry a tax line)
add_transactionRecord one balanced double-entry (money flows from β†’ to)
split_transactionOne payment leg + N category legs (a receipt split across categories)
import_transactionsImport a bank/card CSV as balanced entries β€” preview β†’ confirm, with dedup
manage_rulesCreate/list/delete/test/suggest auto-categorization rules (categorize β†’ account/property, or exclude) that power import-preview suggestions; action=suggest scans past categorizations and returns candidate rules for descriptions with 2+ occurrences
categorize_transactionRe-categorize the income/expense leg of an existing entry β€” explicit account or apply a stored rule
reconcileMatch a bank/card statement CSV against the ledger and mark postings cleared β€” preview then commit
manage_receiptsAttach, list, delete, or get a signed download URL for receipt data; optionally upload the original file (JPEG, PNG, WEBP, HEIC, or PDF) to Railway Bucket storage
generate_reportMonthly reconciliation summary, or fiscal-year Schedule C / Schedule E tax P&L
export_reportRender any report as markdown or CSV
send_reportRun a report and email it via Resend
query_transactionsList entries + postings by date range / account
account_balancesCurrent balance per account

Resources

Bookie exposes two MCP resources that an LLM can read without calling a tool:

Resource URIMIME typeWhat it contains
bookie://accountsapplication/jsonAll active accounts with their current balances
bookie://reports/{year}text/markdownAnnual fiscal snapshot: Schedule C, Schedule E, and a one-row-per-month summary (opening balance, net income, cleared postings count)

Prompts

Three canned workflow prompts guide the LLM through common bookkeeping tasks:

PromptParametersPurpose
monthly-closeyear, monthStep-by-step month-end close: import CSV β†’ categorize β†’ reconcile β†’ report β†’ (optional) email
categorize-uncategorized(none)Find journal entries with no income/expense leg and walk through categorizing each
prepare-tax-summaryyearGenerate Schedule C + E, export as markdown and CSV, optionally email

Docs

Safety

Bookie stores financial data in your Neon Postgres database; connection strings live in .env (gitignored) and Railway env vars β€” never commit them. The HTTP transport requires auth on every /mcp request: either a static Bearer token (BOOKIE_API_KEY) or an OAuth JWT issued by the /token endpoint. Always set at least one before exposing the server beyond localhost. See docs/DEPLOYING.md for the full Claude.ai connector OAuth setup.