Split shared expenses in a group — no account needed. Create a split, add what everyone paid, and see who owes whom. Supports onchain settlement in USDC or sats.
xupersplit demonstrates solid tool design with clear verb-noun naming (create_split, get_split, add_expense, record_payment, remove_entry, settle_split). All 6 tools have descriptions (avg 180 chars, within 10-1024 baseline). Input schemas are present and well-structured with Zod validation. However, output schemas are not explicitly documented in the source, responses are inferred from the `respond()` helper which returns text + structuredContent, but the shape of structuredContent is not formally specified. Error handling via McpToolError is present but recovery guidance is minimal. Parameter descriptions are generally good (e.g., 'paid_by' includes a note about assuming the user if they're a participant), but some lack explicit format constraints (e.g., 'date' says 'YYYY-MM-DD' but no regex pattern). Tool composition is excellent, each tool has one clear responsibility, and the split key parameter is flexible (accepts both key and full URL). Security is well-handled: no secrets in params, IP hashing for tracking, and permission checks for secure splits.
Record something one person paid for the group. Split equally by default; pass split_between for a subset, or shares for an uneven split. One expense covers one set of people — a receipt whose items aren't all shared by everyone is several expenses, so call this once per group of items that the same people share, rather than splitting the total equally. Works on simple, accountless splits. Secure splits (created by a signed-in user) are read-only here and must be opened in a browser.
Create a new xupersplit for sharing expenses in a group. No account needed. Returns a secret link — give it to the user and tell them to share it with the group, since anyone holding the link can see and edit the split.
Read a split: participants, expenses, per-person balances and the shortest set of payments that settles everyone up.
Record a payment from one person to another, settling part or all of their debt. Works on simple, accountless splits. Secure splits (created by a signed-in user) are read-only here and must be opened in a browser.
Delete an expense or payment. Works on simple, accountless splits. Secure splits (created by a signed-in user) are read-only here and must be opened in a browser.
Output schema not formally documented. The `respond()` helper returns {content, structuredContent} but structuredContent shape is not specified. LLMs cannot plan downstream calls without knowing what fields to expect.
Error messages lack recovery guidance. McpToolError is thrown but messages do not suggest next steps (e.g., 'Split not found. Try create_split() first.' or 'Invalid participant. Call get_split() to see available names.').
Date parameter lacks format constraint. Description says 'YYYY-MM-DD' but no regex pattern or format declaration in schema. LLMs may pass invalid dates.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | A | 84 | 2026-07-28+ | v2 |
Wipe all payment methods from a split (Swish, IBAN, Lightning, onchain addresses). Use this if the split is settled and you want to hide the payment details, or if you entered them by mistake. Works on simple, accountless splits. Secure splits (created by a signed-in user) are read-only here and must be opened in a browser.
Destructive tool (remove_entry) lacks confirmation step. No dry-run or confirmation_required pattern. Agents can delete entries without verification.
Parameter dependencies underdocumented. add_expense has mutually exclusive 'split_between' and 'shares' params, but the constraint is only mentioned in the 'shares' description, not both.