Skip to main content

CLI tool for converting MTG collection CSV files between formats

Project description

Transmute

PyPI version Python 3.12+ License: MIT

CLI tool for converting Magic: The Gathering collection CSV files between formats.

Features

  • Convert collections between 16 different formats
  • Auto-detect input format from CSV headers
  • Optional Scryfall API integration to fill missing card data
  • Simple command-line interface

Installation

pip install transmute-mtg

Or with uv:

uv tool install transmute-mtg

Usage

Convert between formats

# Basic conversion (auto-detect input format)
transmute convert my-collection.csv output.csv -o manabox

# Specify both input and output formats
transmute convert goldfish-export.csv moxfield-import.csv -i mtggoldfish -o moxfield

# Fill missing card data via Scryfall API
transmute convert collection.csv output.csv -o helvault --scryfall

List supported formats

transmute formats

Auto-detect a file's format

transmute detect mystery-file.csv

Supported Formats

Format CLI Name Documentation Notes
Archidekt archidekt Help Flexible columns, Scryfall ID support
Card Kingdom cardkingdom Buylist Simple 4-column format for selling
Cardsphere cardsphere FAQ Trading platform with Scryfall ID
Deckbox deckbox Help Uses full set names (not codes)
Decked Builder deckbuilder Separate regular/foil quantities
Deckstats deckstats Import 0/1 for foil status
DragonShield dragonshield App Guide Card scanner app with folder support
Helvault helvault App Requires Scryfall IDs
ManaBox manabox Guide Popular mobile app
Moxfield moxfield Import/Export Popular deck builder
MTGGoldfish mtggoldfish Export Help Supports FOIL/REGULAR/FOIL_ETCHED
MTG Manager mtgmanager Numeric codes for condition/language
MTGO mtgo Support Magic Online format
MTGStocks mtgstocks Site Price tracking site
MTG Studio mtgstudio Site Simple Yes/No foil format
TCGPlayer tcgplayer Bulk Entry Includes Product ID/SKU

Data Considerations

When converting between formats, some data may be lost or unavailable depending on the source and target formats.

Missing Data Without Scryfall

Without the --scryfall flag, transmute only uses data present in the source file. This means:

  • Set names may be missing if the source only has set codes (or vice versa)
  • Scryfall IDs required by Helvault won't be populated unless present in the source
  • Collector numbers may be absent, causing some apps to show generic card images
  • Oracle IDs needed for some advanced features won't be available

Using --scryfall enables API lookups to fill these gaps, but adds processing time and requires internet access.

Format-Specific Limitations

Target Format Limitation
Helvault Requires scryfall_id - use --scryfall if source lacks it
Deckbox Needs full set names, not codes
TCGPlayer Product ID/SKU only preserved if present in source
MTG Manager Condition/language converted to numeric codes (may lose precision)

Recommended Workflow

For best results when converting to formats that require rich metadata:

# Use Scryfall to fill missing data
transmute convert collection.csv output.csv -o helvault --scryfall

Python API

You can also use transmute as a library:

from pathlib import Path
from transmute.converter import Converter
from transmute.formats import FormatRegistry

# Convert a file
converter = Converter(use_scryfall=True)
converter.convert(
    input_path=Path("collection.csv"),
    output_path=Path("output.csv"),
    input_format="mtggoldfish",
    output_format="manabox",
)

# Read a collection
handler = FormatRegistry.get("helvault")
collection = handler.read(Path("helvault-export.csv"))

for entry in collection:
    print(f"{entry.quantity}x {entry.card.name} ({entry.card.set_code})")

CSV Format Examples

Helvault
collector_number,extras,language,name,oracle_id,quantity,scryfall_id,set_code,set_name
"136","foil","en","Goblin Arsonist","c1177f22-...","4","c24751fd-...","m12","Magic 2012"

Unique aspects:

  • Requires scryfall_id for each card (use --scryfall flag when converting to this format)
  • Foil status stored in extras field as "foil" string
  • Language uses ISO codes (en, de, ja, etc.)
MTGGoldfish
Card,Set ID,Set Name,Quantity,Foil,Variation,Collector Number,Scryfall ID
Aether Vial,MMA,Modern Masters,1,REGULAR,"",212,abc123...
Anax and Cymede,THS,Theros,4,FOIL,"",186,def456...

Unique aspects:

  • Foil is an enum with three values: FOIL, REGULAR, FOIL_ETCHED
  • One of few formats that distinguishes etched foils
  • Variation field for special printings (extended art, showcase, etc.)
  • Supports Collector Number and Scryfall ID for precise card identification
ManaBox
Name,Set code,Set name,Collector number,Foil,Rarity,Quantity,Scryfall ID,Condition,Language
Lightning Bolt,m10,Magic 2010,146,foil,Common,4,abc123...,NM,en

Unique aspects:

  • Includes both set code and set name
  • Has optional Scryfall ID (useful for preserving exact printings)
  • Foil is simply "foil" or empty string
Moxfield
Count,Tradelist Count,Name,Edition,Condition,Language,Foil,Alter,Proxy,Purchase Price,Collector Number
4,2,Lightning Bolt,m10,NM,English,foil,,,,146

Unique aspects:

  • Separate Tradelist Count column for cards available for trade
  • Tracks altered and proxy cards
  • Edition uses lowercase set codes
  • Supports Collector Number for precise card identification
DragonShield
Folder Name,Quantity,Trade Quantity,Card Name,Set Code,Set Name,Card Number,Condition,Printing,Language
Binder,4,0,Lightning Bolt,M10,Magic 2010,146,NearMint,Foil,English

Unique aspects:

  • Supports folder organization via Folder Name
  • Condition uses concatenated format: NearMint, LightlyPlayed (no spaces)
  • Includes price columns: LOW, MID, MARKET
TCGPlayer
Quantity,Name,Simple Name,Set,Card Number,Set Code,Printing,Condition,Language,Rarity,Product ID,SKU
1,Verdant Catacombs,Verdant Catacombs,Zendikar,229,ZEN,Normal,Near Mint,English,Rare,33470,315319

Unique aspects:

  • Has both Name (with variant info) and Simple Name (base card name)
  • Includes TCGPlayer-specific Product ID and SKU for marketplace integration
  • Set is full name, Set Code is abbreviation
Deckbox
Count,Tradelist Count,Name,Edition,Card Number,Condition,Language,Foil,Signed
4,4,Angel of Serenity,Return to Ravnica,1,Near Mint,English,,,

Unique aspects:

  • Edition must be the full set name (e.g., "Return to Ravnica", not "RTR")
  • Foil column uses "foil" or empty string
  • Supports signed card tracking
MTGO
Card Name,Quantity,ID #,Rarity,Set,Collector #,Premium
Banisher Priest,1,51909,Uncommon,PRM,1136/1158,Yes

Unique aspects:

  • Magic Online format with unique ID # for digital cards
  • Premium uses Yes/No for foil status
  • Collector numbers may include / notation (e.g., "1136/1158")
MTGStocks
"Card","Set","Quantity","Price","Condition","Language","Foil","Signed"
"Advent of the Wurm","Modern Masters 2017",1,0.99,M,en,Yes,No

Unique aspects:

  • Price tracking site format with embedded price data
  • Foil and Signed use Yes/No strings
  • Condition uses single letters (M, NM, LP, etc.)
Deckstats
amount,card_name,is_foil,is_pinned,set_id,set_code
1,"Abandon Reason",0,0,147,"EMN"

Unique aspects:

  • Uses 0/1 integers for boolean fields (is_foil, is_pinned)
  • Has both set_id (Deckstats internal ID) and set_code
  • is_pinned marks cards locked to specific printings
MTG Manager
Quantity,Name,Code,PurchasePrice,Foil,Condition,Language,PurchaseDate
1,"Amulet of Vigor",WWK,18.04,0,0,0,5/6/2018

Unique aspects:

  • Uses numeric codes for Condition: 0=Mint, 1=NM, 2=LP, 3=MP, 4=HP, 5=Damaged
  • Uses numeric codes for Language: 0=English, 1=German, 2=French, etc.
  • Tracks purchase history with PurchasePrice and PurchaseDate
Archidekt
Quantity,Name,Set Code,Set Name,Collector Number,Condition,Language,Foil,Scryfall ID,Oracle ID
4,Lightning Bolt,m10,Magic 2010,146,NM,en,false,e3285e6b-...,abc123...

Unique aspects:

  • Very flexible column format (minimal required columns)
  • Supports Scryfall ID and Oracle ID for precise card identification
  • Boolean foil field accepts various formats
Cardsphere
Count,Name,Edition,Edition Code,Scryfall ID,Condition,Language,Foil
1,Lightning Bolt,Magic 2010,m10,e3285e6b-...,NM,English,false

Unique aspects:

  • Trading platform format with both edition name and code
  • Includes Scryfall ID for precise matching
  • Used primarily for offer/want list management
Card Kingdom
Name,Edition,Foil,Qty
Lightning Bolt,Magic 2010,,4

Unique aspects:

  • Simple 4-column format designed for buylist submissions
  • Edition is full set name
  • Foil is "Foil" or empty
Decked Builder
Name,Edition,Reg Qty,Foil Qty
Lightning Bolt,M10,4,1

Unique aspects:

  • Separate quantity columns for regular and foil copies
  • Useful when tracking both versions of the same card
  • Edition uses set codes
MTG Studio
Name,Edition,Qty,Foil
Lightning Bolt,M10,4,Yes

Unique aspects:

  • Simple format with Yes/No foil values
  • Edition uses set codes
  • Minimal column set for basic collection tracking

Development

# Clone and install
git clone https://github.com/oflannabhra/transmute.git
cd transmute
uv sync

# Run tests
uv run pytest

# Lint
uv run ruff check src/ tests/

# Format
uv run ruff format src/ tests/

License

MIT License - see LICENSE for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

transmute_mtg-1.0.0.tar.gz (56.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

transmute_mtg-1.0.0-py3-none-any.whl (36.1 kB view details)

Uploaded Python 3

File details

Details for the file transmute_mtg-1.0.0.tar.gz.

File metadata

  • Download URL: transmute_mtg-1.0.0.tar.gz
  • Upload date:
  • Size: 56.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for transmute_mtg-1.0.0.tar.gz
Algorithm Hash digest
SHA256 ea61074a7e5d9f4e438980178d7739d8671bf832616bcdde5fdfe2f41c75b3dd
MD5 ed9aa27167e9046bb1cf78caa676118d
BLAKE2b-256 90a568507ddd77320848fe27b357da38d1e9586dac7d9e58a17182f0c2862c47

See more details on using hashes here.

Provenance

The following attestation bundles were made for transmute_mtg-1.0.0.tar.gz:

Publisher: release.yml on oflannabhra/transmute

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file transmute_mtg-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: transmute_mtg-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 36.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for transmute_mtg-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9ee5953b05e07f12451b3293a19cdb36097ad692d9c08b1fac668e49ae4d22b0
MD5 c0a411b9a83166aa7e7296e34c442ccb
BLAKE2b-256 567d78f655c93c72f0877206c6168e3c36e015d7d7a1492afeb00733a61c7999

See more details on using hashes here.

Provenance

The following attestation bundles were made for transmute_mtg-1.0.0-py3-none-any.whl:

Publisher: release.yml on oflannabhra/transmute

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page