MCP server for interacting with the Scryfall MTG API
POFA Tournaments 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 small tennis & pickleball tournaments from your AI assistant: brackets, schedules, results.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user --transport http pofa-tournaments-mcp https://pofa.app/mcp/
# 2 — ask your agent for something these tools do
# search_tournaments, get_tournament, get_schedule and 9 more
POFA Tournaments 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 pofa-tournaments-mcp https://pofa.app/mcp/Reconnect, 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.
12 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.
Find POFA tournaments (tennis & pickleball) by keyword, city, or start date. Returns each event's id, name and one-line summary. Start here whenever the user wants to discover, browse or pick an event; follow with get_tournament for one event's full details. Read-only, no credentials needed.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | no | Keyword matched against the event name |
| city | string | no | City filter, matched against the event's location text |
| date_from | string | no | Only events starting on/after this date (YYYY-MM-DD) |
| limit | integer | no | Max results to return, 1-25 |
Get one tournament's full public details: format, dates, location, entry fee, description and its public share_url. Use after search_tournaments, or whenever you already have an event id, to answer questions about a specific event. For match courts and start times use get_schedule instead. Read-only.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Tournament id, e.g. from search_tournaments |
Get a tournament's published schedule: match court/time assignments, dates and courts, plus the bracket size. Returns schedule: null with a note when the organizer has not published a schedule yet. Use for when/where questions about matches; use get_tournament for the event's own facts (format, fee, location). Read-only.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Tournament id, e.g. from search_tournaments |
Register one player into a tournament (player-side sign-up; no manage code needed). Duplicate-checked by email. TWO STEPS: first call WITHOUT confirm — it returns a summary and writes nothing; show that summary to the user, and only after they explicitly approve, call again with the same fields plus confirm=true to commit.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_id | string | yes | Tournament id to register into |
| name | string | yes | Player full name |
| string | yes | Player email — duplicates are detected by this address | |
| phone | string | no | Optional contact phone |
| division | string | no | Optional division / group label, if the event uses divisions |
| confirm | boolean | no | Set true only after user confirms the summary |
Create a NEW tournament as an organizer — step 1 of the organizer flow: create_tournament → import_players → generate_bracket → schedule_matches → report_result. Takes effect immediately (no preview step). Returns the new tournament's id, share_url and manage_code. SAVE the manage_code and show it to the user: it is the write credential for every organizer tool on this tournament (import_players,
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Tournament name as shown to players |
| format | string | no | single_elimination (default), double_elimination, or round_robin |
| start_date | string | no | First day of the event, YYYY-MM-DD |
| courts | integer | no | Number of courts available |
| entry_fee | string | no | Entry fee as display text, e.g. '$20' or 'Free' |
| location | string | no | Venue / city text shown to players |
| description | string | no | Public event description (max 500 chars) |
Bulk-add players to a tournament's roster (organizer step 2, right after create_tournament; needs that tournament's manage_code). Each player needs a name; email and phone are optional per player, but entries whose email duplicates an existing roster email are skipped. This roster is what generate_bracket seeds from. Returns how many were imported and which rows were skipped, and why.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_id | string | yes | Tournament id |
| code | string | yes | manage_code from create_tournament |
| players | array | yes | Player objects to add: {name (required), email?, phone?}. Max 500 per call |
Generate the bracket for a tournament (organizer step 3, after the roster is in; needs manage_code). SINGLE-ELIMINATION ONLY in this version — tournaments of other formats return an error. PREVIEW FIRST: call without confirm_preview_id to get a preview_id and bracket preview — nothing is written. Show the preview to the user, then call again with {tournament_id, code, confirm_preview_id} to commit
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_id | string | yes | Tournament id |
| code | string | yes | manage_code from create_tournament |
| format | string | no | Only 'single_elimination' is supported |
| players | array | no | Optional list of player names to preview with instead of the current roster |
| confirm_preview_id | string | no | preview_id from the preview call — pass only to commit that exact preview |
Assign the bracket's matches to courts and start times (organizer step 4, after generate_bracket; needs manage_code). PREVIEW FIRST: call without confirm_preview_id — returns a preview_id plus per-match court/time assignments and conflict validation, and nothing is written. Show the preview to the user, then commit with {tournament_id, code, confirm_preview_id}.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_id | string | yes | Tournament id |
| code | string | yes | manage_code from create_tournament |
| courts | integer | no | Number of courts to schedule across |
| start_time | string | no | First match start time, HH:MM, default 09:00 |
| match_minutes | integer | no | Minutes allotted per match |
| confirm_preview_id | string | no | preview_id from the preview call — pass only to commit that exact preview |
Report a match result (organizer step 5, on match day; needs manage_code). Recording a score advances the winner into the next round automatically and returns where they advanced to. Pass undo=true with the match_id to revert a result (cascades to auto-filled downstream slots). Overwriting an existing result is logged as a correction.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_id | string | yes | Tournament id |
| code | string | yes | manage_code from create_tournament |
| match_id | string | yes | e.g. M1 (the player page's label for the match; legacy R1M1-style ids are also accepted) |
| winner | string | no | exact player name as in the bracket (spelling must match) |
| score | string | no | e.g. 6-4 6-3 |
| score_sets | array | no | Optional structured per-set scores, written in parallel with the display string score (the display string keeps its own semantics). Each item is an object {p1: integer, p2: integer, tb?: [integer, i |
| undo | boolean | no | Set true (with match_id; winner/score not needed) to revert that match's result and its downstream effects |
Put ONE match on the venue call screen FOR ITS COURT — every court has its own screen with its own link, and the screen_url this tool returns is that court's link (open one display per court). The court's screen immediately shows the court number huge with both player names, and keeps showing it until cleared; other courts' screens are unaffected. Use on match day when a specific match must be cal
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_id | string | yes | Tournament id |
| code | string | yes | manage_code from create_tournament |
| player_a | string | yes | First player / side name, exactly as it should appear on the big screen |
| player_b | string | yes | Second player / side name, exactly as it should appear on the big screen |
| court | string | yes | Court label as shown, e.g. '3' or 'Center' |
| note | string | no | Optional line shown with the match, e.g. 'Semifinal' or 'Final' |
Take a match off the venue call screen (needs manage_code). With a court, only that court's screen is cleared and the other courts keep showing their matches; without a court, EVERY court's screen is cleared at once. A cleared screen falls back to the console calling queue board, or to the standby face when the queue is empty. Safe to call when nothing is on screen — it simply reports that. Does n
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tournament_id | string | yes | Tournament id |
| code | string | yes | manage_code from create_tournament |
| court | string | no | Optional: clear only this court's screen. Omit to clear every screen at once. |
Read what a tournament's venue call screens are currently showing: every court's on-screen match (screens), plus court_screens — one screen link per court with its live state, so you can hand the organizer all their court-display links in one go — plus a one-line summary of the console calling queue underneath. Use to confirm a screen_show / screen_clear took effect. Read-only, no credentials need
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Tournament id |
- 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 POFA Tournaments 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 | minimal | capability blast radius (minimal) — client exposure if the model is manipulated | −0 |
| 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. minimal is the level these add up to.
| Tool | Capability tags | Why the tag was assigned |
|---|---|---|
| search_tournaments | untrusted-input | untrusted-input: keyword "browse" |
| get_tournament | no tags | |
| get_schedule | no tags | |
| register_player | no tags | |
| create_tournament | no tags | |
| import_players | no tags | |
| generate_bracket | no tags | |
| schedule_matches | no tags | |
| report_result | no tags | |
| screen_show | no tags | |
| screen_clear | no tags | |
| get_screen | no tags |
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.
The public result for this release does not print the flow graph, so there is nothing to show here. That is not the same as "no paths were found": what the scan did read is above, under coverage.
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 1.3.0.
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 POFA Tournaments 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.