Using Splitease from ChatGPT and Claude

Splitease is a group expense splitter — a shared link, multi-currency, no signup. Last week we shipped an MCP (Model Context Protocol) server so AI assistants can interact with your trip directly. This post walks through what that means in practice.

Why move expense tracking into a chat?

Typing during travel sucks. You're in a taxi, holding a paper receipt with three different currencies on it, your phone in your other hand, and you're trying to:

  1. Open the app
  2. Tap "new expense"
  3. Type the description
  4. Tap currency dropdown, find IDR
  5. Type the amount with three trailing zeros
  6. Pick who paid
  7. Pick split method
  8. Save

Eight steps, all on a 6-inch screen. Compare to:

"Add an expense to our Bali trip — IDR 50,000 for the airport taxi, Emilie paid, split equally"

One sentence. The AI handles the form filling. That's the value.

There's also a second use case that's less obvious: querying your expenses mid-trip. "What's our biggest expense so far?" or "How much has Danny spent total?" are natural language questions that would otherwise require tapping through filters and sorting — operations that are genuinely annoying on mobile. The AI can answer them in a single tool call.

How to set up

Splitease publishes a discovery file at /.well-known/mcp/server-card.json. Both the root endpoint (for create-trip) and the trip-scoped endpoint (for everything else) are listed there.

Claude Desktop:

{
  "mcpServers": {
    "splitease": {
      "type": "http",
      "url": "https://splitease.tillmac.com/api/mcp"
    }
  }
}

That's it. One connector, permanent. New trips don't need new connectors — agents pass tripId as an argument.

ChatGPT Custom GPT:

In Configure → Actions, import https://splitease.tillmac.com/openapi.json. Add to Instructions: "When the user gives a Splitease trip URL, parse the tripId. Use the MCP endpoint to call tools — wrap requests in JSON-RPC 2.0 envelopes."

A real conversation

(Trip names and numbers below are real-looking but fabricated for illustration.)

Me: Build me a Splitease trip for Bali, called "Ubud 5 days", base currency TWD.
Claude: [calls create-trip] Done. Trip "Ubud 5 days" (TWD) is at /trip/abc-123. Want me to add members?
Me: Add Danny and Emilie.
Claude: [calls add-member twice] Added Danny and Emilie.
Me: First expense — Villa Ubud 3 nights, IDR 4,500,000, Emilie paid, split equally.
Claude: [calls create-expense — auto-fetches IDR→TWD rate] Logged. IDR 4,500,000 ≈ TWD 8,720, split equally so Danny owes Emilie TWD 4,360 for this.
Me: What's our biggest expense so far excluding accommodation?
Claude: [calls list-expenses, filters villa/hotel/airbnb out, sorts by amountInBase] The biggest non-accommodation expense is "Surf lesson" at TWD 2,400.

The agent batches calls (multiple tool invocations per turn), handles currency math, and summarizes. The user never opened the app.

One thing worth noting: the AI isn't doing anything clever here. It's calling exactly the same REST-ish endpoints you'd hit from the web UI. The intelligence is just in the parsing — "Emilie paid" → paidBy: "Emilie", "split equally" → splitMethod: "equal". That parsing is what AI is good at, and what the eight-step mobile form is bad at.

When to go back to web UI

The MCP surface is complete for CRUD operations, but some things make more sense visually:

Use AI for capture. Use web for review and final settlement.

Design notes

A few decisions that shaped the integration:

Link-as-token auth. Splitease has no user accounts, no OAuth. The tripId in your URL is the auth scope. Anyone with the link has read+write. We carried this model into MCP — the tripId is either in the URL path (scoped endpoint) or passed as a tool argument (root endpoint). No bearer tokens, no session state.

This is the opposite of what every MCP best-practice guide recommends. We do it because it matches the product. Adding OAuth would create friction that doesn't pay off — Splitease's whole value prop is "no signup", and we'd rather lose 20% of "secure" use cases than lose 80% of casual users to friction.

Hybrid endpoint. Root /api/mcp exposes all 8 tools (including create-trip); scoped /api/mcp/{tripId} exposes 7 (no create-trip — there's already a tripId). One MCP connector, dynamic tripId per request. Power users who want a per-trip dedicated connector can use the scoped form.

No SDK. The MCP server is ~200 lines of hand-rolled JSON-RPC 2.0 over HTTP. We considered @vercel/mcp-adapter but the protocol is small enough that the adapter's value didn't justify the dependency. Direct POST handlers + a switch over method covers initialize, tools/list, tools/call. That's it.

Destructive operations are not exposed. delete-trip and remove-member are intentionally absent from the tool list. delete-expense is exposed but the description explicitly tells the LLM to confirm with the user before calling. We learned during testing that "do you want me to delete this?" prompts are easy for users to accidentally accept. Keep destructive APIs off the agent surface; force the user to web for those.

Try it

If you have a Splitease trip already, point your AI assistant at https://splitease.tillmac.com/api/mcp and ask it to do something. If you don't, just ask the assistant: "create a Splitease trip for me." That's the entire onboarding now.