{"name":"io.github.yuens1002/bookie","slug":"yuens1002-bookie","title":null,"description":"Double-entry bookkeeping MCP server — import bank CSVs, categorize, reconcile, tax reports.","url":"https://mcp.market/server/yuens1002-bookie","rating":null,"grade":"C","score":68,"certified":false,"status":"active","category":"finance","tags":["finance"],"presence":{"score":15,"stars":0,"forks":0,"downloads_week":null,"last_push_at":"2026-09-18T11:40:08.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/yuens1002/bookie","website":null,"version":"0.8.5","remotes":[],"packages":[{"registryType":"npm","identifier":"bookie-mcp","version":"0.8.5","transport":{"type":"stdio"},"environmentVariables":[{"description":"Neon pooled Postgres connection string — the ledger database","isRequired":true,"format":"string","isSecret":true,"name":"BOOKIE_DB_URL"},{"description":"Neon direct (non-pooled) Postgres connection string, used for schema push","isRequired":true,"format":"string","isSecret":true,"name":"BOOKIE_DB_DIRECT_URL"},{"description":"Static Bearer token for authenticating requests (printed by `npm run setup`)","isRequired":true,"format":"string","isSecret":true,"name":"BOOKIE_API_KEY"}]}],"tools":[{"name":"account_balances","description":"Compute the current balance of every account (sum of its postings). Optionally filter by segment or as of a date.","write_action":false,"price_micros":0,"input_schema":null},{"name":"add_transaction","description":"Record a single transaction as a balanced double-entry. Money flows FROM one account TO another: for spending, from your bank/card to an expense account; for income, from an income account to your bank. Amounts are positive, in dollars.","write_action":false,"price_micros":0,"input_schema":null},{"name":"categorize_transaction","description":"Change the category account on an existing journal entry — useful for fixing an imported entry posted to the wrong account, or for categorizing an entry that was added without one. Works on entries with exactly one income/expense leg; for split entries (multiple category legs), delete and re-enter with split_transaction. Supply either targetAccountId (explicit) or ruleId (apply a stored categorize","write_action":false,"price_micros":0,"input_schema":null},{"name":"delete_transaction","description":"Permanently delete a journal entry and its postings (used to correct mistakes or remove duplicate imports). Returns what was deleted. This cannot be undone.","write_action":true,"price_micros":0,"input_schema":null},{"name":"export_report","description":"Run a report and render it as markdown or CSV. Accepts the same parameters as generate_report plus a format. Markdown is human-readable; CSV is suitable for spreadsheet import. The report data is fetched fresh — no need to call generate_report first.","write_action":true,"price_micros":0,"input_schema":null},{"name":"generate_report","description":"Generate a financial report. type='monthly-reconciliation': opening/closing balance for an optional bank/card account, income/expense totals by segment, uncategorized entries, and uncleared postings — requires year + month. type='schedule-c': fiscal-year P&L for sole-proprietor segments (taxSchedule=C) grouped by Schedule C tax line — requires year only. type='schedule-e': fiscal-year rental P&L f","write_action":false,"price_micros":0,"input_schema":null},{"name":"import_transactions","description":"Import a bank/card statement (CSV) for one account, as balanced double-entry transactions. Two-step: run with mode='preview' (default) to parse, deduplicate, and flag possible matches — this writes nothing — then review the plan, decide a category account per row, and call again with mode='commit' and `mappings`. The amount sign is handled per profile; posting direction follows the statement (a ch","write_action":false,"price_micros":0,"input_schema":null},{"name":"manage_accounts","description":"Create, list, or archive ledger accounts. Income/expense accounts double as spending categories and belong to a segment (which sets the tax form); attach a taxLine for the specific Schedule line. Bank/card (asset/liability) accounts are usually segment-neutral (omit segmentId).","write_action":true,"price_micros":0,"input_schema":null},{"name":"manage_properties","description":"Create, list, or archive rental properties. Schedule E is filed per property, so rental transactions are tagged with a propertyId (and optional unit) in add_transaction. Non-rental work doesn't need properties.","write_action":true,"price_micros":0,"input_schema":null},{"name":"manage_receipts","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"manage_rules","description":"Create, list, delete, test, or get suggestions for auto-categorization rules. A rule matches a case-insensitive substring of a transaction's description and either routes it to a category account (action=categorize, optionally tagging a rental property) or marks it to skip on import (action=exclude — e.g. transfers between your own accounts). Higher priority wins; ties break on longer pattern. The","write_action":true,"price_micros":0,"input_schema":null},{"name":"manage_segments","description":"Create, list, or archive segments — lines of business (or 'Personal'). Each segment is its own P&L and tax filing (Schedule C, Schedule E, or none for personal), but all share one ledger so they combine at year-end. Income/expense accounts belong to a segment; bank/card accounts stay segment-neutral.","write_action":true,"price_micros":0,"input_schema":null},{"name":"query_transactions","description":"List journal entries with their postings, filtered by date range and/or account. Returns newest first.","write_action":false,"price_micros":0,"input_schema":null},{"name":"reconcile","description":"Match a bank/card statement (CSV) against the ledger to mark postings as cleared. Two-step: run with mode='preview' (default) to see matched postings, statement lines missing from the ledger, and uncleared ledger postings absent from the statement — writes nothing. Call again with mode='commit' to persist the matches (mark cleared=true). Uses the same CSV profiles as import_transactions. Idempoten","write_action":false,"price_micros":0,"input_schema":null},{"name":"send_report","description":"Run a report and email it via Resend. Same parameters as generate_report plus a recipient address. The report is rendered as markdown and sent as the email body. Requires RESEND_API_KEY and RESEND_FROM env vars.","write_action":true,"price_micros":0,"input_schema":null},{"name":"split_transaction","description":"Record one purchase (or deposit) that splits across multiple categories — e.g. a receipt with both business and personal items. Creates a single balanced journal entry: one leg on the payment account (the bank/card — this is what a statement shows and what reconciliation matches) plus one leg per category. Use this instead of add_transaction when a single statement line maps to several categories.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":68,"grade":"C","scanned_at":"2026-09-26T11:37:34.119Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-26T11:37:34.157Z","components":{"code":{"score":15,"max":25,"notes":["33 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":15,"max":15,"notes":["last push 8 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[{"id":"install.script","severity":"medium","component":"code","title":"npm install lifecycle script present"},{"id":"install.script","severity":"medium","component":"code","title":"npm install lifecycle script present","evidence":"package.json: …t run\", \"test:watch\": \"vitest\", \"postinstall\": \"prisma generate\" }, \"dependencies\"…"}],"inputs":{"packages":[{"registryType":"npm","identifier":"bookie-mcp","version":"0.8.5","found":true,"license":"MIT","hasInstallScripts":true,"dependencyCount":12,"publishedAt":"2026-07-03T11:26:04.038Z"}],"repo":{"found":true,"owner":"yuens1002","repo":"bookie","archived":false,"pushedAt":"2026-09-18T11:40:08Z","stars":0,"forks":0,"openIssues":1,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/6596603?v=4","ownerCreatedAt":"2014-02-05T16:18:54Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/6596603?v=4&s=128","source":"github"},"presence":{"stars":0,"forks":0,"downloadsWeek":null,"license":"MIT","lastPushAt":"2026-09-18T11:40:08.000Z","score":15}}}},"grade_history":[],"reviews":[]}