{"name":"io.github.akutishevsky/lunchmoney-mcp","slug":"akutishevsky-lunchmoney-mcp","title":"Lunch Money","description":"MCP server for managing LunchMoney personal finances: transactions, budgets, categories, and more.","url":"https://mcp.market/server/akutishevsky-lunchmoney-mcp","rating":null,"grade":"B","score":78,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":32,"stars":107,"forks":17,"downloads_week":null,"last_push_at":"2026-08-03T08:08:33.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/akutishevsky/lunchmoney-mcp.git","website":"https://github.com/akutishevsky/lunchmoney-mcp#readme","version":"3.0.0","remotes":[],"packages":[{"registryType":"npm","identifier":"@akutishevsky/lunchmoney-mcp","version":"3.0.0","runtimeHint":"npx","transport":{"type":"stdio"},"environmentVariables":[{"description":"Your LunchMoney API token. Obtain it from https://my.lunchmoney.app/settings/developer","isRequired":true,"isSecret":true,"name":"LUNCHMONEY_API_TOKEN"},{"description":"Set to 'true' to enable debug logging of API requests and responses to stderr","name":"LUNCHMONEY_DEBUG"}]}],"tools":[{"name":"add_supported_cryptocurrency","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"attach_file_to_transaction","description":"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 t","write_action":false,"price_micros":0,"input_schema":null},{"name":"create_category","description":"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).","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_manual_account","description":"Create a new manually-managed account. (Formerly `create_asset`.)","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_manual_crypto","description":"Create a manually-managed crypto asset. The symbol must match one returned by get_supported_cryptocurrencies.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_tag","description":"Create a new tag.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_transaction_group","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_transactions","description":"Insert one or more transactions (1-500 per call). Returns inserted transactions plus any skipped duplicates.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_account_balance_history","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_balance_history_entry","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_category","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_crypto_synced_balance_history","description":"Delete ALL historical balance entries for a synced crypto holding. This is irreversible and affects the Net Worth views.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_manual_account","description":"Delete a manually-managed account. Optionally also delete its transactions/rules/recurring items, and/or its balance history. Both deletion options are irreversible.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_manual_crypto","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_tag","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_transaction","description":"Delete a single transaction. Fails for split/group transactions and their parents — unsplit/ungroup first. Irreversible.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_transaction_attachment","description":"Delete a transaction file attachment. Irreversible.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_transaction_group","description":"Delete (ungroup) a transaction group. The original child transactions remain and revert to normal ungrouped transactions.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_transactions_bulk","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"get_account_balance_history","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_all_categories","description":"Get a list of all categories associated with the user's account. Returns categories in alphabetical order.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_all_manual_accounts","description":"Get a list of all manually-managed accounts associated with the user. (Formerly known as `assets` in the v1 API.)","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_all_manual_crypto","description":"Get all manually-managed crypto balances associated with the user.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_all_plaid_accounts","description":"Get a list of all Plaid (synced) accounts associated with the user.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_all_synced_crypto","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_all_tags","description":"Get a list of all tags associated with the user's account.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_balance_history","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_budget_settings","description":"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).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_budget_summary","description":"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.)","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_crypto_synced_balance_history","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_recurring_items","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_single_category","description":"Get details on a single category or category group, including the list of children categories for category groups.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_single_manual_account","description":"Get details of a single manual account by ID.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_single_manual_crypto","description":"Get a single manually-managed crypto balance by ID. Call get_all_manual_crypto first to discover ids.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_single_plaid_account","description":"Get details of a single Plaid (synced) account by ID.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_single_recurring_item","description":"Retrieve a single recurring item by ID. Optional date range populates the `matches` object.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_single_synced_crypto","description":"Get a single synced crypto account and all its nested balances by ID.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_single_tag","description":"Get details of a single tag by ID.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_single_transaction","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_supported_cryptocurrencies","description":"Get the list of cryptocurrencies supported for manual tracking. The `symbol` of an entry here is what must be passed to create_manual_crypto.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_synced_crypto_balance","description":"Get a single balance held inside a synced crypto account, looked up by its cryptocurrency symbol.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_transaction_attachment_url","description":"Get a short-lived signed download URL for a transaction file attachment. The response includes the URL and an `expires_at` timestamp.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_transactions","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_user","description":"Get details on the current user","write_action":false,"price_micros":0,"input_schema":null},{"name":"refresh_synced_crypto","description":"Trigger a balance refresh for a synced crypto account and return the refreshed account. Reaches out to the external crypto provider.","write_action":false,"price_micros":0,"input_schema":null},{"name":"remove_budget","description":"Remove the budget for a specific category and period. The request is idempotent — succeeds even if no budget exists for the period.","write_action":true,"price_micros":0,"input_schema":null},{"name":"split_transaction","description":"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`).","write_action":false,"price_micros":0,"input_schema":null},{"name":"trigger_plaid_fetch","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"unsplit_transaction","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"update_category","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_deleted_account_details","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_manual_account","description":"Update an existing manually-managed account. (Formerly `update_asset`.)","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_manual_crypto","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_tag","description":"Update properties for an existing tag.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_transaction","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_transactions_bulk","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"upsert_account_balance_history","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"upsert_budget","description":"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).","write_action":true,"price_micros":0,"input_schema":null},{"name":"upsert_crypto_synced_balance_history","description":"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.","write_action":true,"price_micros":0,"input_schema":null}],"scan":{"score":78,"grade":"B","scanned_at":"2026-09-24T11:59:40.030Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-24T11:59:39.999Z","components":{"code":{"score":25,"max":25,"notes":["39 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":12,"max":15,"notes":["last push 52 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"@akutishevsky/lunchmoney-mcp","version":"3.0.0","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":3,"publishedAt":"2026-08-03T08:07:47.782Z","repositoryUrl":"git+https://github.com/akutishevsky/lunchmoney-mcp.git"}],"repo":{"found":true,"owner":"akutishevsky","repo":"lunchmoney-mcp","archived":false,"pushedAt":"2026-08-03T08:08:33Z","stars":107,"forks":17,"openIssues":1,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/28622614?v=4","ownerCreatedAt":"2017-05-11T09:44:51Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/28622614?v=4&s=128","source":"github"},"presence":{"stars":107,"forks":17,"downloadsWeek":null,"license":"MIT","lastPushAt":"2026-08-03T08:08:33.000Z","score":32}}}},"grade_history":[],"reviews":[]}