MCP server for Splitwise - create and manage expenses, splits, and groups directly from Claude
Server has 6 tools with complete input schemas and descriptions. Naming follows verb_noun convention (list_, create_, update_, delete_). However, descriptions lack LLM-optimized guidance on WHEN to use each tool and lack dependency hints. Parameter descriptions are present but minimal (10-30 chars). Output schemas are documented in docstrings but not formally in JSON Schema. Error handling is basic, no recovery guidance or actionable error messages. Missing tool annotations (readOnlyHint, destructiveHint). Splits parameter in create_expense and update_expense lacks nested schema documentation.
Create a Splitwise expense in a group with per-user splits. splits: list of {"user_id": int, "owed_share": str} All owed_share values must sum to cost. The paid_by_user_id is the person who paid the full amount. date: ISO 8601 format e.g. "2026-04-27T00:00:00Z" (optional) notes: extra details shown in the expense notes field (optional) Example: create_expense("Trader Joe's - Eggs", "8.97", 73654273, 94211279, [{"user_id": 94211279, "owed_share": "2.99"}, {"user_id": 24465843, "owed_share": "2.99"}, {"user_id": 29221111, "owed_share": "2.99"}], date="2026-04-27T00:00:00Z", notes="Eggs for the week")
Create a new Splitwise group and optionally add members. name: display name for the group group_type: one of "apartment", "house", "trip", "other" (default "other") members: list of {"user_id": int} to add (optional - you are added automatically) Example: create_group("Road Trip 2026", group_type="trip", members=[{"user_id": 24465843}])
Delete a Splitwise expense by ID.
List members of a Splitwise group with their user IDs and names.
List all Splitwise groups you belong to, with their IDs and names.
Splits parameter lacks nested schema definition. create_expense and update_expense accept splits as array but do not document the required structure {user_id: int, owed_share: str} in JSON Schema, only in docstring. LLMs cannot validate nested object structure.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). delete_expense and create_expense/update_expense should declare their risk level in schema annotations, not just in risk metadata. Agents cannot infer side effects from names alone.
Error handling returns raw API errors without recovery guidance. create_expense and update_expense return {"error": result["errors"]}, a bare dict. Should return 'Invalid split: owed_share values must sum to cost. Got X, expected Y' with actionable next steps.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 53 | 2026-07-28+ | v2 |
Update an existing Splitwise expense. expense_id: ID of the expense to update description: new description (optional) cost: new cost as string e.g. "12.50" (optional) date: ISO 8601 date e.g. "2026-04-27T00:00:00Z" (optional) notes: text for the notes/details field (optional) group_id: group to move expense to (optional) paid_by_user_id: user who paid (required if updating splits) splits: list of {"user_id": int, "owed_share": str} (optional) Example: update_expense(12345678, date="2026-04-27T00:00:00Z", notes="Dinner at Niagara")
Descriptions lack WHEN-to-use guidance and dependency hints. 'List all Splitwise groups' does not explain when to call this vs list_group_members, or that it must be called first to discover group_id. LLMs cannot plan multi-step workflows without explicit hints.
delete_expense description is 35 characters, below the 50-char minimum for LLM clarity. Should explain that this is irreversible and suggest confirmation pattern.