Four tools with basic descriptions and Zod schemas present. However, schemas are minimal (1-3 params each, no explicit output documentation), descriptions lack depth and context for LLM selection, and error handling is generic catch-all with no recovery guidance. No parameter validation constraints (enums, ranges), no batch variants, and responses are unstructured text rather than typed objects. Tool names are clear action verbs (get_, search_), but the implementation relies on string formatting rather than structured output patterns. The server reads transaction/budget data from Lunchmoney API but does not guide the LLM on when to use each tool vs. alternatives, e.g., distinction between get-recent-transactions (time-based) and search-transactions (keyword-based) is not well explained.
Get budget summary for a specific time period
Get spending in a category
Get recent transactions
Search transactions by keyword
No output schemas documented. All tools return formatted text via helper methods (formatBudgetSummary, formatTransactions) with no declared output type. LLMs cannot infer result structure, field names, or chaining IDs for follow-up calls.
Parameter constraints missing. No enums for category names, no min/max bounds on numeric ranges (days, limit), no regex patterns for date strings. LLMs will guess invalid values (e.g., days=999, category='xyz').
Descriptions lack LLM-optimized context. Under 50 chars each (baseline is 194 chars avg). Missing WHEN to use each tool, WHAT distinguishes search-transactions from get-recent-transactions, and WHAT the output contains. No dependency hints (e.g., 'Call search-transactions with a payee name to find a specific merchant').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 47 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 43 | - | v1 |
Error handling is generic. All tools catch errors and return a text string 'Error fetching...' with no guidance on retry, user action, or root cause. No distinction between transient (network) and permanent (API key invalid) failures.
API token exposed as environment variable (LUNCHMONEY_TOKEN in Dockerfile). While not a tool parameter, this follows the correct pattern (secret injection), no deduction here. However, source code does not show how token is loaded or if it validates on startup.
No pagination support visible. Search and recent-transactions tools accept limit (default 10) but no cursor/offset or total count returned. Large result sets will be truncated silently, and LLM has no way to fetch 'next page'.