An MCP server for managing expense tracking with support for SQLite and PostgreSQL databases
The ExpenseTracker server provides three well-named tools with explicit input schemas and descriptions. However, there are meaningful gaps in schema completeness, output documentation, error handling guidance, and parameter constraints that prevent a higher score. All tools are properly registered via @mcp.tool() decorators in main.py with async implementations. Tool names follow verb_noun convention (add_expense, list_expenses, summarize). Descriptions are present and adequate (45 - 90 chars) but lack critical details about return formats and error scenarios. Input schemas declare types (string, number) and descriptions for all parameters, but are missing important constraints: date parameters lack format specs, numeric amount lacks min/max bounds, category lacks enum or validation guidance. Output schemas are entirely undocumented, callers cannot plan downstream operations without seeing the actual responses. Error handling exists but returns generic 'status: error' responses without actionable recovery guidance. Parameters have sensible defaults (subcategory='', note='', category=None) and are not overly required.
Add an expense entry to the database.
List expense entries within an inclusive date range.
Summarize expenses by category within an inclusive date range.
Output schemas entirely undocumented. Callers cannot know what fields each tool returns or plan downstream tool calls.
Date parameters lack format specifications. Ambiguous what formats are accepted (YYYY-MM-DD, ISO 8601, epoch milliseconds?).
Numeric 'amount' parameter has no min/max bounds documented. LLMs may pass negative, zero, or absurdly large values.
Category parameter is free-form string with no enum or validation. No guidance on valid categories or what happens if invalid category is passed.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | B | 71 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 53 | - | v1 |
No pagination support in list_expenses. Unbounded result sets can exceed LLM context window.
Error responses are generic and non-actionable. Do not guide the LLM on what to do next.
No validation or guidance on date range logic. What if start_date > end_date? What is maximum range allowed?