Sugeridor de cartas más baratas para mazos de Magic: The Gathering. Pegás el enlace de un mazo público de Moxfield y te sugiere alternativas más baratas y funcionalmente similares para cada carta, con puntaje de similitud y ahorro real (no solo "misma categoría de precio", sino cartas que realmente hacen algo parecido).
- Lee el mazo completo desde Moxfield (comandante + mainboard).
- Sincroniza una base local con todas las cartas de Magic desde el bulk data de Scryfall (una vez al día, no carta por carta).
- Para cada carta del mazo busca candidatas más baratas: mismo color identity, tipo compatible, legal en el formato del mazo, sin repetir cartas que ya están en el mazo.
- Puntúa cada candidata por similitud real: keywords compartidas, solapamiento de texto de reglas (oracle text), cercanía de costo de maná, popularidad en EDHREC.
- Muestra las mejores sugerencias por carta, con precio original, precio sugerido, ahorro en $ y %, y la razón de la similitud.
webapp.py— app web local (Flask). Pensada para revisar el mazo entero de una: imágenes reales de Scryfall, orden y filtro por categoría, reemplazo con un click sin recargar la página, y el total del mazo actualizándose en vivo. La más cómoda para uso normal.interactive.py— modo interactivo de terminal (usarich). Recorre el mazo carta por carta, deja elegir un reemplazo o pasar a la siguiente.main.py— reporte de una sola pasada. Tabla en consola o--jsonpara integrarlo con otra cosa.
python -m venv .venv
# Windows: .venv\Scripts\activate — Linux/Mac: source .venv/bin/activate
pip install -r requirements.txtCrear un archivo .env en la raíz:
DATABASE_URL=sqlite:///./data/cards.db
Sincronizar la base de Scryfall (necesario antes de la primera corrida, y después una vez al día si querés precios frescos):
python sync_scryfall.py# App web (abre http://127.0.0.1:5000 en el navegador)
python webapp.py
# Modo interactivo de terminal
python interactive.py "https://moxfield.com/decks/TU-DECK-ID"
# Reporte de una sola pasada
python main.py "https://moxfield.com/decks/TU-DECK-ID" --top-n 5 --jsonpuntaje = 3 × similitud de keywords
+ 2.5 × similitud de texto (oracle text)
+ 1 × cercanía de costo de maná
+ 1 × popularidad en EDHREC
Cada término va de 0 a 1, así que el máximo teórico es 7.5 (en la práctica casi nunca se acerca, haría falta texto casi idéntico).
- 3.0 o más: coincidencia fuerte — comparten mecánica real.
- 1.5 a 3.0: coincidencia moderada — algo en común, no es un calco.
- Menos de 1.5: coincidencia débil — sobre todo mismo tipo/color/popularidad.
- No pega a la API de búsqueda de Scryfall carta por carta. Sincroniza el bulk data (
oracle-cards, ~38k cartas) una sola vez y lo guarda en una base local. El motor de base de datos es intercambiable con solo cambiarDATABASE_URL(verdb.py, usa SQLAlchemy Core) — SQLite por defecto, sin instalar nada extra. - El cliente de Moxfield (
moxfield_client.py) usa el endpoint no oficialapi2.moxfield.com, aislado del resto del pipeline — si Moxfield cambia su API interna, el fallo queda contenido ahí. - El scoring (
scoring.py) es reglas + SQL, sin machine learning: overlap de keywords, overlap de texto tokenizado, cercanía de cmc, popularidad EDHREC. Filtra por color identity con un bitmask precalculado (rápido y portable entre motores de DB). sync_scryfall.pycorre aparte, pensado para cron diario — no bloquea el flujo del usuario.
- El endpoint de Moxfield no es oficial y puede cambiar sin aviso.
- Los precios vienen del snapshot diario de Scryfall, no son en tiempo real.
- Pensado para uso local de un solo usuario — sin autenticación ni manejo de sesiones concurrentes, no exponer a internet sin cambios.
Este es un proyecto de fan, sin afiliación con Wizards of the Coast, Moxfield o Scryfall. Los datos de cartas e imágenes provienen de la API de Scryfall, y la lectura de mazos usa un endpoint no documentado de Moxfield. Magic: The Gathering es marca registrada de Wizards of the Coast LLC.