Lunch Money MCP Server
Lunch Money MCP 서버
AI 에이전트가 Lunch Money 개인 금융 데이터와 상호작용할 수 있게 해주는 Model Context Protocol (MCP) 서버입니다.
기능
이 MCP 서버는 금융 데이터를 관리하기 위한 15가지 도구를 제공합니다:
사용자 및 계정
get_user— 프로필 및 계정 정보 가져오기
카테고리
get_categories— 모든 카테고리 나열 (평면 또는 계층형)create_category— 새로운 사용자 지정 카테고리 생성update_category— 기존 카테고리 수정
거래
get_transactions— 필터(날짜 범위, 카테고리, 상태 등)를 사용하여 거래 조회create_transaction— 새로운 거래 추가 (단일 또는 최대 500개 일괄 추가)update_transaction— 거래 업데이트 또는 여러 항목으로 분할
자산 및 계정
get_assets— 수동 관리 자산 나열create_asset— 새로운 수동 자산 추가get_plaid_accounts— Plaid 연결 은행 계좌 나열trigger_plaid_fetch— Plaid 계정 동기화 트리거
예산 및 계획
get_budgets— 모든 날짜 범위에 대한 예산 및 지출 보기upsert_budget— 예산 금액 설정 또는 업데이트get_recurring_items— 반복되는 비용 및 수입 보기
태그
get_tags— 모든 거래 태그 나열
Related MCP server: YNAB Assistant
사전 요구 사항
설치
옵션 1: 복제 및 빌드 (로컬 stdio 전송)
Cursor, Claude Desktop 또는 기타 stdio 기반 MCP 클라이언트와 로컬에서 사용하려면:
# Clone the repository
git clone https://github.com/yourusername/lunchmoney-mcp.git
cd lunchmoney-mcp
# Install dependencies
npm install
# Build the TypeScript
npm run build옵션 2: Cloudflare Workers (원격 HTTP 전송)
HTTP를 통해 액세스할 수 있는 원격 MCP 서버로 배포:
# Clone the repository
git clone https://github.com/yourusername/lunchmoney-mcp.git
cd lunchmoney-mcp
# Install dependencies
npm install
# Set your API key as a secret
npx wrangler secret put LUNCH_MONEY_API_KEY
# Enter your Lunch Money API key when prompted
# Deploy to Cloudflare Workers
npm run deploy옵션 3: npx 사용 (로컬 전용)
복제 없이 MCP 서버를 직접 실행할 수 있습니다:
npx -y lunchmoney-mcp참고: LUNCH_MONEY_API_KEY 환경 변수를 설정해야 합니다.
구성
API 키 가져오기
Lunch Money에 로그인
설정 → 개발자로 이동
새 API 키 생성
키 복사 (안전하게 보관하세요!)
Cursor IDE
Cursor MCP 구성(~/.cursor/mcp.json)에 추가:
{
"mcpServers": {
"lunchmoney": {
"command": "node",
"args": ["/path/to/lunchmoney-mcp/dist/index.js"],
"env": {
"LUNCH_MONEY_API_KEY": "your_api_key_here"
}
}
}
}또는 npx 사용:
{
"mcpServers": {
"lunchmoney": {
"command": "npx",
"args": ["-y", "lunchmoney-mcp"],
"env": {
"LUNCH_MONEY_API_KEY": "your_api_key_here"
}
}
}
}Claude Desktop
Claude Desktop 구성(~/Library/Application Support/Claude/claude_desktop_config.json, macOS 기준)에 추가:
{
"mcpServers": {
"lunchmoney": {
"command": "node",
"args": ["/path/to/lunchmoney-mcp/dist/index.js"],
"env": {
"LUNCH_MONEY_API_KEY": "your_api_key_here"
}
}
}
}기타 MCP 클라이언트
stdio 전송을 지원하는 모든 MCP 클라이언트는 이 서버를 사용할 수 있습니다. LUNCH_MONEY_API_KEY 환경 변수를 설정하고 다음을 실행하세요:
node /path/to/lunchmoney-mcp/dist/index.jsCloudflare Workers를 통한 원격 MCP (사용자 직접 API 키 사용)
Cloudflare Workers 배포는 각 사용자가 자신의 API 키를 가져와 사용하는 공용 MCP 서버로 설계되었습니다. 서버는 어떠한 API 키도 저장하지 않습니다.
작동 방식:
서버를 Cloudflare Workers에 배포 (또는 공유 인스턴스 사용)
각 사용자가 자신의 Lunch Money API 키로 연결
API 키는
X-LunchMoney-API-Key헤더에 포함되어 각 요청과 함께 전송됨
mcp-remote 프록시로 연결:
{
"mcpServers": {
"lunchmoney": {
"command": "npx",
"args": ["mcp-remote", "https://lunchmoney-mcp.your-subdomain.workers.dev/mcp"],
"env": {
"MCP_HEADERS": "X-LunchMoney-API-Key: your_api_key_here"
}
}
}
}참고: mcp-remote 프록시는 사용자 지정 헤더를 지원해야 합니다. 일부 MCP 클라이언트는 아직 이를 지원하지 않을 수 있습니다.
⚠️
mcp.json파일을 자격 증명 파일처럼 취급하세요. 이 파일에는 귀하의 Lunch Money API 키가 포함되어 있습니다. Git 저장소(dotfiles 저장소 포함)에 커밋하지 마십시오. 저장소 내부에 있다면.gitignore에 추가하십시오. 이 파일에 대한 읽기 권한이 있는 사람은 누구나 귀하의 Lunch Money 데이터를 읽고 수정할 수 있습니다.
보안: 이 모델이 가장 안전한 이유는 다음과 같습니다:
서버가 API 키를 전혀 저장하지 않음
각 사용자는 자신의 데이터에만 액세스함
API 키는 서버에 저장되지 않고 요청별로 전달됨
공용 워커는 IP별 속도 제한을 적용하며 요청 본문이나 헤더를 기록하지 않음
Cloudflare Workers 배포 (공용 서버)
이 설정은 누구나 자신의 API 키로 사용할 수 있는 공용 MCP 서버를 생성합니다. 서버는 자격 증명을 저장하지 않습니다.
사전 요구 사항
Cloudflare 계정 (무료 티어 가능)
Wrangler CLI 설치
배포
의존성 설치:
npm installCloudflare Workers에 배포:
npm run deploy공용 MCP 서버가 활성화되었습니다! URL이 출력에 표시됩니다:
https://lunchmoney-mcp.your-account.workers.dev/mcp선택 사항: 테스트를 위해 기본 API 키를 설정할 수 있습니다:
npx wrangler secret put LUNCH_MONEY_API_KEY사용자가 연결하는 방법
사용자는 자신의 Lunch Money API 키를 사용하여 공용 서버에 연결합니다:
{
"mcpServers": {
"lunchmoney": {
"command": "npx",
"args": ["mcp-remote", "https://lunchmoney-mcp.your-account.workers.dev/mcp"],
"env": {
"MCP_HEADERS": "X-LunchMoney-API-Key: their_api_key_here"
}
}
}
}Wrangler를 사용한 로컬 개발
# Run locally with hot reload
npm run dev:worker보안 모델
서버는 API 키를 저장하지 않음 — 키는 헤더를 통해 요청별로 전달됨
사용자는 자신의 데이터에만 액세스함 — 각 요청은 사용자의 고유 키를 사용함
공개적으로 액세스 가능 — 누구나 서버를 사용할 수 있지만, 자신의 Lunch Money 계정이 필요함
이는 공용 API 게이트웨이가 작동하는 방식과 유사합니다. 인프라는 공유되지만 자격 증명은 사용자별로 관리됩니다.
사용 예시
구성이 완료되면 AI 어시스턴트에게 다음과 같이 질문할 수 있습니다:
"이번 달 카테고리별 지출을 보여줘"
"지난주 가장 큰 지출은 무엇이었어?"
"3월의 분류되지 않은 모든 거래를 분류해줘"
"'프리랜서 수입'이라는 새로운 카테고리를 만들어줘"
"1분기에 식료품에 얼마를 썼어?"
"반복되는 모든 구독 항목을 나열해줘"
개발
로컬 stdio 모드 (Cursor, Claude Desktop용)
# Install dependencies
npm install
# Run in development mode with hot reload
npm run dev
# Build for production
npm run build
# Type check without emitting
npm run typecheck
# Test with MCP Inspector
npm run inspectCloudflare Workers 모드 (원격 HTTP 액세스용)
# Build the Worker
npm run build
# Run locally with Wrangler
npm run dev:worker
# Deploy to production
npm run deploy프로젝트 구조
src/
├── index.ts # MCP server entry point (stdio mode)
├── worker.ts # Cloudflare Workers entry point (HTTP mode)
├── client.ts # Lunch Money API client
├── types.ts # TypeScript type definitions
├── tool-utils.ts # Shared tool utilities
└── tools/ # Individual tool implementations
├── user.ts
├── categories.ts
├── transactions.ts
├── assets.ts
├── plaid.ts
├── budgets.ts
├── recurring.ts
└── tags.ts배포 모드
모드 | 전송 | 사용 사례 | 진입점 |
로컬 | stdio | Cursor, Claude Desktop |
|
Cloudflare Workers | 스트리밍 HTTP | 원격 액세스, 웹 클라이언트 |
|
두 모드 모두 동일한 도구 구현과 API 클라이언트를 공유합니다.
보안
API 키 보호
API 키를 절대 커밋하지 마십시오. 이러한 이유로
.env파일은.gitignore에 포함되어 있습니다.키는 환경 변수나 안전한 MCP 구성 파일에 저장하십시오.
키가 노출된 경우 Lunch Money 개발자 페이지에서 즉시 취소하고 새 키를 생성하십시오.
데이터 개인정보 보호
이 서버는 AI 어시스턴트와 Lunch Money 사이의 프록시 역할을 합니다.
귀하의 금융 데이터는 Lunch Money의 개인정보 처리방침에 따라 처리됩니다.
오류 메시지는 우발적인 정보 노출을 방지하기 위해 정제됩니다.
권한
제공하는 API 키에 따라 MCP 서버가 수행할 수 있는 작업이 결정됩니다. Lunch Money API 키는 다음을 수행할 수 있습니다:
모든 금융 데이터 읽기
거래 생성, 업데이트 및 삭제
카테고리 및 예산 수정
Plaid 동기화 트리거
API 참조
이 MCP 서버는 Lunch Money API v1을 사용합니다.
속도 제한
Lunch Money API에는 속도 제한이 있습니다. MCP 서버는 API에서 발생하는 모든 속도 제한 오류를 그대로 전달합니다. 속도 제한이 발생하면 몇 분 기다린 후 다시 시도하십시오.
오류 처리
서버는 Lunch Money API 오류를 처리하여 MCP 도구 오류로 반환합니다. 참고 사항:
Lunch Money는 때때로 논리적 오류를 HTTP 200 응답으로 반환하며, 이는 적절한 오류로 정규화됩니다.
서버는 잠재적인 민감 정보를 제거하기 위해 오류 메시지를 정제합니다.
전체 오류 세부 정보는 디버깅을 위해 stderr에 기록됩니다.
문제 해결
"Missing LUNCH_MONEY_API_KEY" 오류
LUNCH_MONEY_API_KEY 환경 변수가 설정되지 않았습니다. MCP 구성을 확인하고 키가 올바르게 구성되었는지 확인하십시오.
"Unauthorized" 오류
API 키가 유효하지 않거나 취소되었을 수 있습니다. https://my.lunchmoney.app/developers에서 키를 확인하십시오.
거래가 나타나지 않음
Plaid 연결 계정을 사용하는 경우 동기화를 트리거해야 할 수 있습니다:
trigger_plaid_fetch도구를 사용하여 백그라운드 동기화를 대기열에 추가하십시오.이는 작업만 대기열에 추가하는 것이며, 거래가 나타나기까지 몇 분 정도 걸릴 수 있습니다.
기여
기여를 환영합니다! 자유롭게 Pull Request를 제출해 주세요.
저장소 포크
기능 브랜치 생성 (
git checkout -b feature/amazing-feature)변경 사항 커밋 (
git commit -m 'feat: add amazing feature')브랜치 푸시 (
git push origin feature/amazing-feature)Pull Request 열기
라이선스
이 프로젝트는 ISC 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 LICENSE 파일을 참조하십시오.
감사의 말
지원
이 MCP 서버 관련 문제는 GitHub 이슈를 열어주세요.
Lunch Money API 관련 질문은 Lunch Money API 문서를 참조하세요.
MCP 프로토콜 관련 질문은 MCP 문서를 참조하세요.
면책 조항: 이 프로젝트는 비공식 커뮤니티 프로젝트입니다. Lunch Money와 제휴하거나 보증하지 않습니다.
Available Tools
15 toolscreate_assetC
Create a manually managed asset in Lunch Money.
| Name | Required | Description | Default |
|---|---|---|---|
| type_name | Yes | ||
| subtype_name | No | ||
| name | Yes | ||
| display_name | No | ||
| balance | Yes | ||
| balance_as_of | No | ||
| currency | No | ||
| institution_name | No | ||
| closed_on | No | ||
| exclude_transactions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden for behavioral disclosure. The single sentence only states the action, omitting any details about side effects, required permissions, rate limits, or response behavior. This is critically insufficient for a creation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, grammatically correct sentence. However, it is too brief to be useful; conciseness should not come at the cost of essential information. It could be expanded while remaining concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (10 parameters, no output schema, and no annotations), the description is extremely incomplete. It fails to explain the concept of a 'manually managed asset', how it fits into the Lunch Money system, or what the return value would be. The agent would struggle to use this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 10 parameters with 0% schema description coverage, meaning the names and types are the only clues. The description adds no explanation of parameter meanings, constraints, or relationships. For example, 'balance' is required but its format or default currency is not clarified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('create') and the resource ('manually managed asset'), and it distinguishes from sibling tools like 'create_category' which deal with different entities. However, it could be more specific about what constitutes a 'manually managed asset' in Lunch Money.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, nor does it mention any prerequisites or scenarios where it should not be used. This lack of context forces the agent to infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_categoryC
Create a new Lunch Money category.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| description | No | ||
| is_income | No | ||
| exclude_from_budget | No | ||
| exclude_from_totals | No | ||
| archived | No | ||
| group_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It only states 'Create a new...', which implies a write operation but does not mention side effects, authentication needs, or whether the operation is idempotent. For a mutation tool, this is minimal transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that immediately states the purpose. It is front-loaded and efficient, with no extraneous words. However, it is too brief and sacrifices informativeness for brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 parameters, no output schema, no annotations), the description is incomplete. It does not explain how parameters like 'group_id' or 'archived' affect the behavior, nor does it describe the return value or success indicators. More context is needed for effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 7 parameters with 0% description coverage, meaning the description adds no explanation for any parameter. The description does not compensate for the lack of schema descriptions. It does not clarify the meaning of 'is_income', 'exclude_from_budget', etc., which are non-obvious. The baseline is low due to low coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Create') and the resource ('a new Lunch Money category'), specifying the verb and object. It distinguishes from sibling tools like 'update_category' and 'get_categories' by implying the creation operation. However, it lacks additional context such as the domain or scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. There is no mention of prerequisites, such as requiring an existing group_id, or when to use 'update_category' instead. The name and siblings imply a create operation, but no explicit context is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_transactionC
Create one or more Lunch Money transactions.
| Name | Required | Description | Default |
|---|---|---|---|
| transactions | Yes | ||
| apply_rules | No | ||
| skip_duplicates | No | ||
| check_for_recurring | No | ||
| debit_as_negative | No | ||
| skip_balance_update | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description fails to disclose any behavioral traits (e.g., idempotency, duplicate handling, balance update effects) beyond what is minimally implied by 'Create'. No annotations are present to compensate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise (one sentence) and front-loaded with the purpose. However, it lacks any structure or additional sections, which is acceptable given the single sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of the input schema (many parameters, nested objects) and the absence of annotations and output schema, the description is severely incomplete. It does not explain return values, error cases, or any behavioral details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%. The description adds no meaning to the many parameters, such as apply_rules, debit_as_negative, or skip_duplicates, leaving their semantics entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Create' and the resource 'one or more Lunch Money transactions', which distinguishes it from sibling tools like update_transaction and get_transactions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as update_transaction, nor are there any prerequisites or constraints mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_assetsARead-only
List manually managed Lunch Money assets.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description's minimal addition of 'manually managed' provides some extra context about the type of assets, but it doesn't contradict annotations or add significant behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single short sentence with no waste; perfectly front-loaded and to the point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple listing tool with no parameters and a readOnly annotation, the description provides adequate context, including the asset type (manually managed). No output schema exists, but the tool's behavior is straightforward.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has no parameters and is fully covered (100%). Description adds value by specifying 'manually managed', which clarifies the scope beyond the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses specific verb 'List' and clearly identifies the resource as 'manually managed Lunch Money assets', distinguishing it from siblings like get_plaid_accounts and create_asset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use or when not to use this tool versus alternatives. However, the purpose is clear enough that an agent can infer it's for listing only manual assets, not Plaid accounts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_budgetsARead-only
Get Lunch Money budgets and spending for a date range.
| Name | Required | Description | Default |
|---|---|---|---|
| start_date | Yes | ||
| end_date | Yes | ||
| currency | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds that it returns both budgets and spending, providing context beyond the annotation. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no wasted words. It is concise but could benefit from slightly more detail without sacrificing brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose and basic output, but lacks parameter explanations and output schema details. For a 3-parameter tool with no output schema, it provides adequate but not comprehensive context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%: the description does not explain any parameter. While 'date range' hints at start_date/end_date, it omits details on format, optional currency, and usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Get' and the resource 'Lunch Money budgets and spending', specifying a date range. It effectively distinguishes from sibling tools like upsert_budget, which is for modifications.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use when retrieving budget data for a date range but provides no explicit guidance on when to avoid this tool or mention alternatives like upsert_budget.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_categoriesARead-only
List Lunch Money categories in flattened or nested form.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, so description's value is limited. It adds the format choice but lacks details on response structure, pagination, or ordering.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded with verb and resource, no unnecessary words. Highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with one optional enum parameter, the description covers the core function and parameter. Lacks mention of output structure, but adequate given simplicity and lack of output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'format' has an enum, and the description explains its two values ('flattened or nested'), adding meaning beyond the schema (which has 0% description coverage).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and the resource 'Lunch Money categories', and distinguishes its output format options ('flattened or nested') from sibling tools like create_category or update_category.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus similar list tools (e.g., get_assets, get_tags). No mention of use cases, limitations, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_plaid_accountsARead-only
List Lunch Money Plaid-connected accounts.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, and the description adds no further behavioral details (e.g., data freshness, pagination, or authentication requirements). It simply repeats the read-only nature implied by the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with no wasted words. It is concise but could benefit from a bit more detail without becoming verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless list tool, the description is adequate but lacks context about potential prerequisites (e.g., Plaid link requirement) or relationship to sibling tools like trigger_plaid_fetch. No output schema exists, but the simplicity of the tool reduces the need for extensive documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters in the input schema, so the description does not need to elaborate on parameter meaning. The baseline is 4 for zero-parameter tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'List' and identifies the resource as 'Lunch Money Plaid-connected accounts,' clearly distinguishing it from sibling tools like get_assets or get_categories.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not provide explicit usage guidance, such as when to use this tool versus alternatives like trigger_plaid_fetch. The purpose is clear, but no context on prerequisites or limitations is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recurring_itemsARead-only
Get Lunch Money recurring items for the current or specified month range.
| Name | Required | Description | Default |
|---|---|---|---|
| start_date | No | ||
| end_date | No | ||
| debit_as_negative | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as readOnlyHint=true, and the description aligns with a read operation. Beyond that, no additional behavioral traits (e.g., rate limits, data freshness) are disclosed. The description adds minimal extra context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence of 12 words, front-loaded with the key action and resource. Every word earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 3 parameters and no output schema, the description covers the core purpose but omits details on the debit_as_negative parameter and response format. It is adequate for low complexity but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% with 3 parameters. The description hints at start_date/end_date via 'month range' but does not explain debit_as_negative or provide format details. It fails to compensate for low schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and resource 'Lunch Money recurring items' with scope 'current or specified month range', distinguishing it clearly from sibling tools like get_transactions and get_budgets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for month ranges but provides no explicit guidance on when to use this tool versus alternatives such as get_transactions or get_budgets. No exclusions or comparison are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tagsARead-only
List all Lunch Money tags.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, confirming it's a read operation. The description adds the scope 'all', which is useful context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence of four words, perfectly front-loaded and without any wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the description is adequate for a simple list tool with no parameters, it lacks information about the return format or fields of the tags. Without an output schema, the description should provide more detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist in the schema (100% coverage), so baseline is 4. The description does not need to add parameter information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'List' and resource 'tags', clearly stating it returns all tags. This distinguishes it from sibling tools that deal with other resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use versus alternatives. Since there are no sibling tag tools, usage is implied, but no exclusions or when-not-to-use are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transactionsCRead-only
Get Lunch Money transactions with optional filters.
| Name | Required | Description | Default |
|---|---|---|---|
| tag_id | No | ||
| recurring_id | No | ||
| plaid_account_id | No | ||
| category_id | No | ||
| asset_id | No | ||
| is_group | No | ||
| status | No | ||
| start_date | No | ||
| end_date | No | ||
| debit_as_negative | No | ||
| pending | No | ||
| offset | No | ||
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While annotations indicate readOnlyHint=true (safe read), the description does not add any behavioral details beyond the obvious. It omits information about pagination, data format, or potential limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one sentence and concise, but it is too minimal for the complexity of 13 parameters. It is front-loaded but lacks useful structure or breakdown.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 13 optional parameters and no output schema, the description does not provide enough context about typical usage, required constraints (e.g., date range), or how filtering works. The agent might miss important behaviors like pagination defaults.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description only says 'optional filters' without explaining any of the 13 parameters. The agent receives no additional meaning over parameter names, some of which (e.g., debit_as_negative, is_group) are not self-explanatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and the resource 'Lunch Money transactions', and mentions optional filters. It is unambiguous and distinguishes from sibling tools like create_transaction or update_transaction by its name and verb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool vs. alternatives (e.g., create_transaction for adding, update_transaction for modifying). The agent must infer from context or tool names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_userARead-only
Get information about the Lunch Money user connected to the configured API key.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint true. The description confirms it's a read operation without adding behavioral details beyond that. It does not specify what specific information is returned or any side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence that is clear and front-loaded. No unnecessary words or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description lacks detail about the return structure. With no output schema, the description should elaborate on what 'information' is returned. It is minimally complete but not comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, and schema coverage is 100%. The description does not need to add parameter semantics. Baseline score of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves information about the Lunch Money user. The verb 'Get' and resource 'information about the Lunch Money user' are specific, and no sibling tool overlaps in purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when or when not to use this tool. Since there are no similar siblings, the usage context is implied, but the description does not provide any prerequisites or context for invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trigger_plaid_fetchC
Trigger a Lunch Money fetch for eligible Plaid accounts. This queues a background fetch job.
| Name | Required | Description | Default |
|---|---|---|---|
| start_date | No | ||
| end_date | No | ||
| plaid_account_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries the burden. It notes the job is queued (async), but does not disclose safety, auth requirements, rate limits, or what happens if a fetch is already in progress.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences are concise, but the description is too brief for a tool with 3 parameters and no output schema. It could be structured better with a brief parameter explanation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (3 params, no output schema, no annotations), the description lacks details on return value, error handling, or behavior when fetch is already queued. It is incomplete for safe invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 3 optional parameters with 0% description coverage. The description does not explain any parameter, leaving the agent to guess their purpose (e.g., date range or account filter).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the action (trigger fetch) and target (eligible Plaid accounts). It mentions queuing a background job, which adds context. However, it does not define 'eligible', which could confuse the agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives. There is no mention of prerequisites (e.g., account must be linked) or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_categoryC
Update an existing Lunch Money category.
| Name | Required | Description | Default |
|---|---|---|---|
| category_id | Yes | ||
| name | No | ||
| description | No | ||
| is_income | No | ||
| exclude_from_budget | No | ||
| exclude_from_totals | No | ||
| archived | No | ||
| group_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries full burden. It only says 'update' without disclosing return behavior, idempotency, or authentication requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence, but it is too brief and lacks any structuring (e.g., sections, bullet points).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 8 parameters and no output schema, the description is severely incomplete. It fails to explain what the tool returns or any side effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description adds no meaning to any of the 8 parameters. Parameters are completely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'update' and the resource 'category', distinguishing it from create_category and get_categories. However, it lacks specifics on which fields can be updated, but the purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like create_category. No conditions or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_transactionC
Update a Lunch Money transaction or split it into multiple child transactions.
| Name | Required | Description | Default |
|---|---|---|---|
| transaction_id | Yes | ||
| transaction | No | ||
| split | No | ||
| debit_as_negative | No | ||
| skip_balance_update | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden but does not disclose whether updates are partial or full, what happens to existing data, balance implications, or the behavior of splitting. This is a significant gap for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, which is concise but lacks structure to cover both operations (update and split). It is adequately short but sacrifices necessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complex input schema and no output schema, the description is severely incomplete. It does not explain return values, error handling, or behavioral details essential for effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description provides no explanation of parameters. The complex nested objects 'transaction' and 'split' are completely undocumented, leaving the agent without guidance on how to structure the input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Update') and the resource ('a Lunch Money transaction'), and includes the special capability ('split it into multiple child transactions'). This differentiates it from siblings like create_transaction and get_transactions effectively.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives, nor when splitting is appropriate. There are no prerequisites or contextual conditions mentioned, leaving the agent to infer usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upsert_budgetC
Create or update a Lunch Money budget entry for a category and month.
| Name | Required | Description | Default |
|---|---|---|---|
| start_date | Yes | ||
| category_id | Yes | ||
| amount | Yes | ||
| currency | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It only states 'Create or update', implying a write operation, but provides no details on side effects (e.g., overwriting existing budgets), return values, or required permissions. Behavioral traits are severely under-disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that immediately conveys the core purpose. It is front-loaded with the action and resource. However, it lacks any structure (e.g., sections) that could improve scannability for an AI agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description should at least hint at return format or behavior. It mentions 'budget entry for a category and month' but doesn't confirm that start_date should be the first day of the month or that category_id comes from get_categories. The presence of sibling tools like get_budgets for reading is not referenced. Completeness is low.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, yet the description adds no parameter information. It fails to explain what start_date, category_id, amount, or currency represent or their constraints (e.g., start_date should be first of month). The description adds zero value beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Create or update' and the resource 'Lunch Money budget entry', and specifies the context 'for a category and month'. This distinguishes it from sibling tools like create_category or get_budgets, which involve different resources or actions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives or when not to use it. For example, it doesn't clarify that the upsert replaces existing budgets for the same category and month, or that get_budgets should be used for reading. The description lacks any comparative context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
15 tool updates
v1.0.0- First observed
create_asset - First observed
create_category - First observed
create_transaction - First observed
get_assets - First observed
get_budgets - First observed
get_categories - First observed
get_plaid_accounts - First observed
get_recurring_items - First observed
get_tags - First observed
get_transactions - First observed
get_user - First observed
trigger_plaid_fetch - First observed
update_category - First observed
update_transaction - First observed
upsert_budget
TDQS
Scored across 15 tools
Each tool targets a distinct resource or action, with clear separation between asset, category, transaction, budget, account, recurring item, tag, and user operations. No overlapping functionality.
All tools follow a consistent verb_noun pattern (e.g., create_asset, get_transactions, update_category), using the same set of verbs (create, get, update, upsert, trigger) throughout.
With 15 tools, the server covers the core aspects of personal finance management without being overloaded or underdeveloped. Each tool has a clear purpose.
The server provides create, read, and update operations for several resources, but lacks delete operations for all resources and missing update for assets and recurring items. Tags only have a get operation, leaving significant gaps in the lifecycle.
Maintenance
Related MCP Connectors
Read-only Lunch Money accounts, transactions, categories and budgets. Unofficial connector.
Personal-finance workspace for AI agents: accounts, spending, budgets, goals, and investments.
- BankSyncOAuthio.banksync
Connect AI agents to bank accounts, transactions, balances, and investments.
- Era ContextOAuthapp.era
Personal finance, bank account, and shared memory connector for Claude, ChatGPT, Gemini Spark & more
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceEnables AI agents to manage personal expenses through natural language conversations. Supports adding, searching, and analyzing transactions with automatic categorization and financial insights.3MIT
- 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.-
- AlicenseAqualityCmaintenanceEnables AI assistants to interact with the Pocketsmith personal finance API to manage accounts, budgets, and transactions through natural language. It supports comprehensive financial tasks including spending analysis, category management, and tracking recurring bills.233MIT
- AlicenseAqualityDmaintenanceEnables managing personal finances through the Lunch Money API, including transactions, categories, budgets, and accounts via natural language commands.1410 npm3MIT