Remote expense tracking MCP server with SQLite backend for managing expense entries
ExpenseTracker provides 3 tools with clear verb-based naming (add_expense, list_expenses, summarize) and reasonable descriptions. However, there are significant gaps in parameter descriptions, output schema documentation, and error handling guidance. Tool descriptions are adequate (50-90 chars) but lack actionable context on when to use each tool vs. alternatives. Parameter descriptions exist but are minimal (10-30 chars) and lack format constraints. Most critically, output schemas are not documented, LLMs cannot predict what fields will be returned or plan downstream operations. Error handling is generic ('error' key with message string) and offers no recovery guidance. The tools perform single, clear actions (good composition) but lack the production-grade polish expected at 70+.
Add a new expense entry to the database.
List expense entries within an inclusive date range.
Summarize expenses by category within an inclusive date range.
Output schemas not documented. LLMs cannot predict return structure or plan chaining. add_expense returns {status, id, message}; list_expenses and summarize return arrays of dicts, but field types and required fields are not declared.
Parameter descriptions are too brief (5-20 chars) and lack format constraints. E.g., 'date' is described as 'Date of the expense' with no format spec (ISO 8601? YYYY-MM-DD?). 'amount' has no range or validation rules. LLMs will guess formats and pass invalid values.
No pagination support in list_expenses and summarize. Large result sets will blow context window. No limit, offset, or cursor parameters offered.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 52 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 44 | - | v1 |
Error responses are generic strings with no recovery guidance. E.g., 'Database error: ...' tells the LLM nothing about whether to retry, ask the user, or give up. No error classification (retryable vs. fatal vs. user-fixable).
Parameter 'category' in summarize has a default of null but is described as 'Optional category to filter by'. Using null as a default is ambiguous, does it mean 'no filter' or 'fetch null category records'? Use explicit description or no default.
No support for dry-run or confirmation on add_expense (a WRITE operation). An agent should be able to preview or confirm before irreversibly adding an expense.