gnucash-mcp

gnucash-mcp

Full double-entry accounting on local GnuCash books: transactions (single and batch), invoices and bills, budgets, investment lots, scheduled transactions, reconciliation, and reports. Multi-currency and multi-book aware, with a plain-text audit trail of every write. Your data never leaves your machine.

Category
访问服务器

README

gnucash-mcp

Free, open-source accounting software that works with the LLM.

Talk to your GnuCash books through Claude (or any AI assistant that supports MCP). Ask "how am I doing this month," dictate your transactions out loud, hand over the books for the AI to keep up while you focus on running your life or your business.

Your data stays on your machine. Your audit log stays on your machine. Nothing is uploaded anywhere — the AI reads and writes your local GnuCash file, and that's it.

Three real, populated sample books ship in this repo so you can try it before you commit anything. They're realistic — full years of activity, mixed currencies, customers, invoices, budgets, the works. Walk through one in five minutes; if it clicks, point the server at your own book and you're done.

The samples are frozen snapshots, not living books — expect the dashboard to flag stale prices and pending scheduled transactions that have accumulated since their last regeneration. That's realistic too (it's what a book looks like after a vacation). To rebuild them fresh through today, run the deterministic generators in scripts/synthetic_book/ (phase scripts, in order).


What does it look like?

This is what your AI assistant sees when it opens one of the sample books — a complete financial dashboard in a single call:

Book: samples/alex-chen-morales.gnucash
Currency: USD
Data range: 2025-01-01 to 2026-05-31
Last entry: 2026-05-31 (future-dated, 31 days ahead)
Warnings:
  ⚠ Past due invoice: Berlin Digital GmbH 58 days past 30-day default, EUR 4,200 (no term set)
  ⚠ Stale price: GBP last updated 150 days ago
Accounts: 108 total
Assets: 12 accounts, USD 602680.49
  Condo: USD 473250.00
  VTSAX: 230.7620 VTSAX @ 170.99 (USD 39457.99)
  Vehicle: USD 27845.00
  401k: USD 13404.62
  Checking Account: USD 12393.11
  ...
Liabilities: 4 accounts, USD 418457.79
  Credit cards (2): USD 38044.26
  Loans (2): USD 380413.53
  Top 3: Mortgage USD 372199.55, Chase Sapphire USD 22383.23, Business Amex USD 15661.03
Receivables: 3 accounts, USD 10246.46
  Accounts Receivable EUR: USD 4908.96
  Accounts Receivable: USD 3500.00
  Accounts Receivable CAD: USD 1837.50
Reconciliation:
  Checking Account: 174 splits unreconciled (4 months behind, oldest: 2025-12-30) ⚠
  7 accounts never reconciled ⚠
Net worth trajectory:
  12mo ago: USD 187,925
   6mo ago: USD 180,614
   3mo ago: USD 191,350
   1mo ago: USD 185,444
       now: USD 184,223
Monthly net (last 6 months):
  Apr 2026 (MTD): -9,056
  Mar 2026: +3,092
  Feb 2026: +5,202
  Jan 2026: +1,086
  Dec 2025: +4,853
  Nov 2025: -1,494
Runway: 121 days (USD 84,579 liquid / USD 694/day burn)
Budget (2026 Annual Budget): 41% used / 33% elapsed (+8% over pace)
Transactions: 2473
Scheduled: 13 recurring, none due in next 7 days
Business: 4 customers, 2 vendors, 1 employee

That's not a screenshot — that's the AI's actual orientation view. Net worth trajectory, runway, budget pacing, who owes you money, what's overdue, what hasn't been reconciled. One call, and your assistant has the full picture before you've even finished saying hello.


Who is this for?

  • Personal finance people who keep their books in GnuCash and want to dictate transactions, ask their assistant where the money's going, get reconciliation help, plan budgets.
  • Small business owners who run their books in GnuCash and want to issue invoices, track receivables, see vendor spending, manage cash flow without leaving the conversation.
  • People who care that their data stays local. No cloud sync. No SaaS. Your .gnucash file is the system of record; this just gives your AI a way to read and write it the way GnuCash itself does.

You don't need to be a developer. You need:

  • A computer (Mac, Windows, or Linux)
  • GnuCash itself, or willingness to install it (free at gnucash.org)
  • An AI assistant that supports MCP (Claude Desktop is the most common; Claude Code, Continue.dev, and others work too)
  • 10 minutes to get the sample books running, then another 10 to point at your own

Try it without risking anything

The repo ships three sample books — fully-populated synthetic ledgers you can talk to without touching your real data. Pick one, point the server at it, and start asking questions.

samples/alex-chen-morales.gnucash — Personal + freelance

A Seattle-based independent software contractor with a US LLC. USD-default. ~141 accounts, ~2,475 transactions across 2025– 2026. Has a mortgage, a brokerage with VTSAX/VBTLX/AAPL/MSFT/ETH holdings, a 401(k), four customers spanning USD/EUR/GBP/CAD with foreign-currency invoices, scheduled bills, a budget — pretty much everything the server can do, all in one book.

samples/lin-wei.gnucash — Cross-border small business

A Shenzhen-based small-business owner running a cross-border e-commerce operation. CNY-default. ~105 accounts, ~1,960 transactions. Chinese-named customers paying in CNY, USD/EUR customers paying in foreign currency with realized FX gain/loss on rate moves, domestic Chinese investments (茅台, 宁德时代, ETFs), an LPR-based mortgage, mixed payment rails (checking + Alipay + WeChat Pay).

samples/sabine-brenner.gnucash — German freelancer, SKR03 chart

A Munich-based freelance consultant. EUR-default, on a German SKR03 chart of accounts — every account name in German. ~110 accounts, ~1,500 transactions. This is the i18n oracle: if a feature secretly assumes English account names or USD, Sabine's book is where it breaks.

All three books are fictional. See samples/README.md for the full breakdown of what's in each.


Quick Start (5 minutes)

1. Download

git clone https://github.com/ninetails-io/gnucash-mcp.git

That's the whole install — there's no build or install step. The client launches the server with uv run (next step), which syncs dependencies from the lockfile automatically on every start. To update later, just git pull inside the repo; the next launch picks up new code and new dependencies with nothing else to do.

If you don't have uv, install it with one line: curl -LsSf https://astral.sh/uv/install.sh | sh

2. Make a working copy of a sample book

The server writes audit logs and auto-backups alongside the book file. You don't want either of those committed back to the repo, so copy the book somewhere outside the repo first:

mkdir -p ~/gnucash-mcp-scratch
cp gnucash-mcp/samples/alex-chen-morales.gnucash ~/gnucash-mcp-scratch/alex.gnucash

3. Tell Claude Desktop about the server

Find your Claude Desktop config:

  • Mac: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json

Add this — replace /path/to/gnucash-mcp with the repo you just cloned, and GNUCASH_BOOK_PATH with your book's path:

{
  "mcpServers": {
    "gnucash": {
      "command": "uv",
      "args": [
        "run",
        "--directory",
        "/path/to/gnucash-mcp",
        "gnucash-mcp",
        "--modules=all"
      ],
      "env": {
        "GNUCASH_BOOK_PATH": "/Users/yourname/gnucash-mcp-scratch/alex.gnucash"
      }
    }
  }
}

uv run --directory runs the server straight from the clone, resyncing dependencies each launch — so a git pull is all it takes to update. --modules=all loads every tool (111 of them) so you can poke at anything. Once you know what you actually use, narrow it — see choosing a module set below.

Quit Claude Desktop completely (not just close the window — quit) and reopen it. Look for the hammer 🔨 icon next to the text input. That means the server's connected.

4. Try it

Ask Claude:

  • "Summarize the book."
  • "What's my net worth been doing?"
  • "Show me anyone who owes me money."
  • "What did I spend on dining last month?"
  • "Set a $500 monthly grocery budget."

The first response usually starts with the dashboard from above. Everything after that is conversational.

When you're ready to point at your own book, replace the GNUCASH_BOOK_PATH value with the path to your real .gnucash file (more on that next), restart Claude Desktop, and ask away.


Connecting to your own book

One-time conversion: GnuCash file format

The server only reads the SQLite form of GnuCash files, not the older XML form. To convert:

  1. Open your book in GnuCash itself
  2. File → Save As
  3. Change "Data Format" to SQLite3
  4. Save with a new filename (e.g. mybook-sqlite.gnucash)
  5. Keep the XML original as a backup.

On Linux (Debian/Ubuntu), SQLite3 may be missing from the "Data Format" drop-down entirely — GnuCash needs a backend driver that isn't installed by default. Close GnuCash, install it, then reopen and the option appears:

sudo apt update && sudo apt install libdbd-sqlite3

You only do this once. From then on, GnuCash and the MCP server both work against the same SQLite file.

Set the path

Update GNUCASH_BOOK_PATH in your Claude Desktop config to point at your own SQLite-format book. Restart Claude Desktop.

Use absolute paths, not ~ or relative paths. On Mac/Linux: /Users/yourname/Documents/mybook.gnucash. On Windows: C:\\Users\\yourname\\Documents\\mybook.gnucash (note the doubled backslashes — that's a JSON requirement).

Other AI clients

This is an MCP server, so it works with any client that speaks MCP. Notes for non–Claude Desktop clients:

  • Claude Code: claude mcp add-json gnucash '{"command":"uv","args":["run","--directory","/path/to/gnucash-mcp","gnucash-mcp","--modules=all"],"env":{"GNUCASH_BOOK_PATH":"/path/to/your/book.gnucash"}}' Add --scope user for all projects, --scope project for this one only.
  • Gemini CLI: gemini mcp add -e GNUCASH_BOOK_PATH="/path/to/your/book.gnucash" gnucash uv run --directory /path/to/gnucash-mcp gnucash-mcp --modules=all This writes a project .gemini/settings.json with the server registered; run /mcp list inside Gemini to confirm it shows gnucash - Ready. (Verified on Linux — if GnuCash never offered a SQLite3 export, see the libdbd-sqlite3 note above. The Gemini walkthrough and the Linux driver fix both come from @hpuri's testing in #89 — thanks.)
  • Anything else: set GNUCASH_BOOK_PATH and run uv run --directory /path/to/gnucash-mcp gnucash-mcp. Any client that can spawn a command and speak MCP over stdio will work.

Choosing a module set

--modules=all is the easy default — every tool, 107 of them. For day-to-day use you'll probably want less. Pick the role that matches how you'll talk to the server. Each role is a group that expands to the underlying tool modules; you can also pick the leaves individually for a finer cut.

Role What it gives you Tools
core Ledger primitives — accounts, transactions, balances, slots, audit log, backups, balance sheet, reconciliation. Always loaded. 29
bookkeeper Run reports, manage budgets, schedule recurring transactions. The personal-finance management cluster. (Reconciliation moved into core — any configuration that handles money needs it.) 17
investor Cost-basis tracking + price/commodity management. Tax-lot accounting needs prices to compute gains, so the bundle is the useful unit. 12
freelancer Customer invoicing + sales tax, plus billterms (payment terms), jobs (per-project P&L rollups), and credit notes (customer refunds). The full solo-consultant toolkit. 31
business Full small-business package — group alias that expands to freelancer (invoicing) plus business_complete (vendors, employees, bills, vouchers, vendor reports). 48

Pick one or more, comma-separated:

"args": ["--modules=bookkeeper"]            // personal finance
"args": ["--modules=investor"]              // self-directed investor
"args": ["--modules=freelancer"]            // solo contractor
"args": ["--modules=business"]              // small business (= freelancer + business_complete)
"args": ["--modules=bookkeeper,investor,freelancer"]  // most things

core is force-added regardless; the explicit listing in the examples above is for clarity. The leaf modules behind each group (reconciliation, reporting, budgets, scheduling, tax_lots, portfolio, etc.) are individually selectable too — run uv run gnucash-mcp --help from the repo for the full menu.


What you can ask it to do

A non-exhaustive tour. Phrase any of these naturally — the assistant translates.

Recording activity

"I spent $47.50 at Safeway today on groceries, paid with my Visa."

Recorded: $47.50 from Credit Card:Visa to Expenses:Groceries on Apr 30, 2026. Description: "Safeway".

Setting up recurring bills

"Set up my rent as a recurring bill. $1,850 on the 1st of every month from checking."

Created scheduled transaction "Monthly Rent": $1,850 monthly, from Assets:Checking to Expenses:Rent. Next due: May 1, 2026.

Investment tracking

"I bought $1,000 of VTSAX at $170.99/share in my 401(k)."

Recorded VTSAX purchase: 5.85 shares at $170.99/share. Cost basis: $1,000.00. Lot created for capital-gains tracking when you eventually sell.

Invoicing customers

"Create a customer called Acme Corp and invoice them $1,500 for consulting."

Created customer Acme Corp (id 000005) and invoice 000019: 1× Consulting at $1,500.00 = $1,500.00. Open. Tell me when you're ready to post it.

Foreign-currency invoicing

"Invoice Berlin Digital €4,200 for Q1 retainer, due in 30 days."

Created EUR invoice 000020 for Berlin Digital GmbH: 1× Q1 Retainer at EUR 4,200 = EUR 4,200. Net 30. When they pay, I'll book the realized exchange-rate gain/loss to your FX account automatically.

Asking questions

"How much did I spend with each vendor this year?"

Office Depot: $2,340 (4 bills, $0 outstanding) CloudHost Inc: $1,200 (2 bills, $600 outstanding) Legal Associates: $3,500 (1 bill, $3,500 outstanding) Total billed $7,040 / paid $2,940 / outstanding $4,100.

Reconciliation

"Help me reconcile checking against the April statement."

[Walks you through it: pulls unreconciled splits, asks you to confirm cleared transactions, computes the running balance, marks the matched ones reconciled, leaves the mismatches for you to investigate.]


Privacy and safety

Your data does not leave your machine. This server is a local process that reads and writes a local file. The AI assistant you're talking to (Claude Desktop, etc.) sees the results of your tool calls — the same content you'd see on screen — but the file itself stays where it always was.

Every write is logged. A human-readable audit trail lives alongside your book file at <your-book>.gnucash.mcp/audit/, one log file per day. You can read it at any time to see exactly what changed and when. Sample entry:

2026-04-30 14:32  POST INVOICE  id:000019
    total: 1500.00  date: 2026-04-30
    account: Assets:Accounts Receivable  txn:a1b2c3d4

Automatic backups. Before the very first write of each session, the server snapshots your book to <your-book>.gnucash.mcp/backups/ — so if something goes wrong, you can roll back to a known-good state without relying on Time Machine or your own habit. Backups are verified with PRAGMA integrity_check before being declared valid, and skipped when the book hasn't changed since the last snapshot. See docs/RESTORE_FROM_BACKUP.md for the rollback procedure.

Reading timestamps: backup filenames carry UTC timestamps (filesystem-safe and unambiguous across travel and DST); audit and debug logs use local-dated daily files, matching how you'd search for "what happened Tuesday." Near midnight these can differ by a day — the list_backups tool always reports both the ISO timestamp and a human age, so prefer it over eyeballing filenames.

Reconciled splits are protected. The server refuses to delete or modify reconciled splits without an explicit override, so a careless prompt can't quietly invalidate your last bank reconciliation.

Voiding ≠ deleting. When you tell the AI to "void this transaction," it uses GnuCash's proper accounting void — preserving the transaction for the audit trail with values zeroed. Deletion is the destructive option; the AI will tell you which one it's doing.

Disclaimer: This software is provided "as is" under the MIT License, without warranty of any kind. The authors are not liable for any data loss, corruption, or financial discrepancy arising from its use. You are solely responsible for maintaining your own backups and verifying the accuracy of your books.


Limiting what the AI can see

Each tool's description lives in the AI's system prompt, which costs context on every message. Narrowing the toolset to what you actually use makes every conversation cheaper. See choosing a module set above for the five role-based options (core, bookkeeper, investor, freelancer, business).

You can also set GNUCASH_MCP_MODULES=core,bookkeeper as an environment variable instead of --modules=... in the JSON args.


What's new in v1.4.2

One call wide, every surface honest — every entry traces to a named moment of live friction:

  • The bulk grammar is completeupdate_transactions (per-row TSV edits), broadcast updates (one change, many GUIDs), create_prices (batch quotes + a stale-price work list), and a cur column so foreign-denominated transactions batch-enter like everything else.
  • Reconciliation kept honestreconcile_all honors its statement-date bound; a new get_reconciliation_status tool drills down behind the dashboard's counts; statement-less accounts opt out of nagging with the no_reconcile slot; paid-off dormant cards stop warning forever.
  • The dashboard hands each session its vocabulary — your top accounts by recent posting frequency, in short-GUID form, so the AI reaches for compact refs from the first call.
  • First outside code contribution — @bhbrunt's price-lookup memoization and split-graph preload took a 33k-split book's summary from never-completing to under 10 seconds (and made small books ~45% faster too).
  • Audit trail hardened — user text is escaped before it reaches the audit log (no forged entries, no smuggled instructions), price dry-runs agree with live execution, and moving the date of a reconciled transaction now requires force=true (behavior change).

Tests: 1,954 passing.

What's new in v1.4.1

Batch entry grows up, driven by the bookkeeper's daily workflow:

  • The TSV header declares the layout — opt-in memo columns (per-split memos), a notes column (per-transaction notes), and qty columns (investment shares / foreign-currency splits). Legacy submissions parse unchanged; typo'd column names reject by name; a row may simply end once its last split's amount and account are present.
  • Auto-fill from history — a row with no split cells at all reproduces your most recent transaction with that description, marked with its source. Twelve recurring bills = twelve ref-date-description rows; dry_run the batch to preview every match first.
  • Batch deletedelete_transaction takes a list of GUIDs: one call, one save, all-or-nothing.
  • Every annotation field reachable — notes + action on invoice/bill/voucher/credit-note line items, a payment memo on pay_invoice, account notes (shared with GnuCash desktop's editor), and scheduled transactions that actually keep their description.
  • Find accounts without pagingquery on list_accounts matches path and description, so "4930" finds the SKR03 account.
  • Plus the v1.4 adversarial-review hardening (transactional switch_book, per-book backup scoping, i18n fixes) and monthly-close valuation for flow reports.

Tests: 1,856 passing.

What's in v1.4.0

The release where batch transaction entry entered the scene. v1.3 finished the business module; v1.4 makes the server work correctly on non-English books, adds bulk and multi-book workflows, and lands a second multi-currency correctness pass.

Internationalization:

  • Account resolution keys off GNCAccountType, never a localized account name — so a de_DE, es_MX, or zh_CN book resolves Income, Imbalance, and FX accounts correctly. Designated accounts (FX gain/loss, discounts) self-heal via a KVP slot that is locale- and rename-proof after first use.
  • Suspense / Imbalance accounts are excluded from runway and low-cash signals so a lopsided book doesn't skew the dashboard.
  • Three synthetic personas ship in-repo: Alex (USD), Lin Wei (CNY, zh_CN chart of accounts), and Sabine Brenner (German DATEV SKR03, EUR) — the German book is what makes the i18n bug class visible.

Batch and multi-book workflows:

  • create_transactions enters many transactions in one atomic call and returns a per-transaction result you can correlate back by a caller-supplied ref, plus a duplicates table keyed to it.
  • GNUCASH_BOOK_PATH accepts an os.pathsep-separated list of books; switch_book flips the active book mid-session (matched by unique filename prefix) with a context-reset banner so cross-book references don't leak.

Reporting:

  • Every list-returning tool paginates with offset and a Showing X-Y of Z indicator; dated tools also render the covered date range.
  • The aggregation reports take group_by for sub-period columns.

Multi-currency correctness (second pass):

  • FX gain/loss booked in the book's default currency, both-foreign posting splits valued at the posting-date rate, and lot cost basis in the default currency. Foreign debts with no FX rate are excluded from debt_payoff_plan with a warning.
  • An FX entry-sanity warning fires when a cross-currency transaction's implied rate diverges sharply from the latest price on file.

Tests: 1,714 passing.

A condensed changelog of major releases lives in CHANGELOG.md.


Troubleshooting

No 🔨 hammer icon, or "tool not found"

  • Quit Claude Desktop completely, then reopen it. (Closing the window isn't enough — you have to quit the application.)
  • Verify the paths in your config are absolute and correct.
  • Check the JSON for trailing commas — they break the config silently.

"Book not found"

  • Use absolute paths, not ~ or relative paths.
  • Mac/Linux: /Users/yourname/Documents/book.gnucash
  • Windows: C:\\Users\\yourname\\Documents\\book.gnucash (doubled backslashes — JSON requirement)

"Cannot open book" / piecash errors

  • Confirm your book is in SQLite format, not XML.
  • Make sure GnuCash isn't open with the same book — file lock.
  • Try opening the book in GnuCash itself to verify it isn't corrupted.

"Account not found"

  • Use full account paths: Expenses:Groceries, not just Groceries.
  • Or ask the assistant to list accounts: "List my accounts."

Multiple server processes after a client restart

Claude Desktop (and some other MCP clients) may briefly spawn two or three copies of the server when relaunching. This is client behavior, not a server bug, and it's mostly harmless: the server opens your book per-request and releases the file lock between calls, so overlapping processes contend only for moments. If you see persistent Lock on the file errors after a client restart, quit the client fully, confirm with pgrep -fl gnucash-mcp that no strays remain, and relaunch.

Something went wrong

  • Open the audit log at <your-book>.gnucash.mcp/audit/ — every write since the server first ran is there with before/after detail.
  • If you need to roll back, docs/RESTORE_FROM_BACKUP.md walks through it.

Support the project

If gnucash-mcp is useful to you, consider buying me a coffee. It helps keep development going.


For developers

Contributor guide and design notes live in CLAUDE.md. Quick orientation:

uv sync --extra dev
uv run pytest                       # 1,954 tests as of v1.4.2
uv run ruff check src/ tests/
uv run black --check src/ tests/

The uv run --directory PATH ... form the Quick Start uses is also how you point a client at a specific worktree — swap the directory and you're running that checkout, no reinstall. If you prefer a gnucash-mcp binary on your PATH instead, uv tool install -e ./gnucash-mcp still works and tracks your source.

The server is built on piecash (Python interface to GnuCash's SQLite books) and the MCP Python SDK. Roughly 18,000 lines of Python source, 20,000 lines of tests, modularized so disabled modules cost nothing at runtime.

License

MIT.

Acknowledgments

  • GnuCash — the free, open-source accounting software this server makes conversational.
  • piecash — Python interface to GnuCash SQLite books.
  • MCP Python SDK — the Model Context Protocol implementation.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选