Skip to main content
Glama

lorcana-mcp

Tests PyPI Python License: MIT MCP Registry mcp.so lorcana-mcp MCP server

MCP server that connects Claude to Disney Lorcana card data. Export your collection from TCGPlayer, hand it to Claude, and get it fully enriched with ink cost, stats, keywords, abilities, and format legality β€” plus a ready-to-import file for dreamborn.ink.


The simple version

What it does: plug this into Claude and it becomes a Disney Lorcana expert that knows your actual collection β€” no more tab-switching between TCGPlayer, dreamborn.ink, and a wiki.

Once it's connected, you can just talk to Claude like:

  • πŸ—‚οΈ "Enrich my collection at ~/Downloads/export.csv" β€” turns a bare TCGPlayer export into a full card database (cost, stats, keywords, abilities) plus a file ready to import into dreamborn.ink

  • πŸ”Ž "What's that card, big pete?" β€” finds cards even if you don't remember the exact name or spelling

  • 🎴 "Show me cheap Evasive characters in Amber" β€” searches the entire card pool by color, cost, keyword, rarity, whatever

  • 🎡 "Who can sing Be Our Guest for free?" β€” finds the best Singer combos for a song

  • πŸ“‹ "Is this deck legal? 4x Goofy - Musketeer, 4x..." β€” checks curve, colors, and tournament legality of any deck list

  • πŸ’° "What am I missing to finish this deck, and what would it cost?" β€” compares a deck list to your collection and prices the gap with live market data

  • πŸ—οΈ "Build me a Core Constructed Amber/Sapphire deck" β€” automatically assembles a legal, curve-balanced decklist from your collection, an ideal build priced to complete, or a full market build

  • βœ… "Is my collection data still accurate?" β€” audits your CSV against live card data and flags anything stale

Everything reads from public card APIs plus your own exported CSV β€” no account, no login, nothing to configure.

Get it running in under a minute

Claude Desktop β€” one click: download lorcana-mcp.mcpb and double-click it (or Settings β†’ Extensions β†’ Install extension…). No terminal, no Python install, nothing to configure.

Everything else β€” one command:

1. Connect it (uvx fetches it on demand β€” install uv first, or pip install lorcana-mcp and drop the uvx):

claude mcp add lorcana -- uvx lorcana-mcp serve

Using Claude Desktop config, Cursor, VS Code, Windsurf, Cline, or Zed instead? Every client is covered in docs/INSTALL.md.

2. Talk to it: Export your collection from TCGPlayer (My Account β†’ My Collection β†’ Export), then just say:

"Enrich my collection at /path/to/your/export.csv"

That's it β€” Claude does the rest. Everything below is reference detail for when you want more control.


Related MCP server: Pokemon TCG Card Search MCP

Tools

Twelve tools are available in Claude once the server is running:

Tool

What it does

enrich_csv

Enriches a raw TCGPlayer export with Ink, Cost, Type, Subtypes, STR/WIL/Lore, Inkable, Keywords, and Abilities. Writes an enriched CSV and a dreamborn.ink-ready import file next to the input. refresh_prices=True also refreshes TCG Market Price with a live tcgcsv.com lookup.

lookup_card

Looks up any card by name. Returns full stats, ability text, format legality, and card image URL.

resolve_card

Fuzzy-resolves an informal, misspelled, or subtitle-less card name (e.g. "goofy musketeer", "elsa"). Returns a single confident match, a ranked top-3 to disambiguate, or nothing found.

list_printings

Lists every printing of a card β€” or every card sharing a character name β€” side by side: set, number(s), cost, stats, rarity, per-format legality, and cheapest market price. Optional fmt adds a βœ“/βœ— legality column. For "which printing of X is Core-legal / cheapest?".

search_cards

Searches the full card pool by color, type, rarity, set, cost range, keyword, ability text, or subtype β€” with pagination.

find_song_synergies

Finds every character that can sing a given song (or a raw cost threshold), split into Singer-keyword discount picks and plain cost-qualifiers. Optionally flags which ones you own.

filter_collection

Filters your collection to cards legal in a given format: core, infinity, core_zh, core_ja, or poorcana.

audit_csv

Compares an enriched collection against live API data and reports any stale or wrong fields.

analyze_deck

Analyzes a raw deck list (4x Card Name per line) for ink curve, inkable split, color split, card types, estimated lore/turn, and Core Constructed legality (60-card min, max 4 copies, ≀2 ink colors).

what_am_i_missing

Compares a deck list against your collection: what you already own, what's missing or short, and a live TCGPlayer cost estimate (via tcgcsv.com) to complete it.

build_deck

Automatically assembles a legal, curve-balanced ~60-card decklist for an ink pair/format, in one of 3 modes: collection (only cards you own), ideal (best deck regardless of ownership, priced to complete if you pass a collection CSV), or market (best deck, fully priced, ignoring ownership). Also builds for format="coconut" β€” Ravensburger's multiplayer singleton beta (up to 3 ink colors, 1 copy of everything except your chosen Coconut's associated character at up to 4). A heuristic curve/keyword-value builder, not a synergy/combo detector.

get_meta

Returns a hand-maintained Core Constructed metagame snapshot: every two-ink pair's tier, rough meta share, and playstyle, plus recent tournament results β€” optionally filtered to one pair (ink_colors="Emerald,Steel"). With event= ("nac", "asia", "kobe", …) returns that tournament's full standings and decklists instead. Not a live fetch β€” there's no free structured feed for this the way there is for card data β€” so it's a versioned snapshot bundled at release time, and says so explicitly in its own output.


Listed on


Install

You don't have to install anything if you use uvx (below) or the Claude Desktop bundle. To install the package explicitly:

pip install lorcana-mcp
# or:  uv tool install lorcana-mcp

From source:

git clone https://github.com/IcaroBichir/lorcana-mcp
cd lorcana-mcp
pip install .

Claude Desktop bundle: lorcana-mcp.mcpb on the releases page β€” a one-click install that bundles its own runtime. Built from packaging/mcpb/.


Add to your client

lorcana-mcp is a local stdio server β€” it runs on your machine, no hosting or API key. docs/INSTALL.md is the full guide, with copy-paste config for every client. The short version:

Client

Supported

How

Claude Desktop

βœ…

One-click .mcpb bundle, or config below

Claude Code

βœ…

claude mcp add lorcana -- uvx lorcana-mcp serve

Cursor Β· VS Code Β· Windsurf Β· Cline Β· Zed

βœ…

stdio config β€” see docs/INSTALL.md

Any other stdio MCP client

βœ…

Command: uvx lorcana-mcp serve (or lorcana-mcp serve if pip-installed)

Claude.ai (web) Β· ChatGPT

❌

Those need a hosted remote server; this one is local-only β€” see docs/INSTALL.md

Claude Code (CLI)

claude mcp add lorcana -- uvx lorcana-mcp serve

Claude Desktop (manual config)

Easiest is the one-click bundle. To wire it up by hand instead, edit claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\, or Settings β†’ Developer β†’ Edit Config):

{
  "mcpServers": {
    "lorcana": {
      "command": "uvx",
      "args": ["lorcana-mcp", "serve"]
    }
  }
}

Use "command": "lorcana-mcp", "args": ["serve"] if you installed with pip rather than uv. Fully quit and reopen Claude Desktop after saving.


Usage

Once the server is connected, just talk to Claude naturally. No slash commands needed.

Enrich a collection

Export your collection from TCGPlayer β†’ My Collection β†’ Export CSV, then:

"Enrich my collection at /Users/me/Downloads/Lorcana_063026.csv"

Claude will fetch card data from the APIs and write two files next to your input:

  • enriched_Lorcana_063026.csv β€” your collection with 10 new columns

  • dreamborn_Lorcana_063026.csv β€” ready to import at dreamborn.ink

On re-runs, pass the previous enriched file as a cache to skip already-seen cards:

"Enrich /Users/me/Downloads/Lorcana_new.csv using /Users/me/lorcana/enriched_Lorcana_old.csv as cache"

To refresh prices on demand without re-exporting from TCGPlayer:

"Re-enrich my collection at /Users/me/lorcana/enriched_Lorcana_063026.csv and refresh prices"

refresh_prices=True overwrites each row's TCG Market Price with a live tcgcsv.com lookup for that exact printing β€” useful when an enriched CSV's prices are stale.

Look up a card

"Look up Mirage - Super Recruiter"

"What are the stats on Alma Madrigal - Heart of the Family?"

"Is Will o' the Wisp legal in Core?"

Returns: ink color, cost, type, subtypes, STR/WIL/Lore, inkable status, keywords, full ability text, format legality, and a card image URL.

Resolve an informal or misspelled card name

"Find the card 'goofy musketeer'"

"What's that card 'big pete'?"

"Look up 'elsa' β€” not sure which version"

Tokenizes the query and scores it against every card's name and subtitle, tolerating missing dashes, missing subtitles, word order, and minor typos. Returns full detail for a single confident match, a ranked top-3 with confidence scores when several cards are plausible (e.g. a bare name matching every printing of that character), or nothing if the query doesn't resemble any card.

Search the full card pool

"Show me all Evasive characters in Amethyst that cost 3 or less"

"Find Toy characters"

"Search for Rare Steel cards from Wilds Unknown"

Filters: ink color(s), card type (Character / Action / Item / Location / Song), rarity, set name, cost range, keyword, ability text substring, and subtype β€” all combinable, plus pagination (offset + limit). Results are grouped by ink color and sorted by cost.

Find who can sing a song

"Which characters can sing Be Our Guest?"

"Show me Amber characters that can sing a cost-7 song"

"Who can sing Friends on the Other Side, and which ones do I own?" (pass your enriched collection CSV)

A character can sing a song if its printed cost meets the song's cost outright, or it has a matching Singer X keyword β€” Singer lets a cheap character punch above its actual cost for singing purposes only. Results split into Singer-keyword "discount" picks (highest Singer value, then cheapest actual cost) and plain cost-qualifiers (cheapest first). Pass collection_csv to flag ownership.

Filter your collection by format

"Which of my cards are legal in Core Constructed?"

"Show me my Infinity-legal cards grouped by ink color"

"What Poorcana-legal cards do I have in Amber?"

Valid formats: core, infinity, core_zh, core_ja, poorcana

Poorcana filtering uses the Rarity column in your enriched CSV (Common + Uncommon only) β€” no API call needed.

Core/Infinity/regional legality comes from duels.ink, which tracks the current rotation for each region.

Audit an existing enriched file

"Audit my collection at /Users/me/lorcana/enriched_collection.csv"

Useful after a new set releases or if a card's data looks wrong. Compares every non-promo card against live API data and reports field-by-field discrepancies.

Analyze a deck list

"Analyze this deck: 4x Goofy - Musketeer, 4x Elsa - Spirit of Winter, ..." (paste a full list, one card per line)

Accepts 4x Card Name or 4 Card Name; quantity defaults to 1 if omitted. Lines starting with # or // are treated as comments.

Returns: ink curve (1-2/3-4/5-6/7+ cost brackets), inkable vs. uninkable count, color split, card type split, an estimated lore-per-turn (sum of Character lore values), a Core Constructed legality check (60-card minimum, max 4 copies of any card, at most 2 ink colors), and any card names that couldn't be resolved.

Check what a deck list is missing

"What am I missing to build this deck?" (paste the deck list and point me at your collection CSV)

"How much would it cost to finish this Amber/Steel list?"

Same deck list format as analyze_deck. Cross-references against your enriched collection CSV, then splits results into cards you already have enough of and cards you're missing or short on. For cards you're short on (own at least one printing already), the cost comes straight from the CSV's own TCG Market Price column β€” no network call needed. Only cards you own zero copies of fall back to a live TCGPlayer lookup via tcgcsv.com (cheapest printing across all sets/rarities, since gameplay is identical), and even then only if at least one card actually needs it. Live price data is cached for 24h, so the first call that needs it takes a bit longer while it warms up.


Enriched columns

The enricher adds these 10 columns to the raw TCGPlayer export:

Column

Description

Ink

Ink color(s) β€” dual-ink cards show both, e.g. Amber, Steel

Ink Cost

Numeric cost to play (1–12)

Card Type

Character / Action / Action - Song / Item / Location

Subtypes

e.g. Storyborn, Hero, Toy

Strength

βš” stat β€” blank for Actions, Items

Willpower

πŸ›‘ stat β€” blank for Actions, Items

Lore Points

β—† gained per quest β€” blank for Actions, Items

Inkable

Yes / No

Keywords

Comma-separated: Evasive, Shift 3, Singer 5, Resist +1, etc.

Abilities

Full card text, pipe-separated lines


Data sources

Source

Sets

Used for

LorcanaJSON

All sets (1–14+)

Primary source for Set 12+; fallback for 1–11

lorcana-api.com

Sets 1–11

Preferred for Sets 1–11 (richer body text)

duels.ink

All sets

Format legality, card images

tcgcsv.com

All sets

TCGPlayer market prices (daily mirror)

Card data is fetched live and cached locally for 24 hours at ~/.cache/lorcana-mcp/. If LorcanaJSON is unreachable, the server falls back to a bundled card snapshot (lorcana_mcp/data/allcards_fallback.json.gz, refreshed each release) and warns once that data may be stale. Manage the cache with the CLI:

lorcana-mcp cache stats   # show entry count, expiry status, and file size
lorcana-mcp cache clear   # delete all cached responses (fresh fetch on next use)

Supported sets

Set

Name

1

The First Chapter

2

Rise of the Floodborn

3

Into the Inklands

4

Ursula's Return

5

Shimmering Skies

6

Azurite Sea

7

Archazia's Island

8

Reign of Jafar

9

Fabled

10

Whispers in the Well

11

Winterspell

12

Wilds Unknown

13

Attack of the Vine!

14

Hyperia City

New sets are picked up automatically via LorcanaJSON as long as the set name is added to the internal mapping. Open an issue if a new set isn't resolving.


TCGPlayer export format

Go to TCGPlayer β†’ My Account β†’ My Collection β†’ Export. The raw file has columns like Product Name, Set Name, Number, Rarity, Condition, Printing, and Add to Quantity (this is the real owned-quantity column β€” Total Quantity is always blank in exports).

Promo cards: resolved automatically where possible. dreamborn.ink's bulk import represents a promo as (Set Number, Card Number) where Set Number is the LJ set the promo drop is tied to and Card Number is the full "N/Series" string (e.g. "57/P3") β€” verified against a real dreamborn export, not just its card-browser display (an earlier attempt based on the display alone silently corrupted imports; see CHANGELOG.md's 0.2.2/0.2.3 entries). Any promo not yet in that map still needs manual entry via dreamborn.ink's card search after importing the rest.


CLI reference

lorcana-mcp --version
lorcana-mcp serve          Start the MCP server (stdio)
lorcana-mcp cache stats    Show cache info
lorcana-mcp cache clear    Clear cached API responses

Staying up to date

The card data is always live (fetched from public APIs, cached 24h) β€” but the bundled metagame snapshot (get_meta) and any tool/behaviour changes only move when you update the package:

pip install -U lorcana-mcp        # or: uv tool upgrade lorcana-mcp

Claude Desktop .mcpb users: re-download lorcana-mcp.mcpb and reinstall β€” the bundle pins an exact version and does not auto-update. Restart your MCP client after updating so it reconnects to the new server.

Get told when there's a new release:

  • The server checks PyPI about once a day (fail-silent, cached, one request) and, if it's behind, prints a one-line notice to stderr on startup β€” visible in Claude Code's MCP logs / Claude Desktop's log files β€” and appends a note to get_meta's output. Opt out with LORCANA_MCP_NO_UPDATE_CHECK=1 in the server's env.

  • Or watch the repo: Watch β†’ Custom β†’ Releases, or subscribe to the Atom feed https://github.com/IcaroBichir/lorcana-mcp/releases.atom.


Development

git clone https://github.com/IcaroBichir/lorcana-mcp
cd lorcana-mcp
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest

355 tests, no network calls required. CI runs the full suite on Python 3.11, 3.12, and 3.13 on every pull request and on push to main (see .github/workflows/tests.yml).


License

MIT β€” see LICENSE.


πŸ€– CLAUDE READ THIS

If you're an AI agent (Claude or otherwise) with this MCP server connected, read this section before making tool calls. It's the fast path to using this correctly.

Which tool to call

The user wants...

Call...

Not...

Their raw TCGPlayer export turned into a real database

enrich_csv

β€”

To bring stale prices up to date without re-exporting

enrich_csv with refresh_prices=True

manually curling TCGPlayer

Stats on a card whose exact name they gave you

lookup_card

β€”

A card by an informal, partial, or misspelled name (e.g. "goofy musketeer", "big pete", "elsa")

resolve_card

lookup_card β€” it only does plain substring matching and will falsely report "not found" for anything without exact dashes/spelling

Which printing of a card is legal in a format / cheapest to buy / whether it got an Enchanted

list_printings (pass fmt for a legality column)

lookup_card β€” it silently returns only the newest printing

To browse/filter the whole card pool (by color, type, rarity, set, cost, keyword, ability text, subtype)

search_cards

β€”

Singer combos / "who can sing this song for free"

find_song_synergies

β€”

Format legality of their collection (Core, Infinity, Poorcana, etc.)

filter_collection

β€”

To sanity-check an enriched CSV against live data

audit_csv

β€”

A decklist rated for curve, color balance, and legality

analyze_deck

β€”

"What do I need to buy to finish this deck, and how much?"

what_am_i_missing

β€”

"Build me a deck for [ink pair]"

build_deck β€” ask which of the 3 modes (collection/ideal/market) first if the user hasn't said

manually assembling a decklist from search_cards results

Hard rules

  1. Always pass absolute paths for csv_path / input_path / collection_csv. Relative paths resolve against the server process's cwd, not the user's β€” this fails silently or points at the wrong file. If you don't have an absolute path, ask the user or find the file first.

  2. Default to resolve_card over lookup_card unless the user gave you a name you're confident is exact and correctly spelled. When in doubt, resolve_card is strictly more forgiving and costs nothing extra.

  3. Never hand-roll price lookups. find_song_synergies, what_am_i_missing, and build_deck already call tcgcsv.com internally with 24h caching and cheapest-printing logic. Don't curl TCGPlayer or scrape prices yourself.

  4. Gameplay is identical across printings (base, Enchanted, Epic, promo β€” same name, cost, stats, abilities). Every price-aware tool already picks the cheapest printing automatically; don't second-guess a suspiciously low result, and don't treat rarity as a gameplay signal. Use list_printings when the user needs the per-printing breakdown (which one is legal in a format, which is cheapest, whether it got an Enchanted).

  5. If a user says data looks wrong or stale, suggest lorcana-mcp cache clear before assuming a tool is broken β€” card and price data is cached 24h.

  6. Ambiguous tool output is a feature, not an error. resolve_card and find_song_synergies can return a ranked "did you mean" list instead of a single answer β€” present it to the user rather than guessing which one they meant.

  7. build_deck is a curve/keyword-value heuristic, not a synergy engine. It doesn't detect multi-card combos (Merlin/Mim bounce, Steelsong, etc.) β€” don't present its output as a finished, tournament-tuned decklist. Treat it as a strong starting point to review and adjust, not a final answer.

Known gotchas (found the hard way β€” see CHANGELOG.md)

  • Product ID (CSV column 1) β‰  TCGplayer Id (column 2). Only Product ID matches external pricing APIs (LorcanaJSON's externalLinks.tcgPlayerId, tcgcsv.com's productId). Column 2 is an unrelated secondary ID β€” if you're ever writing custom code against this data, matching on it silently returns zero results.

  • Promo cards resolve via PROMO_DREAMBORN_ROW/PROMO_DREAMBORN_ROW_BY_NUMBER (api.py) β€” verified against a real dreamborn.ink export, not its card-browser display (an earlier browser-based guess silently corrupted a real import; CHANGELOG.md 0.2.2). A promo's dreamborn Card Number is the full "N/Series" string, not split into a separate series field β€” don't re-split it if extending this map. Anything not yet in the map still needs manual entry via dreamborn.ink's search after importing.

  • Duplicate-looking rows in search results are printings, not bugs β€” search_cards and find_song_synergies already deduplicate alt-art/Enchanted reprints by name internally, so don't be surprised the count is lower than you'd expect from a raw card list.

If you're modifying this codebase

  • Run pytest before and after any change β€” 355 tests, all network-free (external calls are mocked; tests/conftest.py also disables the PyPI update check).

  • Code layout: pure/testable logic lives in api.py (card data + fuzzy matching + pricing), deck.py (deck list parsing/analysis), enricher.py (CSV pipeline), meta.py + tournaments.py (bundled metagame/tournament snapshot), and update_check.py (PyPI version check). server.py only wraps those as MCP tools and formats output β€” keep it that way rather than putting logic directly in tool functions. lorcana_mcp/data/allcards_fallback.json.gz is the offline card-data fallback (refresh with scripts/update_fallback_snapshot.py).

  • A release bumps the version in four files (pyproject.toml, server.json, packaging/mcpb/pyproject.toml β€” both its version and the lorcana-mcp== pin β€” and packaging/mcpb/manifest.json), adds a CHANGELOG.md entry, and updates this README + docs/INSTALL.md if tool behavior changed. Check git log for the chore: release X.Y.Z pattern.

  • Publishing is a separate, explicit step (python -m build, twine upload, mcp-publisher publish) β€” never assume a version bump in pyproject.toml means it's live on PyPI or the registry. Check before telling a user a feature is "available."

Available Tools

12 tools
analyze_deckA

Analyze a raw deck list (a list of card names, not a collection CSV) and return its ink curve, composition, and Core Constructed legality β€” the tool for "is this decklist actually good/legal", independent of what you own or can afford.

Accepts one card per line, e.g. "4x Goofy - Musketeer" or "4 Goofy - Musketeer" (both "4x" and "4 " are accepted; qty is optional and defaults to 1). Lines starting with "#" or "//" are treated as comments and skipped.

Reports: ink curve (1-2/3-4/5-6/7+ cost brackets), inkable vs. uninkable count, color split, card type split, an estimated lore-per-turn (sum of Character lore values), a Core Constructed legality check (60-card minimum, max 4 copies of any card, at most 2 ink colors), and any card names that couldn't be resolved.

Behavior: card names are matched the same simple way as lookup_card (exact, then substring) β€” not fuzzy-resolved like resolve_card β€” so a typo'd or oddly-abbreviated name lands in the unresolved list rather than being guessed. Unresolved lines are excluded from every stat (curve, color split, lore/turn, legality counts), so a deck list with several unresolved names will under-report its true totals; always check that list before trusting the numbers. The legality check is Core Constructed only β€” it does not check rotation-group safety (whether the deck's cards survive the next rotation) or Infinity/Poorcana rules; for rotation safety, cross-reference the card list against search_cards filtered by set, or build fresh via build_deck(rotation_safe=True).

Usage guidelines: use this on a decklist you already have β€” hand-written, pasted from elsewhere, or build_deck's output β€” to sanity-check curve and legality before playtesting or buying anything. It never touches your collection, so it can't tell you what's missing or what it costs; for that, feed the same deck list to what_am_i_missing instead.

Args: deck_list: Raw deck list text, one card per line.

ParametersJSON Schema
NameRequiredDescriptionDefault
deck_listYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden and does so: it discloses the name-matching rule (exact then substring, unlike resolve_card's fuzzy matching), warns that unresolved lines are dropped from every stat and cause under-reporting, and scopes the legality check to Core Constructed only, excluding rotation/Infinity/Poorcana. These are exactly the behavioral caveats an agent needs to avoid misreporting results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose and benefit, then format, then reports, then behavior. Every section is useful, though the description is long and dense; a small amount of the enumeration (e.g. the full list of reports) could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, yet the description still previews the report contents. Combined with the input-format rules, matching caveats, and legality scope limits, an agent has everything required to invoke this correctly and interpret the results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: it defines the accepted input format in detail (one card per line, '4x' or '4 ' both valid, quantity optional defaulting to 1, '#' and '//' lines skipped as comments). This fully documents the single parameter beyond the bare string type in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (analyze a raw deck list) and enumerates exactly what it returns: ink curve, composition, and Core Constructed legality. It explicitly contrasts itself with a collection CSV and with the fuzzy resolver, so an agent can distinguish it from lookup_card, resolve_card, and enrich_csv without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use ('a decklist you already have β€” hand-written, pasted from elsewhere, or build_deck's output') and names alternatives for adjacent needs: what_am_i_missing for ownership/cost, and search_cards or build_deck(rotation_safe=True) for rotation safety. Exclusions are stated, not implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

audit_csvA

Audit an already-enriched Lorcana collection CSV against live API data and report exactly which fields drifted from the current source of truth β€” a correctness check on data already in the CSV, not a re-enrichment.

Checks Ink color, Ink Cost, Card Type, Subtypes, Inkable, and stats (Strength / Willpower / Lore Points) for every non-promo card, one live API call per unique card. Promo rows are always skipped entirely (counted separately as "promos skipped") since there's no reliable live source to diff a promo printing against. Ability/Keyword text is not checked β€” only the structured fields above.

Behavior: reports every field-level mismatch as "csv_value" β†’ "api_value", grouped by card. One known, harmless false-positive class: Subtypes differences that are purely separator/ordering (e.g. "Storyborn/Ally/Toy" vs "Storyborn, Ally, Toy") β€” same data, different formatting convention, most common in newer sets. Skim for those before treating every reported line as a real error. A completely clean CSV returns a one-line "no discrepancies found" summary instead of an empty list.

Usage guidelines: run this after a new set releases, after any manual CSV edits, or whenever enrichment output looks suspicious β€” not as a routine step after every enrich_csv call, since it re-fetches from the live API per unique card and adds real latency on a large collection. If it turns up genuine (non-Subtypes-formatting) discrepancies, the fix is to re-run enrich_csv, not to hand-edit the CSV β€” this tool only reports drift, it does not write any changes back to the file.

Args: csv_path: Absolute path to an enriched Lorcana collection CSV.

ParametersJSON Schema
NameRequiredDescriptionDefault
csv_pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden and does so thoroughly: fields checked, promos skipped and why, one live API call per unique card (latency cost), read-only nature ('does not write any changes back'), and a disclosed false-positive class for Subtypes formatting, plus the clean-CSV return behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and scope, then behavior, then usage. The false-positive paragraph and the 'does not write' note each earn their place, but the enumeration of checked fields plus the promos explanation is slightly verbose and could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, so return values needn't be documented, yet the description still conveys the report shape ('csv_value' β†’ 'api_value', grouped by card, one-line summary when clean) and the scope of checks. For a single-param reporting tool, nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate; it specifies that csv_path is an absolute path to an *enriched* collection CSV, adding the precondition that the file must already be enriched (otherwise the audit is meaningless). That is meaningful beyond the bare 'string' schema, though format/syntax detail is minimal.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (audit) plus resource (an already-enriched Lorcana collection CSV) and an explicit negation of the closest sibling behavior ('a correctness check on data already in the CSV, not a re-enrichment'). An agent can distinguish this from enrich_csv without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete triggers (after a new set releases, after manual CSV edits, when enrichment output looks suspicious), an explicit when-not ('not as a routine step after every enrich_csv call') with the reason (per-card live fetches add latency), and names the correct remediation path (re-run enrich_csv, not hand-edit).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

build_deckA

Automatically assemble a legal, curve-balanced ~60-card decklist for an ink pair and format, in one of 3 modes:

  • "collection": build only from cards you own (capped at owned quantity per card). If fewer than 60 legal owned cards exist, reports the shortfall honestly instead of padding with irrelevant fillers.

  • "ideal": build the best deck regardless of ownership. If collection_csv is given, also shows what you already own, what's missing, and the price to complete it (via tcgcsv.com).

  • "market": build the best deck ignoring any collection, and prices every card in it (not just the gap) via tcgcsv.com.

This is a heuristic curve/keyword-value builder β€” it optimizes ink curve, stat efficiency, and keyword value, not multi-card combos or synergy packages. See the disclaimer at the bottom of every result.

format="coconut" builds for Format Coconut (Ravensburger's multiplayer singleton beta, open since 2026-07-28 β€” rules/card pool may still change; see the project CLAUDE.md's "Format Coconut" section). It needs coconut_card, allows up to 3 ink colors (one must match the Coconut's own ink), has no rotation and no tracked banned list (every released card is treated as legal), and every card in the build is capped at 1 copy except the Coconut's associated real character, which may run up to 4 β€” this replaces the usual max-4-of-anything rule entirely. Call with format="coconut" and no coconut_card to get the full list of the 18 beta Coconuts to choose from.

Args: ink_colors: Comma-separated ink color(s), e.g. "Amber,Sapphire". 1-2 colors for core/core_zh/core_ja/poorcana, 1-6 for infinity, 1-3 for coconut (must include the Coconut card's own ink β€” see coconut_card). May be omitted entirely when format="coconut" and coconut_card is also omitted β€” that combination just lists the 18 beta Coconut cards (filtered to the given ink(s), if any) and doesn't build anything yet. mode: "collection", "ideal", or "market". format: "core", "infinity", "core_zh", "core_ja", "poorcana", or "coconut". collection_csv: Absolute path to an enriched collection CSV. Required for mode="collection"; optional for "ideal"; ignored for "market". rotation_safe: If True and format="core", restrict to the rotation group that will still be legal after the next rotation event. No-op (with a note) for other formats. coconut_card: Required when format="coconut" β€” fuzzy name of one of the 18 beta Coconut cards (e.g. "Ariel", "Mickey Mouse", "snow white"). Ignored for every other format.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoideal
formatNocore
ink_colorsNo
coconut_cardNo
rotation_safeNo
collection_csvNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and discharges it: it discloses that shortfalls are reported honestly rather than padded, that pricing comes from tcgcsv.com (and only for the gap in 'ideal' vs all cards in 'market'), that the builder is a heuristic curve/keyword-value optimizer and not a combo/synergy engine, and that a disclaimer is attached to every result.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose followed by tightly grouped bullet lists per mode and per argument; every sentence is functional. It runs long on Coconut-specific rules, but that detail is necessary given how unusual that format's legality rules are.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-shape explanation isn't required, and the definition still covers edge cases an agent would otherwise guess at: shortfall reporting, the no-build listing call, pricing scope per mode, and rotation behaviour. Nothing material is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% with six bare defaulted parameters, so the description must compensate and does: per-format ink_color counts, rotation_safe being a no-op outside 'core', coconut_card's fuzzy-name matching and the ink requirement, and the omitted-both-args listing behaviour. These are exactly the semantics the schema lacks.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb, resource, and scope: 'assemble a legal, curve-balanced ~60-card decklist for an ink pair and format'. The three modes are enumerated immediately, so an agent can differentiate build behaviour without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Rich when-to-use guidance: mode semantics (collection vs ideal vs market), that collection_csv is required for 'collection', optional for 'ideal', ignored for 'market', and that the 'coconut' call with no coconut_card just lists the 18 Coconuts. It never names a sibling alternative (e.g. analyze_deck or what_am_i_missing), so routing between tools is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

enrich_csvA

Enrich a raw TCGPlayer Lorcana CSV export with full card data β€” the required first step before any other tool here can read your collection (filter_collection, audit_csv, what_am_i_missing, build_deck, and find_song_synergies's collection_csv all expect this tool's output, not the raw TCGPlayer export).

Fetches card data from LorcanaJSON (sets 12+) and lorcana-api.com (sets 1–11) and adds Ink color, Ink Cost, Card Type, Subtypes, Strength, Willpower, Lore Points, Inkable, Keywords, and Abilities to each row. Both sources are disk-cached 24h, so a second run soon after the first is fast regardless of cache_path.

Behavior: writes two new files next to the input β€” never modifies input_path itself β€” and always reports fill-rate stats per column plus any cards it couldn't match (usually a name typo in the export, or a brand-new card the APIs haven't indexed yet). Promo cards (Set Name "Disney Lorcana Promo Cards") are matched by name against their non-promo equivalent for stats, and separately resolved to a dreamborn.ink-importable (Set Number, Card Number) row when this server's built-in promo table covers that card; promos it doesn't recognize are listed for manual entry rather than guessed. cache_path only skips re-fetching for card names already present in that prior enriched CSV β€” it does not skip enrichment for new cards in the input.

Writes two output files next to the input: enriched_{filename} β€” enriched collection CSV dreamborn_{filename} β€” import-ready CSV for dreamborn.ink

Usage guidelines: run this on every fresh TCGPlayer export before doing anything else with it. Pass cache_path pointing at your previous enriched CSV on a re-export to speed things up β€” otherwise every row re-fetches from the API even for cards you've already enriched before. Use refresh_prices=True specifically to bring an existing enriched CSV's prices current without a fresh TCGPlayer export (it only touches the price column, not the card-data columns); leave it off for a same-day fresh export, since the TCGPlayer download already has current prices and refreshing adds an extra tcgcsv.com call per row.

Args: input_path: Absolute path to the raw TCGPlayer CSV export. cache_path: Optional path to a previous enriched CSV to speed up re-runs by skipping API calls for cards already seen. refresh_prices: If True, overwrite each row's TCG Market Price with a live tcgcsv.com lookup for that exact printing, instead of leaving whatever the raw TCGPlayer export had at download time. Use this to bring an old enriched CSV's prices current without re-exporting from TCGPlayer.

ParametersJSON Schema
NameRequiredDescriptionDefault
cache_pathNo
input_pathYes
refresh_pricesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and does so thoroughly: it discloses that the tool writes two new files next to the input and never modifies input_path, describes API sources and 24h disk caching, explains promo-card handling, reports fill rates and unmatched cards, and clarifies cache_path and refresh_prices semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and workflow, and most detail is justified by the tool's complexity. It is somewhat long and repeats the write-two-files behavior in two places, but the information remains organized and useful rather than padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the lack of annotations, and the 0% schema coverage, the description is complete enough for correct invocation. It covers inputs, side effects, dependency ordering, caching behavior, price refreshes, output filenames, and edge cases; the presence of an output schema means return-value details need not be expanded further.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, so the description must compensate, and it fully documents all three parameters. It gives the expected format for input_path, explains that cache_path only skips re-fetching names already present in a prior enriched CSV, and states exactly what refresh_prices overwrites and when to use it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a precise verb-and-resource purpose: enriching a raw TCGPlayer Lorcana CSV export with full card data. It explicitly names the dependent sibling tools that require its output, so an agent can immediately distinguish it from other collection tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says to run this on every fresh TCGPlayer export before doing anything else, and names the exact situations for optional parameters: use cache_path on re-export for speed, use refresh_prices only to refresh an existing enriched CSV's prices, and leave refresh_prices off for same-day fresh exports. It effectively covers when to use the tool and when not to enable specific behavior.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

filter_collectionA

Filter an enriched collection CSV down to the cards you own that are legal in a specific play format β€” answers "which of my cards can I actually play in format X", grouped by ink color with owned quantities.

Legality data comes from a live duels.ink fetch, which tracks Core EN, Infinity, Core ZH, and Core JA rotation. Poorcana (Common/Uncommon only, 50-card min) is the one exception: it's derived purely from the CSV's own Rarity column, no external lookup, so it still works offline and always reflects the CSV's rarity data exactly.

Behavior: promo rows (Set Name == "Disney Lorcana Promo Cards") are always excluded from Core/Infinity/regional results, not flagged as illegal β€” duels.ink's legality table is keyed by (set, number) and promos don't map onto that cleanly (see "Promo cards" in the reference doc). Any other row duels.ink doesn't recognize (usually a card from a set duels.ink hasn't indexed yet) is silently skipped and counted in a "rows skipped" footer β€” that's a data-lag note, not a legality verdict, so don't read a skipped row as "illegal". Requires the enriched CSV's columns (Set Name, Number, Ink, Ink Cost, Add to Quantity, etc.) β€” running this against the raw TCGPlayer export (pre-enrich_csv) will silently undercount or return nothing useful.

Usage guidelines: run this when you want to see your full legal card pool for a format before hand-building a deck, or to sanity-check whether a deck idea is even feasible with what you own. If you want a finished decklist rather than just the eligible pool, use build_deck with mode="collection" instead β€” it already applies this same legality filter internally as part of assembling a curve-balanced list, so you don't need to call both.

Args: csv_path: Absolute path to an enriched Lorcana collection CSV. format: "core", "infinity", "core_zh", "core_ja", or "poorcana".

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNocore
csv_pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden and does so richly: live duels.ink fetch, Poorcana being offline/CSV-derived, promo-row exclusion semantics (excluded, not illegal), skipped rows being a data-lag note rather than a legality verdict, and the hard dependency on enrich_csv output columns. This is exactly the behavioral context an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and output shape are front-loaded, and every subsequent sentence carries distinct information (offline exception, promo handling, skipped-row caveat, dependency, alternative tool). It is longer than typical and slightly dense, but there is little waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, so return values need no explanation; the description instead covers inputs, offline/online behavior, edge-case row handling, upstream dependency, and the sibling alternative. Nothing needed to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it largely does: csv_path is defined as an absolute path to an enriched Lorcana CSV (with a warning about raw exports), and the valid format values are enumerated in prose despite the schema lacking an enum. It omits that format defaults to 'core', which the schema only implies via a bare default value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (filter), resource (enriched collection CSV), scope (cards you own legal in format X), and output shape (grouped by ink color with owned quantities). An agent can tell it apart from build_deck and enrich_csv without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use ('before hand-building a deck', 'sanity-check whether a deck idea is feasible') and an explicit when-not with the named alternative: use build_deck with mode="collection" instead, which already applies this filter internally. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_song_synergiesA

Find every Character that can sing a given song β€” the tool for building or checking a Singer/song combo (e.g. the Amber/Steel Steelsong package), not for general card search (use search_cards for that).

A character can sing a song if its printed ink cost meets the song's cost outright, OR it has a "Singer X" keyword with X meeting the song's cost β€” Singer lets a cheap character punch above its actual cost for singing purposes only (see the Steelsong package: Amber Singers unlocking expensive Steel songs for free). Provide either song_name (resolved the same fuzzy way as resolve_card, so "beauty and beast" or a slight typo still works) or a raw cost threshold β€” exactly one is required; passing neither, or both, returns an error message instead of guessing.

Results are grouped: Singer-keyword characters first (the actual "discount" picks β€” highest Singer value, then cheapest actual cost), followed by characters that simply cost enough to sing it outright, cheapest first. This only tells you who can sing β€” it doesn't check whether that character is otherwise good (stats, other abilities) or whether you own enough copies to make the combo consistent unless you pass collection_csv, in which case each result is annotated with owned quantity so you can see the combo's real consistency at a glance.

Args: song_name: Name of a Song card, e.g. "Be Our Guest". Fuzzy-matched. cost: Raw song cost threshold to use instead of song_name, e.g. 5. colors: Optional comma-separated ink color(s) to restrict characters to, e.g. "Amber,Steel". collection_csv: Optional path to an enriched collection CSV β€” when given, each character is flagged with how many copies you own. limit: Max characters to list (default 50, capped at 200).

ParametersJSON Schema
NameRequiredDescriptionDefault
costNo
limitNo
colorsNo
song_nameNo
collection_csvNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so: it explains the Singer-keyword eligibility rule, result grouping/ordering, fuzzy name resolution, the error path for zero-or-two arguments, the limit cap, and the explicit limitation that it does not evaluate stats or combo consistency unless collection_csv is passed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and the sibling contrast, and every sentence carries information. The parenthetical asides (Steelsong example, typo note) add length but also real value, so it is slightly verbose rather than padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only lookup tool with an output schema already documenting return shape, the description supplies everything else an agent needs: eligibility logic, argument exclusivity, ordering, and the ownership caveat.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it largely does: it defines song_name (fuzzy), cost as a raw threshold, colors as comma-separated inks with an example, collection_csv's path/effect, and limit's default and 200 cap. Only the cost default sentinel (-1) is left unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Find every Character that can sing a given song') and immediately names the sibling it is not, routing general card search to `search_cards`. An agent can distinguish it from `search_cards`/`filter_collection` without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly frames the use case (building/checking a Singer/song combo) and the anti-case (general card search β†’ `search_cards`). It also states the mutual-exclusion rule: exactly one of song_name or cost, with an error otherwise.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_metaA

Return a hand-maintained Core Constructed metagame snapshot: a tier list of every two-ink pair (archetype name, tier, rough meta share, playstyle) plus a summary of recent notable tournament results β€” for answering "what's strong right now" or "how does my ink pair compare". With event set, returns that tournament's full standings and decklists instead.

Unlike every other tool here, this is NOT a live fetch. There is no free, structured feed for competitive metagame share or tournament decklists β€” inkDecks.com and lorcana.gg publish this as HTML, and tournament results circulate as social-media images, not an API. This tool instead returns a versioned snapshot bundled into the package at release time (see lorcana_mcp/meta.py / tournaments.py and the CHANGELOG for when it was last refreshed). The response states its own snapshot date and sources up front, and flags which rows have actually been checked against a real recent tournament result versus older, unverified metagame-tracker data β€” don't treat an old row's tier/meta-share as more current than it is. Tournament decklists are transcribed from card-grid images: counts/art are reliable, but a few 1-of tech slots and some subtitles are best-effort (per-list notes flag where).

Usage guidelines: reach for this when a player asks what's currently good, whether a given ink pair is competitive, or wants context before calling build_deck. For a specific event's lists, pass event (the plain snapshot output lists which events are available). It complements build_deck/analyze_deck, which build or evaluate one concrete deck.

Args: ink_colors: Optional pair of ink colors to filter to one tier-list row, comma- or slash-separated, e.g. "Emerald,Steel" or "Amber/Sapphire" (order doesn't matter). Ignored if event is set. event: Optional tournament key or name fragment (e.g. "nac", "kobe", "asia-championship-2026") to get that event's full standings + decklists instead of the tier list.

ParametersJSON Schema
NameRequiredDescriptionDefault
eventNo
ink_colorsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden and does so exceptionally: it discloses that this is NOT a live fetch, that data is a versioned package snapshot, that the response self-reports snapshot date/sources, that rows are flagged verified vs. unverified, and that decklists are best-effort transcriptions. These are exactly the caveats an agent needs to avoid over-trusting the output.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose and mode split, and every sentence adds real information (data provenance, verification flags, transcription caveats). It is on the long side and slightly repetitive about the non-live-fetch point, but no sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite an output schema existing, the description still communicates the shape of the alternate mode's return (standings + decklists) and the freshness caveats, and covers both filter parameters without gaps. Nothing an agent needs before calling is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description fully compensates: it documents `ink_colors` syntax (comma- or slash-separated, order-insensitive, ignored when `event` is set) and `event` as a key or name fragment with concrete examples, plus the mode switch each triggers.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource+scope: returns a Core Constructed metagame snapshot (tier list of two-ink pairs plus recent tournament results), and explicitly notes the alternate `event` mode returning standings and decklists. It also distinguishes itself from siblings by naming build_deck/analyze_deck as complementary rather than equivalent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use ('what's currently good', 'is my ink pair competitive', 'context before build_deck') and when to switch modes (pass `event` for a specific event's lists). Alternatives are named directly, so routing is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_printingsA

List every printed version of a Lorcana card β€” or every card sharing a character name β€” side by side: each one's set, card number(s), cost, stats, rarity, per-format legality, and the cheapest market price to acquire it.

Reach for this whenever the answer depends on which printing: "is any Milo Thatch legal in Core?", "which Elsa is cheapest?", "did this card ever get an Enchanted?", "what's the current-set version vs. the rotated-out one?". lookup_card silently collapses to just the newest printing; this shows them all.

Matching, in order: exact full name ("Elsa - Spirit of Winter"); exact character name ("Elsa" β†’ every distinct Elsa card); full-name substring; then a fuzzy resolve. A bare character name lists every subtitle; a full name lists that one card's base + Enchanted/Epic printings. Enchanted and Epic printings are gameplay-identical to the base β€” they only change the number, rarity, and price, which is exactly what this tool compares.

fmt (optional): one of core, infinity, core_ja, core_zh, poorcana, coconut. When given, adds a legality column for just that format and lists legal cards first. Legality/images come from duels.ink and prices from tcgcsv.com (a daily TCGPlayer mirror); both are fetched live, cached 24h, and shown as "?" / omitted (never errored) when unavailable.

Args: name: A card's full name, or a bare character name. fmt: Optional play format to flag legality for.

ParametersJSON Schema
NameRequiredDescriptionDefault
fmtNo
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so: live data sources (duels.ink for legality/images, tcgcsv.com for prices), 24h caching, graceful-degradation behavior ('shown as "?" / omitted (never errored)'), and the gameplay-relevant fact that Enchanted/Epic printings differ only in number/rarity/price. This is behavior an agent cannot infer from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose and routing are front-loaded in the first two paragraphs, which is ideal. However, the trailing 'Args:' block restates the `fmt` details and `name` semantics already given in prose, adding some redundancy to an already long description for a two-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description covers everything else an agent needs: matching behavior, format handling, data provenance, and failure modes. Nothing essential is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate and it does: the `fmt` enum values are enumerated (core, infinity, core_ja, core_zh, poorcana, coconut) along with its effect (adds a legality column, sorts legal cards first), and `name` matching is spelled out as an ordered resolution chain, including how a bare character name differs from a full name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names a specific verb+resource ('List every printed version of a Lorcana card') and the scope (all printings side by side), then explicitly distinguishes itself from the sibling: 'lookup_card silently collapses to just the newest printing; this shows them all.' An agent can route between the two without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the exact selection condition ('Reach for this whenever the answer depends on which printing') and reinforces it with four representative questions, plus the explicit alternative (lookup_card) and why it is wrong for these cases. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lookup_cardA

Look up one specific, already-known Lorcana card by (near-)exact name and return its full stats, abilities, and format legality in one call.

Behavior: tries an exact name match against LorcanaJSON first, then falls back to a plain substring match β€” this is simple matching, not fuzzy scoring. If the same card name exists across multiple sets/printings and set_name isn't given, it silently returns the most recent printing rather than listing the alternatives (Enchanted/Epic/promo variants are gameplay-identical to the base card either way, so this rarely matters for stats β€” but a specific older printing's card ID/legality nuance won't surface without set_name). Card data (LorcanaJSON + duels.ink) is fetched live and cached on disk for 24h β€” see lorcana-mcp cache stats / cache clear if you suspect stale data right after a new set drops.

Usage guidelines: reach for this first when you already have a specific printed card name (even with the subtitle omitted, e.g. "Mirage") β€” it's the cheapest, most precise lookup. If it returns "no card found" for a name you're unsure is spelled/formatted correctly (informal phrasing, missing dashes, a likely typo, or a bare first name meant to cover several printings), retry with resolve_card instead, which fuzzy-matches and will disambiguate multiple candidates rather than failing outright. For browsing/filtering many cards by criteria instead of one known name, use search_cards.

Args: name: Card name, e.g. "Mirage - Super Recruiter" or just "Mirage". set_name: Optional set name to narrow the search, e.g. "Wilds Unknown".

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
set_nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so richly: exact-then-substring matching (not fuzzy), silent selection of the most recent printing when multiple exist without set_name, the consequence for older printings' IDs/legality, and live fetch with 24h disk caching plus cache-invalidation guidance. These are precisely the non-obvious behaviors an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core lookup purpose, then behavior, then usage routing. It is long, but nearly every sentence carries actionable detail (fallback matching, silent recency, caching); only mild tightening is possible without losing signal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value explanation is unnecessary, and the description still summarizes the payload (stats, abilities, legality). For a two-param lookup with no annotations, the behavioral, usage, and parameter context is complete enough to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it largely does: concrete examples for name ('Mirage - Super Recruiter' or just 'Mirage') and set_name ('Wilds Unknown'), plus the behavioral effect of omitting set_name. It doesn't explicitly note whether set_name must be an exact string or how mismatches behave, leaving a minor gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (look up), resource (one already-known Lorcana card), and the scope of the return (full stats, abilities, format legality) in one call. It clearly distinguishes itself from resolve_card (fuzzy) and search_cards (browsing), so an agent can route without opening siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names when to use this (specific printed card name, even with subtitle omitted), the exact failure condition under which to switch (a 'no card found' result for uncertain/informal/misspelled names), and the correct alternative in each case (resolve_card for fuzzy disambiguation, search_cards for browsing). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resolve_cardA

Resolve an informal, misspelled, or subtitle-less card name to specific card(s).

Unlike lookup_card's simple substring match, this tokenizes the query and scores it against every card's name and subtitle, tolerating missing dashes ("goofy musketeer"), missing subtitles ("Elsa" β€” which returns all her versions), word order, and minor typos ("musketer"). Use this when lookup_card fails or when you're not sure of a card's exact printed name.

Returns one of three shapes:

  • A single confident match: full card detail (same as lookup_card).

  • Multiple plausible matches: a ranked top-3 list with confidence scores, for you to disambiguate (e.g. "Pete" with no further qualifier, or a bare character name matching several printings).

  • No match: nothing scored above the noise floor.

Args: name: Informal, partial, or misspelled card name. set_name: Optional set name to narrow the search, e.g. "Wilds Unknown".

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
set_nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It reveals the tool's tolerance for typos, missing dashes, missing subtitles, and word order, and details the three possible return shapes (single match, top-3 list, no match). This gives the agent a complete understanding of what to expect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and efficient: a one-sentence summary, a brief behavior paragraph, a list of return shapes, and an Args block. Every sentence earns its place, and the format is easy for an agent to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists, the description covers all necessary context: the tool's purpose, its behavior, when to use it (vs. lookup_card), and the possible outcomes including the no-match scenario. It is comprehensive for a fuzzy-matching lookup tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides no parameter descriptions (0% coverage), but the description compensates fully. The Args section explains that `name` accepts informal, partial, or misspelled names, and `set_name` is an optional narrow with an example ('Wilds Unknown'). This adds significant meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with a specific verb ('Resolve') and resource ('informal, misspelled, or subtitle-less card name to specific card(s)'). It explicitly distinguishes this tool from lookup_card by contrasting its tokenization and scoring approach with substring matching.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides direct usage guidance: 'Use this when lookup_card fails or when you're not sure of a card's exact printed name.' This explicitly states when to use this tool and names the alternative (lookup_card), making the selection criteria clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_cardsA

Search the full Lorcana card pool (all sets, every printed card) by any combination of filters β€” not your collection. This is a discovery tool for "what cards fit X criteria", independent of what you own or have priced.

All filters are optional and ANDed together, except colors: a card matches if it has ANY of the given colors, so dual-ink cards surface for either half. Calling with no filters at all returns the entire card pool, paginated.

Behavior: always fetches from a live, in-process-cached copy of LorcanaJSON (see the "Card data APIs" reference) β€” never reads a local CSV, so results always include the newest released set. A card that has no Strength/Willpower/Lore (Action, Item, Location) shows "β€”" for those stats rather than being excluded. Results are grouped and displayed by ink color, then returned as one or more Markdown tables; when more results exist than limit, the response tells you the exact offset to pass next β€” call again with that offset rather than guessing pages.

Usage guidelines: use this to browse/filter by criteria (e.g. "every Evasive Sapphire character costing 3 or less") β€” if you already have a specific (possibly misspelled or subtitle-less) card name in mind, use resolve_card or lookup_card instead, they're cheaper and more precise for a single known card. Results carry no ownership or price information; to check what you already own, cross-reference the card names against an enriched collection CSV yourself, or use what_am_i_missing / find_song_synergies's collection_csv param for tools that do that automatically. To narrow to a specific play format's legal pool, combine with set_name, or post-filter the result against filter_collection's format logic.

Args: colors: Comma-separated ink color(s), e.g. "Amber,Steel". Case-insensitive. card_type: "Character", "Action", "Item", "Location", or "Song" (Action cards with the Song subtype). rarity: "Common", "Uncommon", "Rare", "Super Rare", "Legendary", "Enchanted", "Epic", "Iconic", or "Special". set_name: Set name substring, e.g. "Wilds Unknown". cost_min: Minimum ink cost, inclusive. Pass -1 (default) for no minimum. cost_max: Maximum ink cost, inclusive. Pass -1 (default) for no maximum. keyword: Keyword ability name, e.g. "Evasive", "Rush", "Bodyguard", "Shift". ability_text: Substring to search for in full ability text (case-insensitive). subtype: Subtype/classification, e.g. "Toy", "Hero", "Villain", "Princess". offset: Pagination offset, 0-based. limit: Max results in this page (default 25, capped at 200).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
colorsNo
offsetNo
rarityNo
keywordNo
subtypeNo
cost_maxNo
cost_minNo
set_nameNo
card_typeNo
ability_textNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so: it discloses the live cached LorcanaJSON source (never a local CSV), that newest sets are always included, that stat-less card types render 'β€”' rather than being dropped, the group-by-color output shape, and that pagination returns the exact next offset. These are behavioral traits an agent could not derive from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and usage are front-loaded and the Args block is tight and scannable, but there is mild redundancy (ownership/price independence is stated twice, and the format-legality sentence is convoluted). Slightly longer than it needs to be, though no section is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter optional-filter tool, this covers filtering semantics, defaults, pagination, data freshness, and edge-case rendering. An output schema exists, yet the description still usefully notes the Markdown-table/color-grouping return shape and no-price/no-ownership content, which is relevant to how the agent must post-process results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does for all 11 parameters: it defines AND semantics for filters, documents the ANY-of behavior for colors (dual-ink cards included), enumerates valid card_type and rarity values, explains the -1 sentinel for cost bounds, and gives examples for keyword, subtype, and set_name substring matching.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource (search the full Lorcana card pool) and immediately scopes it with a negation ('not your collection'), which is exactly the distinction that separates it from filter_collection and what_am_i_missing. An agent can classify this tool without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names concrete alternatives and the conditions that select them: resolve_card/lookup_card for a single known (even misspelled) name, what_am_i_missing or find_song_synergies for ownership, filter_collection for format legality. Also states that no filters returns the whole pool, so the boundary case is explicit rather than inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

what_am_i_missingA

Compare a deck list against your collection: what you already own, what's missing or short, and the estimated cost to complete it β€” the shopping-list counterpart to analyze_deck, which checks curve/legality but never looks at ownership.

Cross-references a raw deck list (same format as analyze_deck: 4x Card Name per line) against an enriched collection CSV. Card names are matched the same simple exact-then-substring way as lookup_card (not fuzzy like resolve_card); a name that doesn't resolve is dropped from the "Already have"/"Missing" tallies and listed separately under an "unresolved" section instead of being silently skipped β€” check that section if the totals look short. For every card you're short on, price comes first from the CSV's own TCG Market Price if you already own at least one printing (no network needed); only cards you own zero copies of fall back to a live TCGPlayer lookup via tcgcsv.com for the cheapest printing across all sets/rarities (gameplay is identical regardless of rarity or art). That fallback fetch only fires if at least one card actually needs it, and its price data is cached 24h β€” the reported total is always a snapshot, not a quote.

Usage guidelines: use this once you have a specific decklist in hand (hand-written, or build_deck's output) and want to know what to buy or borrow before playtesting it. It doesn't check Core Constructed legality or curve β€” run analyze_deck on the same list for that. If instead you want a deck built around what you can realistically complete rather than checking a fixed list, use build_deck(mode="ideal"), which folds this same ownership/pricing logic into deck construction itself.

Args: deck_list: Raw deck list text, one card per line (e.g. "4x Goofy - Musketeer"). collection_csv: Absolute path to an enriched Lorcana collection CSV.

ParametersJSON Schema
NameRequiredDescriptionDefault
deck_listYes
collection_csvYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden, and it does so richly. It discloses name-matching rules (exact-then-substring, not fuzzy), unresolved-name handling, output sections, pricing source order (CSV TCG Market Price first, tcgcsv.com fallback only for zero-owned cards), 24h caching, and that the total is a snapshot rather than a quote.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose and remains well structured with clear usage guidelines and args sections. Some pricing and matching details are verbose, but most sentences earn their place given the tool's complexity; a small amount could be trimmed without losing correctness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, low schema description coverage, and an existing output schema, the definition supplies all context an agent needs: scope, alternatives, matching behavior, failure handling, pricing logic, and usage sequence. Return values are covered by the output schema, so the description need not explain them further.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does for both required parameters: deck_list format and example, and collection_csv as an absolute path to an enriched CSV. It stops short of enumerating expected CSV columns, but for a 2-param tool with a sibling enrich_csv, the description adds meaningful semantics beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific comparison: deck list vs. collection, returning owned/missing/short cards and estimated completion cost. It explicitly distinguishes itself from analyze_deck (curve/legality) and build_deck(mode="ideal") (deck construction), so an agent can select it correctly without opening sibling schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives exact when-to-use criteria: after obtaining a specific decklist and before playtesting/buying. It names alternatives and the conditions that select them: analyze_deck for legality/curve, build_deck(mode="ideal") when building around collection constraints, and lookup_card/resolve_card for matching behavior.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 3 tool updatesv2.3.0
    • Changedbuild_deck3 fields changed
      • addedInput schema / properties / coconut_card
        Added value: +{
        +  "default": "",
        +  "title": "Coconut Card",
        +  "type": "string"
        +}
      • addedInput schema / properties / ink_colors / default
        Added value: +""
      • removedInput schema / required
        Removed value: -[
        -  "ink_colors"
        -]
    • Addedget_meta
    • Addedlist_printings
  2. 10 tool updatesv0.2.7
    • First observedanalyze_deck
    • First observedaudit_csv
    • First observedbuild_deck
    • First observedenrich_csv
    • First observedfilter_collection
    • First observedfind_song_synergies
    • First observedlookup_card
    • First observedresolve_card
    • First observedsearch_cards
    • First observedwhat_am_i_missing

TDQS

A4.6/5.0

Scored across 12 tools

Disambiguation4/5

The four card-name tools (lookup_card, resolve_card, list_printings, search_cards) overlap in surface area, but the descriptions explicitly delineate when to use each (exact vs fuzzy vs all printings vs filtered browsing). Collection/deck tools (filter_collection, what_am_i_missing, build_deck, analyze_deck) are clearly scoped to distinct tasks with cross-references. Minor residual risk of misselection between the fuzzy and exact lookup paths, but the guidance is unusually clear.

Naming Consistency4/5

Almost every tool follows a verb_noun snake_case pattern (resolve_card, enrich_csv, lookup_card, analyze_deck, list_printings, search_cards, filter_collection, audit_csv, build_deck). The only deviations are get_meta (still verb_noun, different verb family) and what_am_i_missing, which is a conversational phrase rather than a verb_noun pattern. Readable and predictable overall.

Tool Count5/5

Twelve tools is well within the ideal range and each earns its place across the distinct domains of card lookup, collection management, deck construction/analysis, and metagame data. No redundant or filler tools; no obvious missing category given the breadth of functionality present.

Completeness4/5

The surface covers the domain well: card resolution/lookup, collection enrichment/filtering/auditing, deck analysis/building/ownership-gap, song synergies, and metagame snapshots. Minor gaps exist (e.g. no deck-vs-deck comparison, no explicit collection update/edit tool beyond re-enrichment, no trade/binder tooling), but all core workflows have a path.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables Magic: The Gathering players to manage decks and access card information through Claude, supporting gameplay actions like drawing cards and mulligans while providing Scryfall API integration for card lookups.
    15
    -
  • A
    license
    C
    quality
    D
    maintenance
    A Model Context Protocol server that allows Claude to search and display Pokemon Trading Card Game cards with filtering by attributes like name, type, legality, and statistics.
    2
    16 npm
    12
    ISC
  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    Connects Claude to Spotify for music discovery, playlist creation, and collection analysis through natural language. Enables searching songs, analyzing music diversity, creating playlists, and getting recommendations using Spotify's API.
    -