A secure local MCP server for tracking personal expenses in CSV.
Well-structured expense tracker with solid schema definitions and clear naming. All 5 tools have explicit descriptions and input schemas with Zod validation. Tool names follow verb_noun pattern (add_, update_, delete_, list_, get_). Schemas are comprehensive with format validation, range constraints, and helpful error messages. However, output schemas are partially documented (only get_spending_summary has explicit output schema), and descriptions are brief (10-30 chars), below the 50-200 char LLM-optimized baseline. Error handling is present but lacks recovery guidance. No tool annotations visible in registration code.
add a new expense
delete an existing expense by ID
get a spending summary
list expenses with optional filters
update an existing expense by ID
Tool descriptions are too brief (10-30 chars). LLM-optimized descriptions should be 50-200 chars and explain WHAT the tool does, WHEN to use it, and any prerequisites. Current descriptions lack context for tool selection.
Output schemas not documented for 4 of 5 tools. Only get_spending_summary has an explicit output schema (getSpendingSummaryOutputSchema). LLMs need to know what fields to expect from add_expense, update_expense, delete_expense, and list_expenses to plan downstream calls.
No tool annotations visible in registration code. Destructive operations (delete_expense, update_expense) and write operations (add_expense) should declare destructiveHint/idempotentHint annotations to guide agent behavior and prevent accidental misuse.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2025-06-18+ | v2 |
Error handling lacks recovery guidance. Validation errors (e.g., invalid date format, amount out of range) are caught by Zod but responses do not guide the LLM on what to do next. Include actionable error messages like 'Invalid date format: expected YYYY-MM-DD, got "2026-7-28"'.
No pagination support for list_expenses. If expense history grows large, returning all matching expenses will blow the context window. Add limit and offset/cursor parameters with a documented cap (e.g., max 50 per page).