ZenMoney (Дзен-мани) finance for AI agents: transactions, reports, budgets, debts
Runs on your machine from its package; the steps are below.
Not assessed yet.
Odel charges nothing per call. The publisher may charge for its own service.
Runs locally over stdio
This server isn't hosted — your MCP client launches it from a package registry. Use one of the commands below, or drop the config into your client (e.g. Claude Desktop).
Run
npx -y mcp-server-zenmoney
MCP client config
{
"mcpServers": {
"zenmoney": {
"command": "npx",
"args": [
"-y",
"mcp-server-zenmoney"
]
}
}
}MCP server for ZenMoney (Дзен-мани). It gives an AI agent access to your accounts and balances, lets it search transactions and build reports, read and set monthly budgets, see planned (recurring) operations and debts, categorize spending, and record or edit transactions with safety rails. It talks to the official ZenMoney API v8 (POST /v8/diff/ sync protocol and POST /v8/suggest/) using an OAuth token, e.g. one issued through Zerro.
Unofficial project, not affiliated with ZenMoney or Zerro. Your token and data stay on your machine.
Requirements: Node.js >= 22.
ZENMONEY_TOKEN=... npx -y mcp-server-zenmoney --check prints OK: <login>, main currency …, N active accounts, M transactions (exit code 1 with the reason otherwise).Without a token the server still starts; every tool then explains how to configure one.
claude mcp add zenmoney -e ZENMONEY_TOKEN=YOUR_TOKEN -- npx -y mcp-server-zenmoney
claude_desktop_config.json, ~/.cursor/mcp.json, …:
{
"mcpServers": {
"zenmoney": {
"command": "npx",
"args": ["-y", "mcp-server-zenmoney"],
"env": { "ZENMONEY_TOKEN": "YOUR_TOKEN" }
}
}
}
User-wide config ~/.omp/agent/mcp.json (or per project .omp/mcp.json), inside mcpServers:
"zenmoney": {
"type": "stdio",
"command": "npx",
"args": ["-y", "mcp-server-zenmoney"],
"env": { "ZENMONEY_TOKEN": "${ZENMONEY_TOKEN}" }
}
omp expands ${VAR} placeholders, so the token can stay in your shell environment. Then /mcp reload.
umask 077 && printf '%s' 'YOUR_TOKEN' > ~/.config/zenmoney-token
and use "env": { "ZENMONEY_TOKEN_FILE": "~/.config/zenmoney-token" } instead of ZENMONEY_TOKEN.
Add "ZENMONEY_READ_ONLY": "true" to env, or --read-only to args. Write tools are then not registered at all.
ZENMONEY_TOKEN=... npx -y mcp-server-zenmoney --http --port 3000
http://127.0.0.1:3000/mcp; GET /health returns {"ok":true}; any other path is 404.127.0.0.1. Loopback binds (127.0.0.1, localhost, ::1) apply Host/Origin validation against DNS rebinding.--host / MCP_HTTP_HOST is refused unless MCP_HTTP_TOKEN is set. When set (on any bind), clients must send Authorization: Bearer <MCP_HTTP_TOKEN>, otherwise they get 401. It is a single-user server: whoever has that token has your ZenMoney access, so keep it on a private network.| Variable / flag | Default | Meaning |
|---|---|---|
ZENMONEY_TOKEN | — | ZenMoney API token from https://zerro.app/token |
ZENMONEY_TOKEN_FILE | — | File containing the token (used when ZENMONEY_TOKEN is empty; ~ expanded) |
ZENMONEY_READ_ONLY / --read-only | false | 1/true/yes/on registers only read tools |
ZENMONEY_SYNC_TTL | 30 | Seconds before data is re-synced on the next tool call |
ZENMONEY_CACHE_DIR | $XDG_CACHE_HOME/mcp-server-zenmoney, else ~/.cache/mcp-server-zenmoney | Snapshot cache directory |
ZENMONEY_CACHE | on | 0/false/no/off keeps data in memory only |
ZENMONEY_API_URL | https://api.zenmoney.ru, fallback https://api.zenmoney.app | Pin a single API origin |
MCP_TRANSPORT / --http | stdio | http serves Streamable HTTP |
MCP_HTTP_HOST / --host | 127.0.0.1 | HTTP bind address |
MCP_HTTP_PORT / --port | 3000 | HTTP port |
MCP_HTTP_TOKEN | — | Bearer token HTTP clients must send; required for non-loopback binds |
--check | — | Sync once with the configured token, print a one-line summary and exit |
--help, -h / --version, -v | — | Print usage / version |
CLI flags take precedence over the corresponding environment variables.
Read tools (always registered, annotated readOnlyHint):
| Tool | Purpose |
|---|---|
get_overview | Start here: today's date, main currency, net worth, account balances, this month's income/expenses, upcoming planned operations, data freshness |
list_accounts | Accounts with balances (also in main currency), credit limits, bank and flags |
list_categories | Category tree with kind (expense/income/both) and 12-month usage counts |
list_payees | Known payees ranked by use, with last date and usual category |
list_transactions | Filtered, paginated transaction search plus income/expense totals of all matches |
summarize_transactions | Aggregate by category, parent category, payee, account or day/week/month/year; measure=both for cash flow |
get_budget | Monthly budget vs. actual, remaining, % used and still-planned operations per category |
list_planned | Planned / recurring operations still pending in a date range, with expected totals |
list_debts | Per-person debt balances (positive = they owe you); optionally a person's debt transactions |
suggest_category | Category/merchant suggestions for payee names from ZenMoney and your own history |
sync | Pull changes from ZenMoney now; full=true re-downloads everything |
Write tools (not registered in read-only mode):
| Tool | Purpose |
|---|---|
create_transactions | Record up to 50 expenses, incomes, transfers or debt operations; auto-categorizes, warns about duplicates |
update_transactions | Edit amount, account, category, payee, comment, date, original amount; transfer destination. Type cannot change |
delete_transactions | Soft-delete transactions by id |
restore_transactions | Bring deleted transactions back (as copies with new ids) |
create_category | Create a category or subcategory (one nesting level) |
update_category | Rename, move, change kind, budget inclusion, mandatory flag, archive |
delete_category | Delete a category, moving its transactions and planned operations to move_to or uncategorizing them |
set_budgets | Set exact monthly budgets per category, total or uncategorized; 0 removes |
create_account | Create a cash, card, checking or e-money account |
update_account | Rename, archive, include/exclude from balance, savings flag, credit limit |
adjust_account_balance | Match a real balance by recording a correction income/expense |
Write tools carry MCP annotations: creating tools are non-destructive (destructiveHint: false); editing/deleting tools are destructiveHint: true, so clients that honor hints can ask for confirmation.
create_transactions, update_transactions, delete_transactions, delete_category and set_budgets accept dry_run: true: they resolve everything and return the would-be result (for updates: before/after per transaction) without sending anything to ZenMoney.
Clients that support MCP prompts (e.g. as slash commands) get three workflows that only orchestrate the tools above:
| Prompt | Arguments | What it does |
|---|---|---|
monthly_review | month (YYYY-MM) | Income, spending vs. previous month, budget status, large transactions, upcoming payments, suggestions |
categorize_transactions | period | Proposes categories for uncategorized transactions, applies after confirmation (dry run first) |
plan_budget | month (YYYY-MM) | Proposes budgets from the last three months and planned payments, applies with set_budgets after confirmation |
These are also sent to the agent as server instructions.
type gives the direction: expense, income, transfer (between own accounts), debt_out (money given to a person: lending or repaying), debt_in (money received: borrowing or being repaid)."Parent / Child" category paths, or ids. Accounts can also be referenced by card last digits (4+).RUB, USD, KZT, ...). Dates are YYYY-MM-DD.period: today, yesterday, this_week, last_week, this_month, last_month, this_quarter, last_quarter, this_year, last_year, last_7_days, last_30_days, last_90_days, last_12_months (weeks start Monday; date_from/date_to override either end).list_transactions follow the same rules (in-balance, not deleted), even when the listed transactions include off-balance or deleted ones.update_transactions category replaces the main category and keeps secondary tags; null leaves the transaction uncategorized. Moving a transaction to an account in another currency requires the new amount. Changing only amount of a same-currency transfer updates both sides unless the received amount differed (a fee), which is kept.restore_transactions re-creates each transaction under a new id; restoring the same transaction again is a no-op that points at the existing copy.set_budgets sets an exact amount (lock on); 0 removes the budget. Budgets without the lock (set in the app) also include the month's planned operations, as in ZenMoney. The profile's month start day is honored. Rollover between months is not modelled.🤖 [Zerro Data] account and the reminders attached to it are ignored everywhere./v8/diff/: a full download on first use, incremental diffs afterwards. Data older than ZENMONEY_SYNC_TTL seconds is refreshed automatically before a tool runs; sync forces it.<cache dir>/snapshot-<hash>.json (directory created 0700, file 0600). The filename is a hash of token and API origin; the token itself is never written to disk. The snapshot does contain your financial data. Set ZENMONEY_CACHE=off to keep everything in memory.https://api.zenmoney.ru first; if it rejects the token before any request has succeeded, https://api.zenmoney.app is tried. ZENMONEY_API_URL pins a single origin.TZ (e.g. TZ=Asia/Almaty) in the server's env if the agent host runs in a different zone.snapshot-*.json files after rotating a token.adjust_account_balance records a correction transaction.git clone https://github.com/krax1337/mcp-server-zenmoney && cd mcp-server-zenmoney
npm install # also builds dist/
npm run typecheck # tsc --noEmit
npm test # vitest; offline, against an in-repo fake ZenMoney server in test/
node dist/index.js # run the local build
Releases: bump version in package.json and server.json, then push a vX.Y.Z tag. The Publish workflow tests, publishes to npm via Trusted Publishing (no token, with provenance) and to the MCP Registry as io.github.krax1337/mcp-server-zenmoney.
Source layout:
src/index.ts — entry point, stdio and HTTP transportssrc/config.ts — environment variables and CLI flagssrc/server.ts — MCP server and agent instructionssrc/prompts.ts — MCP prompts (monthly_review, categorize_transactions, plan_budget)src/tools/ — MCP tools (read.ts, write.ts, shared schemas and context)src/zenmoney/ — API client (api.ts), sync store and cache (store.ts), ledger semantics (ledger.ts), analytics (analytics.ts), write builders (writes.ts), dates and typesMIT