Full API Coverage
Every Lunch Money API endpoint is represented: transactions, budgets, categories, tags, recurring items, assets, and Plaid accounts. Zero endpoints skipped — if Lunch Money can do it, so can your AI.
Let any MCP-compatible AI assistant manage your finances through Lunch Money's full API. Local or remote, secure by default.
"What did I spend on food last month?" One question. Your AI should just answer it.
Lunch Money is the best personal finance tool for people who care about their data. But switching contexts — closing your editor, opening a browser, clicking through dashboards — breaks the flow that makes deep work possible.
lunchmoney-mcp puts your complete financial picture inside any MCP-compatible AI assistant. Ask natural questions. Get real answers. The AI handles the API calls, the filtering, the math. You stay in flow.
Built for real-world use. Secure by design, tested exhaustively, deployable anywhere.
Every Lunch Money API endpoint is represented: transactions, budgets, categories, tags, recurring items, assets, and Plaid accounts. Zero endpoints skipped — if Lunch Money can do it, so can your AI.
Run locally over stdio for Claude Desktop and similar clients, or serve over HTTP/SSE as a remote MCP endpoint for multi-user and cloud deployments.
Authenticate the remote server with Google, GitHub, CyberArk Identity, or any custom OIDC-compliant provider. Zero custom auth code needed.
API tokens live in the OS keychain (macOS, GNOME, Windows). Session data is encrypted with AES-256-GCM at rest, with the key stored in that same keychain.
Ship it your way: Docker container, systemd service, Railway one-click, Render.com, or Fly.io. Every path is documented with working configs.
Table-driven tests using Vitest. Every tool, every error path, every edge case is exercised before it ships.
supply chain hardenedNo config files. No environment variables to juggle. The token goes straight to your OS keychain.
Install globally or run with npx. The setup wizard validates your token and stores it in the OS keychain.
# Install globally (optional) $ npm install -g @infamousjoeg/lunchmoney-mcp # Or run directly with npx $ npx @infamousjoeg/lunchmoney-mcp setup
Configure Claude Desktop, Cursor, or any MCP client with this config.
{
"mcpServers": {
"lunchmoney": {
"command": "npx",
"args": ["@infamousjoeg/lunchmoney-mcp"]
}
}
}
Run over HTTP with OAuth for multi-device access via Claude.ai.
# Start the HTTP server (default port 8080) $ npx @infamousjoeg/lunchmoney-mcp --http # With a specific port and OAuth provider $ export AUTH_PROVIDER=github $ npx @infamousjoeg/lunchmoney-mcp \ --http \ --port 8080
Select a scenario to see the exact MCP call your AI makes — and what comes back. Every field, every parameter, validated before it hits the network.
getTransactions({
start_date: "2026-02-01",
end_date: "2026-02-28",
is_income: false
})
[
{
"id": 9241, "date": "2026-02-14",
"payee": "Whole Foods Market",
"amount": "-84.37",
"category": "Groceries"
},
... 47 more transactions
]
getBudgets({
start_date: "2026-03-01",
end_date: "2026-03-31"
})
{
"category": "Groceries",
"budget_amount": 400.00,
"spent_amount": 218.45,
"remaining": 181.55,
"pct_used": "54.6%"
}
getRecurringItems({
start_date: "2026-03-26"
})
[
{
"payee": "Netflix",
"amount": "-22.99",
"cadence": "monthly",
"next_billing": "2026-04-01"
},
{
"payee": "GitHub Pro",
"amount": "-4.00",
"cadence": "monthly",
"next_billing": "2026-04-05"
}
]
createTransaction({
date: "2026-03-26",
payee: "Blue Bottle Coffee",
amount: 7.50,
category: "Coffee & Dining",
notes: "Cortado"
})
{
"ids": [9318],
"status": "ok"
}
Every tool maps directly to a Lunch Money API operation. Input validation is enforced with Zod schemas before any network call.
Every deployment target ships with a working configuration. The remote HTTP server supports all 4 OAuth providers out of the box.
A production-ready Dockerfile is included. Mount a secrets volume or pass credentials via environment variables.
$ docker build -t lunchmoney-mcp . $ docker run -p 3000:3000 \ -e LUNCH_MONEY_API_TOKEN=your_token \ lunchmoney-mcp
Run as a persistent system service with automatic restart on failure. Unit file included in the deploy directory.
# Copy unit file $ cp deploy/lunchmoney-mcp.service \ /etc/systemd/system/ $ systemctl enable --now lunchmoney-mcp
Click to deploy directly from GitHub. Railway detects the Dockerfile automatically. Add your token in the environment variables tab.
{
"build": { "builder": "DOCKERFILE" },
"deploy": { "startCommand": "node dist/cli.js" }
}
A render.yaml is included at the repo root. Connect your GitHub repo and Render picks it up automatically.
services: - type: web name: lunchmoney-mcp env: docker plan: free
Deploy close to your users using Fly.io's global network. A fly.toml is included and pre-configured.
$ fly launch --no-deploy $ fly secrets set \ LUNCH_MONEY_API_TOKEN=your_token $ fly deploy
Your API token never touches disk unencrypted. Two-tier architecture separates long-lived credentials from short-lived session tokens.
Platform keychain integration via keytar. Credentials are protected by the OS
and require user authentication to access.
Short-lived session tokens are stored on disk encrypted at rest. The encryption key lives exclusively in Tier 1 — compromised disk = no plaintext.
| Threat | Mitigation | Status |
|---|---|---|
| Token exfiltration via disk read | Token stored only in OS keychain, never written to disk in plaintext | Mitigated |
| Session token theft | AES-256-GCM encryption; key in keychain, not adjacent to ciphertext | Mitigated |
| Unauthorized remote access | OAuth PKCE flow required for HTTP transport; unauthenticated requests rejected | Mitigated |
| Token leakage in logs | Tokens never included in log output; only masked references used | Mitigated |
| Supply chain compromise | Minimal production dependencies; audit trail via npm provenance | By design |
| Privileged keychain access | OS-level access controls apply; no elevation of privilege is requested | By design |
MCP servers sit between AI and your data. A compromised dependency could turn this into a data exfiltration tool. We take this seriously.
| Protection | How it works | Status |
|---|---|---|
| Pinned versions | All versions in package.json are exact — no ^ or ~. Compromised releases won't auto-install. |
Enforced |
| Lockfile integrity | npm ci reproduces the exact dependency tree from the committed package-lock.json. |
Enforced |
| npm provenance | --provenance creates a cryptographic attestation linking each published package to its source commit. |
Enforced |
| Vulnerability scanning | npm audit --audit-level=high runs on every CI build and blocks merges on known high-severity findings. |
Automated |
| Signature verification | npm audit signatures verifies registry signatures on all installed packages in CI. |
Automated |
| Dependabot | Weekly monitoring for vulnerable dependencies. Major version bumps require manual review before merge. | Automated |
| Minimal surface | Only 5 production dependencies. Dev tooling (vitest, typescript) is excluded from the published package. |
By design |
| Package | Purpose | Trust rationale | Status |
|---|---|---|---|
fastmcp |
MCP protocol framework | 1k+ GitHub stars; listed in Anthropic's official MCP servers registry | Ecosystem Std |
zod |
Input validation & schema | 25k+ GitHub stars, widely audited | Audited |
keytar |
OS keychain access | Native OS keychain binding; widely adopted, community-maintained post-Atom archival | Native Binding |
dotenv |
ENV file parsing | 30M+ weekly downloads, minimal surface area | Audited |
env-paths |
Platform data directories | Zero dependencies, ~50 lines of code | Minimal |
# Verify registry signatures on all installed packages $ npm audit signatures # Check provenance attestation — links package to source commit $ npm view @infamousjoeg/lunchmoney-mcp --json | jq '.dist.attestations'