Magic: The Gathering deck management and card lookup servers with Scryfall integration
This server has moderate structural gaps. Tool names follow verb_noun conventions well (upload_deck, draw_card, play_card, etc.), which is a strong point. However, descriptions are inconsistent in quality: some are adequate (upload_deck, draw_card) but many are minimal (view_hand, view_deck_stats, reset_game lack detail on use cases, state modification, and return structure). Parameter descriptions are present but often terse. Critically, NO OUTPUT SCHEMAS are documented anywhere in the source, the code returns string responses but does not declare what structure consumers should expect. Error handling is minimal (basic string returns with no guidance on recovery). Parameter validation is weak: numeric parameters like count and page lack min/max bounds. The sideboard_swap logic has a variable naming bug (main_card_idx used inconsistently), suggesting quality issues. No input validation on card names or deck format beyond basic parsing. For a game state server, the lack of structured output and error taxonomy is a significant liability.
Draw cards from your deck to your hand. Args: count: Number of cards to draw (default: 1)
Get a specific card by name. Args: name: The name of the card to search for fuzzy: Whether to use fuzzy name matching (default: True)
Get a random Magic card, optionally filtered by a query. Args: query: Optional query to filter the random selection
Perform a mulligan, shuffling your hand into your deck and drawing a new hand. Args: new_hand_size: Number of cards to draw for new hand (default: same as current hand)
Play a card from your hand to the battlefield/stack. Args: card_name: Name of the card to play
Reset the game state completely.
No output schemas documented. Tools return string responses, but LLMs have no way to know what fields or structure to expect. This breaks downstream tool chaining and forces manual parsing.
Minimal parameter validation. Numeric parameters (count, page_size, page, new_hand_size) lack bounds. No constraints prevent negative values, zero, or absurd large numbers. An LLM could call draw_card(count=999999) and crash.
Descriptions are too brief (10-30 chars) for view_hand, view_deck_stats, reset_game. Cannot guide LLM selection. 'View the cards in your hand.' tells an LLM nothing about when to call it vs play_card or draw_card.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 47 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 35 | - | v1 |
Search for Magic cards using a Scryfall query. Args: query: A search query using Scryfall's syntax page_size: Number of cards to display per page (default: 5) page: Which page of results to display (default: 1)
Swap a card from your deck with a card from your sideboard. Args: remove_card: Name of card to remove from deck add_card: Name of card to add from sideboard
Upload a Magic: The Gathering deck list. Args: deck_list: Text format deck list with "Deck" and "Sideboard" sections
View statistics about your current deck.
View the cards in your hand.
No error guidance. All errors return plain strings like 'Not enough cards in deck.' with no actionable recovery (e.g. 'Try draw_card with a smaller count'). Agents cannot reason about retry vs alternative tools.
Destructive operations (reset_game, sideboard_swap) lack confirmation or dry-run semantics. An agent could irreversibly destroy game state without safeguards.
State is global and not scoped to users or sessions. Multi-agent or multi-user access will cause data corruption. No isolation, no audit trail.
play_card and sideboard_swap use case-insensitive card name matching but do not validate that the card actually exists in the Scryfall database. Typos or hallucinated card names silently fail.
Parameter dependencies undocumented. sideboard_swap requires both remove_card and add_card; what if add_card is not in sideboard? upload_deck requires specific 'Deck' and 'Sideboard' section headers but does not explain case sensitivity or required format.