The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Money Lover listing page.
An MCP server that lets an AI agent or chatbot read your Money Lover data and, if you allow it, add transactions. It talks to the client over stdio.
Disclaimer — please read. This project is unofficial. It is not affiliated with, endorsed by, or supported by Money Lover or its owners. "Money Lover" is a trademark of its respective owner and is used here only to describe what the software connects to. Money Lover has no public API. This tool uses the same undocumented web endpoints as the Money Lover web app, reverse-engineered from public open-source projects. They can change or break at any time, and using them may be against Money Lover's terms of service (which we could not verify). You use this software entirely at your own risk, including the risk of account restrictions, lost or incorrect data, and incorrect transactions. It is provided "AS IS" under the MIT license, without warranty of any kind. Back up your data and try it on a throwaway wallet first.
What a reviewer should know before granting this server access to a finance account. Each claim is enforced in code and checked in CI, not just stated here.
| Claim | How it is enforced |
|---|---|
| The token is full-access; read-only is enforced by the server. Money Lover has no scoped or read-only tokens. | Write tools are not even registered unless MONEYLOVER_ALLOW_WRITE=true; when they are, a server-side guard limits them (Security). |
Network egress goes only to Money Lover: web.moneylover.me and oauth.moneylover.me, HTTPS only. No telemetry, no update checks, no other hosts. | Endpoints are compile-time constants that no environment variable can change; redirects are never followed. tests/egress.rs fails if any other URL appears in the source. |
Credentials stay local. The password is used for login and never stored; tokens live in a 0600 file; nothing secret is logged or returned to the AI. | src/token_store.rs, redacting Debug impls, tests. |
| Dependencies are pinned and vetted. | Cargo.lock + --locked everywhere; cargo-deny allows crates.io sources and permissive licenses only and fails on RustSec advisories or yanked crates (weekly and on change); GitHub Actions pinned to commit SHAs; Dependabot. |
| Release binaries are built from this repository. | Every release archive has a signed SLSA build-provenance attestation (gh attestation verify) and a SHA256SUMS entry. |
| The published bundles are bound to this repository and to this domain. | The listing in the official MCP Registry uses the DNS-verified namespace com.iyongbudiarso/moneylover-mcp; the hash of every .mcpb is recorded in the release's server.json, and each bundle carries the same build-provenance attestation as the archives. |
| Tool | What it does | Needs write mode |
|---|---|---|
list_wallets | Wallets with currency and balance (refresh: true for live balances) | no |
list_categories | Income/expense categories, optionally for one wallet | no |
list_transactions | Transactions in a date range, newest first (limit default 50, max 200) | no |
summarize_spending | Totals per category and currency for a date range | no |
add_transaction | Create a transaction; supports dry_run | yes |
Design choices that matter for LLM use:
type when a
category name exists as both (e.g. "Other").YYYY-MM-DD in your configured timezone.add_transaction is not even registered unless you opt in with MONEYLOVER_ALLOW_WRITE=true.
See Security for the limits that apply to writes.list_wallets reports from_cache so an agent knows when balances may be stale.
Changes made in the Money Lover app itself show up after the cache expires or with refresh: true.Download the archive for your platform from the latest release:
| Platform | Archive |
|---|---|
| macOS, Apple Silicon | moneylover-mcp-<version>-aarch64-apple-darwin.tar.gz |
| macOS, Intel | moneylover-mcp-<version>-x86_64-apple-darwin.tar.gz |
| Linux x86_64 (glibc 2.35+) | moneylover-mcp-<version>-x86_64-unknown-linux-gnu.tar.gz |
| Linux ARM64 (glibc 2.35+) | moneylover-mcp-<version>-aarch64-unknown-linux-gnu.tar.gz |
| Windows x86_64 | moneylover-mcp-<version>-x86_64-pc-windows-msvc.zip |
Verify it before running it. SHA256SUMS is attached to every release, and every archive has a
signed build-provenance attestation proving it was built by this repository's release workflow:
Extract it and put moneylover-mcp somewhere on your PATH. The binaries are not signed with an
Apple or Microsoft certificate. On macOS, a file downloaded with a browser is blocked by
Gatekeeper; after verifying it, allow it with xattr -d com.apple.quarantine moneylover-mcp.
On Windows, SmartScreen may ask for confirmation.
Clients that understand MCP Bundles can install
the server as an extension instead. Download the .mcpb for your platform from the
latest release and open it, or
point your client at the file:
| Platform | Bundle |
|---|---|
| macOS (Apple Silicon and Intel) | moneylover-mcp-darwin.mcpb |
| Linux x86_64 | moneylover-mcp-linux-x86_64.mcpb |
| Linux ARM64 | moneylover-mcp-linux-aarch64.mcpb |
| Windows x86_64 | moneylover-mcp-windows-x86_64.mcpb |
There is one bundle per platform because a bundle carries a single executable and MCPB cannot choose between executables by CPU architecture; the macOS bundle holds one universal binary.
When the client asks for configuration you can either enter your Money Lover email and password
(the client keeps the password in the OS keychain, and the server exchanges it for a token, exactly
as with login), or leave both empty and run moneylover-mcp login once with a
prebuilt binary — the extension reuses the stored token.
Adding transactions stays off unless you enable it in the extension's settings.
The same bundles are listed in the official MCP Registry as
com.iyongbudiarso/moneylover-mcp,
which is verified by a v=MCPv1; … TXT record on iyongbudiarso.com. Registry-aware clients
check each download against the SHA-256 recorded there. That proves who published the entry; it is not a statement that the code is
safe. Check the trust model and the source instead.
You need a Rust toolchain (1.89 or newer).
--locked builds with the exact dependency versions in Cargo.lock, which CI vets with
cargo deny, instead of whatever is newest on crates.io.
Log in once, from a terminal. The password is typed at a hidden prompt and never stored; only the resulting token is saved:
All configuration is through environment variables.
| Variable | Default | Meaning |
|---|---|---|
MONEYLOVER_TIMEZONE | Asia/Jakarta | IANA timezone for dates |
MONEYLOVER_ALLOW_WRITE | false | Set true to enable add_transaction |
MONEYLOVER_WRITE_WALLETS | – | Comma-separated wallet names; when set, writes go only to these |
MONEYLOVER_MAX_AMOUNT | – | When set, larger amounts are refused |
MONEYLOVER_MAX_WRITES_PER_HOUR | 20 | Created transactions per rolling hour (1-1000) |
MONEYLOVER_TOKEN_PATH | ~/.config/moneylover-mcp/token.json | Where tokens are stored. Must be absolute |
MONEYLOVER_CACHE_SECS | 300 | How long wallets and categories are cached (0 disables) |
MONEYLOVER_TIMEOUT_SECS | 45 | Per-request timeout (1-300). Money Lover's servers can be slow |
MONEYLOVER_LOG | info | Log filter. Logs go to stderr only |
MONEYLOVER_EMAIL, MONEYLOVER_PASSWORD | – | Only for headless setups that cannot run login; see below |
token.json and refreshes them (a refresh uses no slot). Several
MCP clients may share the same token file safely; access is serialized with a lock file.moneylover-mcp login again.moneylover-mcp logout deletes the local token and stops running servers immediately. The token
itself stays valid at Money Lover until it expires; to revoke it, remove the device in the Money
Lover app. Either way every server sharing the token file stops until you run
moneylover-mcp login again; it never silently logs back in.No password in the config: run moneylover-mcp login first.
In Zed, put the same thing under context_servers in settings.json:
To let an agent record transactions, opt in and fence it in:
Headless servers (a container, a VPS running a chatbot) can pass MONEYLOVER_EMAIL and
MONEYLOVER_PASSWORD instead; use your platform's secret store, not a file in a repository.
Do not commit MCP client config files that contain credentials. Zed's settings.json and
similar files often end up in public dotfiles repositories.
What the server does to keep your account safe:
token.json, created with mode 0600 in a 0700 directory; a token file that other users can
read is tightened to 0600, or refused if that is not possible. Passwords, tokens and
Authorization headers never appear in logs or in tool output. On Windows the file relies on
your user profile's default permissions.add_transaction call is checked by the
server, not by the AI:
MONEYLOVER_WRITE_WALLETS (if set), archived wallets never;MONEYLOVER_MAX_AMOUNT (if set);MONEYLOVER_MAX_WRITES_PER_HOUR transactions per hour (counted per server process:
two MCP clients each running the server get the limit twice);allow_duplicate: true;UNCERTAIN
and tells the agent to check before retrying.What you should know:
MONEYLOVER_WRITE_WALLETS, and prefer an MCP client that asks you before each tool call.
MONEYLOVER_WRITE_WALLETS matches wallet names; the owner of a wallet shared with you can
rename it, so list wallets you own.info level
they contain no financial data. MONEYLOVER_LOG=rmcp=debug logs full tool inputs and outputs.version in Cargo.toml, run cargo build to update Cargo.lock, commit.git tag v0.2.0 && git push origin v0.2.0.The release workflow checks that the tag matches Cargo.toml,
runs the tests, builds all platforms, attests their provenance and publishes the GitHub release
with SHA256SUMS. Running the workflow manually (Actions > Release > Run workflow) only builds,
which is a handy dry run.
A second job then assembles the .mcpb bundles from those archives with the pinned
@anthropic-ai/mcpb CLI, smoke-tests the macOS one, attests each bundle and attaches the bundles
plus SHA256SUMS.mcpb and a generated server.json to the same release.
This is a manual step on purpose: it needs an Ed25519 key that must not live in the repository or
in CI. scripts/publish-registry.sh downloads the released bundles, re-checks every hash against
server.json and publishes:
The first time, and after a key rotation, the script's header explains how to generate the key,
put the public half in a TXT record on the apex domain and run mcp-publisher login dns.
Two things to know: a published version is immutable, so bump the version rather than rebuilding a tag; and rebuilding a tag produces different bundle bytes (ZIP timestamps), so publish the registry entry after the release workflow has run and do not re-run the workflow for a published tag.
Live tests hit the real API and are skipped by default. Run moneylover-mcp login (or
cargo run -- login) first, then:
Delete the test transaction in the Money Lover app afterwards.
snyk-agent-scan looks at what an AI client actually sees —
tool descriptions, prompt-injection surface, hardcoded secrets. It is not part of CI because it
needs a Snyk token and uploads tool names and descriptions to api.snyk.io, so run it by hand
when you want it:
Generate mcp.json from your normal client config (it is the usual {"mcpServers": {…}} shape)
and do not commit it if it contains credentials.
MIT. See LICENSE.