MTG Tools MCP
An MCP server for Magic: The Gathering Commander players that allows agents to review decklists, upgrade precons, reduce costs, adjust brackets, and build mana bases. It supports importing decks, searching cards, and planning collections with budget constraints.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://landfiller.app/mtg/mcpWhat you can do with it
- Review a Commander deck and suggest budget swaps
- Build a mana base for a specific commander under a budget
- Search for Commander-legal cards by name or syntax
- Plan a multi-deck collection with a shared purchase budget
Source and maintenance
- Maintenance checked
Protocol and capabilities
- Server
- mtg-tools 2.7.1
- MCP protocol
- 2025-06-18
- Tools
- 13 advertised
- Resources
- Not advertised
- Resource templates
- Not advertised
- Prompts
- Not advertised
{
"tools": {
"listChanged": true
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
13 advertised
search_commanders — Search Commander cards
Find Commander candidates by name. The existing autocomplete may include non-commander cards; only the primary field is validated as a supported Commander choice. Use the exact commander name for build_mana_base.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"query"
],
"properties": {
"query": {
"type": "string",
"maxLength": 100,
"minLength": 2
},
"qaTest": {
"type": "boolean",
"const": true,
"description": "Internal QA only: set true when the user explicitly says this is our test run. Excludes the call from usage/revenue statistics. Omit for normal player requests."
}
}
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}build_mana_base — Build a Commander mana base
Generate 30–42 lands for a Commander within a USD purchase budget, optionally with acceleration. Supply ownedLands to buy only missing copies, lockedLands to keep specific lands, or currentLands with maxChanges for a limited upgrade. The USD budget minimum remains $20; it is a spending cap, not a target. Returns card quantities, reasoning, prices, coverage, warnings, and shopping links. Preview only: no saved build, email, purchase, or cart modification. Shopping imports match by card name; printing and final prices may differ. Always show warnings rather than describing a deficient build as optimal.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"commanderName"
],
"properties": {
"qaTest": {
"type": "boolean",
"const": true,
"description": "Internal QA only: set true when the user explicitly says this is our test run. Excludes the call from usage/revenue statistics. Omit for normal player requests."
},
"bracket": {
"type": "integer",
"default": 3,
"maximum": 5,
"minimum": 1
},
"budgetUsd": {
"type": "number",
"default": 100,
"maximum": 10000,
"minimum": 20
},
"landCount": {
"type": "integer",
"default": 37,
"maximum": 42,
"minimum": 30
},
"maxChanges": {
"type": "integer",
"default": 3,
"maximum": 10,
"minimum": 1,
"description": "Maximum replaced land slots when currentLands is supplied."
},
"ownedLands": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"quantity"
],
"properties": {
"name": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"quantity": {
"type": "integer",
"maximum": 99,
"minimum": 1
}
}
},
"default": [],
"maxItems": 300,
"description": "Land copies already owned; budget and cart charge only missing quantities."
},
"lockedLands": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"quantity"
],
"properties": {
"name": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"quantity": {
"type": "integer",
"maximum": 99,
"minimum": 1
}
}
},
"default": [],
"maxItems": 300,
"description": "Required lands to retain, including quantities. Must be legal and not excluded."
},
"currentLands": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"quantity"
],
"properties": {
"name": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"quantity": {
"type": "integer",
"maximum": 99,
"minimum": 1
}
}
},
"default": [],
"maxItems": 300,
"description": "Existing mana base for a limited upgrade; these copies count as owned."
},
"commanderName": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"excludedCards": {
"type": "array",
"items": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"default": [],
"maxItems": 100
},
"includeAcceleration": {
"type": "boolean",
"default": false
}
}
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}plan_collection — Plan upgrades across a shared collection
Plan 2–3 quantity-prefixed Commander decks in priority order using one total collection and shared USD purchase budget. Reserve every current deck before allocating upgrades; owned copies cannot be allocated twice. Returns per-deck recommendations, allocation ledger, existing-copy shortfalls, and optional missing-card affiliate cart. Proposed cuts do not free copies in this run. Use planId from list_collection_plans to restore a private account-synced plan without JSON. Omit other deck settings when restoring; saved inputs are recalculated at current prices. To restore a website backup, pass savedPlan (the full JSON string) alone, without deck/collection settings. To export current inputs, optionally pass saveName; the response includes a private portable backup. Ask the user to keep that backup locally; do not publish it or claim it is stored for later chats. Prices and shopping links are recalculated. Show all warnings and the purchase summary before tables.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"mode": {
"enum": [
"collection_only",
"collection_first"
],
"type": "string"
},
"decks": {
"type": "array",
"items": {
"type": "object",
"required": [
"commander",
"deck",
"tool",
"label"
],
"properties": {
"deck": {
"type": "string",
"maxLength": 16000,
"minLength": 1,
"description": "Quantity-prefixed main-deck text including the commander. Import public deck URLs with import_deck first, then pass the returned text."
},
"tool": {
"enum": [
"repair_deck",
"upgrade_precon",
"reduce_deck_cost",
"change_deck_bracket"
],
"type": "string"
},
"label": {
"type": "string",
"maxLength": 60,
"minLength": 1
},
"locked": {
"type": "string",
"default": "",
"maxLength": 3000
},
"bracket": {
"type": "integer",
"default": 3,
"maximum": 5,
"minimum": 1
},
"excluded": {
"type": "string",
"default": "",
"maxLength": 3000
},
"commander": {
"type": "string",
"maxLength": 150,
"minLength": 1
},
"maxChanges": {
"type": "integer",
"default": 5,
"maximum": 15,
"minimum": 1
}
}
},
"maxItems": 3,
"minItems": 2
},
"owned": {
"type": "string",
"maxLength": 16000,
"minLength": 1,
"description": "Total collection inventory, including copies used by all submitted decks. Up to 150 quantity-prefixed entries and 100 copies per canonical card."
},
"planId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"qaTest": {
"type": "boolean",
"const": true,
"description": "Internal QA only: set true when the user explicitly says this is our test run. Excludes the call from usage/revenue statistics. Omit for normal player requests."
},
"saveName": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"budgetUsd": {
"type": "number",
"maximum": 5000,
"minimum": 0
},
"savedPlan": {
"type": "string",
"maxLength": 1000000
}
}
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}list_collection_plans — List my synced collection plans
List private plan names, IDs and revisions in the connected account. No deck text or shopping links are returned. Use plan_collection with planId to restore and recompute recommendations and buy links. Requires account connection; never ask for passwords or tokens in chat.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"qaTest": {
"type": "boolean",
"const": true,
"description": "Internal QA only: set true when the user explicitly says this is our test run. Excludes the call from usage/revenue statistics. Omit for normal player requests."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}save_collection_plan — Save a private collection plan to my account
Save decks, total collection inventory, priority order and constraints to the connected account. Ask the player to choose a name. Create a new plan without id/revision; update only with the current id and revision from list_collection_plans. Updating replaces the prior saved inputs; no version history is retained. Does not save recommendation results or shopping prices. Never publish private plan inputs. Do not overwrite without a user request.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name",
"input"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"input": {
"type": "object",
"required": [
"owned",
"decks"
],
"properties": {
"mode": {
"enum": [
"collection_only",
"collection_first"
],
"type": "string",
"default": "collection_only"
},
"decks": {
"type": "array",
"items": {
"type": "object",
"required": [
"commander",
"deck",
"tool",
"label"
],
"properties": {
"deck": {
"type": "string",
"maxLength": 16000,
"minLength": 1,
"description": "Quantity-prefixed main-deck text including the commander. Import public deck URLs with import_deck first, then pass the returned text."
},
"tool": {
"enum": [
"repair_deck",
"upgrade_precon",
"reduce_deck_cost",
"change_deck_bracket"
],
"type": "string"
},
"label": {
"type": "string",
"maxLength": 60,
"minLength": 1
},
"locked": {
"type": "string",
"default": "",
"maxLength": 3000
},
"bracket": {
"type": "integer",
"default": 3,
"maximum": 5,
"minimum": 1
},
"excluded": {
"type": "string",
"default": "",
"maxLength": 3000
},
"commander": {
"type": "string",
"maxLength": 150,
"minLength": 1
},
"maxChanges": {
"type": "integer",
"default": 5,
"maximum": 15,
"minimum": 1
}
}
},
"maxItems": 3,
"minItems": 2
},
"owned": {
"type": "string",
"maxLength": 16000,
"minLength": 1,
"description": "Total collection inventory, including copies used by all submitted decks. Up to 150 quantity-prefixed entries and 100 copies per canonical card."
},
"budgetUsd": {
"type": "number",
"default": 0,
"maximum": 5000,
"minimum": 0,
"description": "Shared purchase budget for the entire plan, USD. Decks receive priority in input order."
}
}
},
"qaTest": {
"type": "boolean",
"const": true,
"description": "Internal QA only: set true when the user explicitly says this is our test run. Excludes the call from usage/revenue statistics. Omit for normal player requests."
},
"revision": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
}
}
}{
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": true
}delete_collection_plan — Delete a synced collection plan
Delete only the named plan ID at its current revision in the connected account. Use only when the player requests deletion. Local device saves are unaffected.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id",
"revision"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"qaTest": {
"type": "boolean",
"const": true,
"description": "Internal QA only: set true when the user explicitly says this is our test run. Excludes the call from usage/revenue statistics. Omit for normal player requests."
},
"revision": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
}
}
}{
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": true
}upgrade_precon — Upgrade a Commander precon
Upgrade a Commander precon using preconworkshop. Input a full quantity-prefixed Commander decklist including the commander, or a public HTTPS Moxfield/Archidekt deck URL. URL imports exclude sideboards and Moxfield companions; provider access can fail, in which case request a plain-text export. replaceCard optionally restricts the review to one specific non-protected card. Budget is USD. Returns proposed cuts/additions, role counts, warnings, estimated cost, individual card links and a TCGplayer cartUrl for recommended cards not marked owned. Owned is a quantity-prefixed list of up to 150 card entries with up to 100 copies per named card; locked/excluded are newline-separated card names. Nothing is purchased or saved publicly. Show all warnings and let the player choose swaps. Bracket analysis is guidance, not certification.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"deck",
"commander"
],
"properties": {
"deck": {
"type": "string",
"maxLength": 16000,
"minLength": 1,
"description": "Full quantity-prefixed decklist, or a public HTTPS Moxfield/Archidekt deck URL without query parameters."
},
"owned": {
"type": "string",
"default": "",
"maxLength": 16000,
"description": "Quantity-prefixed owned cards, up to 150 card entries and 16000 characters. Split larger collections before analysis."
},
"locked": {
"type": "string",
"default": "",
"maxLength": 3000
},
"qaTest": {
"type": "boolean",
"const": true,
"description": "Internal QA only: set true when the user explicitly says this is our test run. Excludes the call from usage/revenue statistics. Omit for normal player requests."
},
"bracket": {
"type": "integer",
"default": 3,
"maximum": 5,
"minimum": 1
},
"excluded": {
"type": "string",
"default": "",
"maxLength": 3000
},
"budgetUsd": {
"type": "number",
"default": 50,
"maximum": 5000,
"minimum": 0
},
"commander": {
"type": "string",
"maxLength": 150,
"minLength": 1
},
"maxChanges": {
"type": "integer",
"default": 5,
"maximum": 15,
"minimum": 1
},
"replaceCard": {
"type": "string",
"default": "",
"maxLength": 150
},
"collectionMode": {
"enum": [
"standard",
"collection_only",
"collection_first"
],
"type": "string",
"description": "collection_only uses only available owned cards; collection_first prioritizes owned cards then purchases within budget. In collection modes, owned is total inventory including this deck; copies in this deck are reserved. One deck at a time, up to 150 entries. No safe swaps may be found."
}
}
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}reduce_deck_cost — Find lower-cost deck replacements
Find lower-cost deck replacements using budgetswap. Input a full quantity-prefixed Commander decklist including the commander, or a public HTTPS Moxfield/Archidekt deck URL. URL imports exclude sideboards and Moxfield companions; provider access can fail, in which case request a plain-text export. replaceCard optionally restricts the review to one specific non-protected card. Budget is USD. Returns proposed cuts/additions, role counts, warnings, estimated cost, individual card links and a TCGplayer cartUrl for recommended cards not marked owned. Owned is a quantity-prefixed list of up to 150 card entries with up to 100 copies per named card; locked/excluded are newline-separated card names. Nothing is purchased or saved publicly. Show all warnings and let the player choose swaps. Bracket analysis is guidance, not certification.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"deck",
"commander"
],
"properties": {
"deck": {
"type": "string",
"maxLength": 16000,
"minLength": 1,
"description": "Full quantity-prefixed decklist, or a public HTTPS Moxfield/Archidekt deck URL without query parameters."
},
"owned": {
"type": "string",
"default": "",
"maxLength": 16000,
"description": "Quantity-prefixed owned cards, up to 150 card entries and 16000 characters. Split larger collections before analysis."
},
"locked": {
"type": "string",
"default": "",
"maxLength": 3000
},
"qaTest": {
"type": "boolean",
"const": true,
"description": "Internal QA only: set true when the user explicitly says this is our test run. Excludes the call from usage/revenue statistics. Omit for normal player requests."
},
"bracket": {
"type": "integer",
"default": 3,
"maximum": 5,
"minimum": 1
},
"excluded": {
"type": "string",
"default": "",
"maxLength": 3000
},
"budgetUsd": {
"type": "number",
"default": 50,
"maximum": 5000,
"minimum": 0
},
"commander": {
"type": "string",
"maxLength": 150,
"minLength": 1
},
"maxChanges": {
"type": "integer",
"default": 5,
"maximum": 15,
"minimum": 1
},
"replaceCard": {
"type": "string",
"default": "",
"maxLength": 150
},
"collectionMode": {
"enum": [
"standard",
"collection_only",
"collection_first"
],
"type": "string",
"description": "collection_only uses only available owned cards; collection_first prioritizes owned cards then purchases within budget. In collection modes, owned is total inventory including this deck; copies in this deck are reserved. One deck at a time, up to 150 entries. No safe swaps may be found."
}
}
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}repair_deck — Repair deck roles and consistency
Repair deck roles and consistency using deckmender. Input a full quantity-prefixed Commander decklist including the commander, or a public HTTPS Moxfield/Archidekt deck URL. URL imports exclude sideboards and Moxfield companions; provider access can fail, in which case request a plain-text export. replaceCard optionally restricts the review to one specific non-protected card. Budget is USD. Returns proposed cuts/additions, role counts, warnings, estimated cost, individual card links and a TCGplayer cartUrl for recommended cards not marked owned. Owned is a quantity-prefixed list of up to 150 card entries with up to 100 copies per named card; locked/excluded are newline-separated card names. Nothing is purchased or saved publicly. Show all warnings and let the player choose swaps. Bracket analysis is guidance, not certification.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"deck",
"commander"
],
"properties": {
"deck": {
"type": "string",
"maxLength": 16000,
"minLength": 1,
"description": "Full quantity-prefixed decklist, or a public HTTPS Moxfield/Archidekt deck URL without query parameters."
},
"owned": {
"type": "string",
"default": "",
"maxLength": 16000,
"description": "Quantity-prefixed owned cards, up to 150 card entries and 16000 characters. Split larger collections before analysis."
},
"locked": {
"type": "string",
"default": "",
"maxLength": 3000
},
"qaTest": {
"type": "boolean",
"const": true,
"description": "Internal QA only: set true when the user explicitly says this is our test run. Excludes the call from usage/revenue statistics. Omit for normal player requests."
},
"bracket": {
"type": "integer",
"default": 3,
"maximum": 5,
"minimum": 1
},
"excluded": {
"type": "string",
"default": "",
"maxLength": 3000
},
"budgetUsd": {
"type": "number",
"default": 50,
"maximum": 5000,
"minimum": 0
},
"commander": {
"type": "string",
"maxLength": 150,
"minLength": 1
},
"maxChanges": {
"type": "integer",
"default": 5,
"maximum": 15,
"minimum": 1
},
"replaceCard": {
"type": "string",
"default": "",
"maxLength": 150
},
"collectionMode": {
"enum": [
"standard",
"collection_only",
"collection_first"
],
"type": "string",
"description": "collection_only uses only available owned cards; collection_first prioritizes owned cards then purchases within budget. In collection modes, owned is total inventory including this deck; copies in this deck are reserved. One deck at a time, up to 150 entries. No safe swaps may be found."
}
}
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}change_deck_bracket — Review a Commander bracket transition
Review a Commander bracket transition using bracketshift. Input a full quantity-prefixed Commander decklist including the commander, or a public HTTPS Moxfield/Archidekt deck URL. URL imports exclude sideboards and Moxfield companions; provider access can fail, in which case request a plain-text export. replaceCard optionally restricts the review to one specific non-protected card. Budget is USD. Returns proposed cuts/additions, role counts, warnings, estimated cost, individual card links and a TCGplayer cartUrl for recommended cards not marked owned. Owned is a quantity-prefixed list of up to 150 card entries with up to 100 copies per named card; locked/excluded are newline-separated card names. Nothing is purchased or saved publicly. Show all warnings and let the player choose swaps. Bracket analysis is guidance, not certification.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"deck",
"commander"
],
"properties": {
"deck": {
"type": "string",
"maxLength": 16000,
"minLength": 1,
"description": "Full quantity-prefixed decklist, or a public HTTPS Moxfield/Archidekt deck URL without query parameters."
},
"owned": {
"type": "string",
"default": "",
"maxLength": 16000,
"description": "Quantity-prefixed owned cards, up to 150 card entries and 16000 characters. Split larger collections before analysis."
},
"locked": {
"type": "string",
"default": "",
"maxLength": 3000
},
"qaTest": {
"type": "boolean",
"const": true,
"description": "Internal QA only: set true when the user explicitly says this is our test run. Excludes the call from usage/revenue statistics. Omit for normal player requests."
},
"bracket": {
"type": "integer",
"default": 3,
"maximum": 5,
"minimum": 1
},
"excluded": {
"type": "string",
"default": "",
"maxLength": 3000
},
"budgetUsd": {
"type": "number",
"default": 50,
"maximum": 5000,
"minimum": 0
},
"commander": {
"type": "string",
"maxLength": 150,
"minLength": 1
},
"maxChanges": {
"type": "integer",
"default": 5,
"maximum": 15,
"minimum": 1
},
"replaceCard": {
"type": "string",
"default": "",
"maxLength": 150
},
"collectionMode": {
"enum": [
"standard",
"collection_only",
"collection_first"
],
"type": "string",
"description": "collection_only uses only available owned cards; collection_first prioritizes owned cards then purchases within budget. In collection modes, owned is total inventory including this deck; copies in this deck are reserved. One deck at a time, up to 150 entries. No safe swaps may be found."
}
}
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}search_cards — Search Commander-legal cards
Search card names or Scryfall syntax. Supports exactName, maxManaValue, cardType, sort (edhrec or usd low-to-high), and up to 30 excludedNames. Exclusions filter the bounded result pool; narrow the query if too few remain. Optional WUBRG color identity and USD per-card price cap. C or blank colors means colorless only; omit colors for any identity. Repeated color letters are canonicalized. Returns up to20 results, Oracle text, prices (null when unknown), source and optional TCGplayer affiliate links. Show disclosure when displaying shopping links. Search is bounded and not an exhaustive recommendation. No purchases.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"query"
],
"properties": {
"sort": {
"enum": [
"edhrec",
"usd"
],
"type": "string"
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 20,
"minimum": 1
},
"query": {
"type": "string",
"pattern": "^[^\\u0000-\\u001f]+$",
"maxLength": 200,
"minLength": 2
},
"colors": {
"type": "string",
"pattern": "^(?:C|[WUBRG, ]*)$",
"maxLength": 30
},
"qaTest": {
"type": "boolean",
"const": true,
"description": "Internal QA only: set true when the user explicitly says this is our test run. Excludes the call from usage/revenue statistics. Omit for normal player requests."
},
"cardType": {
"enum": [
"creature",
"instant",
"sorcery",
"artifact",
"enchantment",
"planeswalker",
"land",
"battle"
],
"type": "string"
},
"exactName": {
"type": "boolean"
},
"maxPriceUsd": {
"type": "number",
"maximum": 5000,
"minimum": 0
},
"maxManaValue": {
"type": "integer",
"maximum": 20,
"minimum": 0
},
"excludedNames": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[^\\u0000-\\u001f]+$",
"maxLength": 150,
"minLength": 1
},
"maxItems": 30
}
}
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}import_deck — Import a public Commander deck URL
Read a public HTTPS Moxfield or Archidekt deck URL without credentials/query parameters. Returns quantity-prefixed main-deck text, tagged commander, card count and warnings. Excludes sideboards and Moxfield companions; no private access or saved server copy. Follow with a deck-review tool to validate names and legality. If Moxfield access is blocked, do not repeat the URL request. Ask for Download > Copy Plain Text, with the commander line marked *CMDR*.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 500,
"minLength": 1
},
"qaTest": {
"type": "boolean",
"const": true,
"description": "Internal QA only: set true when the user explicitly says this is our test run. Excludes the call from usage/revenue statistics. Omit for normal player requests."
}
}
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}find_replacements — Find a targeted card replacement
Given a complete Commander decklist or public deck URL, commander, and replaceCard, propose at most one comparable-role replacement. The requested cut must be in the deck and cannot be the commander or protected. Preserve budget, owned, locked, excluded, color identity, legality, theme and bracket safeguards. Can return no safe swap. Heuristics are not functional equivalence. Show tradeoffs, warnings and optional missing-card affiliate purchase summary.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"deck",
"replaceCard",
"commander"
],
"properties": {
"deck": {
"type": "string",
"maxLength": 16000,
"minLength": 1,
"description": "Full quantity-prefixed decklist, or a public HTTPS Moxfield/Archidekt deck URL without query parameters."
},
"owned": {
"type": "string",
"default": "",
"maxLength": 16000,
"description": "Quantity-prefixed owned cards, up to 150 card entries and 16000 characters. Split larger collections before analysis."
},
"locked": {
"type": "string",
"default": "",
"maxLength": 3000
},
"qaTest": {
"type": "boolean",
"const": true,
"description": "Internal QA only: set true when the user explicitly says this is our test run. Excludes the call from usage/revenue statistics. Omit for normal player requests."
},
"bracket": {
"type": "integer",
"default": 3,
"maximum": 5,
"minimum": 1
},
"excluded": {
"type": "string",
"default": "",
"maxLength": 3000
},
"budgetUsd": {
"type": "number",
"default": 50,
"maximum": 5000,
"minimum": 0
},
"commander": {
"type": "string",
"maxLength": 150,
"minLength": 1
},
"maxChanges": {
"type": "integer",
"default": 5,
"maximum": 15,
"minimum": 1
},
"replaceCard": {
"type": "string",
"maxLength": 150,
"minLength": 1
},
"collectionMode": {
"enum": [
"standard",
"collection_only",
"collection_first"
],
"type": "string",
"description": "collection_only uses only available owned cards; collection_first prioritizes owned cards then purchases within budget. In collection modes, owned is total inventory including this deck; copies in this deck are reserved. One deck at a time, up to 150 entries. No safe swaps may be found."
}
}
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}Prompts
Not advertised
Resources
Not advertised
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 465 ms
- 95th percentile latency
- 465 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 465 ms · metadata changed · 13 tool(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http mtg-tools-mcp https://landfiller.app/mtg/mcpCodex
codex mcp add mtg-tools-mcp --url https://landfiller.app/mtg/mcpCursor
{
"mcpServers": {
"mtg-tools-mcp": {
"url": "https://landfiller.app/mtg/mcp"
}
}
}Cline
{
"mcpServers": {
"mtg-tools-mcp": {
"type": "streamableHttp",
"url": "https://landfiller.app/mtg/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"mtg-tools-mcp": {
"type": "http",
"url": "https://landfiller.app/mtg/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http mtg-tools-mcp https://landfiller.app/mtg/mcpClaude Desktop
{
"mcpServers": {
"mtg-tools-mcp": {
"url": "https://landfiller.app/mtg/mcp"
}
}
}Windsurf
{
"mcpServers": {
"mtg-tools-mcp": {
"serverUrl": "https://landfiller.app/mtg/mcp"
}
}
}Let your agent find its tools
Find servers like MTG Tools MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.