MCP Server to explore money manager sqlite database
Single tool 'query_data' has a verbose description (500+ chars) but lacks formal input schema documentation in code. Parameter 'sql' is typed as string but has no constraints, format specification, or validation guidance in the description. No output schema is documented. Error handling returns raw exception messages rather than actionable recovery guidance. The tool description reads as a tutorial rather than a concise LLM-optimized spec. No tool annotations (readOnlyHint, etc.) present despite being a read-only operation.
Execute SELECT SQLs safely. 1. Almost everything you need are in the `expenses` view. It has these columns: - ZTXDATESTR: The transaction date string in ISO8601 - TXN_YEAR: The transaction year (good for GROUP BY) - ZCONTENT: The transaction recipient or description - SPENT_MYR: The amount spent in Malaysian Ringgit - DEST_CURRENCY: The destination currency code - PARENT_CATEGORY_NAME: The parent category name - CATEGORY_NAME: The subcategory name 2. It is advisable to discover all the categories & parent categories before searching for transactions. `SELECT DISTINCT PARENT_CATEGORY_NAME FROM expenses;` `SELECT DISTINCT CATEGORY_NAME FROM expenses;` 3. Some merchants are the same, but slightly different ZCONTENT may be used. For example: - Zus Coffee / Zus Delivery 4. It is possible to recreate a trip itinerary from MIN/MAX(ZTXDATESTR) and DEST_CURRENCY for every year.
Input schema lacks constraints and validation rules. Parameter 'sql' is a bare string with no format specification, length limits, or guidance on allowed query patterns. LLMs cannot infer valid SQL syntax from the name alone.
No output schema documented. Tool returns raw string representation of tuples. LLMs cannot parse or structure the response for downstream operations. Should return JSON with typed fields (rows, columns, count).
Error messages are raw exception strings ('Error: <str(e)>') rather than actionable recovery guidance. LLM receives no hint about what went wrong or how to fix it. Should categorize errors (syntax, permission, timeout) with specific remediation steps.
Description is 500+ characters of tutorial text (column names, discovery queries, merchant notes). This violates the 10 - 1024 char guideline and buries the core action. Should be 50 - 150 chars stating WHAT the tool does, then move examples to separate documentation.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 38 | 2026-07-28+ | v2 |
No tool annotations despite being a read-only operation. Should include readOnlyHint=true to signal to agents that the tool is safe to call without confirmation.