MCP server for interacting with the Scryfall MTG API
Turnale is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
Run racket-sport tournaments from your AI assistant: fair draws, scores, live standings.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user --transport http turnale-mcp https://mcp.turnale.app
# 2 — ask your agent for something these tools do
# ping, create_tournament, add_players and 27 more
Turnale costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. Nothing here runs on your machine and nothing runs on ours: this server answers at its publisher’s own address, and what you install is the connection straight to it.
This is a public server: it answers at its publisher’s own address and this marketplace is not in the path. Claude Code registers it in one command; --scope user makes it available in every project. The transport below is http, as the publisher's own manifest declares it.
claude mcp add --scope user --transport http turnale-mcp https://mcp.turnale.appReconnect, or start a new session, and the tools appear in the model’s tool list.
One config entry pointing straight at the publisher’s own address — this marketplace is not in the path, and nothing from this listing executes on your machine.
30 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
Health check. Returns a static confirmation that the Turnale MCP server is reachable.
No parameter schema on file.
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 c
| Parameter | Type | Required | Notes |
|---|---|---|---|
| sport | string | yes | Write sport names to the organiser in words — 'table tennis', never the enum spelling 'table_tennis'. |
| format | string | no | Tournament format. round_robin: everyone plays everyone. groups_playoff: round-robin groups then a knockout. single_elimination: knockout with byes. americano/mexicano: rotating-partner doubles, point |
| name | string | no | Defaults to '<Sport> tournament 14 Aug 2026 (<location>)' — start date (or today) plus the location when known |
| discipline | string | no | Ask the organiser — never infer it from the sport. Americano/mexicano are always doubles. Defaults to singles for the bracket formats when they truly have no preference. |
| players | array | no | — |
| pairs | array | no | Doubles: fixed pairs as [name, name] arrays. Omit to auto-pair. |
| courts | integer | no | Default 2 |
| court_names | array | no | — |
| start_time | string | no | ISO datetime with offset, e.g. 2026-08-01T18:00:00+03:00. Must be within 365 days from today. |
| match_duration_minutes | integer | no | — |
| break_minutes | integer | no | Changeover between matches/rounds, shown separately from play time (default 0) |
| page_results_entry | boolean | no | Allow anyone with the page link to enter scores courtside. Default TRUE — recreational tournaments run on whoever finishes their match first, and an organiser who has to type every result is the bottl |
| language | string | no | Language of the tournament page, PDFs and player emails (ISO 639-1). Default en; set it to the language the organiser is writing in when it is in this list. |
| seeding | string | no | Default random |
| group_count | integer | no | — |
| advance_per_group | integer | no | — |
| third_place_match | boolean | no | Single elimination; default true |
| points_per_match | integer | no | Americano/mexicano; default 21 |
| rounds | integer | no | Americano/mexicano; default from player count |
| location | string | no | Venue/location shown to players on the page, e.g. club name + city |
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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_key | string | yes | The tournament's organiser key (starts with tk_) |
| players | array | yes | — |
| request_id | string | no | Optional idempotency id — retrying a call with the same id never applies it twice |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_key | string | yes | The tournament's organiser key (starts with tk_) |
| player_name | string | no | Single update; or use updates for several |
| new_name | string | no | — |
| gender | string | no | — |
| level | number | no | Any consistent numeric level/rating — used only for seeding and balancing |
| note | string | no | Free note shown on the tournament page. Pass an empty string to clear it. |
| updates | array | no | Bulk edit — e.g. levels for a whole roster in one call |
| request_id | string | no | Optional idempotency id — retrying a call with the same id never applies it twice |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_key | string | yes | The tournament's organiser key (starts with tk_) |
| player_name | string | no | — |
| player_names | array | no | Bulk removal — e.g. clearing mistaken placeholder names in one call |
| request_id | string | no | Optional idempotency id — retrying a call with the same id never applies it twice |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_key | string | yes | The tournament's organiser key (starts with tk_) |
| pairs | array | no | Fixed pairs as [name, name] arrays |
| auto | string | no | — |
| request_id | string | no | Optional idempotency id — retrying a call with the same id never applies it twice |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_key | string | yes | The tournament's organiser key (starts with tk_) |
| name | string | no | — |
| start_time | string | no | ISO datetime with offset. Must be within 365 days from today. |
| match_duration_minutes | integer | no | — |
| break_minutes | integer | no | Changeover between matches/rounds, shown separately from play time |
| courts | integer | no | — |
| court_names | array | no | — |
| house_rules | array | no | — |
| location | string | no | Venue/location shown to players; pass an empty string to clear it |
| page_results_entry | boolean | no | Allow anyone with the page link to enter scores courtside. ON for new tournaments — pass false when the organiser wants to be the only one recording results, true to hand it back to the players. |
| signup_open | boolean | no | Open or close self-signup on the page |
| signup_cap | integer | no | — |
| language | string | no | Page/PDF/email language, ISO 639-1 (default en) |
| level_scale | string | no | How to read the numbers in level. absolute (default): one shared scale, a 3 is a 3 whoever holds it. by_group: men and women were each rated within their own group, so the numbers are not directly c |
| level_offset | number | no | by_group only: how much stronger an m is than an f carrying the SAME number, in the organiser's own level units. Default 1 — a starting point to adjust, not a fact. Used for balancing only; never show |
| gender_balance | string | no | Americano/mexicano: prefer matches where both teams have the same make-up (MM v MM, MW v MW, WW v WW). Default prefer_symmetric. A preference, not a rule — an uneven field cannot supply it, and the dr |
| level_gap_cap | number | no | Opt-in: the largest level gap the organiser wants between opponents, in their own level units. Soft — the draw prefers to respect it and reports when it cannot. Pass 0 to clear. |
| request_id | string | no | Optional idempotency id — retrying a call with the same id never applies it twice |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_key | string | yes | The tournament's organiser key (starts with tk_) |
| name | string | yes | — |
| request_id | string | no | Optional idempotency id — retrying a call with the same id never applies it twice |
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 s
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_key | string | yes | The tournament's organiser key (starts with tk_) |
| seeding | string | no | — |
| group_count | integer | no | — |
| advance_per_group | integer | no | — |
| third_place_match | boolean | no | — |
| points_per_match | integer | no | — |
| rounds | integer | no | — |
| discard_results | boolean | no | Required (true) when results already exist — separate acknowledgement that this redraw destroys them |
| seed | integer | no | Draw seed returned by the preview — pass it back with confirm: true to apply exactly the previewed draw. Omit for a fresh draw. |
| request_id | string | no | Optional idempotency id — retrying a call with the same id never applies it twice |
| confirm | boolean | no | Omit or false: return a preview of what would change. True: apply 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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_key | string | yes | The tournament's organiser key (starts with tk_) |
Full roster with status, level, and doubles partner.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_key | string | yes | The tournament's organiser key (starts with tk_) |
Matches with sides, scores, courts and times. Filter by state or round; paginate with after_match_number for large tournaments.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_key | string | yes | The tournament's organiser key (starts with tk_) |
| state | string | no | — |
| round | integer | no | — |
| after_match_number | integer | no | — |
| limit | integer | no | — |
Upcoming matches in playing order with courts and estimated times.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_key | string | yes | The tournament's organiser key (starts with tk_) |
| limit | integer | no | — |
Current standings per group/structure, tiebreak-ordered (wins → head-to-head → set diff → game diff; americano: total points).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_key | string | yes | The tournament's organiser key (starts with tk_) |
Final placements (or placements-so-far for a tournament that ended early).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_key | string | yes | The tournament's organiser key (starts with tk_) |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_key | string | yes | The tournament's organiser key (starts with tk_) |
| limit | integer | no | — |
| before_id | integer | no | — |
Full structured export of the tournament document (players, draws, results) — for the organiser's own records or data portability.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_key | string | yes | The tournament's organiser key (starts with tk_) |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_key | string | yes | The tournament's organiser key (starts with tk_) |
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, ge
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_key | string | yes | The tournament's organiser key (starts with tk_) |
| doc | string | no | — |
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 t
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_key | string | yes | The tournament's organiser key (starts with tk_) |
| results | array | yes | — |
| request_id | string | no | Optional idempotency id — retrying a call with the same id never applies it twice |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_key | string | yes | The tournament's organiser key (starts with tk_) |
| out_player_name | string | yes | — |
| in_player | object | yes | — |
| mode | string | no | — |
| request_id | string | no | Optional idempotency id — retrying a call with the same id never applies it twice |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_key | string | yes | The tournament's organiser key (starts with tk_) |
| player_name | string | yes | — |
| request_id | string | no | Optional idempotency id — retrying a call with the same id never applies it twice |
| confirm | boolean | no | Omit or false: return a preview of what would change. True: apply 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 f
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_key | string | yes | The tournament's organiser key (starts with tk_) |
| player_a | string | yes | — |
| player_b | string | yes | — |
| round | integer | no | Americano/mexicano only: which round to patch. Omit to swap the next unplayed round. |
| request_id | string | no | Optional idempotency id — retrying a call with the same id never applies it twice |
| confirm | boolean | no | Omit or false: return a preview of what would change. True: apply it. |
Shift the start time, add a delay, or move one match to a specific court/slot. Played matches never move.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_key | string | yes | The tournament's organiser key (starts with tk_) |
| start_time | string | no | New start: ISO datetime WITH offset (e.g. 2026-08-01T18:00:00+03:00), within 365 days. |
| delay_minutes | integer | no | — |
| move_match | object | no | — |
| request_id | string | no | Optional idempotency id — retrying a call with the same id never applies it twice |
Finish the tournament. If matches are still pending it ends early and current standings freeze as the final results. Preview first, confirm to apply.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_key | string | yes | The tournament's organiser key (starts with tk_) |
| request_id | string | no | Optional idempotency id — retrying a call with the same id never applies it twice |
| confirm | boolean | no | Omit or false: return a preview of what would change. True: apply 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 ap
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_key | string | yes | The tournament's organiser key (starts with tk_) |
| to_change_id | integer | no | A change id from get_audit_log — restore to just before this change, discarding it and everything after it. Omit to undo only the latest change. |
| request_id | string | no | Optional idempotency id — retrying a call with the same id never applies it twice |
| confirm | boolean | no | Omit or false: return a preview of what would change. True: apply it. |
Soft-delete the whole tournament (recoverable by support for 7 days, then gone). Preview first; confirm: true to apply.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_key | string | yes | — |
| confirm | boolean | no | — |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| category | string | yes | — |
| feedback | string | yes | What the organiser wanted, summarised without any personal data (max 1000 characters — room for the problem, the workaround tried, and the suggested scope) |
| related_tool | string | no | The tool this relates to, if any |
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 return
| Parameter | Type | Required | Notes |
|---|---|---|---|
| players_estimate | integer | yes | — |
| discipline | string | no | Ask the organiser before offering formats; never infer it from the sport. 'unknown' = you asked and they don't mind, which shows both kinds. OMIT to get the question itself back. |
| courts | integer | no | Default 2 |
| total_minutes | integer | no | The time budget, e.g. 120 for a two-hour evening |
| match_minutes | integer | no | — |
| vibe | string | no | Social: everyone mixes and plays a lot. Competitive: a bracket and a winner. |
| fixed_partners | boolean | no | Doubles only: do pairs stay together all evening? |
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
No parameter schema on file.
- Every tool — any call limit is its publisher’s, not ours
- No card, and mcprush charges nothing for it
- Runs at its publisher’s own address — this marketplace is not in the path
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install Turnale or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
| Term | Level | What it prices | Points |
|---|---|---|---|
| capability-exposure | moderate | capability blast radius (moderate) — client exposure if the model is manipulated | −3 |
| coverage-honesty | manifest | inspection depth (manifest) — how much of the target the scan could see | −4 |
What the scan could actually read
A grade is only as meaningful as its coverage, so the scanner publishes its own depth before it publishes its result.
The scan read each tool’s name, description, input schema and annotations exactly as the server listed them the last time it answered us; no code was reviewed. We ask the server again about once a month, and a list that changed is graded again.
The implementation source was not read — this reflects the declared tool metadata only.
Capability — what it could do if the model were manipulated
Tags derived from each tool’s schema and the implementation, not from what the tool calls itself. moderate is the level these add up to.
| Tool | Capability tags | Why the tag was assigned |
|---|---|---|
| ping | no tags | |
| create_tournament | state-write | state-write: declares readOnlyHint: false |
| add_players | state-write | state-write: declares readOnlyHint: false |
| update_player | state-write | state-write: declares readOnlyHint: false |
| remove_player | state-write | state-write: declares readOnlyHint: false |
| set_pairs | state-write | state-write: declares readOnlyHint: false |
| update_settings | state-write | state-write: declares readOnlyHint: false |
| promote_player | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| generate_draw | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| get_briefing | no tags | |
| list_players | no tags | |
| list_matches | no tags | |
| get_schedule | no tags | |
| get_standings | no tags | |
| get_results | no tags | |
| get_audit_log | no tags | |
| get_export | no tags | |
| get_pdf_link | untrusted-input | untrusted-input: keyword "download" |
| get_pdf | untrusted-input | untrusted-input: keyword "download" |
| record_results | state-write | state-write: declares readOnlyHint: false |
| replace_player | state-write | state-write: declares readOnlyHint: false |
| withdraw_player | state-write | state-write: declares readOnlyHint: false |
| swap_partners | state-write | state-write: declares readOnlyHint: false |
| reschedule | state-write | state-write: declares readOnlyHint: false |
| end_tournament | state-write | state-write: declares readOnlyHint: false |
| undo_last_change | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| delete_tournament | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| record_feedback | state-write | state-write: declares readOnlyHint: false |
| suggest_format | no tags | |
| get_player_template | untrusted-input | untrusted-input: keyword "download" |
Toxic-flow graph
The lethal trifecta, checked as a graph rather than as a checklist: untrusted input, a sensitive source and an external sink have to meet before there is a path worth worrying about.
Supply chain and provenance
This is the first scan of this surface here, so there is nothing yet to compare it against.
Every result on this tab comes from one deterministic pass over the published package — offline, rule by rule, and auditable line by line above. Same methodology version, same bytes, same score.
Release history
This is an address its publisher runs: which release it serves is theirs to choose, so there is nothing here to pin. The history below is for reading; the current release on file is 0.1.2.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Turnale can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.