Splitwise MCP Server
README.md
# Splitwise MCP Server
A small [MCP](https://modelcontextprotocol.io) server (built with
[FastMCP](https://gofastmcp.com)) that wraps the
[Splitwise API](https://dev.splitwise.com) so Claude can read and manage your
**expenses** directly.
## Tools
| Tool | What it does |
|------|--------------|
| `list_expenses` | List expenses (filter by group, friend, date ranges; paginated) |
| `get_expense` | Get one expense's full details by id |
| `create_expense` | Add an expense — split equally or with custom per-user shares |
| `update_expense` | Edit an existing expense |
| `delete_expense` | Delete an expense |
## Credentials
Each user supplies **their own** Splitwise API key (and optional default group id).
The server reads them per request, in this order:
1. **HTTP request headers** (multi-user / hosted) — preferred:
| Header | Required | Purpose |
|--------|----------|---------|
| `X-Splitwise-Api-Key` | yes | The caller's Splitwise API key (Bearer token) |
| `X-Splitwise-Group-Id` | no | Default group id when a tool omits `group_id` |
2. **Environment variables** (single-user / local fallback) — `SPLITWISE_API_KEY`,
`SPLITWISE_GROUP_ID`.
This means one hosted deployment can serve many people: each person plugs in their
own key via their client config — no shared key, no per-user redeploy.
Get an API key at [dev.splitwise.com](https://dev.splitwise.com) → **Your apps** →
create an app → copy the **API key**. The group id is in the URL when you open a
group on splitwise.com.
---
## Deploy to FastMCP Cloud (hosted, multi-user)
FastMCP Cloud runs the server remotely and gives you one HTTPS URL that many
people can use — **each with their own key**, passed as a header. You (the owner)
don't need to put any Splitwise secret in the dashboard.
1. **Push this folder to a GitHub repo** (see "Git setup" below).
2. Go to [fastmcp.cloud](https://fastmcp.cloud), sign in with GitHub, and
**create a project** from your repo.
3. Set the **entrypoint** to:
```
server.py:mcp
```
(FastMCP Cloud installs dependencies from `pyproject.toml` automatically.)
4. **Authentication:** so other people can connect, set the project's access to
**public / unauthenticated**. The real credential is each user's
`X-Splitwise-Api-Key` header, so the server doesn't need its own login gate.
(No `SPLITWISE_*` env vars needed in the dashboard for the multi-user case.)
5. Deploy. You'll get a URL like `https://your-project.fastmcp.app/mcp`. Share it.
### How each user adds the server to Claude
Every user runs this with **their own** key and group id:
**Claude Code (CLI):**
```bash
claude mcp add --transport http splitwise https://your-project.fastmcp.app/mcp \
--header "X-Splitwise-Api-Key: THEIR_API_KEY" \
--header "X-Splitwise-Group-Id: THEIR_GROUP_ID"
```
**Other clients (JSON form):**
```json
{
"mcpServers": {
"splitwise": {
"url": "https://your-project.fastmcp.app/mcp",
"headers": {
"X-Splitwise-Api-Key": "THEIR_API_KEY",
"X-Splitwise-Group-Id": "THEIR_GROUP_ID"
}
}
}
}
```
> Note: header-based config works in clients that support custom MCP headers
> (e.g. Claude Code). The Claude Desktop "Add custom connector" UI currently
> only takes a URL (no custom headers), so Desktop users would need a client
> that supports headers — or you'd move to OAuth. For most setups, Claude Code
> is the way each user plugs in their key.
---
## Run locally (stdio, optional)
You can also run it on your own machine without the cloud. Here the secrets DO
go in the Claude config (since the process runs locally):
```bash
uv sync # install deps
```
**Claude Code (CLI):**
```bash
claude mcp add splitwise \
-e SPLITWISE_API_KEY=your_api_key_here \
-e SPLITWISE_GROUP_ID=your_default_group_id \
-- uv run --directory /Users/azeemwaqar/Desktop/home/work/splitwise_mcp server.py
```
**Claude Desktop** `claude_desktop_config.json`:
```json
{
"mcpServers": {
"splitwise": {
"command": "uv",
"args": ["run", "--directory", "/Users/azeemwaqar/Desktop/home/work/splitwise_mcp", "server.py"],
"env": {
"SPLITWISE_API_KEY": "your_api_key_here",
"SPLITWISE_GROUP_ID": "your_default_group_id"
}
}
}
}
```
Inspect tools interactively:
```bash
uv run fastmcp dev server.py
```
---
## Git setup (for FastMCP Cloud)
```bash
cd /Users/azeemwaqar/Desktop/home/work/splitwise_mcp
git init
git add .
git commit -m "Splitwise expense MCP server"
# create an empty repo on GitHub, then:
git remote add origin https://github.com/<you>/splitwise-mcp.git
git branch -M main
git push -u origin main
```
`.env` is git-ignored, so your key never gets committed.
## Notes on splitting
- **Equal split** (default): omit `users`; the cost splits evenly across the group.
- **Custom split**: pass `users`, e.g.
`[{"user_id": 123, "paid_share": "25.00", "owed_share": "12.50"}, ...]`.
`paid_share` values must sum to `cost`, and so must `owed_share`. You can
identify a user by `user_id`, or by `email` / `first_name` / `last_name`.
Scope is intentionally limited to expenses — no friends/groups/categories
management tools (yet).
TDQS
A4.2/5.0
Scored across 5 tools
Disambiguation5/5
Each tool has a clearly distinct purpose: create, delete, get, list, update. No overlap or ambiguity.
Naming Consistency5/5
All tools follow a consistent verb_noun pattern in snake_case (e.g., create_expense, list_expenses), making them predictable.
Tool Count5/5
5 tools is appropriate for the domain of expense management, covering core CRUD operations without unnecessary bloat.
Completeness5/5
The toolset covers all basic expense lifecycle operations (create, read, update, delete, list) with detailed split support, leaving no obvious gaps.
Maintenance
ActivitySlowing
ResponsivenessNo issues