split-bill-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@split-bill-mcpCreate a bill to split $75.50 among me, Dana, and Chris."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
split-bill-mcp
MCP server (stdio) for SplitBill (a Next.js app for splitting bills between friends). It lets an AI agent create bills from split receipts, list and filter bills, update payment statuses, and look up users — all through the SplitBill REST API.
How it works
The server logs in to SplitBill as a service user (email + password from env) via the NextAuth credentials flow, caches the session cookie, and re-logs in once on
401.Money math is cent-exact: receipt positions are split per consumer, remainder cents go to the first consumers, and
Σ per-person == totalis verified before everycreate_bill.Responses are language-neutral JSON (
data) plus a short humansummary(English by default, Russian withlang: "ru"). Item names and titles are never translated — they pass through byte-for-byte.
Related MCP server: Splitwise MCP Server
Prereqs
Node 20+
A running SplitBill instance, e.g.
http://localhost:3000A service user registered in SplitBill via
/auth/registerand confirmed (registration sends a confirmation link; the account must be confirmed before the MCP server can log in as it)
Setup
git clone <this-repo> split-bill-mcp
cd split-bill-mcp
npm install
cp .env.example .env # then fill in the values below
npm run buildEnvironment
Variable | Required | Default | Description |
| yes | — | SplitBill origin, e.g. |
| yes | — | Service-user email |
| yes | — | Service-user password |
| no |
| HTTP timeout per request (ms) |
| no |
|
|
Missing/invalid vars fail fast at startup with
Invalid MCP configuration: VAR: reason.
Connect a client
Build first (npm run build), then pick your client.
Replace <path-to-split-bill-mcp> with the directory where you cloned this repo.
Secrets can live in the client config or in a .env file next to dist/.
Claude Code — one command (writes to ~/.claude.json):
claude mcp add \
--env SPLITBILL_BASE_URL=http://localhost:3000 \
--env SPLITBILL_EMAIL=agent@example.com \
--env SPLITBILL_PASSWORD=change-me \
--transport stdio split-bill --scope user \
-- node <path-to-split-bill-mcp>/dist/index.jsCheck with claude mcp list. Or share with the team via .mcp.json
(--scope project instead of --scope user).
Codex — one command (writes to ~/.codex/config.toml):
codex mcp add split-bill \
--env SPLITBILL_BASE_URL=http://localhost:3000 \
--env SPLITBILL_EMAIL=agent@example.com \
--env SPLITBILL_PASSWORD=change-me \
-- node <path-to-split-bill-mcp>/dist/index.jsCheck with codex mcp list. Or edit ~/.codex/config.toml by hand:
[mcp_servers.split-bill]
command = "node"
args = ["<path-to-split-bill-mcp>/dist/index.js"]
[mcp_servers.split-bill.env]
SPLITBILL_BASE_URL = "http://localhost:3000"
SPLITBILL_EMAIL = "agent@example.com"
SPLITBILL_PASSWORD = "change-me"OpenCode — no install command exists, copy this into
opencode.json / opencode.jsonc (global ~/.config/opencode/ or project root):
{ "$schema": "https://opencode.ai/config.json",
"mcp": { "split-bill": {
"type": "local",
"command": ["node", "<path-to-split-bill-mcp>/dist/index.js"],
"environment": {
"SPLITBILL_BASE_URL": "http://localhost:3000",
"SPLITBILL_EMAIL": "agent@example.com",
"SPLITBILL_PASSWORD": "change-me"
}
} } }Pi — pi install only installs Pi extensions, not MCP servers,
so a one-liner for our server alone is impossible.
Two steps instead: install an MCP client extension, then add the server
to its config:
pi install npm:pi-mcp-extension~/.pi/agent/mcp.json (global) or .pi/mcp.json (project):
{ "mcpServers": { "split-bill": {
"command": "node",
"args": ["<path-to-split-bill-mcp>/dist/index.js"],
"transport": "stdio",
"lifecycle": "eager",
"env": {
"SPLITBILL_BASE_URL": "http://localhost:3000",
"SPLITBILL_EMAIL": "agent@example.com",
"SPLITBILL_PASSWORD": "change-me"
}
} } }Check with /mcp inside Pi.
Tools
All tools accept an optional lang ("en" default, "ru" for Russian summaries)
and return { data, summary, lang }.
Users are referenced by email or userId everywhere and resolved automatically
(ObjectId passthrough → own email → user search → friends).
create_bill
Create a bill. Two modes:
mode: "ready_split"— agent already split the receipt:participants: [{ user, items: [{ name, price, priceWithVat?, vat? }], totalSum }],payerId, optionaltitle/description. Item sums are verified per participant (mismatch > 1 cent →VALIDATION_ERROR).mode: "raw_receipt"— agent sends receipt positions and who shared what:receipt_items: [{ name, price, priceWithVat?, vat?, consumers: [email|userId], portions? }],payer, optionaltitle/description. The server splits each position across consumers (equally or byportions) and builds the participants itself.
Missing priceWithVat defaults to price, missing vat to false
(upstream requires priceWithVat).
Example (raw receipt, agent already figured out who ate what):
{ "mode": "raw_receipt",
"receipt_items": [
{ "name": "Pizza", "price": 1200, "consumers": ["ann@x.ru", "bob@x.ru"] },
{ "name": "Tea", "price": 300, "consumers": ["ann@x.ru"] }
],
"payer": "ann@x.ru", "title": "Dinner", "lang": "ru" }→ data: { billId, title, total, per-person amounts/statuses }.
list_bills
List my bills with local filters (upstream has none):
status (all|paid|unpaid|pending_confirmation|partial),
role (all|creator|payer|debtor), search (title substring),
date_from/date_to (must be parseable dates), page/limit.
Returns the page plus grouped_by_status counts and a totals summary.
get_bill
billId → full bill with participants, amounts, and payment statuses.
update_payment
billId, participant (email or userId, case-insensitive),
status (paid|unpaid|pending_confirmation).
Marks one participant's share; returns the refreshed bill.
search_users
query (min 2 chars) → [{ id, name, email }].
Note: upstream search excludes you and your friends —
use it to find strangers to add, list_friends for existing friends.
list_friends
Your friends as [{ id, name, email }].
include_requests: true also returns { sent, received } request queues.
get_dashboard_stats
{ totalBills, totalOwed, totalOwing, pendingBills, completedBills }.
Error codes
| Meaning / what to do |
| Service-user login failed — check email/password, confirm the account, check |
| Input invalid (bad sums, bad dates, short query) — the message says exactly what mismatched. Fix the input, don't retry blindly. |
| Email/user not found — clarify the email or add them as a friend; close name matches are included when available. |
| Upstream SplitBill error — |
Dev
npm test # vitest, 30 tests
npm run dev # stdio with tsx (needs env set)
npm run typecheck # covers src + tests
npm run build # tsc → dist/ (src only)Available Tools
7 toolscreate_billA
Create a SplitBill bill. mode=ready_split takes pre-split participants with totals; mode=raw_receipt takes receipt positions with consumers and splits them.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden of behavioral disclosure. It mentions that raw_receipt mode 'splits' receipt positions, but it does not describe side effects, permissions, irreversibility, VAT handling, or success/error behavior for this mutating create operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with no filler. The main action is front-loaded and the mode distinction is explained efficiently. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description adequately explains how to choose between the two modes and the schema supplies the remaining parameter details. However, with no annotations and no output schema, it leaves out important context about return values, permissions, and what 'splits them' concretely produces. This is a noticeable gap for a complex creation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents the parameters. The description adds useful semantic meaning by explaining what distinguishes the two mode branches: ready_split uses pre-split participants with totals, while raw_receipt uses receipt positions with consumers and splits them. This goes beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action and resource: 'Create a SplitBill bill.' It then differentiates the two modes of creation, so an agent can distinguish this tool from list_bills, get_bill, and update_payment. The purpose is unambiguous and mode-specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance for choosing mode=ready_split versus mode=raw_receipt, which is the key branching decision for this tool. It does not name sibling alternatives, but the sibling list contains only non-creation operations, so the usage context is still clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_billA
Get one SplitBill bill by ID with participants and payment statuses.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | ||
| billId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral disclosure burden. It does convey that this is a read operation returning a single bill with participants and payment statuses, but it omits any detail about error handling, authentication, or exact response shape. This is adequate for a simple get-by-ID, but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler: it names the action, the resource, the key identifier, and the returned content. It is well front-loaded and every word contributes meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description gives only a high-level view of the return value ('participants and payment statuses') and does not explain the optional lang parameter. For a simple read operation, this is minimally sufficient, but an agent would still need to guess at response structure and language semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description only clarifies that the tool retrieves a bill by ID, which maps to billId. The 'lang' parameter is entirely unaddressed in both the schema and the description, leaving its purpose and expected values ambiguous. The description does not adequately compensate for the lack of parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Get' with a clear resource 'one SplitBill bill by ID' and indicates what is included: participants and payment statuses. It is clearly distinct from siblings like list_bills, create_bill, and update_payment, so an agent can identify the correct tool without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage context is implied by 'Get one SplitBill bill by ID' — an agent can infer this is for retrieving a single bill when the billId is known. However, it does not explicitly name alternatives like list_bills or state when not to use this tool, so the guidance is implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dashboard_statsB
Get SplitBill dashboard totals: bill count, amounts owed and owing.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must carry the behavioral disclosure burden. It does communicate a read-only aggregate and names the output categories, but it remains silent on whether the optional lang parameter affects results, the time scope of bills, or whether 'amounts owed and owing' are totals or breakdowns. This is partial disclosure, not complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One concise sentence that front-loads the main purpose and lists the key output fields. Every word earns its place, and there is no redundant or filler text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the basic return categories but omits any explanation of the optional lang parameter, the assumed scope of bills, and the return shape. Because there is no output schema and no annotations, these missing details leave the agent with incomplete information to call the tool correctly and interpret its response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, lang, appears in the schema with no description and is not mentioned in the tool description. Since schema description coverage is 0%, the description fails to clarify whether lang is a language code, locale, or something else, leaving the agent to guess. This is a critical gap in an otherwise simple tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get'), names the resource ('SplitBill dashboard totals'), and enumerates exact contents (bill count, amounts owed and owing). This clearly distinguishes it from sibling tools like list_bills or get_bill, which are about individual bills rather than aggregated totals.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus siblings such as list_bills or get_bill. The description implies a dashboard context but does not state whether this tool aggregates across all bills, whether it requires authentication, or how it relates to the other bill/stat endpoints.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_billsA
List my SplitBill bills with filters by payment status, my role, title search, date range, and pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | ||
| page | No | ||
| role | No | all | |
| limit | No | ||
| search | No | ||
| status | No | all | |
| date_to | No | ||
| date_from | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the verb 'List' and the scope 'my' signal a read-only, user-scoped operation, which is valuable behavioral context. It does not disclose defaults, auth requirements, or response characteristics, but nothing contradicts the read-only implication.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence states the operation before listing filters, with no filler or redundancy. It is appropriately sized for the tool's function and communicates the key information efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 8 parameters, no annotations, and no output schema, the description leaves significant gaps: it does not describe the returned bill fields, sorting behavior, default filter values, or what 'my' precisely includes (creator, payer, debtor). The filter vocabulary helps, but an agent lacks enough operational detail to fully predict the call's behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 0% schema-description coverage, the description maps most parameters to semantic concepts: payment status (status), my role (role), title search (search), date range (date_from/date_to), and pagination (page/limit). This adds meaning beyond raw parameter names, though 'lang' remains unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('List my SplitBill bills') and enumerates filter dimensions, making the operation unambiguous. It is clearly distinguishable from siblings like get_bill (single bill) and create_bill (creation).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes the core use case—listing the current user's bills—so an agent can infer when to call it. However, it does not explicitly name alternatives or state when not to use this tool, leaving some routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_friendsB
List my SplitBill friends (for picking bill participants).
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | ||
| include_requests | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only says 'List my friends' and gives a use case; it does not disclose whether the result includes pending friend requests, how the 'include_requests' parameter changes behavior, whether pagination exists, or what fields are returned. The uncovered behavior around requests is significant.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler, and every word contributes to the core purpose. However, it is arguably too short given the schema's lack of parameter descriptions, so it could have used a bit more space to explain behavior without becoming bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with two optional parameters and no output schema, this description is not complete enough. It does not explain include_requests, which appears to be a key behavioral switch, nor does it clarify how lang affects results. It also gives no guidance on choosing this tool over search_users, leaving gaps that an agent would need to guess about.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description fails to compensate by explaining either 'lang' or 'include_requests'. The only parameter hint is the parenthetical about bill participants, which is unrelated to the actual parameters. An agent has no way to know what these parameters do.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb 'List' and resource 'my SplitBill friends', and immediately frames the purpose ('for picking bill participants'). This clearly distinguishes it from siblings like list_bills (which lists bills) and search_users (which searches arbitrary users), leaving no ambiguity about scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear usage context: it is for picking bill participants from one's own friend list. However, it does not explicitly mention alternatives or when not to use it, such as when searching for users outside the friend list with search_users would be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_usersB
Search SplitBill users by name or email (to resolve participant IDs).
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | ||
| query | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility for behavioral disclosure. It mentions search criteria and purpose but does not describe case sensitivity, partial matching, pagination, result limits, or whether it searches globally or only within the user's context. This leaves meaningful gaps for an agent deciding how to interpret results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, tight sentence that front-loads the core action and purpose. Every word adds value, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, no output schema, and no parameter documentation, the description is too thin. It leaves unresolved how results are returned, what the 'lang' parameter does, and what the search behavior is, which an agent needs to invoke the tool reliably.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the two parameters. It explains the 'query' parameter by specifying it accepts a name or email, but it does not explain the 'lang' parameter at all, and it omits minimum length or formatting implications.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Search'), resource ('SplitBill users'), and search criteria ('by name or email'), and it adds a purpose ('to resolve participant IDs'), which clarifies intent. It is distinguishable from siblings like list_friends and get_bill, though it does not explicitly differentiate itself from every possible alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: use it when you need to find users by name or email, particularly to resolve participant IDs. However, it does not explicitly state when not to use it or name alternative tools such as list_friends for browsing known friends.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_paymentC
Update a participant payment status (paid, unpaid, pending_confirmation) on a bill.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | ||
| billId | Yes | ||
| status | Yes | ||
| participant | Yes | participant email or userId |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only says a status is updated, leaving side effects, permissions, idempotency, and error behavior undisclosed. The enum values are already present in the schema and add no additional behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence with no filler or redundancy, and the allowed status values are compactly parenthesized. It is appropriately short, though its brevity leaves other dimensions under-served.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an update tool with no annotations and no output schema, this description is incomplete: an agent cannot infer the response format, authorization requirements, idempotency, or possible side effects. The schema provides the required parameters, but the description adds little operational context beyond the basic update target.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25%, with only 'participant' described. The description clarifies the update target ('on a bill') but does not explain billId, lang, or how status values are applied beyond repeating the schema enum. It does not sufficiently compensate for the low schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Update') and a specific resource ('participant payment status on a bill'), listing the allowed status values. It is distinguishable from sibling tools like create_bill and get_bill because no sibling targets payment status, though it does not explicitly contrast with any sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided about when to use this tool versus alternatives, nor are there stated prerequisites, exclusions, or scenarios that would warrant calling update_payment. The only usage signal is the imperative 'Update'.
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.
7 tool updates
v0.1.0- First observed
create_bill - First observed
get_bill - First observed
get_dashboard_stats - First observed
list_bills - First observed
list_friends - First observed
search_users - First observed
update_payment
TDQS
Scored across 7 tools
Most tools target distinct resources: bills, payments, users, friends, and stats. The only slight overlap is search_users versus list_friends, but their descriptions clarify that one resolves arbitrary users while the other picks from existing friends.
All tool names follow a consistent verb_noun pattern in snake_case: create_bill, list_bills, get_bill, update_payment, search_users, list_friends, get_dashboard_stats. Pluralization is handled idiomatically per resource without mixing conventions.
Seven tools is well-scoped for a split-bill domain. Each tool covers a distinct, necessary operation without redundancy or bloat.
The core bill workflow is covered: create, list, get, and update payment status. However, there is no update_bill or delete_bill operation, so editing or canceling a bill would be impossible through this server.
Maintenance
Related MCP Connectors
Split bills from your AI: read bills & balances, create equal splits, request settlements.
Manage Splitwise balances, expenses, and groups from your workspace. Fetch friends and recent acti…
Split bills and collect payments through PayNow (Singapore) from your AI. MCP server for SplitBill.
Create a bill from a chat/photo and share it with anyone
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage Splitwise expenses with atomic duplicate prevention, smart fuzzy matching, and support for flexible split ratios between two people.MIT
- AlicenseNot gradedqualityDmaintenanceEnables 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.1MIT
- AlicenseAqualityBmaintenanceEnables managing Splitwise expenses and generating premium spending analytics with category breakdowns, trends, and settlement optimization through natural language.42MIT
- AlicenseAqualityBmaintenanceEnables AI agents to manage Splitwise expenses through natural language, including reading balances, splitting costs, and handling authentication and rate limits automatically.7MIT