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

Eleven 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.

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"). 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

Card data is cached locally for 24 hours at ~/.cache/lorcana-mcp/. 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

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

320 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

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.

  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 β€” 320 tests, all network-free (external calls are mocked).

  • Code layout: pure/testable logic lives in api.py (card data + fuzzy matching + pricing), deck.py (deck list parsing/analysis), and enricher.py (CSV pipeline). server.py only wraps those as MCP tools and formats output β€” keep it that way rather than putting logic directly in tool functions.

  • A release touches four files together: pyproject.toml (version), server.json (version, for the MCP Registry), CHANGELOG.md (entry), and this README if tool behavior changed. Check git log for the 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

10 tools
analyze_deckA

Analyze a raw deck list and return curve, composition, and legality stats.

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.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
deck_listYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses parsing behavior (accepted quantities, comment syntax), report contents (curve, inkable counts, legality, unresolved names), and notes the 'estimated' nature of lore-per-turn. This is thorough behavioral detail, though it does not explicitly address side effects or error handling.

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 concise yet information-dense. It front-loads the primary purpose, then provides necessary parsing and report details in a structured way without redundant or filler content. Every sentence adds value.

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 single parameter and existing output schema, the description is complete: it covers input syntax, edge cases, report items, legality rules, and unresolved-name reporting. No critical gaps remain for an agent to invoke this tool effectively.

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 only a bare string parameter with no description (0% coverage). The description fully compensates by explaining the expected format, examples, optional quantity, comment handling, and what the deck_list should contain. This is far beyond what the schema offers.

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 function: 'Analyze a raw deck list and return curve, composition, and legality stats.' This is a specific verb+resource pairing that distinguishes it from siblings like build_deck (construction) or lookup_card (single card lookup).

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?

The description provides clear context: it is for analyzing raw deck lists, with detailed input format and expected output. It does not explicitly name alternatives or give when-not-to-use guidance, but the scope is unambiguous enough to guide selection among sibling tools.

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 enriched Lorcana collection CSV against live API data.

Checks Ink color, Ink Cost, Card Type, Subtypes, Inkable, and stats (Strength / Willpower / Lore Points) for every non-promo card. Useful after a new set releases or if enrichment data looks suspicious.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
csv_pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

There are no annotations, so the description carries the full burden. It discloses what data is checked and that it excludes promo cards, but it does not describe the output format, whether it modifies the CSV, or any API-related behavior (e.g., rate limits, failure modes). The description adds value but leaves several behavioral aspects implicit.

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 concise and well-structured: a one-sentence summary, a brief detail paragraph, and a compact args section. Every sentence provides useful information without redundancy or fluff.

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

Completeness4/5

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

The tool has a single simple parameter and an output schema (not shown), so the description does not need to detail return values. It covers the core purpose, when to use it, and parameter semantics. It could mention that the audit involves live API calls and potential latency, but overall it is sufficiently complete for the tool's simplicity.

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?

The input schema only defines 'csv_path' as a required string with no description. The tool description adds meaningful semantics by specifying it must be an 'Absolute path to an enriched Lorcana collection CSV,' clarifying the exact expected input 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 uses a specific verb ('Audit') and resource ('enriched Lorcana collection CSV against live API data'), clearly stating the tool's function. It also enumerates exactly which fields are checked (Ink color, cost, card type, etc.), distinguishing it from sibling tools like enrich_csv or search_cards.

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?

The description explicitly states when the tool is useful ('after a new set releases or if enrichment data looks suspicious'), providing clear context for usage. It does not explicitly name alternative tools or exclusion scenarios, but the use cases are sufficiently specific.

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.

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. mode: "collection", "ideal", or "market". format: "core", "infinity", "core_zh", "core_ja", or "poorcana". 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoideal
formatNocore
ink_colorsYes
rotation_safeNo
collection_csvNo

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 fully carries the burden. It discloses heuristic behavior (curve/keyword-value optimization), ownership capping, honest shortfall reporting, pricing via tcgcsv.com, rotation restrictions, and the disclaimer at the bottom of results. It also explains the no-op/ignored parameter behavior, providing a transparent view of internal logic.

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 front-loaded with the core purpose and mode overview, then uses a bulleted list for modes and a labeled 'Args:' block. Every sentence adds distinctive informationβ€”no filler or redundant restatements. The length is justified by the tool's complexity (5 params, 3 modes, multiple formats).

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 and the absence of annotations, the description covers all essential aspects: parameter semantics, mode behavior, constraints, edge-case handling (shortfall, no-op), and pricing integration. An output schema exists, so not describing return values is acceptable, and the description mentions the disclaimer for result interpretation.

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%, but the description compensates completely by explaining every parameter: ink_colors format and allowed counts per format, the three mode values, accepted format values, collection_csv path requirements and when it's required/optional/ignored, and rotation_safe's conditional behavior. This far exceeds what the schema's bare titles/defaults provide.

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 function: 'Automatically assemble a legal, curve-balanced ~60-card decklist for an ink pair and format'. It specifies the verb (assemble), resource (decklist), and scope (modes, format), and differentiates from sibling tools like filter_collection or analyze_deck by focusing on deck generation rather than collection management or analysis.

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?

The description explicitly explains when to use each of the three modes ('collection', 'ideal', 'market') with conditions and outcomes, including details such as required collection_csv for 'collection', optional for 'ideal', and ignored for 'market'. It also notes the no-op behavior for rotation_safe in non-core formats and calls out the tool's limitations ('not multi-card combos or synergy packages'), which guides users to alternatives.

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.

Fetches card data from LorcanaJSON and lorcana-api.com and adds Ink color, Ink Cost, Card Type, Subtypes, Strength, Willpower, Lore Points, Inkable, Keywords, and Abilities to each row.

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

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.6/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It pays off by disclosing external API calls (LorcanaJSON, lorcana-api.com), output file creation, cache behavior, and price overwrite behavior. It stops short of mentioning rate limits, network requirements, or error handling, but the disclosed traits are substantial and accurate, a minor gap prevents a 5.

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 front-loaded: a one-sentence summary, a compact list of output files, then an Args section. No redundant words; each sentence adds information about the tool's operation or parameters, maintaining conciseness without sacrificing detail.

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 (3 parameters, external API calls, file outputs) and the existence of an output schema (which likely covers return values), the description is complete. It covers inputs, behavior, output file naming, and parameter semantics, providing an agent with enough context to select and invoke it correctly without ambiguity.

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%, and the description compensates fully. Each parameter gets a clear, purpose-driven explanation: input_path (absolute path to raw export), cache_path (speeds re-runs by skipping API calls), refresh_prices (overwrites with live tcgcsv lookup). This goes far beyond the schema's bare names and types, meeting the high need.

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 opens with a specific verb and resource: 'Enrich a raw TCGPlayer Lorcana CSV export with full card data.' It clearly distinguishes this from sibling tools like lookup_card or filter_collection by focusing on file transformation with API enrichment, and lists added fields and output files, making the purpose unmistakable.

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?

The description clearly implies the primary use case (processing a raw TCGPlayer export) and explains optional parameters for re-runs (cache_path) and price refreshing (refresh_prices). However, it does not explicitly state when not to use the tool or compare with alternatives like audit_csv, so it lacks explicit exclusions, though context is strong.

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 to cards legal in a specific play format.

Legality data comes from duels.ink, which tracks Core EN, Infinity, Core ZH, and Core JA rotation. Poorcana (Common/Uncommon only, 50-card min) is derived from the Rarity column in the CSV β€” no external lookup needed.

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.1/5.0
Behavior3/5

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

The description discloses the data provenance (duels.ink) and explains that Poorcana legality is derived from the Rarity column without external lookups. However, it does not mention side effects (e.g., whether it writes a new file or overwrites) or any other behavioral traits. With no annotations, this is a partial gap.

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 concise and well-structured: a one-sentence purpose, a brief note on data source, and a clear Args section. No wasted words; each sentence earns its place.

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

Completeness4/5

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

Given the moderate complexity (2 params, output schema present), the description covers the core context: what it filters, input requirements, and format definitions. It could be more explicit about what the output is (e.g., a new CSV, a printed table), but the output schema likely covers return structure. Overall, reasonably complete.

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 carries the full burden. It explains csv_path as 'absolute path to an enriched Lorcana collection CSV' and enumerates all format values with their string literals, adding meaning well 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?

The description clearly states the tool filters an enriched collection CSV to cards legal in a specific play format, using a specific verb+resource+scope. This distinguishes it from sibling tools like search_cards, build_deck, or enrich_csv, which have different purposes.

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

Usage Guidelines3/5

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

The description implies the tool requires an 'enriched collection CSV' (a precondition) and lists the supported formats, but it does not explicitly state when to use this tool versus alternatives or provide exclusions. Usage guidance is present but not fully explicit.

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, for free-song Singer combos.

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) or a raw cost threshold β€” not both.

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.

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.7/5.0
Behavior5/5

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

With no annotations provided, the description fully discloses behavioral traits: it explains the Singer keyword rule, how the matching works, the grouping order (Singer-keyword characters first, then cost-outright characters), and the effect of passing a collection_csv (flagging owned copies). It also transparently notes that song_name is fuzzy-matched the same way as resolve_card, adding cross-tool context.

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 the core purpose, followed by a clear explanation of the matching logic and a structured Args list. It is somewhat dense due to the detailed Singer explanation, but every sentence contributes necessary context. The structure is logical and easy to scan.

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 tool with 5 parameters, no annotations, and a moderately complex algorithm, the description is remarkably complete. It covers the singer matching rule, output grouping, each parameter's semantics, the optional CSV integration, and even references the fuzzy resolution behavior of a sibling tool. No significant missing context remains 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 description coverage is 0%, so the description must compensate and does so thoroughly. The Args section explains each of the 5 parameters (song_name, cost, colors, collection_csv, limit) with concrete examples and the mutual-exclusion constraint between song_name and cost. This goes far beyond the bare schema fields.

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 opens with a specific verb and resource: 'Find every Character that can sing a given song', clearly stating the tool's core function. It distinguishes itself from sibling tools like search_cards or lookup_card by focusing on song-character synergy and the Singer keyword mechanic. The detailed matching rule further clarifies the exact purpose.

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?

The description provides clear context for when to use the tool: to identify free-song Singer combos and discover which characters can sing a song. It also gives an explicit input constraint ('Provide either song_name ... or a raw cost threshold β€” not both') that acts as usage guidance. It does not explicitly name alternative sibling tools, but the specialized use case is evident.

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 a Lorcana card by name and return its full stats, abilities, and legality.

Searches LorcanaJSON for an exact name match, then falls back to partial match. Supplements with duels.ink data for format legality, structured abilities, and card image URL. If the same card exists in multiple sets, the most recent printing is returned unless set_name is specified.

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.6/5.0
Behavior4/5

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

With no annotations provided, the description carries the transparency burden. It discloses matching behavior (exact then partial), data sources (LorcanaJSON and duels.ink), set selection logic (most recent unless set_name is specified), and return contents (stats, abilities, legality, image URL). It does not mention error handling or rate limits, but for a read-only lookup this is fairly transparent.

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 concise and well-structured: a clear opener stating purpose and return value, two sentences covering matching and data sources, and a compact Args section. Every sentence adds useful information with no 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?

Given that an output schema exists, the description does not need to enumerate return fields in detail. It covers purpose, parameters, data sources, matching behavior, and edge cases like multiple printings. This is complete for a lookup tool with a small parameter set.

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 input schema only lists parameter names and a default, with 0% schema description coverage. The description fully compensates through an Args section: it explains that 'name' accepts exact or partial matches, provides examples, and clarifies that 'set_name' is optional and narrows the search. This adds essential 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 function: 'Look up a Lorcana card by name and return its full stats, abilities, and legality.' It specifies the resource (Lorcana cards), the action (look up by name), and key details like exact/partial matching and data sources, distinguishing it from broader search or filtering tools.

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?

The description gives clear usage context: provide a card name, optionally a set name to disambiguate. It explains fallback behavior and most-recent-printing behavior without explicitly naming alternatives. This is clear context with no exclusions, though it could have referenced sibling tools for stronger differentiation.

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 by any combination of filters.

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.

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.2/5.0
Behavior4/5

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

Even though no annotations are provided, the description discloses non-obvious behavior: all filters are ANDed except colors (which are ORed), colors and ability_text are case-insensitive, cost bounds are inclusive, and limit is capped at 200. This goes beyond the raw schema by explaining query semantics, though it omits error handling and auth/permission notes.

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 concise and front-loaded: a one-sentence purpose, a brief note on filter combination, then a clean Args list. Each parameter gets a single informative line with no redundancy. The structure is easy to scan and appropriately sized for 11 parameters.

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 11 parameters, zero schema descriptions, and an output schema present, the description covers all necessary context: full parameter semantics, filter logic, examples, and pagination details. It does not need to describe return values since the output schema exists, but it could benefit from a note on alternative tools, which is a separate dimension.

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%, but the description fully compensates by documenting every one of the 11 parameters: types, defaults, valid enum values for card_type and rarity, examples, and specific behavior like 'Pass -1 for no minimum/maximum'. This is exemplary parameter-level guidance.

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 opens with a specific verb+resource: 'Search the full Lorcana card pool by any combination of filters.' This clearly distinguishes it from siblings like filter_collection (which presumably filters a collection) and lookup_card (which likely fetches a single card). The scope is explicit and unambiguous.

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

Usage Guidelines2/5

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

No explicit guidance is given on when to use this tool versus alternatives. It does not mention 'use this when you need broad search' or contrast with lookup_card/resolve_card. The filter combination explanation implies usage but does not guide selection among siblings.

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 own, what's missing, and the estimated cost to complete it.

Cross-references a raw deck list (same format as analyze_deck: 4x Card Name per line) against an enriched collection CSV. For every card you're short on, first checks the CSV's own TCG Market Price (you already own at least one printing, so it's already there β€” no network needed). Only cards you own zero copies of fall back to a live TCGPlayer lookup via tcgcsv.com (cheapest printing across all sets/rarities β€” gameplay is identical regardless of rarity or art). That fallback fetch only happens if at least one card actually needs it, and its price data is cached 24h.

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.6/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. It thoroughly discloses behavioral traits: first checks CSV's own TCG Market Price for owned cards (no network), falls back to live TCGPlayer lookup only for zero-copy cards (cheapest printing), caches fallback data for 24 hours, and only fetches if actually needed. This goes beyond a simple 'read-only' hint and covers conditional behavior, data source, and caching.

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 longer than minimal, but every sentence adds value. It is front-loaded with a one-sentence summary, then details mechanics and args. It might be slightly dense, but no filler or redundancy. The structure with separate paragraphs and an Args section aids readability.

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

Completeness4/5

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

Given the output schema exists, return values need not be described. The description covers input formats, pricing logic, fallback behavior, and caching, which is thorough for a tool with two parameters. However, it does not mention error conditions (e.g., invalid CSV, missing cards in TCGPlayer lookup) or network dependencies beyond tcgcsv.com, leaving a small gap for full completeness.

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 input schema has 0% description coverage, but the description compensates fully. It explains deck_list is 'raw deck list text, one card per line (e.g. "4x Goofy - Musketeer")' and collection_csv is 'absolute path to an enriched Lorcana collection CSV.' It also mentions the expected format is identical to analyze_deck, giving clear semantic meaning beyond simple field names.

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 opens with a clear action: 'Compare a deck list against your collection: what you own, what's missing, and the estimated cost to complete it.' This states the specific verb (compare/cross-reference), resources (deck list and collection CSV), and output (owned/missing/cost). It also distinguishes from sibling tools like analyze_deck by explicitly focusing on collection comparison, not just deck analysis.

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?

The description gives context for when to use the tool: when you have a deck list and want to see collection completeness/cost. It references 'same format as analyze_deck,' implying analyze_deck is the alternative for deck-only analysis. However, it does not explicitly state 'use this instead of X when...' or list exclusions, so it's clear but not fully explicit.

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. 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.4/5.0

Scored across 10 tools

Disambiguation5/5

Each tool targets a distinct operation: CSV enrichment, filtering, auditing, exact/fuzzy card lookup, filtered search, song synergy, deck analysis, missing-card comparison, and deck building. lookup_card and resolve_card are clearly differentiated by exact vs. fuzzy matching with explicit guidance on when to use each.

Naming Consistency4/5

Tool names are almost entirely verb_noun in snake_case (filter_collection, enrich_csv, lookup_card, resolve_card, search_cards, find_song_synergies, audit_csv, analyze_deck, build_deck). 'what_am_i_missing' deviates from the verb-first pattern but is still readable and consistent in style.

Tool Count5/5

10 tools is well within the ideal 3-15 range for a focused Lorcana card game server. Each tool addresses a distinct aspect of collection management, search, and deck building without unnecessary bloat.

Completeness4/5

The toolset provides strong coverage of the domain: CSV enrichment, validation, format filtering, card lookup/search, song synergy, deck analysis, missing-card comparison, and deck building. Minor gaps like direct collection editing or set listing are not essential for the stated purpose.

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
    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.
    -