splitsmart-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., "@splitsmart-mcpCreate group 'Roadtrip' with three friends, record gas expense, show who owes whom."
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.
SplitSmart πΈ
Split group expenses fairly β from a web page, a REST API, or straight from your AI agent via MCP. Record who paid, see who owes whom, and get the fewest transfers needed to settle up. All money math is done in integer paise/cents, and the core rules are proven with property-based tests.
Built with Kiro for the Kiro University Challenge (#KiroUniversity #BuildWithKiro).
Quick start
git clone https://github.com/AswaniSahoo/splitsmart && cd splitsmart
uv sync
uv run splitsmart # web UI + API at http://127.0.0.1:8000
uv run pytest -q # 17 tests incl. 7 property-based tests
uv run splitsmart-mcp # MCP server (stdio) β normally started by Kiro via .kiro/settings/mcp.jsonUse it from Kiro CLI with the custom agent:
kiro-cli chat --agent splitsmart-accountant
> Create a group Goa Trip with Asha, Ravi and Meera. Asha paid βΉ1200 for the hotel for all three. Who owes whom?β οΈ SplitSmart has no authentication and binds to
127.0.0.1by default. Don't expose it to the internet.
Related MCP server: splitwise-mcp
How each Kiro lesson is used
# | Lesson | Where | What it does in this project |
1 | Spec-driven development | EARS requirements β design (architecture, API, data model) β task plan that drove the build | |
2 | Steering |
| |
3 | Hooks |
| |
4 | Property-based testing |
| 7 properties (money conserved, balances sum to 0, order independence, delete = undo, settle-up clears debts, β€ nβ1 transfers, format round-trip) run with Hypothesis, 200β500 cases each |
5 | Powers | Kiro Powers panel + | Installed power(s) used while building, plus our own SplitSmart power (see Bonus 2) |
6 | MCP | Our own MCP server exposing 8 tools ( | |
7 | Custom agents |
| |
β 2 | Package a Kiro power |
|
Install the power in Kiro: Powers panel β Add Custom Power β Import power from GitHub β
https://github.com/AswaniSahoo/splitsmart (power folder: power-splitsmart), then say "split the dinner bill".
Architecture
Web UI ββfetchβββΆ api.py (FastAPI) ββ
βββΆ store.py (SQLite) + ledger.py (pure money logic)
Kiro agent βMCPββΆ mcp_server.py ββββββAPI
Method | Path | Body |
POST |
|
|
GET |
| |
POST |
|
|
POST |
|
|
DELETE |
| |
GET |
|
License
MIT
Available Tools
8 toolsadd_expenseA
Record an expense paid by payer, split equally among participants. amount_cents is a positive integer.
| Name | Required | Description | Default |
|---|---|---|---|
| payer | Yes | ||
| group_id | Yes | ||
| description | Yes | ||
| amount_cents | Yes | ||
| participants | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits. It does reveal the splitting behavior ('split equally among participants') and a constraint on amount_cents ('positive integer'), but it does not mention that the expense affects group balances, requires permissions, or that the payer must be among participants. These are notable omissions for a mutating tool, leaving the agent to infer 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with zero filler. It is front-loaded with the core action and includes the key behavioral detail (equal split). Every word adds value, and it is concise without being under-specified in terms of the action.
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 the tool has 5 required parameters, no annotations, and an output schema (so return values are covered), the description still omits explanations for group_id and description, and does not mention the effect on balances or any prerequisites. This is incomplete for an agent to correctly invoke the tool without further research, especially for a write operation.
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 explain all parameters. It only addresses payer, participants, and amount_cents (with a constraint). It does not explain the purpose of group_id or description, nor the relationship between payer and participants. This leaves the agent guessing about two of the five required fields, which is a significant gap.
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: 'Record an expense paid by `payer`, split equally among `participants`.' This is a specific verb ('record') with a resource ('expense') and the splitting rule, which distinguishes it from sibling tools like delete_expense or add_member. The purpose is unambiguous and not a tautology.
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 when to use the tool (when you need to record an expense) but does not explicitly state when not to use it or mention alternatives. It lacks guidance on scenarios like recording a partial split or unequal shares, and does not exclude using it for other purposes. No comparison to siblings is given, though the action itself makes the usage context reasonably clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_memberC
Add a new member to an existing group.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| group_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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. It only says 'Add', implying a mutation, but discloses no other behavior: what happens if the member already exists, whether the operation is reversible, any side effects, or the return value. For a write operation with zero annotation coverage, this is a significant gap.
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 concise sentence with no redundant words. It is front-loaded and appropriately sized for the simplicity of the action, though it sacrifices informativeness for brevity.
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 simple 2-parameter tool, the description is incomplete. It does not mention that the group must already exist, that name is required and its format, or any error cases. Although an output schema exists, it is not shown, and the description provides no context about the result. The minimalism leaves an agent with insufficient information to call the tool correctly in varied scenarios.
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 schema has 0% description coverage, and the tool description does not mention either parameter. It does not explain that group_id must reference an existing group or that name is the new member's identifier. The description adds no meaning beyond the parameter names themselves, which is inadequate given the schema lacks descriptions.
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: 'Add a new member' to an 'existing group'. The verb and resource are clear, and it naturally differentiates from sibling tools like create_group (which creates a new group) and get_group (which reads). No ambiguity about what the tool does.
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 only states the action without any guidance on when to use it versus alternatives. It does not mention prerequisites (e.g., group must exist), exclusions, or alternatives. An agent must infer that this is the right tool for adding members based on the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_groupA
Create a group with a name and a list of unique member names.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| members | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral disclosure. It clearly signals a mutating create operation and adds the useful constraint that member names must be unique, but it does not say what happens with duplicate member names, name conflicts, or whether creation is idempotent.
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?
A single, front-loaded sentence that states the action and both parameters with no filler or repetition.
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 tool is simple (two flat parameters) and an output schema exists, so the description does not need to document return values. It covers the operation and both inputs; only edge-case behavior is left unspecified.
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 schema has no property descriptions, so the text must compensate. It maps 'name' to the group name and 'members' to a list of member names, and adds a uniqueness constraint not present in the schema, but it otherwise mirrors the basic schema structure without deeper validation or formatting details.
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 opens with the specific verb 'Create' and the resource 'group', then names both required inputs. This clearly distinguishes it from sibling tools like get_group and add_member.
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?
Use is implied: call this when you need to instantiate a new group. It does not explicitly state when not to use it or mention alternatives, though the sibling list makes the distinction inferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_expenseC
Delete an expense from a group.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | Yes | ||
| expense_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | 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 burden of behavioral disclosure. The only behavioral information is the verb 'delete,' which is already present in the tool name. There is no mention of irreversibility, required permissions, error behavior, side effects, or any nuance beyond the inherently destructive action. The description adds zero value beyond what the name and schema already imply.
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, grammatically clear sentence with no wasted words. It is efficient and front-loaded with the core action and scope. However, its brevity reflects a lack of substantive content rather than purposeful conciseness, so it does not fully earn an exemplary rating.
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 the tool is a mutation with no annotations and an output schema that is not visible, the description is incomplete. It does not disclose what happens on success or failure, whether the deletion is permanent, or any additional context an agent would need to safely invoke the tool. The presence of an output schema might explain return values, but without descriptions of invocation context or outcomes, the tool remains under-specified for proper use.
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 provides no additional meaning for the parameters 'group_id' and 'expense_id.' It does not explain what these IDs refer to, how to obtain them, or any constraints. The description merely echoes the action without clarifying the parameters, failing to compensate for the total lack of schema-description detail.
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 a specific action ('Delete') on a specific resource ('an expense') within a defined scope ('from a group'). It distinguishes itself from sibling tools like add_expense and get_balances by the verb and resource, so an agent can understand its purpose without inspection.
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?
There is no guidance on when to use this tool versus alternatives, nor any prerequisites, exclusions, or conditions. The description simply states the action, leaving the agent to infer appropriate context. No alternative tools or when-not-to-use scenarios are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_balancesB
Net balance per member in cents: positive = is owed money, negative = owes money.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral disclosure burden. It usefully discloses units and the meaning of positive vs negative balances, but it does not explicitly state that the operation is read-only or describe any permission/error behavior.
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. Every phrase contributes meaning, especially the cents unit and the sign interpretation.
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 an output schema present and only one required parameter, the description plus schema is nearly sufficient. The key interpretive detailsβper-member scope, cents, and sign meaningβare covered, though an explicit tie to group_id would make it fully complete.
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 by explaining parameters. It never mentions group_id or its role, though the parameter is simple and self-explanatory from the 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 identifies the resource: net balance per member, with a helpful sign convention. It lacks an explicit verb, but the tool name 'get_balances' supplies it, and the description is distinct from all sibling tools.
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 use case is implied: use this when you need per-member balance information for a group. However, the description never states when to prefer it over siblings or when not to use it, though no sibling overlaps directly with balance retrieval.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_groupB
Get a group with its members and expenses.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral transparency burden. 'Get' implies a non-mutating read and the description states that members and expenses are included, but it does not mention behavior on missing groups, permissions, or other edge cases. It is adequate 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 wasted words. The core action and included data are front-loaded and easily parsed.
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 simple one-parameter read tool with an output schema, this is minimally viable, but it lacks usage guidance and any behavioral caveats. Given the absence of annotations, a bit more context would make it complete.
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 needed to compensate for the group_id parameter. It does not mention group_id at all, though the parameter name and integer type are fairly self-explanatory.
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 clear verb-resource pairing: 'Get a group' with the additional scope of 'members and expenses'. It is distinct from obvious siblings like list_groups or get_balances, though it does not explicitly name or differentiate them.
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 given about when to use this tool instead of list_groups or get_balances. The context of retrieving a single group is only implied by the verb and the required group_id parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_groupsA
List all groups (id and name).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the burden, and 'List' clearly conveys a read-only operation. It also defines scope with 'all groups' and the output fields, though it does not address pagination, ordering, or permission requirements.
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 or repetition. Every word contributes meaning: the action, the scope, and the returned fields.
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 no-parameter list tool with an output schema already provided, the description is complete. An agent knows exactly what the tool returns and has no required inputs to reason 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?
The tool has zero parameters, so the baseline is 4 and no parameter documentation is needed. The description reinforces that no input is required and that the result is an unfiltered list of groups.
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'), a clear resource ('all groups'), and the exact returned fields ('id and name'). It is immediately distinguishable from siblings like get_group, which targets a single group, and create_group, which mutates.
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 clear context: use this tool when you need the complete set of groups rather than a specific one. It does not explicitly name alternatives or exclusion criteria, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settle_upA
Minimal list of transfers (from, to, amount_cents) that settles every debt in the group.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that the tool returns a computed minimal settlement list rather than mutating group data, and it specifies the output fields. It does not discuss side effects or edge cases, but the 'list of transfers' phrasing strongly signals a read/compute-like 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?
One compact sentence that front-loads the key output concept and includes the essential field names. Every word earns its place with no redundant detail.
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 tool has one simple parameter and an output schema, and the description names the output structure and its purpose. Edge cases like an empty group or invalid group_id are not mentioned, but the definition is complete enough for an agent to decide when to invoke it and what to expect.
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 input schema provides only the type and title for group_id, and the description has 0% schema coverage. The phrase 'every debt in the group' implicitly ties group_id to the target group, adding some meaning, but it never explicitly describes the parameter. For a single obvious integer parameter, this is adequate but not outstanding.
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 what the tool produces: a minimal list of transfers with fields from, to, and amount_cents that settles every debt in the group. This distinguishes it from siblings like get_balances, which reports balances, and add_expense/delete_expense, which modify expenses.
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 the tool should be used when the caller wants a settlement plan for a group's debts, but it does not explicitly say when to prefer this over get_balances or other siblings. The usage context is clear but relies on inference rather than explicit guidance.
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.
8 tool updates
v0.1.0- First observed
add_expense - First observed
add_member - First observed
create_group - First observed
delete_expense - First observed
get_balances - First observed
get_group - First observed
list_groups - First observed
settle_up
TDQS
Scored across 8 tools
Each tool targets a distinct operation: group lifecycle (create/list/get), member addition, expense add/delete, and balance/settlement. No overlap or ambiguity between tools.
All tools follow a consistent lowercase snake_case verb_noun pattern (e.g., add_expense, get_balances). Even settle_up, a phrasal verb, fits the style without deviation.
With 8 tools, the server is well-scoped for an expense-splitting domain. Each tool is necessary for core workflows, and the count is neither sparse nor bloated.
The tool surface covers the full cycle: create/list/get groups, add members, add/delete expenses, and compute balances/settlements. Minor gaps exist (e.g., no update/delete for groups or member removal), but they are not essential for the core purpose and agents can work around them.
Maintenance
Related MCP Connectors
- ContamosOAuthxyz.contamos
Shared ledger for groups that share money: balances, expenses, transfers, budgets and reports.
1 Track and split shared expenses across trips, events, and groups. Create groups, add expenses, andβ¦
Split shared expenses in a group β no account needed. See who owes whom and settle up.
Split bills and collect payments through PayNow (Singapore) from your AI. MCP server for SplitBill.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server that helps AI assistants manage expense-sharing for social events, enabling the creation of gatherings, tracking of expenses, and calculation of fair reimbursements among participants.Apache 2.0
- AlicenseAqualityDmaintenanceAn MCP server for Splitwise that enables users to manage shared expenses, friends, and groups directly through AI assistants. It allows for creating, deleting, and listing expenses while providing tools to track net balances and group debts.8791 npmMIT
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server for managing shared expenses between groups, with tools for group management, expense tracking, and debt simplification.8 npmMIT
- FlicenseNot gradedqualityCmaintenanceA remote, multi-user MCP server for splitting group expenses, enabling users to register, create groups, add members, log expenses, and view balances through MCP clients.-