latte-chan/scryfall-connector
If you are the rightful owner of scryfall-connector and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to dayong@mcphub.com.
The Scryfall MCP Server is a Model Context Protocol server that provides access to the Scryfall API, enabling AI assistants and MCP-compatible clients to interact with Magic: The Gathering card data.
Scryfall MCP Server
MCP server that exposes Scryfall (Magic: The Gathering) through simple, typed tools for MCP-compatible clients (Claude Desktop, Cursor, Continue, Zed, etc.). Now includes Commander Spellbook (combo database) integration.
Highlights
- High-level server API via
McpServerwith typed inputs/outputs - Tools for common queries: full-text search, by colors/CMC/format, and Tagger-based searches
- SSE or stdio transports
- Polite rate limiting and 429 backoff (Scryfall and Commander Spellbook)
- Optional local cache of Tagger tag lists
- Optional local index mapping Scryfall oracle_id → Commander Spellbook card id
Requirements
- Node.js >= 18.17
Install & Build
- Install:
npm install - Build:
npm run build
Run (stdio)
node dist/index.js
Run (SSE HTTP)
npm run start:sse- Env:
PORT=3000(default),CORS_ORIGIN=*(optional)
Docker
- Build:
docker build -t scryfall-mcp:latest . - Run (SSE):
docker run --rm -p 3000:3000 -v mcp_data:/data scryfall-mcp:latest - Override env:
SCRYFALL_INTERVAL_MS=100(rate limiter)TAGGER_CACHE_PATH=/data/tagger-tags.jsonSCRYFALL_BASE_URL=https://api.scryfall.comCSB_INTERVAL_MS=100(rate limiter for Commander Spellbook)CSB_BASE_URL=https://backend.commanderspellbook.comCSB_CARD_INDEX_PATH=/data/csb-card-index.jsonCSB_CARD_INDEX_TTL_MS=86400000
- Stdio transport:
docker run --rm -it scryfall-mcp:latest node dist/index.js
MCP Client Example (Claude Desktop)
{
"mcpServers": {
"scryfall": {
"command": "node",
"args": ["/absolute/path/to/dist/index.js"],
"env": {
"SCRYFALL_INTERVAL_MS": "100",
"TAGGER_CACHE_PATH": "C:/path/to/cache/tagger-tags.json"
}
}
}
}
Environment Variables
SCRYFALL_BASE_URL: API base URL (defaulthttps://api.scryfall.com)SCRYFALL_INTERVAL_MS: Minimum ms between requests (default100)SCRYFALL_MAX_RETRIES: Max retries on 429 (default3)SCRYFALL_RETRY_BASE_MS: Base backoff ms (default250)TAGGER_CACHE_PATH: Local JSON path for Tagger tag lists (default./cache/tagger-tags.json, Docker default/data/tagger-tags.json)
Commander Spellbook (CSB):
CSB_BASE_URL: API base URL (defaulthttps://backend.commanderspellbook.com)CSB_INTERVAL_MS: Minimum ms between requests (default100)CSB_MAX_RETRIES: Max retries on 429 (default3)CSB_RETRY_BASE_MS: Base backoff ms (default250)CSB_CARD_INDEX_PATH: Cache file path for oracleId→CSB id index (default./cache/csb-card-index.json)CSB_CARD_INDEX_TTL_MS: TTL for index reuse in ms (default86400000= 24h)
Tools (Scryfall)
search_cards— Full-text search using Scryfallqsyntax.get_card— Fetch a card byidorname(fuzzyoptional).random_card— Random card, optionalqfilter.autocomplete— Autocomplete card names.list_sets— All sets.get_rulings— Rulings by cardid.
Guided search tools (structured results):
search_by_colors— Params:colors,mode(exact|contains|at_most),identity,include_colorless,page.search_by_cmc— Params:min,max,colors,type,page.search_by_format— Params:format,status(legal|banned|restricted),colors,page.
Tagger-powered tools:
list_tagger_tags— Returns{ function: string[], art: string[] }from docs page (cached).search_by_function_tag— Params:tags[],match(any|all),colors?,format?,page?(usesotag:).search_by_art_tag— Params:tags[],match(any|all),colors?,type?,page?(usesarttag:).read_tagger_cache— Read cached tags without network.refresh_tagger_tags— Force refresh tags and write cache.
Notes:
- Many tools return
structuredContentwith compact card summaries:name,mana_cost,type_line,oracle_text,set,collector_number,scryfall_uri,image,prices. - Some basic tools return
contenttext (JSON stringified) for compatibility.
Commander Spellbook Tools
csb_parse_deck_text— Parse plain-text decklist to cards via CSB.- Input:
{ text: string }
- Input:
csb_find_combos_by_card_ids— Find combos included/almost-included by CSB numeric card IDs.- Input:
{ ids: number[], limit?: number, offset?: number }
- Input:
csb_variants_search— Search variants (combos) by filters likeuses(card id) orproduces(feature id).- Input:
{ uses?: number, produces?: number, of?: number, limit?: number, offset?: number }
- Input:
csb_card— Fetch CSB card by numeric id.- Input:
{ id: number }
- Input:
csb_build_card_index— Build and cache oracleId→CSB id index (paginates/cards).csb_read_card_index— Read the cached index without network.csb_lookup_by_oracle_ids— Map Scryfalloracle_idUUIDs to CSB numeric ids using the cached index.- Input:
{ oracleIds: string[] }
- Input:
csb_find_combos_by_names— Resolve names via Scryfall →oracle_id, map via cached index, then callfind-my-combos.- Input:
{ names: string[], fuzzy?: boolean, limit?: number, offset?: number }
- Input:
Notes:
- CSB’s
card-list-from-textexpectsContent-Type: text/plain(handled by the tool). - The
csb_find_combos_by_namestool benefits from building the index first: runcsb_build_card_indexonce per day or set a custom TTL.
API Etiquette
- All requests send a descriptive
User-Agent. - Default limiter targets ~10 req/s (100ms between starts) and backs off on HTTP 429, honoring
Retry-After(applies to both Scryfall and CSB).
Development
-
Build:
npm run build -
StdIO dev:
npm run start:stdio -
SSE dev:
npm run start:sse -
random_card:- Input:
{ q?: string }
- Input:
-
autocomplete:- Input:
{ q: string }
- Input:
-
list_sets:- Input: none
-
get_rulings:- Input:
{ id: uuid }
- Input:
Notes
- Scryfall rate limits: be respectful (they suggest up to ~10 requests/sec). This server does not add extra rate limiting; your client should avoid flooding requests.
- Responses are returned as JSON content for maximum fidelity; clients can post-process or render summaries.
SSE Transport Endpoints
- Events stream (server -> client via EventSource):
GET /sse - Messages endpoint (client -> server):
POST /messages
Point your MCP client’s SSE transport at these endpoints on your configured host/port.
Development
- Build:
npm run build - Start (built):
npm start - Edit source in
src/and rebuild.
License
No license specified. Add one if you plan to distribute.