Skip to main content
Glama
nnishad

open-splitwise

by nnishad

open-splitwise

Verwandle Splitwise in einen agenten-nativen Ausgaben-Tracker.

Ein offener Model Context Protocol (MCP)-Server, der es jedem KI-Agenten — Hermes, Claude Desktop, Claude Code, Cursor oder allem, was MCP spricht — ermöglicht, Salden zu lesen, Ausgaben aus unstrukturierter natürlicher Sprache aufzuteilen, eigene Authentifizierungsprobleme zu diagnostizieren und sich nie Gedanken über Ratenlimits zu machen.

Python 3.11+ · MCP spec 2026-07-28 · stdio transport · 33 tools · lazy-loaded


Warum

Bestehende Splitwise-Integrationen geben dem Modell einen rohen API-Spiegel und hoffen auf das Beste. Das scheitert auf vorhersehbare Weise: Das Modell erfindet Kategorie-IDs, teilt ₹300 falsch auf drei Personen auf, glaubt Splitwises 200 OK, obwohl die Anfrage tatsächlich fehlgeschlagen ist, oder behandelt eine Rate-Limit-Antwort als Fehler, den es aggressiv erneut versuchen soll.

open-splitwise behebt dies auf der Server-Ebene:

Problem für Agenten

Was open-splitwise tut

„Abendessen mit Alice teilen" erfordert 3–4 API-Aufrufe + Arithmetik

quick_add_expense löst Namen → IDs auf, berechnet centgenaue Anteile, wählt die Kategorie aus, postet einmal

Zwei Alices in deiner Freundesliste

resolve_users gibt Kandidatenlisten zurück, damit der Agent dich fragt, welche gemeint ist

„Was schulde ich?" erfordert Aggregation über mehrere Endpunkte

money_summary gibt Summen pro Währung in einem Aufruf zurück

Splitwise gibt 200 OK mit einem errors-Objekt zurück

Der Server prüft es; Fehler erscheinen als Tool-Fehler mit handlungsorientiertem Text — niemals falscher Erfolg

HTTP-429-Ratenlimits

Unsichtbar wiederholt (Retry-After wird beachtet, exponentielles Backoff als Fallback)

Schlüssel widerrufen / mitten in der Sitzung abgemeldet

Fehler teilen dem Agenten die Ursache mit und dass er setup_auth ausführen soll; neue Schlüssel gelten sofort, kein Neustart

33 Tool-Schemas verbrennen ~4k Tokens in jedem Prompt

Lazy Tool Discovery: Standardmäßig sind nur 7 wesentliche Tools verfügbar; search_tools("expenses") lädt den Rest bei Bedarf mit vollständigen Schemas

Features

  • Vollständige API-Abdeckung — alle 27 Endpunkte der offiziellen Splitwise-OpenAPI-3.0-Spezifikation, ein Tool pro Endpunkt, originalgetreue Namen.

  • Workflow-Ebene — High-Level-Tools, sodass eine einzelne Äußerung einem einzelnen Aufruf entspricht.

  • Self-Service-Authentifizierungslebenszyklussetup_auth validiert einen Schlüssel live gegen Splitwise, bevor er gespeichert wird (falsche Schlüssel werden nie gespeichert), get_auth_status erklärt, was konfiguriert ist, logout löscht Anmeldedaten. Eine erneute Authentifizierung funktioniert mitten in der Sitzung.

  • Ehrliche Fehler — jeder Fehlermodus (nicht aufgelöste Person, Anteilssummen-Konflikt, unbekannte Kategorie, widerrufener Schlüssel, erschöpfte Wiederholungsversuche) gibt Text zurück, der dem Agenten genau sagt, was passiert ist und was als Nächstes zu tun ist.

  • Standardmäßig sichere Anmerkungen — Lesevorgänge tragen readOnlyHint, destruktive Löschungen tragen destructiveHint, gemäß MCP-2026-07-28-Semantik. Tools registrieren sich in deterministischer Reihenfolge für cache-freundliche Erkennung.

  • Lokale Geheimnisse — API-Schlüssel wird unter ~/.config/splitwise-mcp/credentials.json gespeichert, Modus 0600, atomare Schreibvorgänge, niemals ausgegeben (nur maskierte Vorschauen).

Schnellstart

git clone https://github.com/<you>/open-splitwise.git
cd open-splitwise
uv sync

Führe es eigenständig aus (stdio):

uv run open-splitwise          # starts with no key configured — see auth below

Hole dir einen API-Schlüssel unter https://secure.splitwise.com/apps (Kontoeinstellungen → API-Schlüssel).

Verbinde einen beliebigen MCP-Client

Generischer stdio-Block (Claude Desktop claude_desktop_config.json, Claude Code .mcp.json, Cursor, …):

{
  "mcpServers": {
    "splitwise": {
      "command": "uv",
      "args": ["--directory", "/absolute/path/to/open-splitwise", "run", "open-splitwise"],
      "env": { "SPLITWISE_API_KEY": "<optional: preconfigure>" }
    }
  }
}

Hermes-Agent verbinden

Füge zu ~/.hermes/config.yaml hinzu:

mcp_servers:
  splitwise:
    command: "uv"
    args: ["--directory", "/absolute/path/to/open-splitwise", "run", "open-splitwise"]
    env:
      SPLITWISE_API_KEY: "<optional>"
    tools:
      include: [quick_add_expense, resolve_users, money_summary, get_auth_status]
    prompts: false
    resources: false

Dann /reload-mcp. Beginne mit den vier Workflow-/Auth-Tools oben; füge rohe API-Tools nur bei Bedarf hinzu — Hermes' serverseitige Filterung hält den Tool-Umfang klein.

Authentifizierungslebenszyklus

Der Server ist so konzipiert, dass Agenten Authentifizierungsprobleme selbst diagnostizieren und beheben und dich nur nach dem Geheimnis fragen:

Situation

Für den Agenten sichtbares Verhalten

Kein Schlüssel vorhanden

Jedes Tool schlägt fehl mit: „Kein Splitwise-API-Schlüssel ist konfiguriert. Bitte den Benutzer, einen unter secure.splitwise.com/apps zu erstellen, und rufe dann setup_auth auf."

Benutzer stellt einen Schlüssel bereit

setup_auth(api_key) prüft zuerst /get_current_user — ungültige Schlüssel werden abgelehnt, nicht gespeichert; gültige Schlüssel werden gespeichert und es wird berichtet, wem sie gehören

Schlüssel widerrufen / Konto abgemeldet (HTTP 401/403)

Tools schlagen fehl mit „Der Schlüssel könnte widerrufen, abgelaufen oder das Konto abgemeldet worden sein … bitte den Benutzer um einen neuen Schlüssel und rufe setup_auth auf"

Diagnose

get_auth_status(){configured, source: stored|environment, masked_key}

Konten wechseln

logout() löscht die gespeicherte Anmeldeinformation

Die Schlüsselauflösung erfolgt pro Anfrage: gespeicherte Anmeldeinformation → SPLITWISE_API_KEY-Umgebungsvariable → keine. Ein frisch gespeicherter Schlüssel wird sofort im laufenden Prozess wirksam — keine Neustarts.

Anmeldedaten liegen unter ~/.config/splitwise-mcp/credentials.json (Modus 0600). Überschreibe das Verzeichnis mit SPLITWISE_MCP_CONFIG_DIR (praktisch für Tests oder Multi-Profil-Setups).

Agenten-Ergonomie

You:      "add dinner 900 split with alice and bob@x.com, groceries"
Agent:    quick_add_expense(description="Dinner", cost="900.00",
                            participants=["alice", "bob@x.com"],
                            category_name="groceries")
Server:   resolves alice→12? two matches! → error listing Alice A (id 10), Alice Wood (id 12)
Agent:    "Which Alice?"  → you answer → re-call succeeds
Server:   { status: created, expense_id: 99123,
            splits: [ "Nikhil paid 900.00 INR",
                      "Alice A owes 300.00 INR",
                      "Bob B owes 300.00 INR" ] }
  • quick_add_expense — Namen/Teilnamen/E-Mails/IDs werden akzeptiert; gleiche Anteile werden berechnet, Restcents deterministisch verteilt; benutzerdefinierte owed_shares werden auf exakte Summe validiert; Zahler standardmäßig enthalten (include_payer_in_split=false, wenn sie nicht konsumiert haben); Währung standardmäßig aus deinem Profil.

  • resolve_users — E-Mail-Exaktübereinstimmung, Vollnamen-Übereinstimmung, eindeutiger Vorname, Teilstring-Fallback; Mehrdeutigkeit gibt Kandidaten zurück, anstatt zu raten.

  • money_summary — pro Währung owed_to_you / you_owe / net, Freundes-Salden und vereinfachte Gruppenschulden, an denen du beteiligt bist.

Tool-Referenz (33)

Gruppe

Tools

Workflows

quick_add_expense · resolve_users · money_summary

Benutzer

get_current_user · get_user · update_user

Gruppen

get_groups · get_group · create_group · delete_group* · undelete_group · add_user_to_group · remove_user_from_group

Freunde

get_friends · get_friend · create_friend · create_friends · delete_friend*

Ausgaben

get_expenses · get_expense · create_expense · update_expense · delete_expense* · undelete_expense

Kommentare

get_comments · create_comment · delete_comment*

Benachrichtigungen

get_notifications

Sonstiges

get_currencies · get_categories

Auth

setup_auth · get_auth_status · logout*

* mit destructiveHint=true annotiert; alle get_*-Tools sind mit readOnlyHint=true annotiert. Bevorzuge Workflow-Tools gegenüber ihren rohen Gegenstücken, wann immer beide existieren.

Ratenlimitierung

Splitwise antwortet mit HTTP 429, wenn gedrosselt wird. open-splitwise wiederholt automatisch: Retry-After-Header wird wörtlich beachtet; andernfalls exponentielles Backoff (0,5 s Verdopplung, begrenzt auf 30 s), standardmäßig bis zu 3 Versuche. Agenten sehen nur dann einen Fehler, wenn alle Versuche erschöpft sind — und dieser Fehler sagt, langsamer zu machen, nicht blind zu wiederholen.

Konfiguration

Umgebungsvariable

Standard

Zweck

SPLITWISE_API_KEY

Bootstrap-Schlüssel (gespeicherte Anmeldedaten haben Vorrang)

SPLITWISE_MCP_CONFIG_DIR

~/.config/splitwise-mcp

Wo credentials.json liegt

SPLITWISE_MCP_MAX_RETRIES

3

429-Wiederholungsversuche, bevor ein Fehler angezeigt wird

SPLITWISE_MCP_LAZY

on

off registriert alle 33 Tools im Voraus

Splitwise-Eigenheiten, die für dich behandelt werden

  • Array-Parameter werden in Splitwises seltsame users__{index}__{property}-Kodierung umgewandelt

  • 200 OK ≠ Erfolg: errors{} / success:false werden bei jeder Mutation geprüft

  • Geld als Dezimal-Zeichenketten mit 2 Nachkommastellen; Restcents werden verteilt, Summen sind immer exakt

  • category_id muss eine Unterkategorie sein — durchgesetzt über unscharfe Namensauflösung

  • Salden/Schulden werden aus vorberechneten balance[] / simplified_debts gelesen (niemals neu berechnet)

  • „Settle up" ist nur eine Ausgabe mit payment:true (es gibt keinen dedizierten Endpunkt)

  • OAuth2 existiert, ist aber bewusst außerhalb des Rahmens: Persönliche API-Schlüssel passen zum Agent-fragt-Benutzer-Ablauf; OAuth benötigt eine Redirect-URI + Browser (nur für gehostete Bereitstellungen)

Architektur

┌─────────────── any MCP client ───────────────┐
│  Hermes / Claude Desktop / Cursor / …        │
└──────────────────┬───────────────────────────┘
                   │ JSON-RPC over stdio
┌──────────────────▼───────────────────────────┐
│ server.py — FastMCP app, 33 tools            │
│   workflows · raw endpoints · auth lifecycle │
├──────────────────────────────────────────────┤
│ client.py — async REST client                │
│   bearer auth (per-request key resolution)   │
│   param flattening · success verification    │
│   transparent 429 retry/backoff              │
├──────────────────────────────────────────────┤
│ auth.py — credentials.json (0600, atomic)    │
└──────────────────┬───────────────────────────┘
                   │ HTTPS
          secure.splitwise.com/api/v3.0

Entwicklung

uv run pytest                        # 54 tests: client, rate limits, auth, workflows, lazy loading, MCP semantics
uv run python scripts/smoke_stdio.py # real subprocess: handshake, discovery, live auth-failure paths

Test-first entwickelt (strikte TDD): Jedes oben genannte Verhalten hat eine Test-first-Herkunft (zuerst fehlschlagender Test). Layout:

src/open_splitwise/
  client.py    # REST client: auth provider, flattening, retry, error mapping
  auth.py      # credential storage
  server.py    # FastMCP definitions: workflows + raw + auth tools
tests/
scripts/smoke_stdio.py

Nutzungsbedingungen

Die Self-Service-API von Splitwise ist laut ihren API-Bedingungen nicht kommerziell. Dein API-Schlüssel gewährt vollen Zugriff auf dein Konto — behandle ihn wie ein Passwort. Dieses Projekt ist eine unabhängige Integration und wird von Splitwise Inc. weder unterstützt noch befürwortet.

Roadmap

  • Beleg-Upload bei der Ausgabenerstellung

  • Multi-Währungs-Ausgaben-Helfer mit Umrechnungsunterstützung

  • Zusammenfassungen wiederkehrender Ausgaben als MCP-Prompt

  • Optionaler Streamable-HTTP-Transport für gehostete/Multi-Benutzer-Bereitstellungen (+OAuth2)

  • Veröffentlichung auf PyPI (uvx open-splitwise)

Mitwirken

PRs sind willkommen — bitte halte die TDD-Disziplin ein (Tests schlagen zuerst fehl, dann bestehen sie), schreibe Tool-Beschreibungen weiterhin für Modelle und protokolliere niemals Geheimnisse.

Lizenz

MIT — offen für alle: nutze es, modifiziere es, veröffentliche es, verkaufe es. Behalte nur den Urheberrechtshinweis.

-
license - not tested
Not graded
quality - not tested
C
maintenance

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

  • Connect AI agents to bank accounts, transactions, balances, and investments.

  • Log, query, and edit expenses, budgets, and accounts in Ledgy from any MCP-compatible AI assistant.

  • Live & historical FX rates and currency conversion for AI agents. No API keys.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/nnishad/open-splitwise-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server