Split bills and collect payments through PayNow (Singapore) from your AI. MCP server for SplitBill.
SplitBill MCP Server (com.jittee/splitbill)
This MCP server splits bills and collects payments via PayNow (Singapore) from an AI. It calculates how much each person owes and provides payment links. Money never passes through the server; each participant pays from their own banking app.
π οΈ Key Features
Create a split bill from a receipt or a total
Equal split
Custom amount for one participant (and implied support for other participants based on the split logic)
π Use Cases
Splitting dinner or group expenses
Producing shareable payment links for a group after an AI determines the owed amounts
β οΈ Limitations
Payments are made directly from each userβs banking app; the server does not handle money transfer
β‘ Developer Benefits
Integrates split-bill and PayNow (Singapore) collection workflows into an AI-driven process
Captured live from the server via tools/list.
create_split
Create a payment page for a shared bill and return the manage URL plus the share URLs. The PayNow recipient is already saved with this connection β never ask the user for it. All you need is a total (total) or the receipt lines (items), plus the head count (people). By default the user is treated as having paid up front: they count towards the head count but get no payment link (pass i_paid=false to turn that off). Paste a share URL into the group chat and everyone sees their own amount and a PayNow QR code.
Parameters10
title
string
optional
What the bill was for (e.g. Friday dinner). Defaults to the date and time.
total
number
optional
The total. If items are given, their sum wins.
items
array
optional
Receipt lines. Their sum becomes the total. Payers can see them.
people
number
optional
How many people share the bill, INCLUDING the user who paid up front.
names
array
optional
Names of the others (only the ones you know). Empty slots get filled in by the payers themselves.
custom
array
optional
Charge one person a different amount (e.g. someone who did not drink). The rest is re-split automatically.
i_paid
boolean
optional
Did the user pay up front? (default: true) They count towards the head count but are not billed.
my_name
string
optional
What to call the user in the list (default: Me).
rounding
string
optional
Rounding. ceil-all = round everyone up to whole dollars and let the user absorb the difference; one-extra = split exactly and let one person carry the remainder.
note
string
optional
A short note shown to the payers.
Raw schema
{
"type": "object",
"properties": {
"title": {
"type": "string",
"description": "What the bill was for (e.g. Friday dinner). Defaults to the date and time."
},
"total": {
"type": "number",
"description": "The total. If items are given, their sum wins."
},
"items": {
"type": "array",
"description": "Receipt lines. Their sum becomes the total. Payers can see them.",
"items": {
"type": "object",
"properties": {
"label": {
"type": "string",
"description": "What the line is for (e.g. Food)."
},
"amount": {
"type": "number"
}
},
"required": [
"amount"
]
}
},
"people": {
"type": "number",
"description": "How many people share the bill, INCLUDING the user who paid up front."
},
"names": {
"type": "array",
"items": {
"type": "string"
},
"description": "Names of the others (only the ones you know). Empty slots get filled in by the payers themselves."
},
"custom": {
"type": "array",
"description": "Charge one person a different amount (e.g. someone who did not drink). The rest is re-split automatically.",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "A name passed in names."
},
"index": {
"type": "number",
"description": "Position when there is no name (counting from 1; 1 is the user)."
},
"amount": {
"type": "number"
}
},
"required": [
"amount"
]
}
},
"i_paid": {
"type": "boolean",
"description": "Did the user pay up front? (default: true) They count towards the head count but are not billed."
},
"my_name": {
"type": "string",
"description": "What to call the user in the list (default: Me)."
},
"rounding": {
"type": "string",
"enum": [
"ceil-all",
"one-extra"
],
"description": "Rounding. ceil-all = round everyone up to whole dollars and let the user absorb the difference; one-extra = split exactly and let one person carry the remainder."
},
"note": {
"type": "string",
"description": "A short note shown to the payers."
}
},
"required": []
}
list_splits
Return the splits created with this connection, newest first, with how much has been collected, how many people are still to pay, and the read-only URL. Use this to find a split again when the organiser has lost the link.
Parameters1
limit
number
optional
How many to return (default 10, max 50).
Raw schema
{
"type": "object",
"properties": {
"limit": {
"type": "number",
"description": "How many to return (default 10, max 50)."
}
},
"required": []
}
get_split
Return one split in full: who owes what, whether they have paid, the notes they left, and the share URLs.
Parameters1
admin_token
string
required
The t= value from the manage URL, or the whole manage URL.
Raw schema
{
"type": "object",
"properties": {
"admin_token": {
"type": "string",
"description": "The t= value from the manage URL, or the whole manage URL."
}
},
"required": [
"admin_token"
]
}
Split bills and collect payments through PayNow (Singapore) β from the AI you already use.
You paid for the dinner. SplitBill works out who owes what and gives you links to send.
Money never passes through us: everyone pays from their own banking app.
Equal split, or a custom amount for one person (the rest is re-split)
The person who paid up front is counted but never billed
Participant management β names optional; payers can enter their own
Shareable payment URLs (one per amount) + a read-only status link
PayNow QR on the payment page
Payment status tracking (self-reported with a transfer screenshot)
Receipts attached to the total, visible to payers
ζ₯ζ¬θͺ / English / δΈζ
Example
User:
Split SGD 891 between 4 people.
AI: creates a SplitBill payment page
code
SGD 222.75 Γ 3 participants (you paid up front, so you are not billed)
Share: https://sposched.jittee.com/split/pay/?t=β¦
Manage: https://sposched.jittee.com/split/manage/?t=β¦ (keep this one to yourself)
Status: https://sposched.jittee.com/split/manage/?t=β¦ (read-only, safe to share)
Setup
Option A β point your client at the remote server (recommended)
code
https://jittee.com/mcp/splitbill
That endpoint speaks OAuth 2.1 (dynamic client registration + PKCE), so there is no key to
copy around. Connecting opens SplitBill, you enter the PayNow number (or UEN) that should
receive the money plus the display name your payers will see in their banking app, and you
press allow. The key is created at that moment and kept by your client, and the AI is never
asked for your number again.
Claude Code
bash
claude mcp add --transport http splitbill https://jittee.com/mcp/splitbill
Claude Desktop / claude.ai / ChatGPT β Settings β Connectors β add a custom connector and
paste the URL. Leave authentication on OAuth.
For a stdio install, or a client that does not speak OAuth.
Open https://sposched.jittee.com/split/mcp/ and enter the PayNow number (or UEN) that should
receive the money, plus the display name your payers will see in their banking app. You get a
key that starts with wkn_, shown only once.
β οΈ That key can create pages that collect money to your PayNow. Keep it to yourself.
It cannot move money. If you lose it, just create another one.
Claude Code
bash
claude mcp add splitbill --env SPLITBILL_TOKEN=wkn_xxx -- npx -y splitbill-mcp
Remote, with the key in the URL β for clients that cannot send headers. Choose
No authentication, since the key is already in the URL:
code
https://jittee.com/mcp/splitbill?token=wkn_xxx
Then ask
"Split this receipt four ways. Tanaka did not drink, so $20 for him."
Tools
Tool
What it does
create_split
Create the page. Takes a total or itemised receipt, a head count, optional names, per-person overrides and rounding. Returns the manage URL, the share URLs (one per amount) and a read-only status URL.
list_splits
Splits created with this key, newest first, with how much has been collected and who is left.
get_split
One split: who has paid, their notes, the share URLs.
By default you are treated as the person who paid up front: you count towards the head
count, but no payment link is created for you. Pass i_paid: false to turn that off.
Environment
Variable
Meaning
SPLITBILL_TOKEN
Your key from /split/mcp (starts with wkn_). Required.
SPLITBILL_URL
Endpoint override. Only needed to point at a non-production environment.
Good to know
No sign-up, no login. The key is the only credential.
Money never passes through us. Payments go directly between banking apps over PayNow.
SplitBill only shows the amount and the recipient, and records who says they have paid.
Pages delete themselves 7 days after the last payment, images included.
NRIC cannot be used as a PayNow recipient (Singapore PDPA); mobile number or UEN only.
Amounts are SGD.
Anyone can create a split page, so payment pages carry a standing warning and a report
button. Never send money from a link you got from someone you do not know.