Skip to main content
Glama
AzeemWaqarRao

Splitwise MCP Server

Splitwise MCP Server

A small MCP server (built with FastMCP) that wraps the Splitwise API 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

Related MCP server: Splitwise MCP Server

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.comYour 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, 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):

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):

{
  "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):

uv sync   # install deps

Claude Code (CLI):

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:

{
  "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:

uv run fastmcp dev server.py

Git setup (for FastMCP Cloud)

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).

Available Tools

5 tools
create_expenseA

Create a new expense.

cost is a decimal string, e.g. "25.00". description is required.

Splitting:

  • Equal split (default): leave users empty; the cost is split evenly among everyone in the resolved group (group_id or SPLITWISE_GROUP_ID).

  • Custom split: pass users, a list of dicts each like {"user_id": 123, "paid_share": "25.00", "owed_share": "12.50"}. Identify a user by user_id, or by email/first_name/last_name. The paid_share values must sum to cost, and so must the owed_share values.

date accepts ISO 8601 (e.g. "2026-06-15T00:00:00Z"). currency_code is a 3-letter code (e.g. "USD"). category_id and details are optional.

ParametersJSON Schema
NameRequiredDescriptionDefault
costYes
dateNo
usersNo
detailsNo
group_idNo
category_idNo
descriptionYes
currency_codeNo
split_equallyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description must cover behavior. It details splitting logic and date format but does not mention success responses, error conditions, permissions, or side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections for splitting, date, currency. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 9 parameters and 2 required, the description covers all parameters effectively. Output schema exists, so return values need not be detailed here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description provides essential semantics: cost as decimal string, users as list of dicts with specific keys, date as ISO 8601, and default behavior when users is empty.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with 'Create a new expense.' and explains the resource and action clearly. It distinguishes from siblings (delete, get, list, update) by focusing on creation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains when to use equal split versus custom split and mentions the group_id needed. It could explicitly state that this is for new expenses only, but context from sibling tools helps.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_expenseA

Delete an expense by id. Returns {"success": true} on success.

ParametersJSON Schema
NameRequiredDescriptionDefault
expense_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the destructive action ('Delete') and the return value on success. With no annotations, this is adequate for a simple delete operation, though failure behavior is not mentioned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very concise: two sentences with no wasted words. The action is front-loaded, making it easy for an agent to quickly understand the tool's purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter delete tool, the description covers the basic purpose and return value. However, it lacks details on error cases, idempotency, or any side effects, which would be valuable given no annotations or output schema details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description only says 'by id,' which adds little beyond the parameter name 'expense_id' in the schema. With 0% schema description coverage, the description should provide more detail about the parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Delete an expense by id.' It uses a specific verb and resource, distinguishing it from sibling tools like create_expense, get_expense, list_expenses, and update_expense.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: use when you want to delete an expense. However, there is no explicit guidance on when to use this tool versus alternatives, nor any mention of prerequisites or consequences.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_expenseA

Get the full details of a single expense by its id.

ParametersJSON Schema
NameRequiredDescriptionDefault
expense_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It states 'Get' implying read-only, but does not disclose output format, side effects, or authentication needs. For a simple get-by-id, this is minimally adequate but lacks explicit behavioral traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single short sentence with no wasted words. It is efficient, though a brief mention of the output could be beneficial without being overly long.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has one parameter and an output schema, the description is complete enough for a simple get-by-id operation. It covers what the tool does and what input to provide, with no obvious gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but with only one parameter, the description adds meaning that expense_id is the identifier used to fetch the expense. While minimal, it provides the necessary context beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Get' and resource 'full details of a single expense', clearly distinguishing it from siblings like list_expenses (which returns multiple) and create/delete/update (mutations).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when full details of a single expense are needed, but does not explicitly state when to avoid it (e.g., use list_expenses for multiple, create/update for mutations). No alternatives or exclusions are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_expensesA

List expenses, most recent first.

When group_id is omitted, the SPLITWISE_GROUP_ID default is used. Pass group_id=0 to list expenses across all groups and non-group expenses. Date filters (dated_after/before, updated_after/before) accept ISO 8601 strings, e.g. "2026-01-31T00:00:00Z".

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
group_idNo
friend_idNo
dated_afterNo
dated_beforeNo
updated_afterNo
updated_beforeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries full burden. It discloses sorting order, default group behavior, special group_id=0, and date format. However, it omits pagination behavior and does not mention all parameters like friend_id.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, directly addressing the main functionality and key parameter nuances. No unnecessary words; front-loaded with the primary action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 8 optional parameters and an output schema, the description covers sorting, group scope, and date format. However, it lacks explanation for friend_id and pagination, leaving some gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema coverage, the description must compensate. It explains date filter format and group_id special values, but limit, offset, and friend_id remain undocumented. Only partial parameter coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists expenses, sorted most recent first. It is distinct from sibling tools (create, delete, get, update) which have different purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for listing expenses but does not explicitly guide when to use this tool versus alternatives like get_expense. No exclusions or when-not guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_expenseA

Update an existing expense. Only provided fields are changed.

Note: if you pass users (custom shares), it overwrites ALL existing shares on the expense — include every participant. See create_expense for the users format and split rules.

ParametersJSON Schema
NameRequiredDescriptionDefault
costNo
dateNo
usersNo
detailsNo
group_idNo
expense_idYes
category_idNo
descriptionNo
currency_codeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided; description carries burden. Discloses partial update behavior and overwrite risk for 'users' parameter. Missing details on error handling or side effects, but sufficient for standard update.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two-sentence description, front-loaded with main action, followed by critical note on users parameter. No redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers key behavioral aspects of update operation; output schema presumably handles return values. Could mention error handling or idempotency, but still fairly complete for given complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%; description only explains 'users' parameter's overwrite behavior and references create_expense for format. Other parameters (cost, date, etc.) rely on name inference. Limited added value beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Update an existing expense' with a specific verb and resource. Distinct from sibling tools (create, delete, get, list) by implying modification of existing entity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly notes that only provided fields are changed, giving usage context. No explicit when-not-to-use or prerequisites (e.g., expense must exist). Implicitly for updating, but lacks exclusion of other tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updatesv0.1.0
    • First observedcreate_expense
    • First observeddelete_expense
    • First observedget_expense
    • First observedlist_expenses
    • First observedupdate_expense

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

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables conversational control of Splitwise accounts through Claude AI, allowing users to add expenses, check group balances, record settlements, and manage payment splits using natural language commands. Supports multiple currencies and flexible splitting methods including equal, exact, and percentage-based divisions.
    1
    MIT
  • F
    license
    A
    quality
    C
    maintenance
    A standalone MCP server that provides complete access to the Splitwise API, enabling natural language management of expenses, groups, friends, and notifications in MCP-compatible clients like Claude Desktop and VS Code Copilot.
    9
    1
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    A local MCP server that enables AI clients like Codex, Claude Code, and Claude Desktop to manage Splitwise expenses, friends, groups, and more through natural language.
    2
    -