An MCP server for tracking and managing expenses with SQLite backend
ExpenseTracker demonstrates adequate but incomplete definition quality. All 5 tools are properly registered with clear action verbs (add_, list_, summarize, delete_, edit_), and schemas are present with typed parameters. However, parameter descriptions are minimal or generic, tool descriptions lack context about prerequisites and use cases, and output schemas are not formally documented. Error handling is present but returns generic error objects rather than actionable recovery guidance. The server shows practical implementation quality but lacks the LLM-optimized descriptions and comprehensive documentation required for higher-confidence agent integration.
Add a new expense entry to the database.
Delete an expense entry by ID.
Edit an expense entry by ID.
List expense entries within an inclusive date range.
Summarize expenses by category within an inclusive date range.
Output schemas not formally documented. Return types for all 5 tools are inferred from code but not declared in tool metadata. LLMs cannot reliably plan downstream operations without explicit schema documentation of what fields to expect (e.g., list_expenses returns list of dicts with id, date, amount, category, subcategory, note, not declared).
Date parameter format not formally constrained. Both start_date and end_date in list_expenses and summarize accept 'string' type but lack format specification (ISO 8601, YYYY-MM-DD, etc.). LLMs may pass invalid formats like '2024-1-5' or '01/15/2024', causing silent failures or SQL parse errors.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 59 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 47 | - | v1 |
Tool descriptions lack context and action guidance. Descriptions are under 100 chars and do not answer WHEN to use this tool or what prerequisites exist. E.g., add_expense says 'Add a new expense entry' but omits expected date format, valid categories, or amount constraints. Similarly, summarize lacks guidance on the optional category parameter, when should it be included?
Destructive operations (delete_expense) lack confirmation or dry-run support. An agent could delete the wrong expense ID without a safety mechanism. No pattern:confirmation-request is implemented.
Error responses do not provide recovery guidance. When a tool returns {"status": "error", "message": "..."}, the message is often generic ('Database error: ...' in add_expense, 'Error listing expenses: ...' in list_expenses). LLMs receive no signal about whether to retry, ask the user, or try a different tool. No pattern:recovery-guide implemented.
Parameter descriptions are minimal. Many params lack actionable constraints: 'amount' has no range (negative allowed?), 'category' and 'subcategory' are free-form strings with no enum or validation hints, 'note' has no length limit. LLMs cannot infer valid inputs from bare descriptions like 'Category of the expense'.
No pagination or result limits on list_expenses or summarize. A database with thousands of expenses could return a massive list, blowing the context window. No limit, offset, or cursor parameters are present. Pattern:paginated-result not implemented.