app. turnale/ turnale
by turnale.app · remote · no sign-in to list tools · v0.1.2 · published by app.turnale
Run racket-sport tournaments from your AI assistant: fair draws, scores, live standings.
30 tools: 4 can delete or cancel things, 2 do something that can't be undone, 12 change things and 12 only read.
Scanned Oct 21, 2026
- Deletes or cancels4Claude Code: deny: see these tools
- Can't be undone2Claude Code: ask: see these tools
- Changes things12Claude Code: ask: see these tools
- Only reads12Claude Code: allow: see these tools
1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http turnale https://mcp.turnale.appFindings
Matches of fixed checks, with the text they matched.
- Warnremove_player
The server marks "remove_player" not destructive (destructiveHint: false), and its own name, description or input give the class "destructive".
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}; The name "remove_player" says "remove": a word for removing or ending something.
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
30 tools
Deletes or cancels 4Claude Code: deny
delete_tournamentSoft-delete the whole tournament (recoverable by support for 7 days, then gone).No findings
Why it is in this group
- The name "delete_tournament" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Soft-delete the whole tournament (recoverable by support for 7 days, then gone). Preview first; confirm: true to apply.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- openWorldHint: false
generate_drawGenerate (or regenerate) the draw and schedule.No findings
Why it is in this group
- The name "generate_draw" says "generate": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Generate (or regenerate) the draw and schedule. This IS the start action: the first draw moves the tournament from setup to active and closes self-signup — when the organiser says "start the tournament", call this. The result includes rounds_text — SHOW it to the organiser as-is, in whatever language they are writing to you in (it is English already, so relay it unchanged unless they are writing something else) so they can check who plays whom — and the seed that produced the draw: preview first, then confirm with that SAME seed to apply exactly the previewed draw. Free until the first result is recorded; after that this DISCARDS recorded results and requires BOTH confirm: true and discard_results: true. If the organiser asks for a format that is not supported, offer to note it with record_feedback. Optional overrides adjust the format first.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- openWorldHint: false
remove_playerRemove one or MANY players before any result is recorded (afterwards use withdraw_player or replace_player) — pass player_names to clear several in one call, never loop one-by-one.1 finding
Why it is in this group
- The name "remove_player" says "remove": a word for removing or ending something.
- The server marks it not destructive (destructiveHint: false), but an annotation never lowers a class.
Findings
- Warn
The server marks "remove_player" not destructive (destructiveHint: false), and its own name, description or input give the class "destructive".
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}; The name "remove_player" says "remove": a word for removing or ending something.
Description, as the server wrote it Remove one or MANY players before any result is recorded (afterwards use withdraw_player or replace_player) — pass player_names to clear several in one call, never loop one-by-one. Regenerates an existing unlocked draw.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
undo_last_changeRoll the tournament back.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Roll the tournament back. Without to_change_id: restore exactly how it was before the most recent change (tool call or courtside page entry). With to_change_id (an id from get_audit_log): restore to just before that change — it and every later change are discarded in one step, so a burst of unwanted calls unwinds with a single revert. Preview lists exactly what would be discarded; confirm: true applies. To apply exactly what a preview showed, confirm with to_change_id set to the first id in its discarded list — anything that landed in between (a courtside entry) is then listed as discarded instead of silently changing the target. A follow-up plain undo restores what the previous undo discarded.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- openWorldHint: false
Can't be undone 2Claude Code: ask
create_tournamentCreate a new tournament.No findings
Why it is in this group
- The name "create_tournament" says "create": a word for a change.
- The description says "cannot be recovered".
Description, as the server wrote it Create a new tournament. Keep setup SHORT: ask the organiser only for sport, players, court count and start time — sensible defaults cover everything else. FORMAT: never ask an open 'which format?' question. If the organiser clearly named one, pass it; otherwise omit format — the call then returns a ready-to-show menu of options (nothing is created) for you to relay so the organiser can read and choose in one reply. Players can be added later with add_players. NEVER invent placeholder or fake player names ('Player 1', made-up names): if the organiser only knows the headcount, create with signup_open: true and signup_cap set to it — players add themselves by name via the page link. If the organiser gives a time budget instead of rounds (e.g. 'we have 2 hours'), derive rounds ≈ total minutes ÷ (match + break minutes) and confirm. If they ask for a format that is not listed, offer to note it with record_feedback. Returns the organiser key (tk_…): relay it with the warning that it cannot be recovered, plus the shareable page link.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
withdraw_playerWithdraw a player (or their pair) mid-tournament.No findings
Why it is in this group
- The name "withdraw_player" says "withdraw": a word that usually means money moves, which cannot be taken back.
Description, as the server wrote it Withdraw a player (or their pair) mid-tournament. Remaining matches become walkovers for the opponents; americano regenerates its future rounds instead, mexicano cancels their unplayed match and pairs the next round from the standings without them. Preview first, confirm to apply.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
Changes things 12Claude Code: ask
add_playersAdd players to the roster in bulk (parse pasted lists or spreadsheets yourself and send structured entries — never invent placeholder names; use signup mode when names aren't known…No findings
Why it is in this group
- The name "add_players" says "add": a word for a change.
Description, as the server wrote it Add players to the roster in bulk (parse pasted lists or spreadsheets yourself and send structured entries — never invent placeholder names; use signup mode when names aren't known yet). Duplicate names are rejected for disambiguation. If an unlocked draw exists it is regenerated automatically. Americano/mexicano take late arrivals even after results exist: americano rebuilds the rounds nobody has started, mexicano pairs them into the next round.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
end_tournamentFinish the tournament.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
Description, as the server wrote it Finish the tournament. If matches are still pending it ends early and current standings freeze as the final results. Preview first, confirm to apply.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
promote_playerMove a waitlisted player onto the active roster when a spot opens (signed-in players are notified by email).No findings
Why it is in this group
- The description's first verb is "move": a word for a change.
Description, as the server wrote it Move a waitlisted player onto the active roster when a spot opens (signed-in players are notified by email). The cap can be raised with update_settings. Once results exist only americano/mexicano can take them — the unstarted rounds follow the roster.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: true
record_feedbackRecord a request for something Turnale does not support yet (a format, scoring variant, or feature), so it can be considered for the roadmap.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
Description, as the server wrote it Record a request for something Turnale does not support yet (a format, scoring variant, or feature), so it can be considered for the roadmap. Call this only when the organiser asked for something unsupported AND agreed to have it noted. Describe the missing capability in general terms — NEVER include player names, contact details, or tournament keys.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
record_resultsRecord one or many results.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
Description, as the server wrote it Record one or many results. Score is conversational text: "6-4 3-6 10-7" (sets) or "16-8" (americano points). Outcomes: completed (default), walkover, retired (partial score allowed), cancelled, reinstate — reinstate CLEARS a recorded result and returns the match to scheduled (the fix for a mis-entered score). Corrections simply re-record. Winner (a|b = first|second listed side) only needed when the score alone does not decide.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
replace_playerA substitute takes over a player's spot.No findings
Why it is in this group
- The name "replace_player" says "replace": a word for a change.
Description, as the server wrote it A substitute takes over a player's spot. During play: slot takeover — completed results stay, the change is shown ("Anna, for Kristjan from R3"). Before the first result: choose mode slot_swap (default) or regenerate (re-pair and redraw using levels). Unknown substitute names are added to the roster automatically.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
rescheduleShift the start time, add a delay, or move one match to a specific court/slot.No findings
Why it is in this group
- The name "reschedule" says "reschedule": a word for a change.
Description, as the server wrote it Shift the start time, add a delay, or move one match to a specific court/slot. Played matches never move.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
set_pairsFix the doubles pairs: pass explicit pairs by name, or auto-pair (random or level-balanced).No findings
Why it is in this group
- The name "set_pairs" says "set": a word for a change.
Description, as the server wrote it Fix the doubles pairs: pass explicit pairs by name, or auto-pair (random or level-balanced). Only before results exist. Regenerates an existing unlocked draw.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
suggest_formatRecommend tournament formats in plain language, with the round/time math done by the engine.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it Recommend tournament formats in plain language, with the round/time math done by the engine. Call this FIRST when the organiser has not named a format, names one hesitantly, or comes from a background where americano/mexicano need explaining — then relay the `menu` text as-is instead of asking an open 'which format?' question. SINGLES OR DOUBLES IS A PREREQUISITE: omit `discipline` and this returns the question to put to the organiser rather than a menu, because it decides which formats exist at all (americano and mexicano are doubles). Never infer it from the sport. Needs no key.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
swap_partnersExchange two players' places.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
Description, as the server wrote it Exchange two players' places. Fixed-pair doubles: swaps partners between two pairs permanently (name one player from each pair). Americano/mexicano: pass `round` to swap two players' places in ONE unplayed round — the courtside patch for a late arrival, an injury, or two friends who want a game together. One of them may be sitting that round, which is how you put a late arrival on court. Preview first, confirm to apply: the preview names any partnership or meeting the swap would repeat. Results already played never move.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
update_playerRename a player or set their gender/level/note.No findings
Why it is in this group
- The name "update_player" says "update": a word for a change.
Description, as the server wrote it Rename a player or set their gender/level/note. Updates MANY in one call: pass `updates` with one object per player and never loop one-by-one — setting levels for a whole roster used to be one call per player, which on a phone meant approving each one and left the roster half-updated when some were mis-tapped. The whole batch applies or none of it does.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
update_settingsChange the tournament name, start time, match duration, break/changeover minutes, courts (count or names), house rules, or courtside score entry from the page.No findings
Why it is in this group
- The name "update_settings" says "update": a word for a change.
Description, as the server wrote it Change the tournament name, start time, match duration, break/changeover minutes, courts (count or names), house rules, or courtside score entry from the page. Court changes recompute the remaining schedule; played matches never move.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
Only reads 12Claude Code: allow
get_audit_logChronological record of every change (newest first) — the answer to "who changed that?".No findings
Why it is in this group
- The name "get_audit_log" says "get": a word for reading.
Description, as the server wrote it Chronological record of every change (newest first) — the answer to "who changed that?". Paginate with before_id. Ids are global across all tournaments, so gaps between ids are normal.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
get_briefingCompact full state of the tournament — settings, roster, progress, next matches, standings, page link.No findings
Why it is in this group
- The name "get_briefing" says "get": a word for reading.
Description, as the server wrote it Compact full state of the tournament — settings, roster, progress, next matches, standings, page link. Call this first when resuming work in a new conversation with just the key.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
get_exportFull structured export of the tournament document (players, draws, results) — for the organiser's own records or data portability.No findings
Why it is in this group
- The name "get_export" says "get": a word for reading.
Description, as the server wrote it Full structured export of the tournament document (players, draws, results) — for the organiser's own records or data portability.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
get_pdfThe printable PDF itself, returned as a base64 embedded resource — use this when the organiser wants the file handed to them and your client cannot fetch URLs.No findings
Why it is in this group
- The name "get_pdf" says "get": a word for reading.
Description, as the server wrote it The printable PDF itself, returned as a base64 embedded resource — use this when the organiser wants the file handed to them and your client cannot fetch URLs. Default "sheet": the merged tournament document (match sheet with write-in score boxes, player sheet, standings/results when they exist). "results" and "plan" are deprecated pre-merge variants kept for comparison. For a lighter response, get_pdf_link returns download URLs instead.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
get_pdf_linkDownload links for the printable PDF.No findings
Why it is in this group
- The name "get_pdf_link" says "get": a word for reading.
Description, as the server wrote it Download links for the printable PDF. pdf_url is the merged tournament document (match sheet with write-in score boxes, player sheet, standings/results when they exist) — hand this to the organiser. results_pdf_url and plan_pdf_url are deprecated pre-merge variants kept for comparison.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
get_player_templateA blank Excel workbook the organiser fills in and hands back: Name, Level, Gender, Comments, one player per row, with a sheet explaining each column.No findings
Why it is in this group
- The name "get_player_template" says "get": a word for reading.
Description, as the server wrote it A blank Excel workbook the organiser fills in and hands back: Name, Level, Gender, Comments, one player per row, with a sheet explaining each column. Offer it when the organiser has no list ready, asks how to send their players, or would rather work in a spreadsheet than paste names into chat. Needs no key. The file comes back both as a download link and as an attachable file. Reading a filled-in sheet needs no tool: parse it yourself and send the rows to add_players.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
get_resultsFinal placements (or placements-so-far for a tournament that ended early).No findings
Why it is in this group
- The name "get_results" says "get": a word for reading.
Description, as the server wrote it Final placements (or placements-so-far for a tournament that ended early).
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
get_scheduleUpcoming matches in playing order with courts and estimated times.No findings
Why it is in this group
- The name "get_schedule" says "get": a word for reading.
Description, as the server wrote it Upcoming matches in playing order with courts and estimated times.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
get_standingsCurrent standings per group/structure, tiebreak-ordered (wins → head-to-head → set diff → game diff; americano: total points).No findings
Why it is in this group
- The name "get_standings" says "get": a word for reading.
Description, as the server wrote it Current standings per group/structure, tiebreak-ordered (wins → head-to-head → set diff → game diff; americano: total points).
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
list_matchesMatches with sides, scores, courts and times.No findings
Why it is in this group
- The name "list_matches" says "list": a word for reading.
Description, as the server wrote it Matches with sides, scores, courts and times. Filter by state or round; paginate with after_match_number for large tournaments.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
list_playersFull roster with status, level, and doubles partner.No findings
Why it is in this group
- The name "list_players" says "list": a word for reading.
Description, as the server wrote it Full roster with status, level, and doubles partner.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
pingHealth check.No findings
Why it is in this group
- The name "ping" says "ping": a word for reading.
Description, as the server wrote it Health check. Returns a static confirmation that the Turnale MCP server is reachable.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 0.1.2. Values in angle brackets are yours to fill in.
claude mcp add --transport http turnale https://mcp.turnale.appRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__turnale__ping",
"mcp__turnale__get_briefing",
"mcp__turnale__list_players",
"mcp__turnale__list_matches",
"mcp__turnale__get_schedule",
"mcp__turnale__get_standings",
"mcp__turnale__get_results",
"mcp__turnale__get_audit_log",
"mcp__turnale__get_export",
"mcp__turnale__get_pdf_link",
"mcp__turnale__get_pdf",
"mcp__turnale__get_player_template"
],
"ask": [
"mcp__turnale__create_tournament",
"mcp__turnale__add_players",
"mcp__turnale__update_player",
"mcp__turnale__set_pairs",
"mcp__turnale__update_settings",
"mcp__turnale__promote_player",
"mcp__turnale__record_results",
"mcp__turnale__replace_player",
"mcp__turnale__withdraw_player",
"mcp__turnale__swap_partners",
"mcp__turnale__reschedule",
"mcp__turnale__end_tournament",
"mcp__turnale__record_feedback",
"mcp__turnale__suggest_format"
],
"deny": [
"mcp__turnale__remove_player",
"mcp__turnale__generate_draw",
"mcp__turnale__undo_last_change",
"mcp__turnale__delete_tournament"
]
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as turnale. Review it before you use it.