ExpensifyAI
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SPLITWISE_OAUTH_ACCESS_TOKEN | Yes | Your Splitwise OAuth access token |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_current_userA | Get the current authenticated user's profile (id, name, email, picture). |
| get_userB | Get a user's profile by their ID. |
| create_expenseA | Create a new expense. Cost is a string with 2 decimals (e.g. "25.50"). Splits equally by default; provide users list with paid_share/owed_share for custom splits. Each user needs user_id or (email + first_name + last_name). Set repeat_interval to "weekly", "fortnightly", "monthly", or "yearly" for recurring expenses. |
| get_expensesC | List expenses with optional filters. Dates are ISO 8601 format. Max limit is 100. |
| get_expenseA | Get full details of a single expense including users, splits, and comments. |
| update_expenseA | Update an existing expense. Only provided fields are changed. If any users are supplied, all shares for the expense are overwritten with the provided values. |
| delete_expenseA | Delete an expense permanently. Use restore_expense to undo. |
| restore_expenseA | Restore a previously deleted expense. Use this to undo an accidental deletion. |
| get_groupsA | List all groups the current user belongs to, with members and balances. |
| get_groupA | Get a group's details including members, balances, and simplified debts. |
| create_groupA | Create a new group. group_type is one of: home, trip, couple, other. Optionally add initial members via users list with user_id or email+name. |
| delete_groupA | Delete a group. All expenses must be settled first. |
| add_user_to_groupB | Add a user to a group by user_id or by email (with first_name/last_name for new invites). |
| remove_user_from_groupB | Remove a user from a group. User must have zero balance in the group. |
| get_friendsA | List all friends with their balance information. |
| get_friendB | Get a friend's details including balances and shared groups. |
| create_friendB | Add a friend by email address. Optionally provide their first and last name. |
| delete_friendA | Remove a friendship. Does not affect shared expenses or balances. |
| resolve_friendA | Fuzzy-match a friend by name. Returns matches with id, name, and match_score. Use this when you know a name but not the user_id. |
| resolve_groupA | Fuzzy-match a group by name. Returns matches with id, name, and match_score. Use this when you know a group name but not the group_id. |
| resolve_categoryB | Fuzzy-match an expense category by name (e.g. "food", "utilities"). Returns matches with id, name, and match_score. Searches subcategories too. |
| create_commentB | Add a comment to an expense. Visible to all users in the expense. |
| get_commentsA | Get all comments on an expense. |
| delete_commentA | Delete a comment. You can only delete your own comments. |
| get_notificationsA | Get recent notifications for the current user (new expenses, payments, comments, group activity). |
| get_categoriesA | Get all expense categories and subcategories. Results are cached. |
| get_currenciesA | Get all supported currency codes and symbols. Results are cached. |
| analyze_spendingA | Deterministic spending analytics for the current user, a group, or a friend. All numbers are computed in Python (never estimated by the model): category breakdown, monthly trend, owed-vs-paid ("mine vs split"), transaction ledger, top transactions, and — for groups — per-member comparison, category×member matrix, and a minimum-transaction settlement plan. Every result includes a reconciliation check (shares must sum to cost) and a multi-currency guard. target_type: "me" (all your expenses), "group" (needs target_id=group_id),
or "friend" (needs target_id=friend user_id).
dated_after / dated_before: ISO 8601 date filters (optional).
generate_dashboard: if True, also writes a self-contained HTML dashboard and
returns its file path in |
| compare_group_membersA | Deterministic per-member comparison for a group: total spend + ranking, category×member matrix, insights (highest/lowest/average/spread), and a minimum-transaction settlement plan. Convenience wrapper over analyze_spending with target_type='group'. |
| create_itemized_expenseA | Create ONE Splitwise expense from itemized line-items, each with its OWN split. This is how a receipt becomes an expense: the agent extracts line-items from the receipt image and passes them here. Each item can split differently (e.g. beers 3/4 to one person, groceries 4-way, cake between two) — the tool computes each person's total owed_share exactly in integer paise and reconciles to the total before writing. Set dry_run=True to preview the computed split without creating. items: list of { "desc": "Beers", "amount": "2710.00", # rupees, string with 2 decimals "category": "Drinks", # optional (free text, informational) "paid_by": , # who fronted this item "split": { # OR "split_ref": "" "type": "equal" | "shares" | "exact", "among": [user_id, ...], # for equal/shares "shares": {user_id: weight, ...}, # for shares "exact": {user_id: "amount", ...} # for exact (must sum to amount) } } |
| save_default_splitA | Save a reusable split template by name (e.g. "roomies-4way"). split: {"type": "equal"|"shares", "among": [user_id, ...], "shares"?: {user_id: weight}} Referenced from create_itemized_expense items via "split_ref": "". Stored locally in ~/.expensifyai/splits.json. |
| list_default_splitsB | List all saved split templates. |
| delete_default_splitB | Delete a saved split template by name. |
| attach_receiptA | Attach a receipt image or PDF (from a local file path) to an existing expense. Uploads the file to Splitwise via multipart on update_expense. Supports common image types and PDF. The receipt then shows on the expense in the app/website. (Splitwise's API only exposes receipt UPLOAD, not OCR — pair this with create_itemized_expense, where the calling agent reads the image for line-items.) |
| sync_allA | Sync Splitwise into a local SQLite mirror for instant offline search. Delta sync: uses the API's |
| search_notesA | Fuzzy search over expense descriptions AND notes/details in the local mirror. Use when exact search misses — catches typos, abbreviations (vizag/vskp/vtz), and amounts or words buried inside a bundled expense's note (e.g. a '5552' line inside a multi-item details field). Returns matches with a score (100 = exact substring) and whether it hit the description or the note. Run sync_all first. |
| search_expensesA | Search the local mirror (run sync_all first). Full-text over description/details/ category, plus filters: amount range, user_id, group_id, category, date range. Returns matching expenses. Instant, offline, no API calls, no Pro paywall. |
| import_statementA | Turn parsed statement rows into a reviewable import proposal (creates NOTHING). transactions: list of {date: 'YYYY-MM-DD', merchant (or description), amount, category? (override), split_ref? (a saved default-split name)}. default_split_name: template applied to rows without their own split_ref; if omitted, rows default to 100%-personal (you pay + owe fully). dedup: if True, flags rows that match an existing expense in the local mirror (same day + same amount) and marks them to skip, so re-importing a statement doesn't double-add. (Run sync_all first for dedup to see your existing data.) Returns proposals + summary. Review, then call confirm_import with the rows to create. |
| confirm_importA | Bulk-create expenses from approved statement rows (after import_statement review). rows: approved items, each {date, description, amount, category?, split_ref?}. Rows with a split_ref use that saved template; otherwise 100%-personal. group_id: default group for created expenses (0 = non-group). Per-row group_id overrides. Each expense is created via the itemization engine (exact paise, reconciled). Returns a per-row result list (created id or error). Sequential to stay under rate limits. |
| gmail_find_statementsA | Find bank/card statement emails in Gmail (read-only). Returns message id/subject/ from/date/snippet for you to pick from. Omit query to use a default that targets common Indian bank/card statement senders in the last 3 months. Then call gmail_read_statement. |
| gmail_read_statementA | Read one statement email's decoded text (read-only). Returns id/subject/from/date/text.
Extract the transactions from |
| unlock_statement_pdfA | Unlock + parse a password-protected statement PDF attached to a Gmail message. Provide name + dob (+ optional card_last4) so passwords can be derived (common Indian
bank formats), or pass an explicit |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 42 tools
Most tools have clear distinct purposes (expenses, groups, friends, splits, sync/search, import pipeline). Some potential confusion exists between get_expenses/search_expenses/search_notes and analyze_spending/compare_group_members, but descriptions clarify the differences.
Tool names mostly follow a consistent verb_noun pattern (create_expense, get_expense, update_expense, delete_expense, restore_expense). Minor deviations: sync_all, analyze_spending, compare_group_members, and the gmail_* / unlock_statement_pdf tools break the pattern slightly but remain readable.
42 tools is on the heavy side for a single server, but the breadth is justified by the domain (expense management, groups, friends, itemization, import pipeline, sync/search). Still, the count feels high and could overwhelm an agent.
The tool surface covers the full expense lifecycle (create, read, update, delete, restore), groups, friends, comments, categories, currencies, notifications, itemized expenses, default splits, receipt attachment, local sync/search, and a full statement import pipeline (Gmail → PDF unlock → import → confirm). No obvious dead ends.