An MCP server that provides expense tracking functionality with a React widget UI, allowing users to list and add expenses through MCP tools or REST API.
Two tools with basic schemas and descriptions, but significant gaps in parameter documentation and output schema clarity. list_expenses has no input parameters (empty schema), which is acceptable for a read-only discovery tool. add_expense has typed parameters with descriptions, meeting minimum requirements. However, neither tool documents output structure, error cases, or recovery guidance. Descriptions are adequate (34-52 chars) but lack context on when to use each tool or what data structures are returned. No tool annotations (readOnlyHint, destructiveHint) despite clear read/write distinction. Validation is present in code (Zod) but not reflected in schema constraints (e.g., name minLength, amount range).
Adds a new expense item with a name and amount.
Returns the full list of expenses.
Output schemas not documented. Neither tool specifies what fields are returned (e.g., list_expenses returns {expenses: [...], structuredContent: {...}} but this is invisible to the LLM). LLMs cannot plan downstream calls or extract data without knowing response structure.
Missing tool annotations. add_expense is destructive (WRITE risk) but lacks destructiveHint annotation. list_expenses is read-only but lacks readOnlyHint. These annotations help LLMs reason about safety and retry logic.
Parameter constraints not fully expressed in schema. add_expense validates name.min(1) and amount.finite() in code (Zod), but schema lacks minLength, pattern, or minimum/maximum constraints. LLMs cannot see these rules and may pass invalid values.
Inferred effective spec: 2025-06-18+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | 2025-06-18+ | v2 |
No error recovery guidance. If add_expense fails validation, the response includes a message but does not guide the LLM on what to do next (e.g., 'Retry with a non-empty name'). Error responses should be actionable.
Descriptions lack context on when to use each tool. add_expense description does not mention prerequisites (e.g., 'Call list_expenses first to see current expenses') or what happens on success. Descriptions should answer WHAT, WHEN, and WHAT IS RETURNED.