Atlas / MCP servers / leafeye / Lunchmoney

LunchmoneyBLOCK

mcp/leafeye/lunchmoney
Verdict
BLOCK
Grade
F
Trust score
45 /100
Exposed tools
4 4r · 0w · 0d
Transport
sse · stdio
License
MIT
Stars
28
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

A Model Context Protocol (MCP) server that lets you interact with your Lunchmoney transactions and budgets through Claude and other AI assistants.

What is this?

This tool allows you to connect your Lunchmoney financial data to Claude AI, so you can ask questions about your spending, analyze your budget, and get insights about your finances through a natural conversation.

Features

This server provides four main tools:

  1. get-recent-transactions: View your recent transactions from the past N days
  2. search-transactions: Search transactions by keyword in payee names or notes
  3. get-category-spending: Analyze spending in specific categories
  4. get-budget-summary: Get detailed budget information including spending, remaining amounts, and recurring items

Privacy and Data Handling

Important: MCP provides a structured way for Claude to interact with your Lunchmoney data while maintaining privacy boundaries. Here's what you should know:

  • Claude (the host) creates a client that connects to your local MCP server
  • Your Lunchmoney API token stays on your local machine
  • The MCP server runs locally and fetches data from Lunchmoney's API
  • You will be asked to approve each request to access your Lunchmoney data
  • When you ask a question about your finances, Claude requests specific information from the MCP server
  • The MCP server processes your request locally and returns only the relevant results
  • Claude never has direct access to your full financial data or API token
  • Only the specific information requested (like transaction summaries or budget status) is shared with Claude
  • Anthropic's data retention policies apply to these summary results that are part of your conversation
  • Each server connection is isolated, maintaining clear security boundaries

You can find more about MCP in the documentaion: https://modelcontextprotocol.io/introduction

Installation

Also look at the offical C

Read from source at commit 67bd1d1ad5a4OBSERVED · 2026-10-08
Advertisement
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add lunchmoney-mcp-server --env LUNCHMONEY_TOKEN=${LUNCHMONEY_TOKEN} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "lunchmoney-mcp-server": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "LUNCHMONEY_TOKEN": "${LUNCHMONEY_TOKEN}"
      }
    }
  }
}
03

Exposed tools (4)

4 read · 0 write · 0 destructive.

ToolRiskDescription
get-budget-summaryreadGet budget summary for a specific time period
get-category-spendingreadGet spending in a category
get-recent-transactionsreadGet recent transactions
search-transactionsreadSearch transactions by keyword
04

Trust audit

BLOCKgrade F · trust 45/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryWARN
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
none-observed
Network
declared (5 observation(s))
Shell
declared (9 observation(s))
Dependencies
not all pinned
Secrets in source
none-found

Findings (25)

HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
node_modules/@types/node/sqlite.d.ts:189
exec(sql: string): void;
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
node_modules/depd/index.js:425
var deprecatedfn = new Function('fn', 'log', 'deprecate', 'message', 'site',
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
node_modules/depd/index.js:427
'return function (' + args + ') {' +
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
node_modules/typescript/lib/lib.es5.d.ts:998
exec(string: string): RegExpExecArray | null;
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHSupply chain · supply.typosquat · CWE-829, CWE-1357
node_modules/iconv-lite/package.json
request ~ requests
Why it matters. dependency name one edit from a popular package
Fix. verify the package; likely typosquat
MEDIUMInventory / provenance · inv.symlink · CWE-1104
node_modules/.bin/tsc
node_modules/.bin/tsc
Why it matters. link not followed
MEDIUMInventory / provenance · inv.symlink · CWE-1104
node_modules/.bin/tsserver
node_modules/.bin/tsserver
Why it matters. link not followed
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
node_modules/@types/node/url.d.ts:560
* console.log(myURL.password);
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
node_modules/iconv-lite/encodings/sbcs-data-generated.js:100
"chars": "€پ‚ƒ„...†‡ˆ‰ٹ‹Œچژڈگ‘’“”•–—کTMڑ›œں ،¢£¤¥¦§ ̈©ھ«¬® ̄°±23 ́μ¶· ̧1؛»1⁄41⁄23⁄4؟ہءآأؤإئابةتثجحخدذرزسشصض×طظعغـفقكàلâمنهوçèéêëىيîïًٌٍَôُِ÷ّùْûüے"
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
node_modules/iconv-lite/encodings/sbcs-data-generated.js:373
"chars": "«»...“”�•‘’� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาําิีึืฺุู–—฿เแโใไๅๆ็่้๊๋์ํTM๏๐๑๒๓๔๕๖๗๘๙®©����"
LOWInventory / provenance · inv.hidden_file · CWE-1104
node_modules/.package-lock.json
.package-lock.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
node_modules/zod-to-json-schema/.prettierrc.json
.prettierrc.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
node_modules/@types/node/buffer.d.ts:1896
function atob(data: string): string;
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
node_modules/typescript/lib/lib.webworker.d.ts:8713
atob(data: string): string;
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
node_modules/typescript/lib/lib.webworker.d.ts:9525
declare function atob(data: string): string;
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
node_modules/zod/lib/index.mjs:1006
const decoded = JSON.parse(atob(base64));
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
node_modules/zod/lib/index.umd.js:1012
const decoded = JSON.parse(atob(base64));
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
node_modules/@modelcontextprotocol/sdk/package.json
content-type, eventsource, raw-body, zod, zod-to-json-schema, @eslint/js, @types/content-type, @types/eslint__js
Why it matters. 21 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
node_modules/@types/node/package.json
undici-types
Why it matters. 1 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
node_modules/data-uri-to-buffer/package.json
@types/jest, @types/node, jest, ts-jest, typescript
Why it matters. 5 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
node_modules/eventsource-parser/package.json
@sanity/pkg-utils, @sanity/semantic-release-preset, @types/node, @typescript-eslint/eslint-plugin, @typescript-eslint/parser, eslint, eslint-config-prettier, eslint-config-sanity
Why it matters. 15 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
node_modules/eventsource/package.json
eventsource-parser, @sanity/pkg-utils, @sanity/semantic-release-preset, @tsconfig/strictest, @types/sinon, @typescript-eslint/eslint-plugin, @typescript-eslint/parser, esbuild
Why it matters. 21 dependency range(s) float
Fix. pin exact versions or ship a lockfile
INFOInventory / provenance · inv.oversize · CWE-1104
node_modules/@modelcontextprotocol/sdk/dist/cjs/types.d.ts
node_modules/@modelcontextprotocol/sdk/dist/cjs/types.d.ts
Why it matters. 1279637 bytes not read
INFOInventory / provenance · inv.oversize · CWE-1104
node_modules/@modelcontextprotocol/sdk/dist/esm/types.d.ts
node_modules/@modelcontextprotocol/sdk/dist/esm/types.d.ts
Why it matters. 1279637 bytes not read
INFOInventory / provenance · inv.oversize · CWE-1104
node_modules/typescript/lib/_tsc.js
node_modules/typescript/lib/_tsc.js
Why it matters. 6151909 bytes not read

Gates applied: no_behavioural_pass.

Audited 2026-10-08 · audit v0.4.1 · source sha 67bd1d1ad5a4full audit observations/trust-audit/mcp-server/leafeye__lunchmoney.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-0867bd1d1ad5a4BLOCKF45first audit
06

Questions

What tools does Lunchmoney expose?

4 in total: 4 read-only, 0 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is Lunchmoney safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (45/100) and found 5 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does Lunchmoney need?

It reads LUNCHMONEY_TOKEN from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does Lunchmoney run?

It speaks sse and stdio, so it runs as a local process your client starts. It is published on npm as lunchmoney-mcp-server at 1.1.0.

How current is this page?

The grade is for one exact copy of the source (67bd1d1ad5a4), read on 2026-10-08. The repository is watched and re-audited when it changes.

Advertisement