Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
LORCANA_APINoURL to fetch cards APIhttps://danielenricocahall.github.io/lorcana-mcp/allCards.json
LORCANA_CACHE_PATHNoLocal file path for caching fetched cardscards.json
LORCANA_SKIP_IF_DB_EXISTSNoSkip API fetch if cache file already contains cardstrue
LORCANA_REFRESH_ON_STARTUPNoAlways fetch from API on startup if truefalse
LORCANA_HTTP_TIMEOUT_SECONDSNoHTTP timeout in seconds60

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{
  "listChanged": true
}
logging
{}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
extensions
{
  "io.modelcontextprotocol/ui": {}
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
search_cardsA

Search Lorcana cards with optional filters. Returns card objects (not counts). Color must be one of: ruby, sapphire, emerald, amber, amethyst, steel. Use card_type to filter by card type: Character, Action, Item, Song, or Location. Use min_attack/max_attack and min_defence/max_defence for stat-based queries (e.g. 'characters with 4+ strength'). Use min_cost/max_cost for cost ranges. Use keyword to filter by Lorcana keyword (Bodyguard, Challenger, Evasive, Reckless, Resist, Rush, Shift, Singer, Sing Together, Support, Vanish, Voiceless, Ward, etc.) — matches against the structured ability list, more reliable than substring search. Use body_text to search card ability text — useful for value-specific keyword queries like 'Singer 5' or 'Resist +2', or for non-keyword phrases like 'gain 2 lore'. Use lore/min_lore/max_lore to filter by lore value. Use sort_by to order results (id, name, cost, strength, willpower, lore, rarity, set_code); use sort_order='asc' or 'desc'. Use set_code to filter by set number (e.g. '1' for The First Chapter). Use set_name to filter by set name as a case-insensitive substring (e.g. 'Wilds Unknown', 'frozen', 'Floodborn') — preferred when the user names a set in plain English so you don't have to look up the code first. Use offset to paginate through results (e.g. offset=20 for the next page). Use count_cards instead if you only need a total count. Set response_format='toon' to receive a TOON-encoded string instead of JSON objects (~10% fewer tokens; the printings array is nested so the savings are smaller than a purely flat schema would yield); default is 'json'.

count_cardsA

Count cards matching the given filters. Use this for questions like 'how many ruby cards are there?' or 'how many evasive characters?'. Supports stat ranges: min_attack/max_attack, min_defence/max_defence, min_cost/max_cost. Use keyword to filter by Lorcana keyword (Bodyguard, Challenger, Evasive, Reckless, Resist, Rush, Shift, Singer, Sing Together, Support, Vanish, Voiceless, Ward, etc.) — matches against the structured ability list. Use body_text for value-specific keyword queries like 'Singer 5' or 'Resist +2', or for non-keyword phrases like 'gain 2 lore'. Use lore/min_lore/max_lore to filter by lore value. Use card_type to filter by card type: Character, Action, Item, Song, or Location. Use set_code to filter by set number (e.g. '1' for The First Chapter). Use set_name to filter by set name as a case-insensitive substring (e.g. 'Wilds Unknown', 'frozen') — preferred when the user names a set in plain English. Color must be one of: ruby, sapphire, emerald, amber, amethyst, steel.

aggregate_cardsA

Return card counts grouped by a field. Valid fields: cost (ink curve), rarity, color, set_code, type. Examples: aggregate_cards('cost') for the ink curve, aggregate_cards('color') for color breakdown, aggregate_cards('rarity') for rarity breakdown, aggregate_cards('set_code') for set distribution.

top_traitsC

Return most common traits.

resolve_cardA

Resolve an informal, partial, or misspelled card name to the closest matching cards. Returns full card data (stats, abilities, cost, etc.) for each candidate — no follow-up query needed. Use this as follows:

  • 'Tell me about / get stats for X' → call resolve_card only, use the result directly.

  • 'Find cards that synergize with / work well with X' → resolve_card to get X's traits and abilities, then use those as inputs to search_cards.

  • 'Build a deck with X' → resolve_card to identify X, then search_cards for supporting cards. Never call search_cards first when the user has named a specific card — resolve_card avoids failed searches and retry loops. Example: 'Maui Half Shark' resolves to 'Maui - Half-Shark' as the top result.

export_deckA

Render a Lorcana deck as a Dreamborn/Pixelborn-compatible text deck list (<count> <full_name> per line, no sections, no set codes). Each entry is {name: str, count: int} where name is the card's full_name from search_cards (e.g. 'Mickey Mouse - Brave Little Tailor'). Returns plain text suitable for pasting into Dreamborn, Pixelborn, untap.in, or a Limitless tournament submission.

import_deckA

Parse a Dreamborn/Pixelborn-style deck list (<count> <full_name> per line) into resolved card objects. Each line is matched to a card by exact full_name first; lines that don't match exactly are returned in unresolved with the top fuzzy candidates so the user can disambiguate. Returns {parsed: [{count, card}], unresolved: [{raw, candidates}]}. Blank lines, comments (#, //), totals (Total: 60), and bracketed section headers are silently skipped.

validate_deckA

Validate a Lorcana deck against the format rules: at least 60 cards (no maximum — 60 is just the floor), max 4 copies of any card, max 2 distinct ink colors across the deck. Each entry is {name: str, count: int} where name is the card's full_name (e.g. 'Mickey Mouse - Brave Little Tailor'). Returns {legal: bool, total_cards, inks, violations: [...]}. Violation types: deck_size (under 60 — total below minimum), max_copies (>4 of one card), ink_limit (>2 distinct colors — also catches dual-ink cards adding a forbidden third color), unknown_card (name didn't resolve to a known card). If you have the output of import_deck, build the input as [{name: card.full_name, count: count}] for each parsed entry.

deck_statsA

Compute summary stats for a Lorcana deck: ink curve (copies at each cost), color split (copies per color — dual-ink contributes to BOTH buckets, so the sum may exceed total_cards), inkable/uninkable counts, and type breakdown (Character/Action/Item/Song/Location). Each entry is {name: str, count: int} where name is the card's full_name. Names that don't resolve are listed under unresolved and excluded from the per-card stats (but still counted in total_cards).

server_statusA

Show startup metadata for this server instance.

Prompts

Interactive templates invoked by user choice

NameDescription
build_deckGuide the user through building a legal Lorcana deck (60-card minimum). Accepts preferred color(s) and playstyle, then uses the available search and aggregation tools to suggest a full deck list with synergy notes.

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/danielenricocahall/lorcana-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server