A remote MCP server for tracking and managing expense entries with date ranges and category summaries
ExpenseTracker has three tools with basic parameter schemas and generic descriptions. All tools follow verb_noun naming (add_*, list_*, summarize), which is good. However, descriptions are superficial (29 - 47 chars, below the 50 - 200 char ideal), parameter descriptions lack detail on format/constraints, and output schemas are not documented. Error handling exists but does not guide recovery, errors return a 'status: error' dict without actionable guidance. Schema definitions are present but minimal: no enums, no constraints, no pagination support for list_expenses (which could return hundreds of records). The add_expense tool lacks date format documentation, and the summarize tool's optional category parameter defaults to null without explaining the semantics. Tools are properly composed (no 'and' in names, single concerns) and naming is clear, but depth is lacking for production use.
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.
Descriptions too short and lack actionable detail. add_expense is 33 chars ('Add a new expense entry to the database.'), list_expenses is 47 chars, summarize is 38 chars. Below production baseline of 50 - 200 chars. Descriptions do not explain WHEN to use each tool, what data is returned, or constraints.
Parameter descriptions lack format/constraint detail. 'date' param has description 'Date of the expense' but does not specify format (ISO 8601? YYYY-MM-DD? Unix timestamp?). 'amount' lacks range (negative allowed? max value?). 'category' lacks enum constraint, LLM will hallucinate invalid categories. See categories.json resource for valid set; this should be an enum in the schema.
Output schemas not documented. list_expenses returns a list of dicts with fields {id, date, amount, category, subcategory, note}, but this structure is not declared in the tool definition. summarize returns {category, total_amount, count}, also undocumented. LLM cannot plan downstream operations without knowing the response shape.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 49 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 42 | - | v1 |
No pagination support. list_expenses accepts start_date and end_date but returns all matching rows with no limit, offset, or page_size parameter. A date range spanning months or years could return thousands of records, exhausting context window. Production baseline: tools returning lists must support limit and pagination.
Error responses are not actionable. All errors return {status: 'error', message: <str>}. No indication of whether error is retryable, user-fixable, or fatal. No guidance on next steps. Example: 'Database error: <exception>', LLM cannot act on this. Should return error classification and recovery hints per pattern:recovery-guide.
No confirmation step for irreversible writes. add_expense modifies state (writes to DB) but has no dry-run or confirmation mechanism. If agent calls add_expense by mistake, the entry is permanent. Agents make mistakes, pattern:confirmation-request recommends a confirm_before_execute step.
Missing idempotency guarantees. add_expense does not check for duplicate entries (same date + amount + category). If agent retries due to timeout or error, a duplicate expense is created silently. Production tools should support idempotent operations via unique constraints or explicit deduplication.
summarize category parameter defaults to null and is not clearly optional. Parameter description says 'Optional category filter' but defaults to null in the schema definition. This is confusing, does null mean 'all categories' or is the parameter truly optional? If optional, use a boolean optional flag or restructure.