splitwise-mcp
Click on "Install 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., "@splitwise-mcpAdd a $45.60 dinner expense and split it evenly with Emily."
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.
splitwise-mcp
A Model Context Protocol server that gives any MCP-compatible AI host full, safe control over a Splitwise account — expenses, groups, friends, and balances — with guards against silent duplicate charges and unconfirmed deletions.
Quickstart
No install step is required. Any MCP host that can launch a command over stdio can run the server directly with uv:
uvx --from splitwise-mcp-server splitwise-mcpSet SPLITWISE_API_KEY in the environment first (see below), then point your MCP host at
that command. Configuration snippets for three hosts are below.
Related MCP server: splitwise-mcp
Getting your Splitwise API key
Most setups only need a personal API key:
Go to secure.splitwise.com/apps and register an application (any name and description work).
Copy the generated API key.
Set it as
SPLITWISE_API_KEYwherever you configure the server.
A personal API key authenticates as the Splitwise account that generated it — this is all you need for a single-user setup, such as Claude Code or Gemini CLI running on your own machine.
Reach for OAuth2 instead when one deployment of this server needs to act on behalf of someone else's Splitwise account — for example, a shared bot or chat-bridge host serving multiple people, where you don't want each user handing their API key to the operator. To use it:
Register an application at the same secure.splitwise.com/apps page and note its consumer key and secret.
Set that application's Redirect URI / Callback URL to
http://127.0.0.1:61438/callback.splitwise-mcp-authalways binds its local callback server to this exact host and port, so it must match what's registered here or Splitwise will refuse the authorization request.Set
SPLITWISE_CONSUMER_KEYandSPLITWISE_CONSUMER_SECRETin the environment.Run
splitwise-mcp-authonce per account. It opens a browser to Splitwise's authorization page, receives the redirect on a local server listening at127.0.0.1:61438, and caches the resulting access token to~/.splitwise-mcp/token.json(mode 0600). The MCP server picks that cached token up automatically on every subsequent run. If port 61438 is already in use by something else, free it and run the command again -- it will not fall back to a different port.
Configuring your MCP host
All three snippets below use the same command and the personal-API-key path. Substitute your own key.
Claude Code (.mcp.json)
{
"mcpServers": {
"splitwise": {
"type": "stdio",
"command": "uvx",
"args": ["--from", "splitwise-mcp-server", "splitwise-mcp"],
"env": {
"SPLITWISE_API_KEY": "your-splitwise-api-key"
}
}
}
}Gemini CLI (.gemini/settings.json or ~/.gemini/settings.json)
{
"mcpServers": {
"splitwise": {
"command": "uvx",
"args": ["--from", "splitwise-mcp-server", "splitwise-mcp"],
"env": {
"SPLITWISE_API_KEY": "your-splitwise-api-key"
}
}
}
}Hermes Agent (~/.hermes/config.yaml)
mcp_servers:
splitwise:
command: "uvx"
args: ["--from", "splitwise-mcp-server", "splitwise-mcp"]
env:
SPLITWISE_API_KEY: "your-splitwise-api-key"Worked example: a low-trust registration for chat channels
Some MCP hosts bridge a chat surface you don't fully control — a WhatsApp number shared
with roommates, a family group chat, a support inbox — through Hermes Agent or a similar
tool. Messages arriving over that channel may come from anyone in the chat, may be routed
through a smaller/cheaper model with weaker judgment, and may not even reach a client that
implements MCP elicitation (many chat-bridge hosts don't), which means this server's
confirm-gate on destructive tools would fall back to its "re-call with confirm=true"
mode instead of ever prompting a human. A local model asked "can you delete the roommate
group?" as a joke, or a prompt-injection payload hidden in an incoming message, should not
be able to act on that.
The fix is to register this server twice under two different names — once with the
full tool list for channels you trust, and once scoped down to read-only tools plus
create_expense for everything else — and wire only the second registration into the
untrusted channel's agent profile.
Hermes Agent (~/.hermes/config.yaml) supports this natively via each server's
tools.include/tools.exclude block:
mcp_servers:
splitwise:
command: "uvx"
args: ["--from", "splitwise-mcp-server", "splitwise-mcp"]
env:
SPLITWISE_API_KEY: "${SPLITWISE_API_KEY}"
# Full tool list. Wire this into channels you fully control (CLI, your own account).
splitwise_readonly:
command: "uvx"
args: ["--from", "splitwise-mcp-server", "splitwise-mcp"]
env:
SPLITWISE_API_KEY: "${SPLITWISE_API_KEY}"
tools:
include:
- whoami
- list_groups
- get_group
- list_friends
- list_expenses
- get_expense
- create_expense
# Read-only tools plus create_expense only. Wire this into the WhatsApp channel
# (or any other agent profile handling messages from people you don't fully trust).With include set, Hermes never even shows the model the excluded tools exist, so there is
no delete_group, delete_expense, or manage_group_members for a WhatsApp message to
reach — the worst an untrusted sender can do is add a visible, additive expense (itself
still guarded by create_expense's duplicate-detection window), never rewrite or delete
shared history.
Gemini CLI offers the same mechanism per server, with includeTools/excludeTools
directly in settings.json:
{
"mcpServers": {
"splitwise": {
"command": "uvx",
"args": ["--from", "splitwise-mcp-server", "splitwise-mcp"],
"env": { "SPLITWISE_API_KEY": "your-splitwise-api-key" }
},
"splitwise_readonly": {
"command": "uvx",
"args": ["--from", "splitwise-mcp-server", "splitwise-mcp"],
"env": { "SPLITWISE_API_KEY": "your-splitwise-api-key" },
"includeTools": [
"whoami", "list_groups", "get_group", "list_friends",
"list_expenses", "get_expense", "create_expense"
]
}
}
}Claude Code has no per-server include/exclude field in .mcp.json itself; register
the server twice there as shown above, then scope the low-trust name in
.claude/settings.json with an explicit allow-list keyed to the mcp__<server>__<tool>
pattern. Unlike Gemini CLI's or Hermes's include-lists, this doesn't hide the other tools
from the model — it gates the call itself, falling back to Claude Code's normal permission
prompt for anything not listed — so for a fully unattended bridge, pair it with whatever
default-deny/headless permission mode Claude Code offers rather than relying on the allow
rule alone:
{
"permissions": {
"allow": [
"mcp__splitwise_readonly__whoami",
"mcp__splitwise_readonly__list_groups",
"mcp__splitwise_readonly__get_group",
"mcp__splitwise_readonly__list_friends",
"mcp__splitwise_readonly__list_expenses",
"mcp__splitwise_readonly__get_expense",
"mcp__splitwise_readonly__create_expense"
]
}
}Tool reference
Tool | Description | Kind |
| Return the profile of the authenticated Splitwise account. | Read-only |
| List every Splitwise group the authenticated user belongs to. | Read-only |
| Fetch a single group's detail, including its current members. | Read-only |
| List every Splitwise friend, with current balances. | Read-only |
| List expenses, optionally scoped to one group or friend, paginated. | Read-only |
| Fetch one expense's full detail, including splits and its comment thread. | Read-only |
| Create a new expense, split among a group or with a friend. Runs duplicate detection first. | Additive |
| Record a payment from one user to another, settling part of their balance. | Additive |
| Post a comment on an expense. | Additive |
| Create a new group and optionally add its initial members. | Additive |
| Restore a previously deleted expense. | Additive |
| Restore a previously deleted group. | Additive |
| Add a member (immediate) or remove one (confirm-gated). | Additive / Destructive |
| Change an expense's description, amount, split, date, or category. | Destructive (confirm-gated) |
| Permanently delete an expense. | Destructive (confirm-gated) |
| Permanently delete a comment. | Destructive (confirm-gated) |
| Permanently delete a group. | Destructive (confirm-gated) |
Two read-only resources are also exposed for reference data: splitwise://categories
(every expense category, for create_expense's category_id) and
splitwise://currencies (every accepted currency_code).
Safety model
Destructive actions are confirm-gated. update_expense, delete_expense,
delete_comment, delete_group, and manage_group_members (when removing a member) all
take a confirm: bool = False parameter. With confirm left False, the tool fetches the
current state from Splitwise, builds an exact preview of what will change, and calls the
MCP client's elicitation capability to ask for interactive yes/no confirmation. If the
connected client doesn't support elicitation at all, the tool never performs the write —
instead it raises an error containing the full preview and the instruction to re-call with
confirm=true. Passing confirm=true skips straight to the write. Additive actions
(create_expense, add_comment, settle_up, create_group, undelete_expense,
undelete_group, and adding a group member) never require confirmation.
create_expense guards against duplicate writes with a reserve-then-finalize log. A
local SQLite log at ~/.splitwise-mcp/write_log.db (directory mode 0700) reserves a row
for every create_expense call before it talks to Splitwise, and only marks that row
completed once the API call actually succeeds. A repeated call for the same group/friend,
amount, and description is handled one of three ways: if an earlier call for the same
content is still in flight (reserved but not yet completed, within a 60-second guard
window), the retry is rejected outright rather than allowed to race the original request;
if a matching call completed in the last 120 seconds, it's rejected with an error
describing the existing expense unless allow_duplicate=true is passed; otherwise the
write proceeds. An optional idempotency_key lets a caller safely retry the same logical
write — a repeated key replays the original result instead of creating a second expense.
This narrows, but cannot fully eliminate, the failure window inherent to any client
retrying a call whose response was lost: a retry issued after the 60-second guard window
has elapsed, with no idempotency_key and against an original request that is still
in flight at Splitwise, can still produce a real duplicate.
Money is exact. Every amount is a Python Decimal, never a float. Splitting an
expense uses the largest-remainder method: each participant's ideal share is computed as
an exact fraction of the total in cents, floored, and any leftover cents are handed out one
at a time to the participants with the largest fractional remainder (ties broken by input
order) until the split sums to the total exactly, in every mode (equal, exact,
percent, shares). exact and percent splits that don't reconcile to the expense
total are rejected with the precise shortfall or excess, not silently rounded.
Ambiguous names are never guessed. Friend, group, and category lookups accept either a numeric id or a case-insensitive substring of a name. Zero matches produce an error listing close-but-imperfect suggestions; more than one match produces an error listing every candidate by id and full name so the caller can retry with an exact id. This server never silently picks the "best" match.
Limitations
Two-decimal currencies only. All money math assumes currencies with exactly two decimal places (USD, EUR, GBP, and most others). Zero-decimal currencies such as JPY are not handled correctly in this v1 and should not be used with
create_expenseorupdate_expense.settle_upis a synthetic payment. Splitwise's API doesn't expose the flag that marks an expense as a true "payment" through this endpoint, so a settlement is recorded as an ordinary expense where the payer owes nothing and the recipient owes the full amount. The balance effect is identical to a real payment, but it will display with a regular expense icon in the Splitwise UI rather than a payment icon.Elicitation support varies by host. The confirm-gate's interactive prompt only works if the connected MCP client implements elicitation. Many hosts, especially chat-bridge and headless integrations, don't — those fall back to the
confirm=truere-call pattern for every destructive tool.Duplicate detection is local and per-installation. The write log lives on the machine running the server. It won't catch a duplicate created by a different instance of this server, or one entered directly through the Splitwise app or website.
Pagination has no total count.
list_expenses'shas_moreflag is a lower bound (it is true whenever a page came back full), not a guarantee, because the Splitwise API doesn't report how many expenses exist in total.One currency per expense. Splits within a single expense share one
currency_code, matching Splitwise's own data model; there is no cross-currency split support.
Development
git clone https://github.com/sarathfrancis90/splitwise-mcp
cd splitwise-mcp
uv venv
source .venv/bin/activate
uv pip install -e '.[dev]'
pytest
ruff check src/ tests/
mypy src/Available Tools
17 toolsadd_commentB
Post a comment on an expense.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | Comment text to post. | |
| expense_id | Yes | Id of the expense to comment on. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Splitwise's numeric id for this comment. |
| author | No | User who posted the comment, if known. |
| content | Yes | Text content of the comment. |
| created_at | No | Timestamp the comment was posted. |
| relation_id | No | Id of the object (usually an expense) this comment is attached to. |
| comment_type | No | Splitwise's type tag for the comment, e.g. 'User'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a write operation (readOnlyHint=false) and non-destructive intent (destructiveHint=false). The description adds no behavioral detail beyond what annotations state, such as side effects or error cases. It does not contradict annotations.
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 sentence with zero wasted words. The verb is front-loaded, and the resource is immediately clear. It is appropriately concise for a simple tool.
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 tool with annotations covering safety and schema covering parameters, the description is minimally adequate. However, it omits any mention of return behavior (despite an output schema existing) and does not clarify that the expense must already exist, which could be inferred from the parameter but is not explicit.
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% with clear descriptions for both parameters ('Comment text to post.' and 'Id of the expense to comment on.'). The description adds no additional meaning; this is the baseline for full 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 clear verb ('Post') and resource ('comment on an expense'), distinguishing it from siblings like delete_comment. It is specific but lacks any additional nuance (e.g., whether it appends or replaces).
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 alternatives. It does not mention prerequisites (e.g., expense must exist) or exclusions, leaving the agent to infer context from the parameter schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_expenseA
Create a new expense, split among a group or with a single friend.
Exactly one of group_id/group_name or friend_id/friend_name must be
given. Every participant in split must be resolvable, by id or by
name, against that group's members (for a group expense) or against
the authenticated user plus their friends (for a friend expense).
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Date the expense occurred. Defaults to now. A value with no timezone is treated as UTC. | |
| split | Yes | How to divide the expense among its participants. | |
| amount | Yes | Total cost of the expense. | |
| group_id | No | Id of the group this expense belongs to. | |
| payer_id | No | Id of who paid. Defaults to the authenticated user. | |
| friend_id | No | Id of the friend to split this expense with, for a non-group expense. | |
| group_name | No | Name (or partial name) of the group this expense belongs to. | |
| payer_name | No | Name (or partial name) of who paid. | |
| category_id | No | Id of the expense's category. | |
| description | Yes | Short human-readable description of the expense. | |
| friend_name | No | Name (or partial name) of the friend to split this expense with. | |
| category_name | No | Name (or partial name) of the expense's category. | |
| currency_code | Yes | ISO 4217 currency code, e.g. 'USD'. | |
| allow_duplicate | No | Set true to create this expense even if a matching one was created in the last two minutes. | |
| idempotency_key | No | Opaque key identifying this logical write. Reusing it replays the original result instead of creating a second expense. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Splitwise's numeric id for this expense. |
| cost | Yes | Total cost of the expense, in currency_code units. |
| date | Yes | Date and time the expense occurred. |
| splits | No | Per-participant owed and paid shares for this expense. |
| deleted | No | Whether this expense has been soft-deleted in Splitwise. |
| category | No | Category assigned to this expense, if any. |
| group_id | No | Id of the group this expense belongs to, if any. |
| description | Yes | Short human-readable description of the expense. |
| currency_code | Yes | ISO 4217 currency code the cost is denominated in. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false, so the write nature is covered. The description adds genuinely useful behavioral context beyond annotations: the exclusive group/friend requirement and how participant names are resolved against group members or the authenticated user's friends.
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 tight paragraphs with no filler. The first sentence front-loads the action and scope, and every subsequent sentence conveys a constraint an agent must know to call the tool successfully.
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 15-parameter tool with complete schema descriptions and an output schema, the description covers the two non-obvious invariants that would otherwise cause failed calls: the exclusive group/friend target and participant resolvability. Required parameters and defaults are already documented in the schema.
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 100%, so the baseline is 3. The description adds value by expressing the exactly-one constraint among group_id/group_name/friend_id/friend_name and explaining how name-based participant resolution works—semantics not captured by the schema's individual parameter 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 names the exact operation (create), the resource (expense), and the scope (split among a group or a single friend). This clearly differentiates it from sibling tools like get_expense, update_expense, and delete_expense without needing to inspect the schema.
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?
It clearly establishes the creation context and states the hard constraint that exactly one group or friend identifier must be provided. It doesn't explicitly name alternative tools for when not to use it, but the verb 'Create' plus the resource makes the use case unambiguous.
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 new Splitwise group and optionally add its initial members.
Members who cannot be added (e.g. a malformed invite) do not roll
back the group itself; the error lists which ones failed so they can
be retried with manage_group_members.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| members | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Splitwise's numeric id for this group. |
| name | Yes | Group's display name. |
| members | No | Current members of the group. |
| group_type | No | Splitwise's category for the group, e.g. 'trip', 'home'. |
| simplify_by_default | No | Whether Splitwise simplifies debts within this group by default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already mark the operation as non-read-only and non-idempotent, so the description does not need to restate that. It adds valuable behavioral detail beyond the annotations: failed member additions do not roll back the entire group, and the error reports which members failed so they can be retried via `manage_group_members`. This is a non-obvious partial-failure behavior that an agent should know before calling.
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 two short paragraphs with no filler. The core action is front-loaded in the first sentence, and the important failure caveat is separated into the second paragraph. Every sentence adds meaningful guidance.
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 two parameters, the rich input schema, and the presence of an output schema, the description is mostly complete. It covers the main purpose, optional membership, and the partial-failure behavior. A minor gap is not explicitly stating that adding members to an existing group should use `manage_group_members`, though the 'initial members' wording and retry reference imply as much.
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-level description adds little parameter detail beyond calling members 'initial members' and alluding to malformed invites. However, the input schema compensates with structured descriptions for `GroupMemberInput`, `user_id`, `email`, `first_name`, and `last_name`, so an agent reviewing the schema can understand the member modes. The description does not shoulder the full burden, but the schema largely fills the 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 states a specific verb and resource: 'Create a new Splitwise group and optionally add its initial members.' It also names a related sibling tool, `manage_group_members`, for handling failed member retries, which sharpens the boundary between creating a group and later managing its members.
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 clearly establishes when to use the tool: when creating a new group, with optional initial member adds. It also explicitly points to `manage_group_members` as the retry path for members that failed during creation, giving a concrete alternative for that scenario. It does not discuss broader exclusions, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_commentADestructiveIdempotent
Permanently delete a comment.
Splitwise has no endpoint to fetch a single comment by id, so unlike
delete_expense this cannot preview the comment's content beforehand
-- the preview and the confirmation gate below are id-only until the
delete call itself returns the comment Splitwise removed. Calling
this again on a comment a prior call already deleted is a no-op: the
delete request itself comes back not-found, and that is treated as
already deleted rather than a hard failure.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Skip the confirmation step and delete immediately. | |
| comment_id | Yes | Id of the comment to delete. |
Output Schema
| Name | Required | Description |
|---|---|---|
| content | No | Text content the comment had before deletion. None when the comment was already deleted before this call, so its content could not be recovered. |
| comment_id | Yes | Id of the comment the deletion applies to. |
| already_deleted | Yes | True if the comment was already deleted before this call, so no delete request needed to succeed for it to be gone. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description explains meaningful behavior: previews and confirmation are id-only because Splitwise cannot fetch a comment by id, and repeated deletion is treated as a no-op rather than a hard failure. This clarifies the idempotentHint annotation and gives an agent accurate expectations for edge cases.
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 front-loaded with the core action and then provides two tightly focused pieces of behavioral context. Every sentence adds necessary information without redundancy or unrelated 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 description, together with the annotations and output schema, gives an agent everything needed to call this tool correctly: the destructive nature, idempotency behavior, confirmation semantics, and the limitation around previewing. No critical operational detail is missing.
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 already documents both comment_id and confirm with 100% coverage, so the description does not need to redefine them. It adds context about the confirmation flow, but the parameters themselves are simple and well-covered by 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 opens with 'Permanently delete a comment,' which is a specific verb plus resource and clearly states the tool's destructive purpose. It also distinguishes itself from delete_expense by noting that no endpoint exists to fetch a single comment by id, making the tool's behavior unique among siblings.
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 clearly situates this tool as the way to delete comments and contrasts it with delete_expense, which helps an agent choose between those two destructive operations. It does not explicitly enumerate all when-to-use/when-not-to-use cases, but the context is clear enough for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_expenseADestructiveIdempotent
Permanently delete an expense.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Skip the confirmation step and delete immediately. | |
| expense_id | Yes | Id of the expense to delete. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cost | Yes | Cost the expense had at the time of deletion. |
| expense_id | Yes | Id of the expense the deletion applies to. |
| description | Yes | Description the expense had at the time of deletion. |
| currency_code | Yes | Currency code the expense's cost was denominated in. |
| already_deleted | Yes | True if the expense was already deleted before this call, so no write occurred. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose destructiveHint and idempotentHint. The description adds 'permanently,' which clarifies irreversibility, but it does not mention confirmation behavior, cascading effects, or failure semantics beyond what the schema already hints at.
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. It efficiently states the action and resource without repeating schema or annotation information.
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 deletion tool with a full input schema and an output schema, the description is sufficient. The annotations carry the destructive/idempotent behavior, and the schema documents the confirm and expense_id parameters.
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 100%, with expense_id described as 'Id of the expense to delete' and confirm as 'Skip the confirmation step and delete immediately.' The description adds no additional parameter-level meaning, so the baseline of 3 applies.
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 and resource: 'Permanently delete an expense.' The word 'permanently' also differentiates it from the sibling tool 'undelete_expense' by signaling irreversibility.
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 no when-to-use guidance and does not contrast with related tools like 'update_expense' or 'undelete_expense.' The word 'permanently' implies finality, but no explicit alternative or exclusion is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_groupADestructiveIdempotent
Permanently delete a Splitwise group.
Identify the group with group_id or group_name. Without
confirm=true, this previews the group and its members and asks for
confirmation before deleting. Use undelete_group to restore it.
Calling this again on a group a prior call already deleted is a
no-op: looking the group up by group_id comes back not-found, and
that is treated as already deleted rather than a hard failure. A
group_name that no longer matches anything is not given that
benefit of the doubt, since there is no way to tell "deleted" apart
from "never existed" or "misspelled" by name alone.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | ||
| group_id | No | ||
| group_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | Name the group had at the time of deletion. None when the group was already gone before this call, so its name could not be looked up. |
| group_id | Yes | Id of the group the deletion applies to. |
| already_deleted | Yes | True if the group was already deleted before this call, so no delete request was sent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation already declares destructiveHint=true and idempotentHint=true. The description goes beyond this by explaining exactly how idempotency works: calling again on an already-deleted group by ID is a no-op, but by name it is not. It also discloses the confirmation requirement when confirm=false. This adds valuable behavioral context that the annotations alone do not provide.
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 moderately sized but every sentence contributes unique value: purpose, identification, confirmation, alternative tool, and idempotency edge cases. It starts with the core action and flows logically. It could be slightly more concise, but it is well-structured and not verbose.
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 destructive, idempotent tool with a confirmation mechanism, this description covers all necessary aspects: how to identify the resource, the confirmation behavior, the difference in handling already-deleted groups by ID vs name, and the restoration alternative. Since an output schema exists, return value details are not required here. Nothing an agent needs to call it correctly is missing.
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 zero description coverage (0%), so the description carries the full burden of explaining parameters. It does so thoroughly: group_id and group_name are explained as identification methods with different post-deletion behaviors, and confirm is explained as controlling whether the action previews or directly deletes. This fully compensates for the lack of schema 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 opens with a clear, specific verb and resource: 'Permanently delete a Splitwise group.' It explicitly distinguishes itself from undelete_group, which is a sibling tool, and explains the confirmation behavior. This eliminates ambiguity about what the tool does and how it differs from related operations.
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 provides clear context for when to use this tool: to delete a group, with the option to preview before deletion. It explicitly mentions undelete_group as the alternative for restoration, and explains the behavioral difference when identifying by group_id vs group_name. While it doesn't say 'do not use this if...', the guidance is sufficient for an agent to make an appropriate selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_expenseARead-onlyIdempotent
Fetch one expense's full detail, including its splits and comment thread.
| Name | Required | Description | Default |
|---|---|---|---|
| expense_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| expense | Yes | The expense, including its per-participant splits. |
| comments | No | Comments left on this expense, oldest first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint true, idempotentHint true, and destructiveHint false, so the safety profile is established. The description adds valuable behavioral context about the response contents: it returns a single expense's full detail, including splits and the comment thread, which is not inferable from the schema alone.
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. It efficiently conveys the action, the resource, and the key content of the response.
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 read-only tool with one parameter, existing annotations, and an output schema, the description is complete enough for an agent to invoke it correctly. It identifies exactly what will be returned and does not need to explain return values because an output schema exists.
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 should compensate by explaining the expense_id parameter, but it does not mention it at all. The parameter name and type are self-explanatory to some degree, but the description adds no meaning beyond the schema's field name and integer type.
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 ('Fetch'), a specific resource ('one expense'), and the scope of what is returned ('full detail, including its splits and comment thread'). This clearly distinguishes it from list_expenses, which retrieves multiple expenses, and from the mutation siblings.
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 makes the intended use clear: call this tool when you need the full detail for a single expense. It does not explicitly name alternatives or exclusion conditions, but the 'one expense' phrasing and the tool name provide sufficient context for when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_groupARead-onlyIdempotent
Fetch a single group's detail, including its current members.
Provide group_id for an exact lookup, or group_name to resolve one by
a case-insensitive substring match against the caller's group names.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | No | ||
| group_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Splitwise's numeric id for this group. |
| name | Yes | Group's display name. |
| members | No | Current members of the group. |
| group_type | No | Splitwise's category for the group, e.g. 'trip', 'home'. |
| simplify_by_default | No | Whether Splitwise simplifies debts within this group by default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnly, openWorld, idempotent, and non-destructive hints. The description adds valuable behavioral context by disclosing that results include current members, that group_name is case-insensitive, and that lookup is scoped to the caller's groups. It does not state precedence when both parameters are supplied, but this is a minor gap given the simple read-only 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?
The description is two sentences with no redundancy. The primary purpose is front-loaded, and the parameter guidance is concise and directly actionable.
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 low complexity, rich annotations, and presence of an output schema, the description is nearly complete. The only notable missing piece is behavior when both group_id and group_name are provided or when both are omitted, which could be clarified.
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?
With 0% schema coverage, the description compensates by explaining group_id as an exact lookup and group_name as a case-insensitive substring match. It does not specify behavior when both parameters are provided or when neither is provided, but it does assign meaningful semantics to both parameters.
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 opening sentence states a specific verb and resource: 'Fetch a single group's detail, including its current members.' This clearly distinguishes the tool from list_groups and other sibling operations that operate on different entities.
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 clearly explains the two lookup modes and the scope of group_name lookup, which tells an agent how to use the tool correctly. It does not explicitly name alternatives or exclusions, but the context is clear enough for selecting this tool over list_groups or manage_group_members.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_expensesARead-onlyIdempotent
List expenses, optionally scoped to one group or one friend.
Pass at most one of group_id/group_name or friend_id/friend_name;
with none of them set, this returns expenses across the whole account.
Results are paginated with limit/offset -- check has_more on the
returned page rather than assuming the listing is complete.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| group_id | No | ||
| friend_id | No | ||
| group_name | No | ||
| dated_after | No | ||
| friend_name | No | ||
| dated_before | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | Yes | Maximum number of expenses requested for this page. |
| offset | Yes | Number of expenses skipped before this page. |
| expenses | Yes | Expenses on this page, most recent first. |
| has_more | Yes | Whether more expenses likely exist beyond this page. True whenever this page came back full (returned count reached limit); Splitwise does not report a total count, so this is a lower bound rather than a guarantee. Fetch the next page by re-calling with offset advanced by limit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false. The description adds non-obvious behavior: pagination via limit/offset and the instruction to check has_more rather than assume completeness. No contradiction with annotations.
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?
Three compact sentences are front-loaded with the core purpose, then scoping rules, then pagination. Every sentence carries unique information 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?
For a listing tool with an output schema and read-only/idempotent annotations, the description covers purpose, default scope, scoping constraints, and pagination. The only minor omission is the dated_after/dated_before filters, but they are optional and reasonably inferable from their names.
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?
With 0% schema description coverage, the description carries the parameter-semantics burden. It explains group/friend scoping, the mutual-exclusivity rule, and limit/offset meaning, but it omits dated_after and dated_before, leaving those two parameters to rely on their names alone.
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?
Description opens with a specific verb and resource, 'List expenses', and immediately qualifies scope ('optionally scoped to one group or one friend', otherwise 'whole account'). This distinguishes it from single-expense getters like get_expense and from group/friend listing siblings.
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?
It gives concrete usage constraints: pass at most one of group_id/group_name or friend_id/friend_name, and states that omitting all filters returns account-wide expenses. It doesn't explicitly name sibling alternatives like get_expense, but the guidance is clear enough for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_friendsARead-onlyIdempotent
List every Splitwise friend of the authenticated user, with current balances.
| 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?
Annotations already declare readOnly, openWorld, idempotent, and non-destructive traits. The description adds meaningful behavioral context by stating it returns current balances, beyond what annotations alone convey.
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 one sentence, front-loaded with the action and resource, and includes the key output detail ('current balances') without any 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?
The tool is simple, parameterless, and has rich annotations plus an output schema. The description supplies the essential scope and return-value context, leaving no critical gap for an agent to invoke it correctly.
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 description bears minimal burden. Schema coverage is 100% and the description adds no unnecessary parameter details, which is appropriate for a parameterless 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 ('List') with a precise resource ('every Splitwise friend of the authenticated user') and specifies the included data ('with current balances'). This clearly differentiates it from sibling tools like list_groups or list_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 use case: retrieving the authenticated user's friends and their current balances. It does not explicitly name alternatives or exclusions, but the context is clear and no misleading guidance is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_groupsARead-onlyIdempotent
List every Splitwise group the authenticated user belongs to.
| 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?
Annotations already convey readOnly, idempotent, and non-destructive behavior. The description adds useful context by specifying the operation returns groups the authenticated user belongs to and that all such groups are included. It does not describe unnecessary behavioral details beyond that, but given the strong annotations and simple read-only nature, this is adequate.
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 sentence with no filler or redundancy. The core action, resource, and scope are front-loaded and immediately actionable.
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 parameterless, read-only listing tool with a rich output schema and comprehensive annotations, the description fully covers what an agent needs. There are no missing prerequisites, inputs, or side effects to disclose.
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 and an empty schema, so the schema requires no explanation. The description reinforces that the tool takes no input and operates on the authenticated user's own groups. This matches the baseline for parameterless tools.
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 ('List'), a clear resource ('Splitwise group'), and scopes it to 'every' group the authenticated user belongs to. This clearly distinguishes it from sibling tools like get_group (single group) and create_group (creating groups).
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: whenever you need the full list of groups for the current user. However, it does not explicitly mention alternatives or exclusions, such as 'use get_group for a single group' or 'use create_group to add a group.' The usage context is clear but not explicitly contrasted with sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_group_membersADestructive
Add or remove a member of a Splitwise group.
Identify the group with group_id or group_name, and the member
with user_id, or email (optionally with first_name/last_name
for a new invite when adding, or to disambiguate when removing).
Adding executes immediately. Removing is destructive and, without
confirm=true, previews who will be removed and asks for
confirmation first.
| Name | Required | Description | Default |
|---|---|---|---|
| No | |||
| action | Yes | ||
| confirm | No | ||
| user_id | No | ||
| group_id | No | ||
| last_name | No | ||
| first_name | No | ||
| group_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| user | No | The user added or removed. None when Splitwise accepted an email invite without returning a user record yet. |
| action | Yes | Which membership change was performed. |
| detail | No | Extra context, e.g. that an invite email was sent. |
| group_id | Yes | Id of the group the membership change applies to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true, but the description adds crucial behavioral details: that removal is destructive, requires confirmation unless confirm=true, and that adding executes immediately. It also explains that first_name/last_name can be used for new invites or disambiguation. This goes beyond the annotation's bare hint, providing practical operational transparency.
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 tight and well-organized. The primary action is stated first, followed by identification schemes and behavior nuances. Every sentence adds value without redundancy or fluff, making it easy for an agent to parse quickly.
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's complexity (8 parameters, dual actions, destructive behavior) and the existence of an output schema, the description is essentially complete. It covers identification, add/remove behavior, confirmation, and invite specifics. It could mention response or error handling, but with an output schema present, that is not required. Overall, it provides enough context for correct invocation.
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?
With schema description coverage at 0%, the description carries the full burden of explaining parameters. It does so well: it explains how to specify the group (group_id or group_name) and member (user_id or email), the role of first_name/last_name, and the confirm parameter's function. The action parameter is self-explanatory via the enum. Some nuances (e.g., behavior when both group_id and group_name are provided) are not addressed, but the core semantics are well-covered.
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 tool's purpose: 'Add or remove a member of a Splitwise group.' It names the specific verb and resource (group member management) and is readily distinguishable from sibling tools like create_group or delete_group, which handle group-level operations.
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 explains how to identify the group and member (via group_id/group_name and user_id/email), and clarifies the difference between add and remove, including the confirm flag for removal. It does not explicitly name alternative tools, but the guidance for when to use add vs. remove is clear and sufficient for an agent to select this tool appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settle_upA
Record a payment from one user to another, settling part of their balance.
Exactly one of from_user_id/from_user_name and one of to_user_id/ to_user_name must be given for each side, resolved against the settling group's members (if group_id/group_name given) or against the authenticated user plus their friends.
Splitwise represents a cash payment as an expense with a payment
flag so its UI shows a distinct "paid" icon rather than a shared
cost; SplitwiseClient.create_expense does not expose that flag, so
this records the settlement as an ordinary expense where from_user_id
owes nothing and paid the full amount while to_user_id owes the full
amount and paid nothing. The balance effect is identical to a true
payment, but Splitwise's UI will display it like a regular expense.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Date the payment occurred. Defaults to now. A value with no timezone is treated as UTC. | |
| amount | Yes | Amount being paid. | |
| group_id | No | Id of the group this payment settles within. | |
| group_name | No | Name (or partial name) of the group this payment settles within. | |
| to_user_id | No | Id of the user receiving the payment. | |
| from_user_id | No | Id of the user making the payment. | |
| to_user_name | No | Name (or partial name) of the user receiving the payment. | |
| currency_code | Yes | ISO 4217 currency code, e.g. 'USD'. | |
| from_user_name | No | Name (or partial name) of the user making the payment. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Splitwise's numeric id for this expense. |
| cost | Yes | Total cost of the expense, in currency_code units. |
| date | Yes | Date and time the expense occurred. |
| splits | No | Per-participant owed and paid shares for this expense. |
| deleted | No | Whether this expense has been soft-deleted in Splitwise. |
| category | No | Category assigned to this expense, if any. |
| group_id | No | Id of the group this expense belongs to, if any. |
| description | Yes | Short human-readable description of the expense. |
| currency_code | Yes | ISO 4217 currency code the cost is denominated in. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses non-obvious behavior: the settlement is actually recorded as an ordinary expense with a specific owes/pays split, and Splitwise's UI will display it as a regular expense rather than a true payment. This is substantial, non-obvious behavioral context that annotations alone do not provide.
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 purpose is front-loaded in the first sentence, and the follow-up paragraph explains the important Splitwise workaround. The second paragraph is somewhat long but earns its place because the behavior it describes is non-obvious and critical for correctly understanding the tool's effect.
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 mutating tool with sparse annotations, the description covers the essential call constraints and the most important behavioral caveat. An output schema exists, so return values need not be described. Minor gaps like permission failure behavior are not addressed, but the tool is sufficiently complete for correct invocation.
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 baseline is 3. The description adds meaningful cross-parameter semantics by requiring exactly one identifier per side and explaining name/id resolution against group members or the authenticated user and friends. This is valuable beyond the schema's individual parameter 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 clearly states the tool records a payment between users and settles part of a balance. It further distinguishes itself from create_expense by explaining that Splitwise's payment flag is not exposed, so this tool exists specifically for the settle-up case.
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 input constraints: exactly one from_user_id/from_user_name and one to_user_id/to_user_name must be provided, and resolution depends on whether a group is supplied. It also references create_expense as the overlapping alternative and explains why it is unsuitable, providing actionable selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
undelete_expenseBIdempotent
Restore a previously deleted expense.
| Name | Required | Description | Default |
|---|---|---|---|
| expense_id | Yes | Id of the previously deleted expense to restore. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Splitwise's numeric id for this expense. |
| cost | Yes | Total cost of the expense, in currency_code units. |
| date | Yes | Date and time the expense occurred. |
| splits | No | Per-participant owed and paid shares for this expense. |
| deleted | No | Whether this expense has been soft-deleted in Splitwise. |
| category | No | Category assigned to this expense, if any. |
| group_id | No | Id of the group this expense belongs to, if any. |
| description | Yes | Short human-readable description of the expense. |
| currency_code | Yes | ISO 4217 currency code the cost is denominated in. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose that the operation is non-read-only, idempotent, and non-destructive (readOnlyHint=false, idempotentHint=true, destructiveHint=false). The description adds no extra behavioral context beyond the action itself, such as idempotency or side effects, but does not contradict the annotations. Since the bar is lower with annotations present, a 3 is appropriate.
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 zero filler. The action and object are front-loaded, achieving maximum clarity in minimal space.
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 tool with annotations covering safety and an output schema present, the description is minimally adequate. However, it omits usage guidance and potential behavioral nuances (e.g., what happens if the expense is already restored), leaving some gaps in completeness for an agent to navigate without further context.
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 100%, and the schema already fully documents expense_id as 'Id of the previously deleted expense to restore.' The description adds no additional semantics beyond what the schema provides, so the baseline of 3 applies.
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 precise verb ('restore') and resource ('previously deleted expense'), clearly distinguishing this from sibling tools like delete_expense and create_expense. It is unambiguous about what the tool does, though it could add a bit more specificity about what restoration entails (e.g., restoring to active status).
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 versus alternatives, nor any prerequisites (e.g., whether the expense must be soft-deleted, or if there are restrictions on which deleted expenses can be restored). The agent is left to infer the usage context from the name and description alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
undelete_groupAIdempotent
Restore a previously deleted Splitwise group.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Splitwise's numeric id for this group. |
| name | Yes | Group's display name. |
| members | No | Current members of the group. |
| group_type | No | Splitwise's category for the group, e.g. 'trip', 'home'. |
| simplify_by_default | No | Whether Splitwise simplifies debts within this group by default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey non-read-only, idempotent, and non-destructive behavior. The description adds the 'previously deleted' precondition but does not disclose what the restore operation entails (e.g., restoring members, expenses, or group settings). It contradicts no annotations.
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 communicates purpose with no redundant words. Every word earns its place, and the tool's core intent is immediately visible.
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 tool with an output schema and useful annotations, the description is nearly complete. It would benefit from a note about what is restored (e.g., all associated data) or any time limits, but nothing essential is missing for basic invocation.
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 does not explicitly explain the group_id parameter. However, the parameter name is self-explanatory, and the description's phrase 'previously deleted group' clarifies that group_id refers to a deleted group to restore. This provides partial compensation but not full parameter-level guidance.
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 ('Restore') and a specific resource ('previously deleted Splitwise group'), making the tool's purpose immediately clear. It also distinguishes itself from siblings like delete_group and undelete_expense by naming the exact resource and state.
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 clearly states when to use the tool: to restore a previously deleted Splitwise group. It does not explicitly discuss when not to use it or name alternatives, but the context is unambiguous enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_expenseADestructive
Update an existing expense's description, amount, split, date, or category.
Changing amount requires also supplying split, so the new total is divided unambiguously; there is no way to change amount alone without this tool guessing how to redistribute it.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | New expense date, if changing it. A value with no timezone is treated as UTC. | |
| split | No | New division of the expense among its participants. | |
| amount | No | New total cost, if changing it. Requires split to also be given. | |
| confirm | No | Skip the confirmation step and apply the change immediately. | |
| expense_id | Yes | Id of the expense to update. | |
| category_id | No | New category id, if changing it. | |
| description | No | New description, if changing it. | |
| category_name | No | Name (or partial name) of the new category. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Splitwise's numeric id for this expense. |
| cost | Yes | Total cost of the expense, in currency_code units. |
| date | Yes | Date and time the expense occurred. |
| splits | No | Per-participant owed and paid shares for this expense. |
| deleted | No | Whether this expense has been soft-deleted in Splitwise. |
| category | No | Category assigned to this expense, if any. |
| group_id | No | Id of the group this expense belongs to, if any. |
| description | Yes | Short human-readable description of the expense. |
| currency_code | Yes | ISO 4217 currency code the cost is denominated in. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, so the mutation risk is covered. The description adds genuinely useful behavioral context: changing the amount requires also supplying split, and the tool will not guess how to redistribute. It does not mention the confirmation step, though the schema documents the 'confirm' parameter, so this is a minor gap rather than a serious omission.
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 sentences, no filler. The first sentence front-loads the tool's purpose and target fields, and the second explains a critical constraint. 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?
Given the rich input schema, 100% parameter coverage, and annotations covering safety, the description is nearly complete. It could explicitly mention the confirmation workflow or the destructive nature of updates, but the schema and annotations already carry that information. For an 8-parameter update tool, this is adequate and slightly above the minimum viable bar.
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 100%, so the description has little burden to explain parameters. It does reinforce the amount-requires-split rule, but that rule already appears in the amount parameter's schema description. No additional parameter-level semantics are provided beyond what the schema already offers.
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 ('Update') and a specific resource ('an existing expense'), and enumerates the mutable fields: description, amount, split, date, or category. This makes it immediately distinguishable from sibling tools like create_expense, delete_expense, get_expense, and list_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 clearly implies the tool is for modifying an existing expense rather than creating, deleting, or viewing one. It does not explicitly name alternatives or state when not to use it, but the context is clear enough for an agent to choose this tool correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoamiARead-onlyIdempotent
Return the profile of the Splitwise account this server is authenticated as.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Splitwise's numeric id for this user. |
| No | User's email address, if visible to the caller. | |
| last_name | No | User's family name, if set. |
| first_name | No | User's given name. |
| picture_url | No | URL of the user's profile photo, if any. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior, so the safety profile is fully covered. The description adds minimal context by clarifying the operation targets the authenticated server account, but it does not disclose additional behavioral details such as authentication failure behavior or response shape.
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, grammatically complete sentence with no filler or redundancy. Every word contributes to understanding the tool's function.
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's low complexity, zero parameters, strong safety annotations, and the presence of an output schema, the description is sufficient for an agent to select and invoke this tool correctly. No additional contextual information is necessary.
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 per the rubric. The description correctly implies no inputs are needed, and there are no parameter semantics left 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 uses a specific verb ('Return') and a clear resource ('the profile of the Splitwise account this server is authenticated as'). This unambiguously distinguishes it from sibling tools that target expenses, groups, or friends.
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 clearly indicates the tool's purpose: retrieving the current authenticated account's profile. While it doesn't explicitly state exclusions or alternatives, none of the sibling tools serve this identity-focused role, so the usage context is clear without needing further 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. Dates show when Glama detected each change.
17 tool updates
v0.1.0- First observed
add_comment - First observed
create_expense - First observed
create_group - First observed
delete_comment - First observed
delete_expense - First observed
delete_group - First observed
get_expense - First observed
get_group - First observed
list_expenses - First observed
list_friends - First observed
list_groups - First observed
manage_group_members - First observed
settle_up - First observed
undelete_expense - First observed
undelete_group - First observed
update_expense - First observed
whoami
TDQS
Scored across 17 tools
Each tool maps to a distinct resource-action pair, so there is no real overlap: expense CRUD, group lifecycle, member management, comments, settlements, and account info are cleanly separated. Even pairs like delete_expense/undelete_expense and delete_group/undelete_group are complementary opposites rather than ambiguous alternatives.
The naming mostly follows a clear verb_noun pattern: list_expenses, get_group, create_expense, update_expense, delete_comment, manage_group_members. Minor deviations like whoami and settle_up are readable and conventional, so the set remains predictable despite not being perfectly uniform.
At 17 tools, this is slightly above the typical 3-15 range, but each tool covers a genuine operation needed for Splitwise workflows. The count feels justified rather than bloated, since expense, group, comment, member, settlement, and account concerns all have dedicated actions.
The expense and group lifecycles are well covered with create, read, list, update, delete, and undelete operations, plus member management, comments, settlements, and friend/account views. Minor gaps exist, such as no update_group and no standalone comment listing, but get_expense exposes the comment thread and the missing operations are not critical dead ends.
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
Manage Splitwise balances, expenses, and groups from your workspace. Fetch friends and recent acti…
- ManiloOAuthapp.manilo
Log, query, and edit expenses, budgets, and accounts in Manilo from any MCP-compatible AI assistant.
Split bills from your AI: read bills & balances, create equal splits, request settlements.
- ManiloOAuthapp.ledgy.api
Log, query, and edit expenses, budgets, and accounts in Manilo (formerly Ledgy) from any MCP-compatible AI assistant.
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
- 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.8626MIT
- FlicenseNot gradedqualityDmaintenanceMCP server for Splitwise. Enables creating and managing expenses, splits, and groups directly from Claude without manual entry.-
- AlicenseNot gradedqualityDmaintenanceEnables natural language management of Splitwise expenses, groups, and friends via the Model Context Protocol, with dual authentication and fuzzy name resolution.11MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/sarathfrancis90/splitwise-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server