Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

mtg-parser

PyPI PyPI - Python Version Github - Latest Release GitHub

mtg_parser is a Python library to download and parse Magic: The Gathering decklists. It supports the MTGO/MTGA formats as well as the most popular deck building websites.

Table of contents

Installation

The following section covers the installation of mtg_parser.

Before using mtg_parser, you will need:

  • python>=3.9

To install mtg_parser, simply run one of the following commands in the terminal of your choice:

$ pip install mtg-parser
# or
$ uv add mtg-parser
# or
$ poetry add mtg-parser

Supported Formats

[!NOTE] mtg_parser has been developed with a primary focus on Commander. While it may function with other formats, compatibility is not guaranteed.

In addition to MTGO and MTGA formats, mtg_parser supports the following websites:

Known issues

Parsing decklists on some websites require specific configuration.

Usage

QuickStart

[!NOTE] As of mtg_parser="=>0.0.1a50" doesn't provide a default http client anymore.

To parse a decklist with mtg_parser, you need to provide an HTTP client that implements a requests compatible interface (such as requests or httpx).

import requests
import mtg_parser

cards = mtg_parser.parse_deck(url, requests.Session())

For conveniency, mtg_parser provides an optional HttpClientFacade to facilitate handling of different websites with different http clients.

import cloudscraper
import httpx
import mtg_parser

client_facade = mtg_parser.HttpClientFacade(httpx.Client(timeout=10.0))
client_facade.set_override('aetherhub.com', cloudscraper.create_scraper())
client_facade.set_override('moxfield.com', httpx.Client(
    timeout=10.0,
    headers={'User-Agent': os.getenv('MOXFIELD_USER_AGENT')},
))

cards = mtg_parser.parse_deck(url, client_facade)

Return format

parse_deck() returns an Iterable[Card] matching the following description

class Card:
    name: str
    quantity: int
    extension: Optional[str]
    number: Optional[str]
    tags: Iterable[str] = []

cards = mtg_parser.parse_deck(url, http_client)
for card in cards:
    print(card)

Parsing MTGO / MTGA

mtg_parser can parse textual decklists in either MTGO or MTGA format

import mtg_parser

decklist = """
    1 Atraxa, Praetors' Voice
    1 Imperial Seal
    1 Lim-Dûl's Vault
    1 Jeweled Lotus (CMR) 319
    1 Llanowar Elves (M12) 182
    3 Brainstorm #Card Advantage #Draw
"""

cards = mtg_parser.parse_deck(deck_list)

Parsing from aetherhub.com

Aetherhub Integration Tests

mtg_parser can parse public decks from aetherhub.com

[!IMPORTANT] aetherhub.com requires a Cloudflare-bypass requests compatible http client such as cloudscraper.

import cloudscraper
import mtg_parser

url = 'https://aetherhub.com/Deck/<deck_name>'

cards = mtg_parser.parse_deck(url, cloudscraper.create_scraper())

Parsing from archidekt.com

Archideckt Integration Tests

mtg_parser can parse public decks from archidekt.com

import requests
import mtg_parser

url = 'https://www.archidekt.com/decks/<deck_id>/'

cards = mtg_parser.parse_deck(url, requests.Session())

Parsing from deckstats.net

Deckstats Integration Tests

mtg_parser can parse public decks from deckstats.net

[!IMPORTANT] deckstats.net requires a Cloudflare-bypass requests compatible http client such as cloudscraper.

import cloudscraper
import mtg_parser

url = 'https://deckstats.net/decks/<user_id>/<deck_id>'

cards = mtg_parser.parse_deck(url, cloudscraper.create_scraper())

Parsing from moxfield.com

Moxfield Integration Tests

mtg_parser can parse public decks from moxfield.com

[!IMPORTANT] Moxfield.com prohibits scraping their website, as it violates their Terms of Service.

For authorized access, please contact support@moxfield.com to request a custom User-Agent.

import httpx
import mtg_parser

url = 'https://www.moxfield.com/decks/<deck_id>'

headers = {'user-agent': '<MOXFIELD_USER_AGENT>'}
with httpx.Client(headers=headers) as http_client:
    cards = mtg_parser.parse_deck(url, http_client)

Parsing from mtggoldfish.com

MTGGoldfish Integration Tests

mtg_parser can parse public decks from mtggoldfish.com

[!IMPORTANT] mtggoldfish.com requires a Cloudflare-bypass requests compatible http client such as cloudscraper.

import cloudscraper
import mtg_parser

url = 'https://www.mtggoldfish.com/deck/<deck_id>'

cards = mtg_parser.parse_deck(url, cloudscraper.create_scraper())

Parsing from mtgjson.com

mtgjson Integration Tests

mtg_parser can parse decks from mtgjson.com

import requests
import mtg_parser

url = 'https://mtgjson.com/api/v5/decks/<deck_name>.json'

cards = mtg_parser.parse_deck(url, requests.Session())

Parsing from scryfall.com

Scryfall Integration Tests

mtg_parser can parse public decks from scryfall.com

import requests
import mtg_parser

url = 'https://scryfall.com/<userid>/decks/<deck_id>/'

cards = mtg_parser.parse_deck(url, requests.Session())

Parsing from tappedout.net

Tappedout Integration Tests

mtg_parser can parse public decks from tappedout.net

import requests
import mtg_parser

url = 'https://tappedout.net/mtg-decks/<deck_id>/'

cards = mtg_parser.parse_deck(url, requests.Session())

Parsing from tcgplayer.com

TCGplayer Integration Tests

mtg_parser can parse public decks from either tcgplayer.com or infinite.tcgplayer.com

import requests
import mtg_parser

url = 'https://www.tcgplayer.com/content/magic-the-gathering/deck/<deck_name>/<deck_id>'
# or url = 'https://infinite.tcgplayer.com/magic-the-gathering/deck/<deck_name>/<deck_id>'

cards = mtg_parser.parse_deck(url, requests.Session())

Metadata

Release files for mtg_parser 0.0.1a58

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for mtg_parser 0.0.1a58
File Size Uploaded
mtg_parser-0.0.1a58.tar.gz 16.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for mtg_parser 0.0.1a58
File Interpreter ABI Platform
mtg_parser-0.0.1a58-py3-none-any.whl Python 3 none any Details

Total release size: 38.4 kB

Release files / mtg_parser-0.0.1a58.tar.gz

Download URL mtg_parser-0.0.1a58.tar.gz
Size 16.7 kB
Tags Source
SHA-256 checksum
How to use checksums
f7f7c1a35ce383c66c5d738f477aaf030ce81b1735975f30eac8b3d9619ff6a9
BLAKE2b-256 checksum
How to use checksums
1685ccf9caf465c0d8259825d801c7b680133fb56a880951f231536e557a636c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.4.2 CPython/3.14.7 Darwin/23.5.0

Release files / mtg_parser-0.0.1a58-py3-none-any.whl

Download URL mtg_parser-0.0.1a58-py3-none-any.whl
Size 21.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0220efaf8fda333d3ce24572a90ed330378be98c671d1d371bad93aa78eb1034
BLAKE2b-256 checksum
How to use checksums
93c6cab5372fd75b772f20bb7593dda09b783c5f03a5732f12558fb3aaeadc49
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.4.2 CPython/3.14.7 Darwin/23.5.0

Release history Release notifications | RSS feed

This release

0.0.1a58 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page