mtga-mcp
This local MCP server lets you query and analyze your Magic: The Gathering Arena collection, decks, and game data using natural language, powered by your game logs and Scryfall enrichment.
Search & Owned Cards: Find cards by name, colors, rarity, set, or type, optionally filtering to only cards you own. List all owned cards with the same filters.
Missing from Set: Identify cards in a set where you lack a full playset (4 copies), with needed count and optional rarity filter.
Collection Summary: Get an overview of distinct owned cards, total copies, per-rarity breakdown, and current wildcard/currency balances.
Ad-hoc SQL: Run read-only SELECT queries directly against the local database tables.
Deck Management: Import decks from pasted text (Arena/MTGO format) or URLs (Archidekt/Moxfield), with optional metadata; list all stored decks; delete decks by ID or name.
Deck Analysis: Calculate the specific cards and wildcards needed to complete a stored deck (deck gap); rank cards by how many decks they would unlock (craft priority); suggest the best deck to build considering meta strength and your collection completeness, with filters for format and wildcard budget.
Wildcard History: View recent snapshots of wildcard and currency changes over time.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mtga-mcpWhich rares am I missing from FDN?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mtga-mcp
A local MCP server for querying your Magic: The Gathering Arena collection in natural language. It ingests MTGA's own card catalog, your owned cards from the game log, and Scryfall card data into a local SQLite database, then exposes query tools that any MCP client (Claude Desktop, Claude Code) can call.
Nothing leaves your machine except the one-time Scryfall bulk-data download. There is no model bundled here — your MCP client supplies the LLM.
How it works
Source | What it provides | Location (macOS) |
MTGA card catalog | Every card: name, set, collector #, rarity, colors |
|
Player.log | Cards you own + wildcard/currency balances |
|
Scryfall bulk | Oracle text, mana cost, prices, legalities, images | downloaded from scryfall.com |
The join key is MTGA's GrpId, which equals Scryfall's arena_id. Everything lands in
~/.local/share/mtga-mcp/mtga.db (override with MTGA_MCP_DATA_DIR).
Platforms. Defaults target a native macOS MTGA install. On Linux/NixOS running MTGA via Heroic (Wine/Proton) the files live inside the game's Wine prefix — point the tool at them with environment variables (no code changes):
Env var
What
MTGA_MCP_PLAYER_LOGfull path to
Player.log(prev log is inferred as a sibling)
MTGA_MCP_RAW_DIRdir holding
Raw_CardDatabase_*.mtga
MTGA_MCP_UTC_LOG_DIRdir of rotating
UTC_Log*.logfiles
MTGA_MCP_DATA_DIRwhere our own DB/caches live (default
~/.local/share/mtga-mcp)Under Heroic these are typically at
<prefix>/drive_c/users/<user>/AppData/LocalLow/Wizards Of The Coast/MTGA/…(Player.log, andDownloads/Rawfor the card DB).
Related MCP server: iwantmymtg-mcp
Setup
uv syncStep 0 — enable MTGA Detailed Logs (required for owned counts)
MTGA only writes your collection to Player.log when detailed logging is on:
In MTGA: Settings → Account → check "Detailed Logs (Plugin Support)".
Restart MTGA and open your Collection screen once.
The card catalog and Scryfall data work without this; only owned quantities need it.
Import data
uv run mtga-mcp import # runs all three steps
# or selectively:
uv run mtga-mcp import --catalog # ~19.7k cards from MTGA
uv run mtga-mcp import --collection # your owned cards + wildcards
uv run mtga-mcp import --scryfall # enrich (downloads a ~77MB bulk file, cached)Re-run import --collection whenever your collection changes; re-run --scryfall
occasionally for new sets/prices (it only re-downloads when Scryfall has newer data).
Full collection (recommended): memory-scanner export
Modern MTGA clients no longer log the full owned-card list — import --collection only
recovers wildcards plus new card grants captured going forward, never cards you already
owned. To get the complete collection, export-collection reads it straight out of the
running client's memory. (The scanner is adapted from the MIT-licensed
MTGA-collection-exporter; see
LICENSES/mtga-collection-exporter-MIT.txt.)
With MTGA running and the Collection screen opened once, and the card catalog already imported
(uv run mtga-mcp import --catalog):
uv run mtga-mcp export-collection # interactive: sudo password + confirm anchor cardsThe command self-elevates: on macOS, if it isn't already root it re-execs itself under
sudo up front (before anchors are chosen), passing your data-dir/DB path through so writes
land in your home, not root's, and hands the DB back to you afterward. scripts/export-collection.sh
remains as an equivalent wrapper (it also runs uv sync first).
It's interactive by design:
sudo — the macOS scan uses
task_for_pid, which needs root, so you'll be prompted for your password. The target MTGA process must not use the hardened runtime (the Heroic/native build is fine).anchor cards — the scanner locates your collection in memory by searching for the exact
(card, quantity)of a few cards you own. It proposes ~5 rares/mythics pulled from your last-imported collection and lets you confirm or adjust them (e2to edit a quantity,ato add,d2to drop, Enter to accept). The quantities must match what you own right now, so edit any that changed since your last export. On a first-ever run (empty collection) you add a few cards manually. Run it in a real terminal; don't pipe its stdin.
This replaces the collection table with an authoritative, point-in-time snapshot (exact
per-printing counts). Re-run it whenever you want to refresh.
A legacy mtga_collection.json produced by the upstream exporter can still be loaded with
mtga-mcp import-collection <file>.
Maintaining the scanner. src/mtga_mcp/memory_export.py is derived from
MTGA-collection-exporter. A pristine copy of the upstream source we ported from lives at
third_party/mtga-collection-exporter/mtg.py (reference only — not imported). To pull upstream
fixes, run scripts/update-exporter-reference.sh to diff newer upstream against that baseline,
port the relevant hunks into memory_export.py, then re-run with --accept to advance the
pinned commit. See third_party/mtga-collection-exporter/UPSTREAM.md.
Use it from an MCP client
Claude Code
claude mcp add mtga -- uv --directory /Users/scott/git/mtga-mcp run mtga-mcp serveClaude Desktop
Add to claude_desktop_config.json:
{
"mcpServers": {
"mtga": {
"command": "uv",
"args": ["--directory", "/Users/scott/git/mtga-mcp", "run", "mtga-mcp", "serve"]
}
}
}Then ask things like:
"How complete is my collection? Show the per-rarity breakdown and my wildcards."
"Which rares am I missing from FDN?"
"List blue instants I own that are Standard-legal."
Tools exposed
Tool | Purpose |
| Filter by name / colors / rarity / set / type; optional |
| Cards you own (count ≥ 1), same filters |
| Cards in a set you haven't got a playset (4) of, with a |
| Distinct owned, total copies, per-rarity breakdown, wildcards |
| Ad-hoc read-only |
| Import a decklist from pasted text or an Archidekt/Moxfield URL |
| List stored decks |
| Cards + wildcards needed to complete a deck |
| Which cards to craft to unlock the most decks |
| Best Bo1/Bo3 deck you could build, meta strength × buildability |
| Remove a stored deck |
| Recent history of wildcard/currency balances (from scheduled capture) |
Database tables: cards, collection(grp_id, count), wildcards(kind, count), meta,
decks, deck_cards, inventory_raw, inventory_history.
Deck buildability
Import meta decks (or your own brews), then ask what you're missing and what to build.
# Import from pasted Arena/MTGO text (tag it with meta info for ranking):
pbpaste | uv run mtga-mcp deck import --paste --name "Mono-Red" --format Standard \
--best-of 1 --meta-share 0.18
uv run mtga-mcp deck import --file list.txt --name "Dimir Midrange" --best-of 3 --tier 1
# Import from a deck host with a public API:
uv run mtga-mcp deck import --url https://archidekt.com/decks/1234567
uv run mtga-mcp deck import --url https://www.moxfield.com/decks/AbCdEf
uv run mtga-mcp deck gap "Mono-Red" # cards + wildcards you still need
uv run mtga-mcp deck best --best-of 1 # best deck you can build right now
uv run mtga-mcp deck craft-priority # what to craft to unlock the most decksThe north-star query — "given my cards and the current meta, what's the best Bo1/Bo3
deck I could build?" — is deck best, which ranks decks by meta strength × how few
wildcards you're missing. Strength comes from the --tier / --meta-share / --win-rate
you supply at import (meta sites don't expose this programmatically); with none supplied it
ranks purely by buildability.
Decks containing cards not legal in their format (rotated or banned, per the Scryfall
legalities) are excluded by default — a "best deck" you can't actually play isn't an answer.
Pass --include-illegal to keep them, flagged with format_legal and the offending
illegal_cards. Formats without legality data (Alchemy/Timeless) are never excluded on those
grounds.
A note on meta-deck sources
The big meta sites (MTGGoldfish, Untapped, AetherHub, mtgdecks) actively block automated
access — Cloudflare, robots ai-train=no, blocked bot user-agents, and blocked export
endpoints. So this tool imports decklists from pasted text and deck-host public APIs
(Archidekt, Moxfield) instead. A best-effort MTGGoldfish scraper exists behind an explicit
--allow-scrape flag but is brittle and may fail; pasting the Arena export (one click in your
browser) is the reliable path.
Scheduled capture (wildcards + future card deltas)
Modern MTGA clients don't log your full owned-card collection — only InventoryInfo
(wildcards/currency, plus a Changes delta array that's populated on real acquisition events:
pack opens, precon grants, bundle/voucher redemptions). Player.log also rotates, so those
payloads are ephemeral. mtga-mcp capture archives every distinct InventoryInfo payload
into inventory_raw (deduped by content hash — SeqId resets every MTGA session, so it's not
a safe dedup key on its own), records a wildcard/currency snapshot in inventory_history, and
applies any Changes[].GrantedCards entries to the collection table. Running it on a
schedule accumulates a timeline and owned-card deltas as packs are opened / new sets
release.
Caveat: collection counts built this way only reflect deltas captured since capture
started running — there's no full historical collection to reconcile against, since modern
clients don't log one. A card you owned before capture ran (and haven't been granted again
since) won't show up.
uv run mtga-mcp capture # skips instantly if the logs haven't changed since last run
uv run mtga-mcp history # recent wildcard/currency snapshotscapture stat-checks the logs and skips all parsing when they're unchanged (i.e. when
you're not playing), so a frequent schedule costs almost nothing at idle.
Run it automatically
macOS (launchd): edit packaging/com.mtga-mcp.capture.plist (replace __REPO__ and
__LOG__), copy to ~/Library/LaunchAgents/com.mtga-mcp.capture.plist, then:
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.mtga-mcp.capture.plist
# unload with: launchctl bootout gui/$(id -u)/com.mtga-mcp.captureLinux/NixOS (systemd user timer): run .venv/bin/mtga-mcp capture from a *.service on a
15-minute *.timer, with the MTGA_MCP_* path vars (above) set in the unit's Environment=.
If a path contains spaces (common under Wine prefixes, e.g. .../Magic The Gathering Arena/...), quote the whole VAR=value assignment — Environment="VAR=/path with spaces" — not just the value, or systemd word-splits it into several broken assignments. See
docs/latitude-setup.md for a full worked example, including doing
this declaratively via home-manager's systemd.user.services/timers.
Sharing findings across machines (Syncthing)
To use one database across several machines (e.g. macOS + a Linux/NixOS laptop), keep the DB in a synced folder and leave the big regenerable Scryfall cache local:
export MTGA_MCP_DB_PATH=~/Documents/mtga-mcp/mtga.db # inside your Syncthing folder
# DATA_DIR (Scryfall cache, ~74 MB) stays local and is NOT synced.Set MTGA_MCP_DB_PATH everywhere the tool runs: your shell profile, the capture LaunchAgent
(EnvironmentVariables), and the MCP client config (env block of the server entry). Then
append packaging/syncthing.stignore to the .stignore at the root of the synced folder so
SQLite's transient -journal/-wal/-shm sidecars aren't synced.
This is safe because MTGA runs on only one device at a time, so the two machines never
write the DB concurrently; the ~11 MB mtga.db (decks, wildcards, inventory history) syncs as
a single clean file.
Development
uv run pytestNot yet implemented (ideas)
Auto-refreshing meta snapshots, live log-watching, deck similarity/clustering, non-English card names.
Available Tools
11 toolsbest_buildable_deckA
The best deck you could build given your cards and the meta. Ranks stored decks by meta strength x buildability. Filter by best_of (1 or 3) and format; max_wildcards hides decks needing more than that many wildcards.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | ||
| best_of | No | ||
| max_wildcards | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of explaining behavior. It discloses the ranking mechanism and the max_wildcards filter's effect. While it doesn't mention side effects (likely none) or prerequisites like requiring a collection, the core behavior is transparent and not misleading.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the main purpose, and every sentence contributes essential information. No redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (3 optional params, output schema present), the description fully covers purpose, usage, and parameters. The output schema handles return values, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 0% schema coverage, the description explicitly explains all three parameters: best_of ('1 or 3'), format, and max_wildcards ('hides decks needing more than that many wildcards'). This fully compensates for the missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: ranking stored decks by 'meta strength x buildability' given the user's cards and meta. This distinguishes it from sibling tools that search cards or manage decks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for use ('given your cards and the meta') and explains filter options, but it does not explicitly compare with alternatives like deck_gap or craft_priority. Usage is clear, but exclusions or when-not-to-use are absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
collection_summaryA
Collection overview: distinct owned, total copies, per-rarity breakdown, and wildcard/currency balances.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description must convey behavioral traits. It implies a read-only overview with the listed data points, but does not explicitly state that it makes no modifications, nor does it mention authentication or rate limits. This leaves room for ambiguity, though the nature of a summary implies a safe query.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that succinctly lists the key content categories. Every word earns its place with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless tool with an output schema, the description is largely complete, covering the main summary dimensions. It could be improved by explicitly noting that no parameters are required and confirming the read-only nature, but these are minor omissions given the simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the empty schema covers all inputs at 100% coverage. The description adds no parameter details, but they are not needed; a baseline of 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource (collection) and specifies the scope of the overview (distinct owned, total copies, per-rarity, wildcard/currency balances). It lacks an explicit verb and does not explicitly contrast with sibling tools like owned_cards, but the content clearly conveys a summary operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use collection_summary versus sibling tools such as owned_cards or missing_from_set. The description only states what the tool returns, not the appropriate context for invoking it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
craft_priorityA
Across all stored decks (optionally one format), rank cards to craft by how many decks they would unlock, then by how many decks need them.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses the two-step ranking logic and the optional format filter. It does not detail return structure, but an output schema exists, and the behavior described is consistent and non-mutating.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that is direct, front-loaded, and free of filler. It earns its place by explaining the core behavior and ranking criteria.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one optional parameter and an output schema, the description fully explains what the tool does and how it prioritizes, making it complete for an agent to select and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has only 'format' with no description, and coverage is 0%. The description clarifies that format is optional and restricts to one format, adding meaningful context beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('rank') and resource ('cards to craft') across stored decks, and clearly states the ranking criteria (unlock count, then need count). This distinguishes it from siblings like deck_gap or best_buildable_deck.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context: operates across all stored decks, optionally filtered by format. It does not explicitly name alternatives or exclusion cases, but the context is sufficient for most use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deck_gapA
Cards and wildcards needed to complete a deck (by id or name), given your collection. Basics are excluded; copies are capped at a playset (4).
| Name | Required | Description | Default |
|---|---|---|---|
| deck | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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 explicitly states that basics are excluded and copies are capped at a playset of 4, which are important constraints not visible in the schema. It also clarifies the deck identifier can be by id or name. It doesn't mention error handling or read-only guarantees, but the core behavior is well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the primary purpose and follows with two important constraints. There is no wasted wording, and all information contributes to understanding the tool's behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple single-parameter schema and the existence of an output schema, the description covers the essential behavior and edge-case constraints (basics excluded, cap at 4). It does not address potential confusion with similar sibling tools like 'missing_from_set', but for its simplicity it is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only has a 'deck' string with no description, so the description compensates by stating that the deck can be specified by id or name. This adds meaningful semantics to the otherwise opaque parameter. It doesn't provide formatting examples, but enough is given to understand the parameter's purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what the tool returns: cards and wildcards needed to complete a deck. It distinguishes from siblings like 'missing_from_set' by focusing on decks rather than entire sets. However, it lacks an explicit action verb (e.g., 'calculates' or 'lists'), so it is not a perfect 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The implied usage is to determine the missing cards for a given deck using the user's collection. It does not explicitly mention alternatives or when not to use it, but the purpose makes the primary use case clear. No exclusions or sibling comparisons are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_deckA
Delete a stored deck by id or name.
| Name | Required | Description | Default |
|---|---|---|---|
| deck | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden for behavioral disclosure. It does not mention that deletion is permanent/irreversible, any required permissions, or side effects on associated data, which is critical for a destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no redundant wording. Every word contributes to the meaning, making it highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the description covers the core purpose and parameter semantics, it omits important context for a delete tool, such as irreversibility or behavior when the deck is not found. The presence of an output schema helps, but the destructive nature requires additional disclosure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides only the parameter name 'Deck' with type string and no description. The description adds meaning by clarifying that the deck can be identified by id or name, which is essential for using the parameter correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (delete) and the resource (stored deck), with the scoping detail 'by id or name.' This distinguishes it from sibling tools like list_decks and import_deck.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives, nor any prerequisites or exclusions. The description merely states what the tool does without contextual usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_deckA
Import a decklist and store it for buildability analysis. Provide exactly one of text (pasted Arena/MTGO list) or url (Archidekt or Moxfield). Optional meta metadata: best_of (1 or 3), tier, meta_share (0..1) feed the best_buildable_deck ranking. Set allow_scrape=true to attempt an MTGGoldfish URL (unreliable). Returns the deck id and any card names that couldn't be matched.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| name | No | ||
| text | No | ||
| tier | No | ||
| format | No | ||
| best_of | No | ||
| meta_share | No | ||
| allow_scrape | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses that the deck is stored, the return value (deck id and unmatched card names), and that scraping is unreliable. It doesn't mention side effects like duplicate handling or failure behavior, but it's reasonably transparent for an import operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, front-loaded with the main purpose, followed by param details and return value. Every sentence adds value with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an import tool with 8 parameters and no annotations, the description covers the essential aspects: what, how, special cases, and expected output. It omits details on `name` and `format`, and doesn't discuss error scenarios, but it's adequate for a well-scoped tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the burden. It explains most parameters: `text` (Arena/MTGO list), `url` (Archidekt/Moxfield), `best_of` (1 or 3), `meta_share` (0..1), `tier`, and `allow_scrape`. However, `name` and `format` are not described, leaving a small gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool imports a decklist and stores it for buildability analysis, distinguishing it from siblings like list_decks and search_cards. The verb 'import' and resource 'decklist' are specific and the purpose is explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear usage context by specifying that exactly one of `text` or `url` must be provided, and explains when `allow_scrape` is appropriate (MTGGoldfish, though unreliable). However, it doesn't explicitly name alternative tools or say when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_decksA
List stored decks with format, best_of, tier and source.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral disclosure burden. 'List' clearly implies a read-only operation, and the specified fields indicate what is returned. However, it does not disclose details such as ordering, potential pagination, or whether all stored decks are always included, leaving some 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that states the action, the target, and the key attributes. Every word contributes meaning; there is no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (zero parameters) and the presence of an output schema, the description adequately covers the essential context. It could mention that it lists all decks without filters, but for a straightforward list operation the current description is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema coverage is 100% (empty properties). The description adds no parameter semantics, but none are needed. The baseline for 0 parameters is 4, and the description does not obstruct or complicate parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') with a clear resource ('stored decks') and enumerates the included attributes ('format, best_of, tier and source'). This clearly distinguishes it from sibling tools like 'search_cards' or 'owned_cards', which target different resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when you need to see stored decks, but it does not explicitly state when to prefer this tool over alternatives like 'collection_summary' or 'query_sql'. There is no mention of exclusions or context, but the simple listing purpose is reasonably inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
missing_from_setA
Cards in a set the player hasn't completed a playset (4) of. Returns a 'needed' count per card. Optional rarity filter.
| Name | Required | Description | Default |
|---|---|---|---|
| rarity | No | ||
| set_code | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of explaining behavior. It discloses the core computation ('hasn't completed a playset (4)') and output shape ('needed count per card'), but it does not mention ordering, inclusion of zero-count cards, or behavior when the set is fully completed. These gaps leave some behavioral context unspecified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences convey purpose, output, and filtering capability. The description is front-loaded and every word adds value—no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple filtered-query tool with an output schema (which covers return details), the description is mostly sufficient: it communicates the main operation, the output count, and the optional filter. It lacks explicit usage guidance and parameter format details, but given the low complexity, the coverage is good.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 adds meaning to 'rarity' by calling it an 'Optional rarity filter', but it does not explain the format or allowed values for rarity, nor does it explicitly connect 'set_code' to the set identifier beyond the schema's property name. Partial compensation only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies what the tool does: 'Cards in a set the player hasn't completed a playset (4) of' names the resource (set) and the specific filtering logic. It also states the output ('Returns a 'needed' count per card'), which distinguishes it from siblings like deck_gap (deck-focused) and search_cards (general card search).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context—finding cards needed to complete playsets in a given set—but does not explicitly state when to use this tool versus alternatives, nor does it provide exclusions or alternate tool recommendations. It is functional but lacks direct guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
owned_cardsA
List cards the player owns (owned count >= 1), with the same optional filters as search_cards.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| limit | No | ||
| colors | No | ||
| rarity | No | ||
| set_code | No | ||
| type_contains | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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 discloses the 'owned count >= 1' filtering behavior, which is useful. However, it does not mention other traits like pagination, default limit behavior, or read-only nature beyond the implied 'List' action. It adds some context but not rich behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that conveys the core purpose and a key filter reference. Every word is useful, with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple list operation and the presence of an output schema, the description covers the essential context: what is listed and the filter inheritance. It could be more complete by mentioning limit behavior or output formatting, but the schema and tool name fill in many gaps. Overall, it is sufficient for this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 only says 'same optional filters as search_cards' without explaining any parameter or its semantics. The parameter names are self-explanatory, but the description adds minimal value for understanding their usage or constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists cards the player owns, with a specific condition (owned count >= 1) and references the same filters as search_cards. This distinguishes it from search_cards (which likely searches all cards) and conveys a concrete action on a specific resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool (when you need owned cards) and references search_cards for filter behavior, providing context. However, it does not explicitly state when not to use it or name direct alternatives, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_sqlA
Run an ad-hoc read-only SELECT against the collection database. Tables: cards, collection(grp_id,count), wildcards(kind,count). Join collection on cards.grp_id for owned counts.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It clearly states 'read-only SELECT' (safe, non-mutating) and lists the tables and join key, which tells the agent what data can be accessed. It does not mention auth, rate limits, or query limitations, but the read-only disclosure plus table schemas is substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core action ('Run an ad-hoc read-only SELECT') followed by the supported tables and join hint. No filler or repetition; every clause adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (2 params, output schema exists) and the description covers the purpose, safety, and data model. It could be improved by explaining the limit parameter and when to prefer this over siblings, but given the output schema and simple interface, it is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description compensates by documenting the target tables and columns (cards, collection(grp_id,count), wildcards(kind,count)) and showing the join relationship. It does not explicitly explain the 'limit' parameter or provide SQL syntax examples, but the table inventory gives meaningful context for constructing the 'sql' string.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Run an ad-hoc read-only SELECT') and identifies the exact resource ('collection database') and tables (cards, collection, wildcards). This clearly distinguishes it from sibling tools like search_cards or collection_summary, which are purpose-built, whereas this is a generic SQL query tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context that this tool is for ad-hoc read-only SQL queries, which implies it should be used when the dedicated sibling tools do not cover a custom query. However, it does not explicitly state when not to use it or name alternatives, so it stops short of full exclusionary guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_cardsA
Search cards by name/colors/rarity/set/type. colors is WUBRG letters; set_code is the 3-letter set. Set owned_only=true to restrict to cards the player owns.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| limit | No | ||
| colors | No | ||
| rarity | No | ||
| set_code | No | ||
| owned_only | No | ||
| type_contains | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It does disclose the default scope (all cards) and the effect of owned_only, as well as the WUBRG encoding. However, it omits details like result format, pagination, or authentication requirements, leaving significant behavioral gaps for a tool with no annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with two efficient sentences. The first sentence front-loads the core purpose, and the second adds essential format hints without unnecessary information. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 parameters) and the presence of an output schema, the description is mostly complete. It covers the main search dimensions and provides key format hints. Minor gaps like the explicit meaning of 'type_contains' and the limit parameter are partially addressed by the schema's titles and defaults, making the description adequate overall.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 adds crucial semantics for colors (WUBRG letters), set_code (3-letter set), and owned_only. However, it fails to explain limit and does not explicitly clarify the type_contains parameter, leaving some parameters underspecified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as a card search with specific criteria (name, colors, rarity, set, type). It distinguishes itself from sibling tools like owned_cards by the inclusion of an owned_only filter, implying a broader default search scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the description of search filters and the owned_only option, but there is no explicit guidance on when to use this tool versus alternatives such as owned_cards or query_sql. The absence of alternative comparisons leaves the usage context somewhat implicit.
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.
11 tool updates
v0.1.0- First observed
best_buildable_deck - First observed
collection_summary - First observed
craft_priority - First observed
deck_gap - First observed
delete_deck - First observed
import_deck - First observed
list_decks - First observed
missing_from_set - First observed
owned_cards - First observed
query_sql - First observed
search_cards
TDQS
Scored across 11 tools
Most tools have distinct purposes, but search_cards with owned_only=true overlaps with owned_cards. Otherwise each tool targets a clear, separate function (searching, collection summary, deck import, gap analysis, etc.).
Names are readable and exclusively snake_case, but conventions vary: some are verb_noun (search_cards, import_deck, list_decks, delete_deck) while others are noun or adjective phrases (owned_cards, collection_summary, deck_gap, best_buildable_deck). No consistent pattern.
11 tools is well-scoped for the MTGA collection and deck analysis domain. Each tool fills a distinct role without unnecessary bloat, and the count feels appropriate for the server's purpose.
The set covers card search, collection overview, deck import/list/delete, and deck-building assistance, but lacks a tool to view a stored deck's full card list. This is a notable gap for analysis and verification workflows, though query_sql can partially address collection data if needed.
Maintenance
Related MCP Connectors
Connect to your CollectHolo Pokémon card collection. Check your portfolio value, look up card, sealed and graded (PSA/BGS/CGC) prices from Cardmarket, TCGplayer, eBay, Goldin and Fanatics, search the catalog in six languages, import a whole collection from a spreadsheet, and add or update holdings in plain language. Every change asks for confirmation.
Scryfall MCP — Magic: The Gathering card database.
Query your warehouse or a CSV with Claude/ChatGPT over MCP, governed by table-level ACL + audit.
MCP server for searching Airweave collections with natural language queries.
Related MCP Servers
- AlicenseAqualityCmaintenanceMagic: The Gathering MCP server with card search, rules lookup, deck analysis, and Commander intelligence1440 npm4MIT
- AlicenseAqualityAmaintenanceMCP server for I Want My MTG that enables conversational search of Magic: The Gathering cards/sets and inventory management via API tools.6082 npm1MIT
- AlicenseAqualityDmaintenanceProvides AI assistants with 69 tools, 19 prompts, and 21 resources for deep access to Magic: The Gathering, including card data, combos, draft analytics, Commander metagame, competitive constructed, sideboard strategy, deck building, and rules engine, working with any MCP client.5620MIT
- AlicenseNot gradedqualityCmaintenanceEnables querying multi-language trading card game data (Pokémon TCG and more) through natural language or direct tools, integrated with Pipeworx MCP gateway.16 npmMIT