Money Lover MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Money Lover MCP Server show me my spending in the last week"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Money Lover MCP Server
Node.js implementation of a Model Context Protocol (MCP) server that wraps the unofficial Money Lover REST API. The server exposes 27 MCP tools covering authentication, wallets, categories, transactions, events, debts, and static configuration — enabling AI assistants or MCP-compatible clients to query and manage personal finance data.
Features
Auto-authentication via
EMAIL/PASSWORDenvironment variables — no token passing required for most tools.23 read tools covering user info, wallets, categories, transactions, events, debts, icons, providers, and static config.
4 write tools: create, update, and delete transactions, wallets, and categories.
Large responses truncated automatically to keep LLM context manageable (configurable via
limitparameter).Stdio-based server compatible with Claude Code, Claude Desktop, Cursor, and any MCP host.
Token caching per email under
~/.moneylover-mcp/with automatic refresh on auth errors.
Related MCP server: Money Lover MCP Server
Prerequisites
Node.js 22 or newer.
Money Lover account credentials.
Installation
npm installUsage
Launch the MCP server over stdio:
npm startProject-scoped Configuration (Claude Code)
Add .mcp.json at the project root:
{
"mcpServers": {
"mcp-moneylover": {
"command": "node",
"args": ["/absolute/path/to/moneylover-mcp/src/server.js"],
"env": {
"EMAIL": "your@email.com",
"PASSWORD": "your-password"
}
}
}
}And enable it in .claude/settings.json:
{ "enabledMcpjsonServers": ["mcp-moneylover"] }Global Configuration (Claude Desktop / Cursor)
{
"mcpServers": {
"mcp-moneylover": {
"command": "npx",
"args": ["@ferdhika31/moneylover-mcp@latest"],
"env": {
"EMAIL": "your@email.com",
"PASSWORD": "your-password"
}
}
}
}Available Tools
Auth
Tool | Description | Arguments |
| Retrieve a JWT token. |
|
User
Tool | Description | Arguments |
| Profile associated with the session. | — |
| Devices and active sessions. | — |
| Extended profile data. | — |
Wallets
Tool | Description | Arguments |
| List all wallets. | — |
| Balance summary for a wallet. |
|
| Wallets shared with other users. | — |
| Pending share invitations. | — |
| Create a new wallet. |
|
| Update wallet name, icon, or currency. |
|
| Delete a wallet permanently. |
|
Categories
Tool | Description | Arguments |
| Categories for a specific wallet. |
|
| All categories across every wallet. | optional |
| Create a category in a wallet. |
|
| Rename a category or change its icon. |
|
| Delete a category. |
|
Transactions
Tool | Description | Arguments |
| Transactions in a date range. |
|
| Create a transaction. Category IDs from |
|
| Update a transaction. The API requires the full payload on every edit — fetch the transaction first if you need current values. |
|
| Delete a transaction. |
|
| Free-form search with optional filters. | optional |
| Transactions flagged as debts/loans. | — |
| Related transactions by ID list. |
|
| Related transactions for a category. |
|
| Related transactions for a wallet. |
|
| Available search filter options. | optional |
Static & Config
Tool | Description | Arguments |
| Saving goals/events for a wallet. |
|
| Open debts in a wallet. |
|
| Icon pack metadata. | optional |
| Supported bank providers. | — |
| Currency catalogue. | optional |
| USD-based exchange rate snapshot. | — |
| Miscellaneous runtime configuration. | — |
Tool Usage Examples
Prompt examples, required vs optional fields, gotchas, and common multi-step patterns for every tool: docs/examples.md.
Library Usage
import { MoneyloverClient } from './src/moneyloverClient.js';
const token = await MoneyloverClient.getToken(email, password);
const client = new MoneyloverClient(token);
const wallets = await client.getWallets();
const txns = await client.getTransactions(walletId, '2026-01-01', '2026-04-30');
await client.addTransaction({ walletId, categoryId, amount: '50000', date: '2026-04-18' });
await client.editTransaction('txn-id', { amount: '60000', note: 'updated' });
await client.deleteTransaction('txn-id');Testing
Unit Tests
Mocked unit tests — no live API calls required:
npm testIntegration Tests (mcp-tester)
mcp-tester is a ReAct-agent-based MCP testing framework. It starts the server, drives an LLM to call tools in response to natural-language prompts, and asserts the correct tools were called with correct arguments.
Install
pipx install --index-url https://pypi.artifacts.furycloud.io/simple/ mcp-testerConfigure
tests/mcp-tester/mcps.json — point at the local server with your credentials:
{
"mcp-moneylover": {
"command": "node",
"args": ["/absolute/path/to/src/server.js"],
"transport": "stdio",
"env": {
"EMAIL": "your@email.com",
"PASSWORD": "your-password"
}
}
}Run
mcp-tester run-tests \
--mcps tests/mcp-tester/mcps.json \
--model gpt-4o-mini \
--concurrent-runs 3 \
tests/mcp-tester/read-tools.yamlResults
tests/mcp-tester/read-tools.yaml contains 25 integration tests covering every read tool:
total 25, success 25, failures 0Key decisions that make the tests stable:
No token parameter on read tools — exposing an optional
tokenfield caused LLMs to inject wallet IDs into it. The server authenticates automatically via env vars.Response truncation — several endpoints return hundreds of thousands of records from the shared MoneyLover database. Tools accept a
limitparameter (default: 20–100) to keep LLM context under control.Dict wrapping — all tool responses return a JSON object (never a bare array) so MCP framework validation passes.
Write-Tool Tests (mcp-tester)
Three additional YAML files test the full CRUD lifecycle for wallets, categories, and transactions across three sequential phases. Each phase runs all three resource types concurrently.
File | Phase | Tests |
| Create |
|
| Edit |
|
| Delete |
|
Run phases in order — each depends on the previous:
# Phase 1: Create
mcp-tester run-tests --mcps tests/mcp-tester/mcps.json --model gpt-4o-mini --concurrent-runs 3 tests/mcp-tester/write-create.yaml
# Phase 2: Edit (after Phase 1 passes)
mcp-tester run-tests --mcps tests/mcp-tester/mcps.json --model gpt-4o-mini --concurrent-runs 3 tests/mcp-tester/write-edit.yaml
# Phase 3: Delete (after Phase 2 passes)
mcp-tester run-tests --mcps tests/mcp-tester/mcps.json --model gpt-4o-mini --concurrent-runs 3 tests/mcp-tester/write-delete.yamlResults across all three phases:
Phase 1 (Create): total 3, success 3, failures 0
Phase 2 (Edit): total 3, success 3, failures 0
Phase 3 (Delete): total 3, success 3, failures 0Key design decisions for write-tool tests:
Discovery before mutation — Edit and delete tests instruct the agent to first call a read tool (
get_wallets,get_categories,get_transactions) to locate the target by name, then call the mutation tool. This mirrors real-world agent behaviour where IDs are not known in advance.args: !anyfor write tool assertions — The framework requires exact arg matching. Write tools accept optional fields (icon,with, etc.) that the agent may include at its discretion;!anyverifies the tool was called and succeeded without failing on harmless extras. Read-tool assertions can use exact arg matching because their schemas have no optional fields the LLM would add spontaneously.Predictable identifiers — Test resources use fixed names (
MCP-Test-Wallet,MCP-Test-Category) and a fixed note (MCP test transaction) so the agent can locate them by name during the edit and delete phases without needing to share state between test runs.Full-payload edit assertions —
edit_transactionis a full-replace operation; the test prompt instructs the agent to fetch the existing transaction first (get_transactions) and carry forward all current field values, only changing the note. This validates the multi-step reasoning the tool description requires.
Security Notes
Never commit real credentials or tokens.
Cached tokens live in
~/.moneylover-mcp/restricted to the current user.Delete that directory to revoke all cached sessions.
Available Tools
33 toolsadd_categoryAdd CategoryC
Create a new transaction category in a wallet.
Inputs: walletId (required), name (required), icon (required), type (required).
add_transactionAdd TransactionC
Create a new transaction in a wallet.
Inputs: walletId (required), categoryId (required), amount (required), date (required), +2 more.
add_walletAdd WalletC
Create a new Money Lover wallet.
Inputs: name (required), currencyId (required), icon.
delete_categoryDelete CategoryC
Permanently delete a category.
Inputs: categoryId (required).
delete_transactionDelete TransactionC
Permanently delete a transaction by its identifier.
Inputs: transactionId (required).
delete_walletDelete WalletC
Permanently delete a wallet and all its data.
Inputs: walletId (required).
edit_categoryEdit CategoryC
Rename a category or update its icon.
Inputs: categoryId (required), icon (required), name.
edit_transactionEdit TransactionA
Update an existing transaction. The API requires the full transaction payload on every edit, so you must supply walletId, categoryId, amount, and date (fetch the transaction with get_transactions first if you need the current values). categoryId should be the global category ID from get_all_categories or from an existing transaction response.
Inputs: transactionId (required), walletId (required), categoryId (required), amount (required), +3 more.
edit_walletEdit WalletC
Update a wallet name, icon, or currency.
Inputs: walletId (required), currencyId (required), name, icon.
get_all_categoriesGet All CategoriesA
List ALL categories across ALL wallets with no wallet filter. Use this instead of get_categories when no specific wallet is provided.
Inputs: limit.
get_categoriesGet CategoriesB
Retrieve categories for a specific wallet.
Inputs: walletId (required). Returns: categories
get_currenciesGet CurrenciesA
List all currencies supported by Money Lover (names, symbols, codes). Use this for currency metadata, not exchange rates.
Inputs: limit.
get_debtsGet DebtsB
List open debts or loans tracked in a specific wallet.
Inputs: walletId (required).
get_debt_transactionsGet Debt TransactionsB
List transactions flagged as debts or loans across the account.
Inputs: no named parameters.
get_eventsGet EventsC
List Money Lover events (savings goals, campaigns) associated with a wallet.
Inputs: walletId (required), limit.
get_exchange_ratesGet Exchange RatesB
Fetch the USD-based exchange rate snapshot used by Money Lover.
Inputs: no named parameters.
get_iconsGet IconsC
Fetch the icon pack used by Money Lover categories, wallets, and events.
Inputs: pack.
get_linked_providersGet Linked ProvidersA
List financial institution providers supported for linked accounts.
Inputs: no named parameters.
get_other_configGet Other ConfigB
Retrieve the small static configuration blob served under /other/config.
Inputs: no named parameters.
get_transactionsGet TransactionsC
Fetch transactions for a wallet between two dates.
Inputs: walletId (required), startDate (required), endDate (required).
get_transaction_search_configGet Transaction Search ConfigA
Return the saved configuration options (labels, with-parties, saved filters) available for use with the search_transactions tool.
Inputs: limit.
get_user_accountGet User AccountB
List devices and sessions tied to the Money Lover account.
Inputs: no named parameters.
get_user_infoGet User InfoB
Retrieve the Money Lover user profile associated with the provided token.
Inputs: no named parameters.
get_user_profileGet User ProfileB
Retrieve extended profile information for the current user.
Inputs: no named parameters.
get_wallet_balanceGet Wallet BalanceB
Fetch the current balance summary for a specific wallet.
Inputs: walletId (required).
get_walletsGet WalletsA
List all wallets accessible to the authenticated user.
Inputs: no named parameters. Returns: wallets
loginLogin to Money LoverA
Authenticate using Money Lover credentials to retrieve a JWT token.
Inputs: email (required), password (required). Returns: token
search_transactionsSearch TransactionsA
Free-form search across transactions using optional filters (walletId, categoryId, keyword, parties). Use this when no date range is given or when doing a keyword/label search instead of a date-range fetch.
Inputs: filters, limit.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 33 tools
Most tools have distinct purposes with clear resource-action pairs, but some overlap exists: get_user_account, get_user_info, and get_user_profile could be confused, and get_related_transactions, get_related_transactions_by_category, and get_related_transactions_by_wallet have subtle distinctions that might cause misselection without careful reading of descriptions.
Tool names follow a highly consistent verb_noun pattern throughout, with clear action prefixes (add_, delete_, edit_, get_, login, search_) and descriptive nouns. There are no deviations in style or convention, making the set predictable and readable.
With 33 tools, the count feels heavy for a personal finance server, bordering on excessive. While it covers many features, it may overwhelm agents and could likely be streamlined without losing core functionality, placing it in the borderline range for appropriateness.
The tool surface provides comprehensive coverage for the Money Lover domain, including full CRUD operations for wallets, categories, and transactions, along with extensive querying, user management, and auxiliary features like debts, events, and search. No obvious gaps exist that would hinder agent workflows.
Maintenance
Related MCP Connectors
Personal finance for AI agents: accounts, budgets, goals, 9-strategy debt payoff, reports. OAuth 2.1
Log, query, and edit expenses, budgets, and accounts in Manilo (formerly Ledgy) from any MCP-compatible AI assistant.
Track expenses, budgets, balances, transfers, and multi-currency reports with OAuth-secured tools.
Log, query, and edit expenses, budgets, and accounts in Manilo from any MCP-compatible AI assistant.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with YNAB budgets through natural language. Supports managing accounts, categories, transactions, and budget months with 21 tools for comprehensive budget operations.-
- AlicenseAqualityDmaintenanceEnables AI assistants to interact with Money Lover personal finance app through unofficial REST API. Supports authentication, wallet management, transaction querying, and creating new transactions for expense tracking.614 npm6ISC
- AlicenseAqualityBmaintenanceEnables AI assistants to manage personal finances through the Realbyte Money Manager mobile app, providing transaction management, asset tracking, credit card monitoring, and financial analytics with 18 comprehensive tools.1826 npm20MIT
- FlicenseNot gradedqualityNot gradedmaintenanceEnables AI assistants and MCP clients to interact with personal finance data for transaction management, budgeting, recurring expenses, accounts, categories, tags, crypto, and balance history via LunchMoney's API.41 npm-