Round-robin fixtures, standings and match-day plans for league organizers. 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.
Compute a one-day timetable: lay an ordered list of games onto parallel courts and fixed-length time slots from a start time, giving each game a court and HH:MM start, plus the end time. Use when you already know the day's games. Do NOT use to decide who plays whom (use round_robin_schedule) or to size a whole season (use season_plan).
Games in the order they should be played (non-empty); e.g. one round's fixtures from round_robin_schedule
Number of courts/pitches usable at the same time, integer 1-12, e.g. 2
First game start, 24h HH:MM, e.g. "09:00" or "18:30"
Length of one game slot in minutes, integer 10-180, e.g. 40
Compute a one-day timetable: lay an ordered list of games onto parallel courts and fixed-length time slots from a start time, giving each game a court and HH:MM start, plus the end time. Use when you already know the day's games. Do NOT use to decide who plays whom (use round_robin_schedule) or to size a whole season (use season_plan).
| Argument | Type | Description |
|---|---|---|
| games* | array | Games in the order they should be played (non-empty); e.g. one round's fixtures from round_robin_schedule |
| courts* | integer | Number of courts/pitches usable at the same time, integer 1-12, e.g. 2 |
| start_time* | string | First game start, 24h HH:MM, e.g. "09:00" or "18:30" |
| slot_minutes* | integer | Length of one game slot in minutes, integer 10-180, e.g. 40 |
{
"type": "object",
"required": [
"games",
"courts",
"slot_minutes",
"start_time"
],
"properties": {
"games": {
"type": "array",
"items": {
"type": "object",
"required": [
"home",
"away"
],
"properties": {
"away": {
"type": "string",
"description": "Away team name, e.g. \"Tigers\""
},
"home": {
"type": "string",
"description": "Home team name, e.g. \"Falcons\""
}
}
},
"minItems": 1,
"description": "Games in the order they should be played (non-empty); e.g. one round's fixtures from round_robin_schedule"
},
"courts": {
"type": "integer",
"maximum": 12,
"minimum": 1,
"description": "Number of courts/pitches usable at the same time, integer 1-12, e.g. 2"
},
"start_time": {
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
"description": "First game start, 24h HH:MM, e.g. \"09:00\" or \"18:30\""
},
"slot_minutes": {
"type": "integer",
"maximum": 180,
"minimum": 10,
"description": "Length of one game slot in minutes, integer 10-180, e.g. 40"
}
}
}Compute a round-robin fixture list (circle method) for 2-100 teams: every pair meets once, or twice home-and-away with second_leg; odd counts get one bye per round. Use when you need who plays whom in each round. Do NOT use to assign times/courts for one match day (use match_day_plan) or to get calendar dates for a season (use season_plan).
| Argument | Type | Description |
|---|---|---|
| teams* | array | Team names: 2-100 unique, non-empty names (trimmed), e.g. ["Falcons", "Tigers", "Bears"] |
| rounds | integer | Optional: return only the first N rounds, integer 1..max (max = teams-1 for even counts, teams for odd; doubled with second_leg). Default: all rounds |
| second_leg | boolean | If true, append a mirrored second leg with home and away swapped (double round-robin). Default false |
{
"type": "object",
"required": [
"teams"
],
"properties": {
"teams": {
"type": "array",
"items": {
"type": "string",
"description": "Team name, e.g. \"Falcons\""
},
"maxItems": 100,
"minItems": 2,
"description": "Team names: 2-100 unique, non-empty names (trimmed), e.g. [\"Falcons\", \"Tigers\", \"Bears\"]"
},
"rounds": {
"type": "integer",
"minimum": 1,
"description": "Optional: return only the first N rounds, integer 1..max (max = teams-1 for even counts, teams for odd; doubled with second_leg). Default: all rounds"
},
"second_leg": {
"type": "boolean",
"description": "If true, append a mirrored second leg with home and away swapped (double round-robin). Default false"
}
}
}Estimate a season's size and calendar: total round-robin fixtures, games per match day (limited by courts, one slot per day), match days needed, every match-day date from start_date at a fixed interval, and the finish date. Use for "when will the season end?". Do NOT use for pairings (use round_robin_schedule) or one day's timetable (use match_day_plan).
| Argument | Type | Description |
|---|---|---|
| teams* | array | Team names: 2-100 unique, non-empty names (trimmed), e.g. ["Falcons", "Tigers", "Bears"] |
| courts* | integer | Courts usable at the same time on each match day, integer 1-12; caps games per match day. E.g. 2 |
| second_leg | boolean | If true, plan a double round-robin (each pair meets twice). Default false |
| start_date* | string | First match day, YYYY-MM-DD, e.g. "2026-10-04" |
| slot_minutes* | integer | Length of one game slot in minutes, integer 10-180 (validated and echoed in the note; each match day is one slot). E.g. 30 |
| days_between_rounds | integer | Days between consecutive match days, integer 1-60. Default 7 (weekly) |
Compute a league standings table from match results: played, W/D/L, goals for/against, goal difference and points, sorted by points, then goal difference, then goals for, then name. Use when you have scores and want the current table. Do NOT use to generate future fixtures (use round_robin_schedule).
| Argument | Type | Description |
|---|---|---|
| teams | array | Optional full roster (2+ unique names). Teams with no results appear with zeros; results involving teams not listed are skipped with a warning |
| results* | array | Completed match results in any order; may be empty if teams is given (zeroed table) |
| points_win | number | Points awarded for a win, non-negative number. Default 3 |
| points_draw | number | Points awarded for a draw, non-negative number. Default 1 |
{
"type": "object",
"required": [
"results"
],
"properties": {
"teams": {
"type": "array",
"items": {
"type": "string",
"description": "Team name"
},
"minItems": 2,
"description": "Optional full roster (2+ unique names). Teams with no results appear with zeros; results involving teams not listed are skipped with a warning"
},
"results": {
"type": "array",
"items": {
"type": "object",
"required": [
"home",
"away",
"home_score",
"away_score"
],
"properties": {
"away": {
"type": "string",
"description": "Away team name (must differ from home), e.g. \"Tigers\""
},
"home": {
"type": "string",
"description": "Home team name, e.g. \"Falcons\""
},
"away_score": {
"type": "integer",
"minimum": 0,
"description": "Away team score, non-negative integer, e.g. 1"
},
"home_score": {
"type": "integer",
"minimum": 0,
"description": "Home team score, non-negative integer, e.g. 3"
}
}
},
"description": "Completed match results in any order; may be empty if teams is given (zeroed table)"
},
"points_win": {
"type": "number",
"minimum": 0,
"description": "Points awarded for a win, non-negative number. Default 3"
},
"points_draw": {
"type": "number",
"minimum": 0,
"description": "Points awarded for a draw, non-negative number. Default 1"
}
}
}{
"type": "object",
"required": [
"teams",
"courts",
"slot_minutes",
"start_date"
],
"properties": {
"teams": {
"type": "array",
"items": {
"type": "string",
"description": "Team name, e.g. \"Falcons\""
},
"maxItems": 100,
"minItems": 2,
"description": "Team names: 2-100 unique, non-empty names (trimmed), e.g. [\"Falcons\", \"Tigers\", \"Bears\"]"
},
"courts": {
"type": "integer",
"maximum": 12,
"minimum": 1,
"description": "Courts usable at the same time on each match day, integer 1-12; caps games per match day. E.g. 2"
},
"second_leg": {
"type": "boolean",
"description": "If true, plan a double round-robin (each pair meets twice). Default false"
},
"start_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "First match day, YYYY-MM-DD, e.g. \"2026-10-04\""
},
"slot_minutes": {
"type": "integer",
"maximum": 180,
"minimum": 10,
"description": "Length of one game slot in minutes, integer 10-180 (validated and echoed in the note; each match day is one slot). E.g. 30"
},
"days_between_rounds": {
"type": "integer",
"maximum": 60,
"minimum": 1,
"description": "Days between consecutive match days, integer 1-60. Default 7 (weekly)"
}
}
}