Connects Claude to your Splitwise account through the official Splitwise API, exposing 20 tools for managing shared expenses, groups, and friends. You can ask Claude to add expenses with custom splits, check balances, create groups, invite friends, or search past transactions. It covers the full CRUD surface: create/update/delete expenses and comments, manage group membership, handle friend requests. Runs via npx or from source, authenticates with your Splitwise API key. Built entirely by Claude Code, so review the implementation before use. Best for automating expense tracking when you're already managing shared costs in Splitwise and want natural language access without opening the app.
Public tool metadata for what this MCP can expose to an agent.
users.get_currentReturns information about the authenticated user: id, name, email, default currency, locale, registration status.Returns information about the authenticated user: id, name, email, default currency, locale, registration status.
No parameter schema in public metadata yet.
users.getReturns public information about another Splitwise user by id.1 paramsReturns public information about another Splitwise user by id.
idintegerusers.updateUpdate the authenticated user's profile (first_name, last_name, email, password, default_currency, locale, etc.).7 paramsUpdate the authenticated user's profile (first_name, last_name, email, password, default_currency, locale, etc.).
idintegeremailstringlocalestringpasswordstringlast_namestringfirst_namestringdefault_currencystringgroups.list**Note**: Expenses that are not associated with a group are listed in a group with ID 0.**Note**: Expenses that are not associated with a group are listed in a group with ID 0.
No parameter schema in public metadata yet.
groups.getReturns full details for a group: members, balances, simplified-debts setting, group type, avatar.1 paramsReturns full details for a group: members, balances, simplified-debts setting, group type, avatar.
idintegergroups.createCreates a new group. Adds the current user to the group by default. **Note**: group user parameters must be flattened into the format `users__{index}__{property}`, where `property` is `user_id`, `first_name`, `last_name`, or `email`. The user's email or ID must be provided.3 paramsCreates a new group. Adds the current user to the group by default. **Note**: group user parameters must be flattened into the format `users__{index}__{property}`, where `property` is `user_id`, `first_name`, `last_name`, or `email`. The user's email or ID must be provided.
namestringgroup_typestringhome · trip · couple · other · apartment · housesimplify_by_defaultbooleangroups.deleteDelete an existing group. Destroys all associated records (expenses, etc.)1 paramsDelete an existing group. Destroys all associated records (expenses, etc.)
idintegergroups.restoreRestores a deleted group. **Note**: 200 OK does not indicate a successful response. You must check the `success` value of the response.1 paramsRestores a deleted group. **Note**: 200 OK does not indicate a successful response. You must check the `success` value of the response.
idintegergroups.add_user**Note**: 200 OK does not indicate a successful response. You must check the `success` value of the response.1 params**Note**: 200 OK does not indicate a successful response. You must check the `success` value of the response.
_bodystringgroups.remove_userRemove a user from a group. Does not succeed if the user has a non-zero balance. **Note:** 200 OK does not indicate a successful response. You must check the success value of the response.2 paramsRemove a user from a group. Does not succeed if the user has a non-zero balance. **Note:** 200 OK does not indicate a successful response. You must check the success value of the response.
user_idintegergroup_idintegerfriends.list**Note**: `group` objects only include group balances with that friend.**Note**: `group` objects only include group balances with that friend.
No parameter schema in public metadata yet.
friends.getReturns details about a single friendship including balances by currency and any pending expenses with that friend.1 paramsReturns details about a single friendship including balances by currency and any pending expenses with that friend.
idintegerfriends.createAdds a friend. If the other user does not exist, you must supply `user_first_name`. If the other user exists, `user_first_name` and `user_last_name` will be ignored.3 paramsAdds a friend. If the other user does not exist, you must supply `user_first_name`. If the other user exists, `user_first_name` and `user_last_name` will be ignored.
user_emailstringuser_last_namestringuser_first_namestringfriends.create_batchAdd multiple friends at once. For each user, if the other user does not exist, you must supply `users__{index}__first_name`. **Note**: user parameters must be flattened into the format `users__{index}__{property}`, where `property` is `first_name`, `last_name`, or `email`.1 paramsAdd multiple friends at once. For each user, if the other user does not exist, you must supply `users__{index}__first_name`. **Note**: user parameters must be flattened into the format `users__{index}__{property}`, where `property` is `first_name`, `last_name`, or `email`.
_bodystringfriends.deleteGiven a friend ID, break off the friendship between the current user and the specified user. **Note**: 200 OK does not indicate a successful response. You must check the `success` value of the response.1 paramsGiven a friend ID, break off the friendship between the current user and the specified user. **Note**: 200 OK does not indicate a successful response. You must check the `success` value of the response.
idintegerreference.currenciesReturns a list of all currencies allowed by the system. These are mostly ISO 4217 codes, but we do sometimes use pending codes or unofficial, colloquial codes (like BTC instead of XBT for Bitcoin).Returns a list of all currencies allowed by the system. These are mostly ISO 4217 codes, but we do sometimes use pending codes or unofficial, colloquial codes (like BTC instead of XBT for Bitcoin).
No parameter schema in public metadata yet.
expenses.getReturns full details for a single expense by id: payers, splits, shares, comments count, group, and audit metadata.1 paramsReturns full details for a single expense by id: payers, splits, shares, comments count, group, and audit metadata.
idintegerexpenses.listList expenses visible to the authenticated user. Supports filters: group_id, friend_id, dated_after, dated_before, updated_after, updated_before, limit, offset.8 paramsList expenses visible to the authenticated user. Supports filters: group_id, friend_id, dated_after, dated_before, updated_after, updated_before, limit, offset.
limitintegeroffsetintegergroup_idintegerfriend_idintegerdated_afterstringdated_beforestringupdated_afterstringupdated_beforestringexpenses.createCreates an expense. You may either split an expense equally (only with `group_id` provided), or supply a list of shares. When splitting equally, the authenticated user is assumed to be the payer. When providing a list of shares, each share must include `paid_share` and `owed_s...1 paramsCreates an expense. You may either split an expense equally (only with `group_id` provided), or supply a list of shares. When splitting equally, the authenticated user is assumed to be the payer. When providing a list of shares, each share must include `paid_share` and `owed_s...
_bodystringexpenses.updateUpdates an expense. Parameters are the same as in `create_expense`, but you only need to include parameters that are changing from the previous values. If any values is supplied for `users__{index}__{property}`, _all_ shares for the expense will be overwritten with the provide...17 paramsUpdates an expense. Parameters are the same as in `create_expense`, but you only need to include parameters that are changing from the previous values. If any values is supplied for `users__{index}__{property}`, _all_ shares for the expense will be overwritten with the provide...
idintegercoststringdatestringdetailsstringgroup_idintegercategory_idintegerdescriptionstringcurrency_codestringrepeat_intervalstringnever · weekly · fortnightly · monthly · yearlyusers__1__emailstringusers__0__user_idintegerusers__1__last_namestringusers__0__owed_sharestringusers__0__paid_sharestringusers__1__first_namestringusers__1__owed_sharestringusers__1__paid_sharestringexpenses.delete**Note**: 200 OK does not indicate a successful response. The operation was successful only if `success` is true.1 params**Note**: 200 OK does not indicate a successful response. The operation was successful only if `success` is true.
idintegerexpenses.restore**Note**: 200 OK does not indicate a successful response. The operation was successful only if `success` is true.1 params**Note**: 200 OK does not indicate a successful response. The operation was successful only if `success` is true.
idintegercomments.listReturns the comments on a given expense. `expense_id` is required.1 paramsReturns the comments on a given expense. `expense_id` is required.
expense_idintegercomments.createAdd a comment to an existing expense by expense_id.2 paramsAdd a comment to an existing expense by expense_id.
contentstringexpense_idintegercomments.deleteDeletes a comment. Returns the deleted comment.1 paramsDeletes a comment. Returns the deleted comment.
idintegernotifications.listReturn a list of recent activity on the users account with the most recent items first. `content` will be suitable for display in HTML and uses only the `<strong>`, `<strike>`, `<small>`, `<br>` and `<font color="#FFEE44">` tags. The `type` value indicates what the notificatio...2 paramsReturn a list of recent activity on the users account with the most recent items first. `content` will be suitable for display in HTML and uses only the `<strong>`, `<strike>`, `<small>`, `<br>` and `<font color="#FFEE44">` tags. The `type` value indicates what the notificatio...
limitintegerupdated_afterstringreference.categoriesReturns a list of all categories Splitwise allows for expenses. There are parent categories that represent groups of categories with subcategories for more specific categorization. When creating expenses, you must use a subcategory, not a parent category. If you intend for an...Returns a list of all categories Splitwise allows for expenses. There are parent categories that represent groups of categories with subcategories for more specific categorization. When creating expenses, you must use a subcategory, not a parent category. If you intend for an...
No parameter schema in public metadata yet.
A Model Context Protocol server that connects Claude to Splitwise, giving you natural-language access to your expenses, groups, friends, and balances.
[!WARNING] AI-developed project. This codebase was entirely built and is actively maintained by Claude Code. No human has audited the implementation. Review all code and tool permissions before use.
Ask Claude things like:
By using this MCP server, you acknowledge and agree to the following:
1. This server accesses your own Splitwise account via Splitwise's official Developer API. Auth happens via your own API consumer key + secret, which Splitwise issues to you when you register an app. It does not — and cannot — access anyone else's expenses or groups.
2. Splitwise's Developer Terms govern your use of this server. The clauses most relevant here:
You will use Splitwise Materials solely as necessary to develop, test and support a Self-Service integration of your software application… with Splitwise.
And on rate limits: "You will not use the API in a manner that exceeds rate limits, or constitutes excessive or abusive usage." And on competitive use: "You may not [use] Splitwise Materials to create an application that replicates existing Splitwise functionality or competes with Splitwise."
You are agreeing to those terms — read by the maintainer 2026-05-23 — every time you invoke a tool in this server.
3. Personal, non-commercial use only. This project is not affiliated with, endorsed by, sponsored by, or in partnership with Splitwise, Inc. It is a personal automation tool that calls the documented public Splitwise REST API on your own account. Do not use it to commercialize Splitwise data, compete with Splitwise's product, or share API credentials with third parties.
4. Your API key is yours alone. Splitwise issues credentials per-app, per-developer. Do not commit your SPLITWISE_API_KEY (or consumer key/secret) to git, do not paste it into shared chats, and do not embed it in a public client.
5. You accept full responsibility for any consequences of using this server in connection with your Splitwise account — rate limiting, API key revocation, account warnings, or any enforcement action. If Splitwise objects to your use or your usage exceeds their rate limits, stop using this server.
This section is the maintainer's good-faith summary of the terms — it is not legal advice and does not modify or supersede Splitwise's actual Developer Terms.
npx -y splitwise-mcp
Add to your Claude config (.mcp.json or Claude Desktop config):
{
"mcpServers": {
"splitwise": {
"command": "npx",
"args": ["-y", "splitwise-mcp"],
"env": {
"SPLITWISE_API_KEY": "your-api-key-here"
}
}
}
}
git clone https://github.com/chrischall/splitwise-mcp.git
cd splitwise-mcp
npm install
npm run build
Add to Claude Desktop config:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.json{
"mcpServers": {
"splitwise": {
"command": "node",
"args": ["/absolute/path/to/splitwise-mcp/dist/index.js"],
"env": {
"SPLITWISE_API_KEY": "your-api-key-here"
}
}
}
}
| Env var | Required | Notes |
|---|---|---|
SPLITWISE_API_KEY | Yes | API key from splitwise.com/apps/register |
20 tools across 5 domains. All tools are prefixed sw_.
| Tool | What it does |
|---|---|
sw_get_current_user | Get the authenticated user's profile |
sw_get_user | Get another user's profile by ID |
| Tool | What it does |
|---|---|
sw_list_groups | List all groups with members |
sw_get_group | Group details including members and balances |
sw_create_group | Create a new group |
sw_delete_group | Soft-delete a group |
sw_undelete_group | Restore a deleted group |
sw_add_user_to_group | Add a user to a group |
sw_remove_user_from_group | Remove a user from a group |
| Tool | What it does |
|---|---|
sw_list_friends | List all friends |
sw_create_friend | Add a friend by email |
sw_delete_friend | Remove a friendship |
| Tool | What it does |
|---|---|
sw_list_expenses | List or search expenses with filters |
sw_get_expense | Full details of a single expense |
sw_create_expense | Create an expense (equal or custom split) |
sw_update_expense | Edit an existing expense |
sw_delete_expense | Soft-delete an expense |
sw_undelete_expense | Restore a deleted expense |
sw_get_comments | Get comments on an expense |
sw_create_comment | Add a comment to an expense |
sw_delete_comment | Delete a comment |
| Tool | What it does |
|---|---|
sw_get_notifications | Recent activity feed |
sw_get_categories | Expense category list |
sw_get_currencies | Supported currency codes |
"SPLITWISE_API_KEY is required" -- set the environment variable in your MCP config or a .env file.
429 rate limit -- Splitwise has undocumented rate limits. Wait a moment and retry.
Tools not appearing in Claude -- go to Claude Desktop > Settings > Developer to see connected servers. Make sure you fully quit and relaunched after editing the config.
npm test # run the test suite (vitest)
npm run build # compile TypeScript -> dist/
src/
client.ts Splitwise API client (auth, request handling)
index.ts MCP server entry point
tools/
user.ts sw_get_current_user, sw_get_user
groups.ts group CRUD and membership
friends.ts friend list and management
expenses.ts expense CRUD, comments
utilities.ts notifications, categories, currencies
MIT
SPLITWISE_API_KEY*secretYour Splitwise API key (splitwise.com/apps/api)