# Lunch Money [Health: Active]

**Category:** 💰 Finance & Fintech  
**Repository:** https://github.com/akutishevsky/lunchmoney-mcp.git  
**GitHub Stars:** 113  
**npm Downloads (last month):** 1904  
**Views:** 2  
**Installs:** 0  
**Upvotes:** 0  
**Directory Page:** https://allmcps.com/mcp/lunch-money

## Description
MCP server for managing LunchMoney personal finances: transactions, budgets, categories, and more.

## Tools
Capabilities this server exposes over MCP:

- **get_user** — Get details on the current user
- **get_all_categories** — Get a list of all categories associated with the user's account. Returns categories in alphabetical order.
- **get_single_category** — Get details on a single category or category group, including the list of children categories for category groups.
- **create_category** — Create a new category or a category group. Set is_group=true to create a category group; supply children as an array of existing category IDs and/or strings (names of new sub-categories to create).
- **update_category** — Update properties for an existing category or category group. For category groups, supplying children replaces the group's full child list. Cannot be used to convert between category and category group.
- **delete_category** — Delete a single category or category group. By default fails (HTTP 422) if dependencies exist, returning a structured `dependents` payload. Set force=true to delete and disassociate from all related budgets, transactions, recurring items, etc. Force delete is irreversible.
- **get_all_tags** — Get a list of all tags associated with the user's account.
- **get_single_tag** — Get details of a single tag by ID.
- **create_tag** — Create a new tag.
- **update_tag** — Update properties for an existing tag.
- **delete_tag** — Delete a tag. By default fails (HTTP 422) with a structured `dependents` payload if the tag is in use by transactions or rules. Set force=true to delete and disassociate from those records.
- **get_transactions** — Retrieve transactions, optionally filtered by date range, account, category, tag, recurring item, status, and more. Returns at most `limit` transactions (default 1000, max 2000); `has_more` is set on the response when more match the filters. Pending and split-parent / group-child transactions are excluded by default.
- **get_single_transaction** — Get details of a specific transaction. The response always includes plaid_metadata, custom_metadata, files, and (for split or group parents) the children array — none of which are returned by default in get_transactions.
- **create_transactions** — Insert one or more transactions (1-500 per call). Returns inserted transactions plus any skipped duplicates.
- **update_transaction** — Update an existing transaction. Provide any subset of writable fields directly (the v2 API no longer wraps the body in a `transaction` envelope). Cannot modify split or grouped transactions; use the corresponding split/group tools instead.
- **delete_transaction** — Delete a single transaction. Fails for split/group transactions and their parents — unsplit/ungroup first. Irreversible.
- **update_transactions_bulk** — Update multiple transactions in a single call (1-500). Each entry must include `id` plus at least one writable field. Cannot be used to modify split or grouped transactions.
- **delete_transactions_bulk** — Bulk-delete transactions by ID (1-500). Fails if any ID is a split or group parent, or part of a split/group; unsplit or ungroup those first. Irreversible.
- **create_transaction_group** — Create a transaction group from 2-500 existing transactions. Source transactions are hidden from get_transactions and accessible via the new group's `children` (set include_children=true on get_single_transaction). Cannot include split or recurring transactions.
- **delete_transaction_group** — Delete (ungroup) a transaction group. The original child transactions remain and revert to normal ungrouped transactions.
- **split_transaction** — Split an existing transaction into 2-500 child transactions. The sum of child amounts must equal the parent's amount. After splitting, the parent is hidden from get_transactions and accessible via get_single_transaction (returns the parent with `children`).
- **unsplit_transaction** — Unsplit a previously split transaction by deleting its children and restoring the parent. Pass the parent (split_parent_id) — not a child — as the path id.
- **attach_file_to_transaction** — Attach a local image or PDF receipt (max 10MB) to a transaction. Allowed types: image/jpeg, image/png, image/heic, image/heif, application/pdf. The file is read from the local filesystem of the host running this MCP server, and its type is determined from its actual contents — files that are not a real image or PDF are rejected. If LUNCHMONEY_ATTACHMENTS_DIR is set on the host, only files inside that directory can be attached.
- **get_transaction_attachment_url** — Get a short-lived signed download URL for a transaction file attachment. The response includes the URL and an `expires_at` timestamp.
- **delete_transaction_attachment** — Delete a transaction file attachment. Irreversible.
- **get_recurring_items** — Retrieve a list of recurring items expected for a specified date range. The `matches` object on each item is populated based on the requested range.
- **get_single_recurring_item** — Retrieve a single recurring item by ID. Optional date range populates the `matches` object.
- **get_budget_summary** — Get a summary of the user's budget for a specified date range. Returns per-category totals (other_activity, recurring_activity, budgeted, available, recurring_remaining, recurring_expected). Set include_occurrences=true for a per-period breakdown matching the account's budget periodicity. (Backed by the v2 GET /summary endpoint.)
- **get_budget_settings** — Get budget period and display settings for the account (granularity, period length, anchor date, hide-no-activity preference, income option, rollover-left-to-budget setting).
- **upsert_budget** — Create or update a budget for a category and budget period. The start_date must be a valid budget period start for the account (see get_budget_settings).
- **remove_budget** — Remove the budget for a specific category and period. The request is idempotent — succeeds even if no budget exists for the period.
- **get_all_manual_accounts** — Get a list of all manually-managed accounts associated with the user. (Formerly known as `assets` in the v1 API.)
- **get_single_manual_account** — Get details of a single manual account by ID.
- **create_manual_account** — Create a new manually-managed account. (Formerly `create_asset`.)
- **update_manual_account** — Update an existing manually-managed account. (Formerly `update_asset`.)
- **delete_manual_account** — Delete a manually-managed account. Optionally also delete its transactions/rules/recurring items, and/or its balance history. Both deletion options are irreversible.
- **get_all_plaid_accounts** — Get a list of all Plaid (synced) accounts associated with the user.
- **get_single_plaid_account** — Get details of a single Plaid (synced) account by ID.
- **trigger_plaid_fetch** — Trigger a fetch of latest data from Plaid. Optionally scope the fetch to a date range and/or a specific Plaid account ID. Note: Plaid enforces a minimum 60-second delay between fetch requests; fetching may take up to 5 minutes.
- **get_supported_cryptocurrencies** — Get the list of cryptocurrencies supported for manual tracking. The `symbol` of an entry here is what must be passed to create_manual_crypto.
- **add_supported_cryptocurrency** — Add a new cryptocurrency to the supported manual-crypto list by submitting its CoinGecko coin-page URL. Only needed when get_supported_cryptocurrencies does not already list the symbol you want to track.
- **get_all_manual_crypto** — Get all manually-managed crypto balances associated with the user.
- **get_single_manual_crypto** — Get a single manually-managed crypto balance by ID. Call get_all_manual_crypto first to discover ids.
- **create_manual_crypto** — Create a manually-managed crypto asset. The symbol must match one returned by get_supported_cryptocurrencies.
- **update_manual_crypto** — Update a manually-managed crypto balance. At least one of name, display_name, institution_name, or balance must be supplied. The symbol of an existing balance cannot be changed.
- **delete_manual_crypto** — Delete a manually-managed crypto asset. If the asset has balance history, keep_history must be set explicitly or the API rejects the request. Irreversible.
- **get_all_synced_crypto** — Get all synced crypto accounts (Coinbase, Kraken, Ethereum wallets) and their nested per-symbol balances. Synced accounts are connected in the Lunch Money web app and cannot be created or edited through the API.
- **get_single_synced_crypto** — Get a single synced crypto account and all its nested balances by ID.
- **get_synced_crypto_balance** — Get a single balance held inside a synced crypto account, looked up by its cryptocurrency symbol.
- **refresh_synced_crypto** — Trigger a balance refresh for a synced crypto account and return the refreshed account. Reaches out to the external crypto provider.
- **get_balance_history** — Get monthly account balance history across all accounts — the data behind the Net Worth views in the LunchMoney app. History is monthly. With no month range, returns all available history plus an ephemeral `current` entry for the current month, which is calculated on demand and may change between requests. Only months with data are included.
- **get_account_balance_history** — Get monthly balance history for a single account. Call get_all_manual_accounts, get_all_plaid_accounts, or get_all_manual_crypto first to discover ids. For synced crypto holdings use get_crypto_synced_balance_history instead.
- **upsert_account_balance_history** — Create or update monthly balance history entries for a single account. Every month must be a past calendar month — the current month is calculated on demand and cannot be written. The request is all-or-nothing: if any entry fails validation, none are applied. The response contains only the entries submitted, not the account's full history.
- **delete_account_balance_history** — Delete ALL historical balance entries for a single account. This is irreversible and affects the Net Worth views. To remove a single month, use delete_balance_history_entry instead.
- **get_crypto_synced_balance_history** — Get monthly balance history for a synced crypto holding, identified by its account id and ticker symbol. Synced crypto is scoped per symbol, so it is not available through get_account_balance_history.
- **upsert_crypto_synced_balance_history** — Create or update monthly balance history entries for a synced crypto holding. Every month must be a past calendar month. If an entry sets `symbol`, it must match the symbol argument. The request is all-or-nothing.
- **delete_crypto_synced_balance_history** — Delete ALL historical balance entries for a synced crypto holding. This is irreversible and affects the Net Worth views.
- **delete_balance_history_entry** — Delete a single historical balance entry by its id. The id must come from an entry with type=historical in a balance history response; ephemeral `current` entries have no id and cannot be deleted.
- **update_deleted_account_details** — Update the display details shown for a deleted account in the Net Worth views. Applies to all historical entries for that deleted source. At least one field must be provided; pass null to clear a field.

## Claude Desktop Quick Installation
Install path detected from listing signals. Uses `npx` (confidence: high):

```json
"mcpServers": {
  "lunch-money": {
    "command": "npx",
    "args": ["-y","@akutishevsky/lunchmoney-mcp"],
    "env": {
      "LUNCHMONEY_API_TOKEN": ""
    }
  }
}
```

**Requires environment variables:** `LUNCHMONEY_API_TOKEN` — the values above are empty placeholders; fill in real credentials before running (see the repository for what each one is for).

## Documentation

## What Lunch Money does

Lunch Money exposes personal-finance operations through MCP tools backed by LunchMoney's v2 API. It can read the current user's details, list and manage categories and category groups, and create, update, or delete transaction tags. Category and tag deletions protect dependent records by returning a structured dependency error unless a force option is used.

Transaction coverage is the largest part of the server. Agents can query transactions with filters such as dates, accounts, categories, tags, recurring items, and status; retrieve detailed records; create, edit, and delete transactions; and perform bulk updates or deletions. The server also handles transaction groups, splits, unsplitting, and receipt files. Recurring items and budget information are available for planning and review workflows.

## How it works

The server implements MCP over stdio, allowing a compatible client to launch it as a local process. Requests are sent to LunchMoney's API using an API token, and responses are encoded with TOON rather than ordinary JSON to reduce token use in conversations. Input validation uses the LunchMoney v2 specification and rejects several invalid requests before they reach the API.

Transaction operations have important visibility rules. Pending transactions and split or group child records are excluded from ordinary transaction searches by default. Split or group parents can be inspected with the single-transaction tool, which includes their children. Creating a split requires child amounts to add up to the parent amount, while grouping accepts between two and 500 existing transactions.

## Setup and configuration

Install the npm package through an MCP client's stdio configuration, for example with `npx -y @akutishevsky/lunchmoney-mcp`. Set `LUNCHMONEY_API_TOKEN` to a token obtained from LunchMoney Developer Settings. The server can also be installed in Claude Desktop from its downloadable MCP Bundle, which prompts for the token during installation.

Claude Code and Codex CLI have dedicated commands for registering the server. Other MCP-compatible clients can use a configuration entry with `npx` as the command and the package name as its argument. Set `LUNCHMONEY_DEBUG=true` to write API request and response debugging information to stderr.

For receipt uploads, `attach_file_to_transaction` reads the file from the host running the server. `LUNCHMONEY_ATTACHMENTS_DIR` can restrict uploads to one directory; paths outside it, including those reached through disallowed symlinks or parent-directory traversal, are rejected.

## Tools and capabilities

- Read user details with `get_user`.
- Create, inspect, update, and delete categories and category groups.
- Create, inspect, update, and delete tags.
- Query transactions with filters and retrieve expanded single-transaction details.
- Create up to 500 transactions in one request and report skipped duplicates.
- Update or delete individual transactions, or process batches of up to 500 records.
- Create and remove transaction groups, or split and unsplit transactions.
- Attach, download through a signed URL, and delete receipt files.
- Retrieve recurring items and populate their date-range matches.
- Read budget settings and summaries, including optional per-period occurrences.
- Create or update a category budget for a valid budget-period start date.

## Limitations and notes

Destructive operations are irreversible where noted by the API, including forced category or tag deletion, transaction deletion, unsplitting, and attachment deletion. Category and tag deletion normally fails when dependent records exist; force deletion disassociates those records.

Individual and bulk transaction updates cannot modify split or grouped transactions. Those records must be handled with the relevant split or group operation. A transaction group cannot include split or recurring transactions, and a split must contain between two and 500 children whose amounts equal the parent.

Receipt uploads are limited to real JPEG, PNG, HEIC, HEIF, or PDF files no larger than 10 MB. Attachment download URLs are short-lived and include an expiration timestamp. Transaction searches return at most 2,000 records per request and indicate when more matches exist. The server targets LunchMoney's v2 API, described as alpha in its project documentation.

_Full upstream README: https://allmcps.com/mcp/lunch-money/readme_

