MCP server for managing LunchMoney personal finances: transactions, budgets, categories, and more.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste into ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
A Model Context Protocol (MCP) server implementation for LunchMoney, providing programmatic access to personal finance management through LunchMoney's API. Also available as an MCP Bundle (.mcpb) for easy installation in Claude Desktop.
Heads up β v3.0.0 removes
get_all_crypto. The crypto tools now use LunchMoney's v2 crypto endpoints, which split manual and synced holdings into separate resources and offer no combined equivalent of v1'sGET /crypto. Replaceget_all_cryptowithget_all_manual_cryptoandget_all_synced_crypto, which together return everything it did and more.update_manual_cryptoalso drops itscurrencyparameter. Nothing outside the crypto domain changed; if you don't use the crypto tools, upgrading from 2.x needs no action. See CHANGELOG.md. If you depend onget_all_crypto, pin@akutishevsky/lunchmoney-mcp@^2.2.0.
Heads up β v2.0.0 is a breaking release. This server now targets LunchMoney's v2 API (
https://api.lunchmoney.dev/v2, currently in alpha). It is not backwards-compatible with v1.x of this server: tool names, fields, and endpoint shapes have changed (for example,assetsis nowmanual_accounts,tagsarrays are nowtag_ids, transactionasset_idis nowmanual_account_id, thedebit_as_negativetoggle is gone, and the budget summary moved to a new/summaryendpoint). See CHANGELOG.md for the full list. If you depend on v1.x, pin@akutishevsky/lunchmoney-mcp@^1.4.3.
This MCP server enables AI assistants and other MCP clients to interact with LunchMoney data, allowing for automated financial insights, transaction management, budgeting, and more.
The easiest way to install this server is as an MCP Bundle in Claude Desktop:
.mcpb file from the releases page.mcpb fileAdd the LunchMoney MCP server to Claude Code:
To enable debug logging:
Verify the server was added:
Add the LunchMoney MCP server to Codex:
To enable debug logging:
Verify the server was added:
To use this MCP server with any MCP-compatible client (such as Claude Desktop), you need to add it to the client's configuration.
The server can be configured in your MCP client's configuration file. The exact location and format may vary by client, but typically follows this pattern:
Note:
LUNCHMONEY_DEBUGis optional. Set it to"true"to enable debug logging of API requests and responses to stderr. Useful for troubleshooting.
Note:
LUNCHMONEY_ATTACHMENTS_DIRis optional.attach_file_to_transactionis the only tool that reads from your filesystem, and it always verifies that a file really is a JPEG, PNG, HEIC, HEIF, or PDF before uploading it. Set this variable to a directory (say, a~/Receiptsfolder) to additionally restrict it to files inside that directory β..and symlinks that point outside are rejected. Leave it unset and any path the server can read is fair game, which is usually fine for a local stdio server but not for remote deployments.
Replace "your-api-token-here" with your actual LunchMoney API token from LunchMoney Developer Settings.
Different MCP clients store their configuration in different locations:
Claude Desktop:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.json~/.config/Claude/claude_desktop_config.jsonOther MCP Clients: Check your client's documentation for the configuration file location.
mcpServers section.npx available in your system PATHThe bundled stdio binary covers desktop MCP clients, but Claude on mobile and the custom connectors feature in claude.ai only speak HTTP. There are two ways to expose this server remotely.
lunchmoney-mcp-cloudflare wraps this package as a Cloudflare Worker with Google sign-in and an email allowlist in front of the MCP endpoint. The whole stack fits inside Cloudflare's and Google Cloud's free tiers, and a setup.sh wizard handles KV creation, OAuth client setup, secrets, and deploy in one walkthrough. Each authenticated user runs in their own Durable Object, so the config singleton stays per-user.
For a single-user deployment, wire createServer() into StreamableHTTPServerTransport and serve it from any Node HTTP framework. Example with Express:
Swap Express for Hono (via @hono/node-server) or Fastify if you prefer β the transport only needs Node's IncomingMessage and ServerResponse. Add your own auth in front of /mcp β the package ships no transport-level auth.
Set
LUNCHMONEY_ATTACHMENTS_DIRon any remote deployment.attach_file_to_transactionreads a path supplied by the caller off the host's filesystem. On a desktop stdio server the caller and the file owner are the same person, so that is unremarkable. Once the server is reachable over HTTP they are different principals, and an unconfined read is a way for a remote caller β or a prompt-injected model β to pull files off your host. Point the variable at a dedicated directory and keep nothing else in it. The content-type check (only real JPEG/PNG/HEIC/HEIF/PDF files upload) applies either way, but it is a backstop, not a substitute.
Multi-tenant warning. This pattern serves one user from one process with one shared API token. To serve multiple users from a single Node process you'd hit the single-tenant config singleton; fork the process per user or use the Cloudflare option above (each user gets their own isolate).
Here are some example prompts you can use with the LunchMoney MCP server:
get_user - Retrieve current user detailsget_all_categories - List all categories (supports format and is_group filters)get_single_category - Get details for a specific category or category groupcreate_category - Create a category or category group (set is_group=true plus children)update_category - Update properties; replaces the children list on category groupsdelete_category - Delete a category; pass force=true to override dependency checkget_all_tags - List all tagsget_single_tag - Get a tag by IDcreate_tag - Create a new tagupdate_tag - Update tag propertiesdelete_tag - Delete a tag (with force to override dependents)get_transactions - List transactions with extensive filtering options (date range, account, category, tag, status, pending, metadata, files, etc)get_single_transaction - Get full transaction details (always includes plaid_metadata, custom_metadata, files, and children for split/group parents)create_transactions - Insert 1β500 transactions in one callupdate_transaction - Partial update of one transactiondelete_transaction - Delete one transaction (cannot be split/group)update_transactions_bulk - Bulk update 1β500 transactionsdelete_transactions_bulk - Bulk delete 1β500 transactions by IDcreate_transaction_group - Create a transaction group from existing transactionsdelete_transaction_group - Ungroup a transaction groupsplit_transaction - Split a transaction into 2β500 childrenunsplit_transaction - Undo a previous splitattach_file_to_transaction - Upload a local file (jpeg/png/heic/heif/pdf, β€10MB), type verified from its contentsget_transaction_attachment_url - Get a signed download URL for a file attachmentdelete_transaction_attachment - Delete a file attachmentget_recurring_items - List recurring items for a date range (include_suggested for system suggestions)get_single_recurring_item - Get a recurring item by IDget_budget_summary - Per-category budget summary (backed by /summary); supports occurrences, totals, rollover-pool togglesget_budget_settings - Account-wide budget period and display settingsupsert_budget - Create or update a budget for a category and periodremove_budget - Remove a budget for a category and periodget_all_manual_accounts - List all manually-managed accounts (formerly "assets")get_single_manual_account - Get a manual account by IDcreate_manual_account - Create a new manually-managed accountupdate_manual_account - Update properties of a manual accountdelete_manual_account - Delete a manual account; optionally also delete its transactions / balance historyget_all_plaid_accounts - List all connected Plaid accountsget_single_plaid_account - Get a Plaid account by IDtrigger_plaid_fetch - Trigger fetch of latest data from Plaid (optionally scoped to a date range or account)get_supported_cryptocurrencies - List the cryptocurrencies supported for manual trackingadd_supported_cryptocurrency - Add a cryptocurrency to the supported list from its CoinGecko coin-page URLget_all_manual_crypto - List all manually-managed crypto balancesget_single_manual_crypto - Get a single manually-managed crypto balance by IDcreate_manual_crypto - Create a manually-managed crypto assetupdate_manual_crypto - Update a manual crypto balance's name, display name, institution name, or balancedelete_manual_crypto - Delete a manual crypto asset (irreversible)get_all_synced_crypto - List synced crypto accounts and their nested per-symbol balancesget_single_synced_crypto - Get a single synced crypto account by IDget_synced_crypto_balance - Get one balance inside a synced crypto account by symbolrefresh_synced_crypto - Trigger a balance refresh for a synced crypto accountget_balance_history - Get monthly balance history across all accounts (powers the Net Worth views); optional start_month/end_month (YYYY-MM) range filterget_account_balance_history - Get monthly balance history for one account (manual, plaid, crypto_manual, or deleted)upsert_account_balance_history - Create or update monthly balance entries for one account (past months only; all-or-nothing)delete_account_balance_history - Delete all historical balance entries for one accountget_crypto_synced_balance_history - Get monthly balance history for a synced crypto holding by account id + ticker symbolupsert_crypto_synced_balance_history - Create or update monthly balance entries for a synced crypto holdingdelete_crypto_synced_balance_history - Delete all historical balance entries for a synced crypto holdingdelete_balance_history_entry - Delete a single historical balance entry by idupdate_deleted_account_details - Update the display details (name, institution, type, subtype, mask) shown for a deleted account's balance historysrc/tools/src/index.tssrc/types.ts if neededThe package exposes subpath entry points so it can be embedded in a custom transport (for example, a Cloudflare Worker that serves the MCP protocol over HTTP) rather than only the bundled stdio binary:
initializeConfig must be called before any tool is invoked, or the first request throws "Configuration not initialized.".
Single-tenant assumption. The config is held in a module-level singleton. That is safe on per-isolate runtimes β each user gets their own isolate, so there is no shared mutable state to race on. It is not safe on shared-process multi-tenant Node hosts (e.g. one Express or Hono process serving multiple users): concurrent
initializeConfigcalls would race and leak tokens between requests. Those consumers need to fork per-user or refactor the singleton before exposing the package.
The server implements the full LunchMoney API v2. For detailed API documentation, see:
Contributions are welcome! Please feel free to submit a Pull Request.
MIT License
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/lunch-money)<a href="https://allmcps.com/mcp/lunch-money"><img src="https://allmcps.com/api/badge/lunch-money?style=directory" alt="Lunch Money on AllMCPs" /></a>