Split court costs, settle up and plan fair rotations for pickup games. Free.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Plan fair player rotations for pickup games: who plays on each court every round and who sits out, balancing games played across the roster. Use when more players show up than court spots. Does not split money; for costs use split_costs or split_series.
Number of rounds to schedule, 1-50
Unique roster names, at least capacity x courts of them, e.g. ["Asha","Dev","Mira","Sam","Lee","Kai"]
Players per court: 2 for singles, 4 for doubles, 10 for 5v5 basketball
Number of courts in use at once (default 1)
Plan fair player rotations for pickup games: who plays on each court every round and who sits out, balancing games played across the roster. Use when more players show up than court spots. Does not split money; for costs use split_costs or split_series.
| Argument | Type | Description |
|---|---|---|
| courts | integer | Number of courts in use at once (default 1) |
| rounds* | integer | Number of rounds to schedule, 1-50 |
| players* | array | Unique roster names, at least capacity x courts of them, e.g. ["Asha","Dev","Mira","Sam","Lee","Kai"] |
| capacity* | integer | Players per court: 2 for singles, 4 for doubles, 10 for 5v5 basketball |
{
"type": "object",
"required": [
"players",
"capacity",
"rounds"
],
"properties": {
"courts": {
"type": "integer",
"minimum": 1,
"description": "Number of courts in use at once (default 1)"
},
"rounds": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Number of rounds to schedule, 1-50"
},
"players": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 2,
"description": "Unique roster names, at least capacity x courts of them, e.g. [\"Asha\",\"Dev\",\"Mira\",\"Sam\",\"Lee\",\"Kai\"]"
},
"capacity": {
"type": "integer",
"minimum": 1,
"description": "Players per court: 2 for singles, 4 for doubles, 10 for 5v5 basketball"
}
}
}Given a shared total and who already paid what, compute each player's balance and the minimal set of payments (who pays whom, how much) to settle everyone. Use when the question is 'who owes whom'. For recurring sessions with different attendees use split_series.
| Argument | Type | Description |
|---|---|---|
| shares | array | Optional positive relative weights, one per participant in the same order, e.g. [2,1,1]; omit for an equal split |
| currency | string | Currency code used only for display, e.g. USD, EUR, GBP (default USD) |
| total_cost* | number | Total court/venue cost in currency units, e.g. 96 for $96.00 |
| participants* | array | At least 2 players with unique names; include 'paid' for anyone who already paid, e.g. [{"name":"Asha","paid":96},{"name":"Dev"}] |
{
"type": "object",
"required": [
"total_cost",
"participants"
],
"properties": {
"shares": {
"type": "array",
"items": {
"type": "number",
"exclusiveMinimum": 0
},
"description": "Optional positive relative weights, one per participant in the same order, e.g. [2,1,1]; omit for an equal split"
},
"currency": {
"type": "string",
"description": "Currency code used only for display, e.g. USD, EUR, GBP (default USD)"
},
"total_cost": {
"type": "number",
"description": "Total court/venue cost in currency units, e.g. 96 for $96.00",
"exclusiveMinimum": 0
},
"participants": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Player name, unique within the list, e.g. 'Asha'"
},
"paid": {
"type": "number",
"minimum": 0,
"description": "Amount this player already paid toward the total, in currency units (default 0)"
}
}
},
"minItems": 2,
"description": "At least 2 players with unique names; include 'paid' for anyone who already paid, e.g. [{\"name\":\"Asha\",\"paid\":96},{\"name\":\"Dev\"}]"
}
}
}Split one total court or venue cost across players, equally or by relative weights, and show each player's share plus the fewest payments to settle up. Use for a single booking or event. For recurring sessions with changing attendance use split_series.
| Argument | Type | Description |
|---|---|---|
| shares | array | Optional positive relative weights, one per participant in the same order, e.g. [2,1,1]; omit for an equal split |
| currency | string | Currency code used only for display, e.g. USD, EUR, GBP (default USD) |
| total_cost* | number | Total court/venue cost in currency units, e.g. 96 for $96.00 |
| participants* | array | At least 2 players with unique names; include 'paid' for anyone who already paid, e.g. [{"name":"Asha","paid":96},{"name":"Dev"}] |
{
"type": "object",
"required": [
"total_cost",
"participants"
],
"properties": {
"shares": {
"type": "array",
"items": {
"type": "number",
"exclusiveMinimum": 0
},
"description": "Optional positive relative weights, one per participant in the same order, e.g. [2,1,1]; omit for an equal split"
},
"currency": {
"type": "string",
"description": "Currency code used only for display, e.g. USD, EUR, GBP (default USD)"
},
"total_cost": {
"type": "number",
"description": "Total court/venue cost in currency units, e.g. 96 for $96.00",
"exclusiveMinimum": 0
},
"participants": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Player name, unique within the list, e.g. 'Asha'"
},
"paid": {
"type": "number",
"minimum": 0,
"description": "Amount this player already paid toward the total, in currency units (default 0)"
}
}
},
"minItems": 2,
"description": "At least 2 players with unique names; include 'paid' for anyone who already paid, e.g. [{\"name\":\"Asha\",\"paid\":96},{\"name\":\"Dev\"}]"
}
}
}Split a series of recurring sessions where attendance varies: each session's cost is shared only by that session's attendees, then payments already made are netted into balances and minimal settle-up transfers. Use for weekly games or leagues. For a single event use split_costs.
| Argument | Type | Description |
|---|---|---|
| players | array | Optional full roster, so players who missed every session still appear with a zero balance |
| currency | string | Currency code used only for display, e.g. USD (default USD) |
| payments | array | Optional list of who already paid what across the series, e.g. [{"name":"Asha","paid":120}] |
| sessions* | array | Sessions in order, each with its cost and the names who attended |
{
"type": "object",
"required": [
"sessions"
],
"properties": {
"players": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional full roster, so players who missed every session still appear with a zero balance"
},
"currency": {
"type": "string",
"description": "Currency code used only for display, e.g. USD (default USD)"
},
"payments": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"paid"
],
"properties": {
"name": {
"type": "string",
"description": "Player who paid, e.g. the person who fronted court fees"
},
"paid": {
"type": "number",
"minimum": 0,
"description": "Total amount this player has paid across the series, in currency units"
}
}
},
"description": "Optional list of who already paid what across the series, e.g. [{\"name\":\"Asha\",\"paid\":120}]"
},
"sessions": {
"type": "array",
"items": {
"type": "object",
"required": [
"cost",
"attendees"
],
"properties": {
"cost": {
"type": "number",
"description": "Cost of this session in currency units, e.g. 60",
"exclusiveMinimum": 0
},
"label": {
"type": "string",
"description": "Optional session label, e.g. 'Tue 7pm' (default 'session N')"
},
"attendees": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "Unique names of players present at this session"
}
}
},
"minItems": 1,
"description": "Sessions in order, each with its cost and the names who attended"
}
}
}