Skip to main content
Glama

Quartermaster

License: MIT Release GitHub stars Python 3.10+ Platform

MCP Ready Search Vectors GUI Telemetry Tests PRs Welcome Inspired by

Este proyecto empezó porque quería prototipar una presa.

Nada serio: una demo corta, quizá algo más si funcionaba. Antes de construir nada, quería ver qué era lo que ya tenía y que pudiera acelerar el proceso. Así que busqué en mi biblioteca "presa": no apareció nada. Claro que no apareció nada: ningún activo se llama presa. Pero repartidas entre cuatro paquetes que ya poseía había mallas de hormigón curvado, un sistema de agua, algo de terreno rocoso. Todo lo que la presa necesitaba. Había tenido casi todo aquello durante años y nunca había conectado las piezas.

Eso es lo que te hacen ~1.500 activos repartidos entre dos tiendas. Casi todos de bundles y rebajas, y ninguno recordado. Y no es solo cosa mía: ningún asistente de IA lo sabe tampoco. Pídeles ayuda y o construyen todo desde cero o te mandan de compras, mientras cientos de dólares de exactamente lo que necesitas están en tu disco.

Quartermaster indexa toda tu biblioteca de Unity Asset Store y Fab localmente y se la sirve a tu agente de código a través de MCP. Es la herramienta que deseaba que existiera ese día: pregunta por una presa y te dicen que ya tienes mallas de hormigón curvado.

you    →  "I want to build a dam — what do I have to work with?"

agent  →  search_owned_assets(...)        finds the concrete meshes, water FX, terrain
          validate_stack([...])           checks none of them fight each other
          import_asset_to_project(...)    unpacks into Assets/, demos stripped

Cada resultado es algo que ya pagaste. Nada se inventa.

Quartermaster spotlight search

Escribir una descripción, no un nombre: ninguno de esos resultados comparte una palabra con la consulta.

¿Por qué Quartermaster?

El trabajo de un quartermaster nunca fue recordar lo que hay en las tiendas — es asegurarse de que estés equipado cuando llega el momento de moverse. Eso está más cerca del problema real que el olvido. No había perdido nada; sabía que poseía cosas. Lo que no podía hacer era pasar de "quiero prototipar una presa" a "abre estos cuatro paquetes" sin una hora de excavación antes — y quizá algo más si funcionaba no sobrevive a una hora de excavación. Las ideas que llegan así no se rechazan. Simplemente no llegan a ocurrir, y nunca averiguas si habrían funcionado.

Related MCP server: Unity API Communicator MCP Server

La parte que nadie te cuenta

Ninguna de las dos tiendas admite lo que posees.

Unity eliminó /account/purchases (404 desde agosto de 2026). Fab no tiene API de propiedad, ni botón de exportación, ni nada. Tu historial de compras existe solo dentro de su GraphQL privado, tras SSO, MFA y detección de bots.

Conseguirlo requirió cuatro intentos, tres de ellos fallidos:

  1. El Chromium incluido con Playwright — el captcha de Epic lo rechaza de plano ("habilita JavaScript").

  2. Playwright manejando tu navegador real — inyecta hooks detectables; Epic lanza un segundo muro de seguridad después de la contraseña.

  3. Depurador adjunto durante el inicio de sesión — el mismo resultado. Cualquier cosa que toque el flujo de inicio de sesión se marca.

  4. Lo que realmente funciona: deja de automatizar por completo el inicio de sesión. Entras a través de una ventana de navegador normal — sin puerto de depuración, nada entre tú y la tienda — porque la automatización era en sí misma lo que disparaba los sistemas de riesgo. Solo después de que termines, en una sesión que estableciste tú mismo, Quartermaster adjunta un depurador y reproduce las consultas paginadas de la tienda — con sus propias cabeceras CSRF, su propio troceado (42 IDs por petición, porque eso es lo que envía el cliente de Unity).

Ese truco es la mayor parte de este proyecto. El resto — búsqueda, linting, desempaquetado — es sinceramente sencillo en comparación.

Dos reglas ganadas con esfuerzo e integradas en el diseño, por si alguna vez hackeas esto tú mismo:

  • Los navegadores deben cerrarse correctamente (taskkill sin /F). Un cierre abrupto pierde la cookie de confianza de dispositivo de Unity y te verás sometido a un desafío MFA en cada sesión futura.

  • Nunca ejecutes una descarga de biblioteca en modo headless. El modo headless activa el sistema de riesgo de Unity incluso con cookies válidas.

Lo que obtienes

Búsqueda que entiende intención y visión. Este es el problema de la presa.

  • Palabras clave exactas mediante SQLite FTS5.

  • Intención en lenguaje natural mediante embeddings de texto ONNX locales (BAAI/bge-small-en-v1.5) — "estructuras de hormigón para retener agua" saca a la superficie mallas y shaders cuyos listados nunca mencionan presas.

  • Comprensión visual cross-modal mediante embeddings CLIP ONNX (Qdrant/clip-ViT-B-32) — buscar "catedral gótica" puntúa literalmente tus capturas de pantalla y renders promocionales, encontrando activos incluso cuando sus descripciones de texto son completamente mudas. Las tres señales se fusionan con fusión de rango recíproco (RRF) de 3 vías en tu CPU. Sin GPU, sin proceso de base de datos vectorial, sin API en la nube — ONNX Runtime y una matriz numpy, en el mismo proceso que todo lo demás.

Medido en un almacén de ~1.800 activos: ~480 MB de RAM pico con ambos modelos residentes, ~1.5 s para la primera consulta (cargando BGE y CLIP), ~110 ms en caliente después. Los modelos se cargan de forma diferida, así que un agente que nunca busca nunca paga por ellos.

Datos reales sobre tu disco. Escanea %APPDATA%/Unity/Asset Store-5.x/ y el VaultCache de Epic para que cada resultado sepa si ya está descargado o es solo de nube. Los agentes prefieren lo local: una importación sin descargar nada supera a una de 4 GB.

Un linter para stacks. Dos renderizadores de vegetación se pelearán. Un módulo de MicroSplat sin el MicroSplat principal no hace nada en silencio. Un shader solo URP en un proyecto HDRP se renderiza en rosa. Quartermaster los detecta antes de que pases una tarde con ellos.

Desempaquetado directo. Extrae los archivos .unitypackage en caché directamente en Assets/, descartando /Demo/, /Samples/, /Documentation/ y PDFs de paso — normalmente entre un 60 y un 80 % menos de peso por paquete. Cada ruta declarada se normaliza y se verifica dentro de <project>/Assets/; los escapes son estructuralmente imposibles, no solo se filtran.

Instalación

El paquete independiente — descarga Quartermaster-windows-x64.zip desde Releases y descomprímelo en cualquier lugar. No se requiere Python.

  • Quartermaster.exe — GUI de escritorio con búsqueda spotlight Win+Alt+V, recolección de tiendas, navegación por la biblioteca y desempaquetado directo.

  • Quartermaster-mcp.exe — servidor MCP stdio independiente para Claude Desktop, Cursor, Antigravity y Windsurf.

Los datos de tu biblioteca viven de forma segura en %LOCALAPPDATA%\Quartermaster, así que las actualizaciones consisten en simples reemplazos de carpeta sin pérdida de datos.

Desde el código fuente — requiere Python 3.10+.

git clone https://github.com/Tanshaydar/Quartermaster.git
cd Quartermaster
pip install -r requirements.txt

Puebla tu biblioteca:

1. Inicia sesión. El único paso que te necesita. Se abre una ventana de navegador normal; la 2FA y los captchas se comportan exactamente como siempre. Ciérrala cuando termines y la sesión persiste localmente.

python -m src.store_client login unity
python -m src.store_client login fab

2. Recolecta y enriquece. De larga duración, reanudable y seguro de volver a ejecutar: cada uno continúa donde se detuvo.

python -m src.store_client fetch unity
python -m src.store_client fetch fab
python -m src.store_client enrich            # descriptions and cover art, politely batched
python -m src.store_client fab-deep-media    # Fab only: plain HTTP is 403'd, galleries need the authed browser

3. Construye los índices locales y luego escanea tu disco.

python -m src.semantic build     # text embeddings
python -m src.vision build       # screenshot embeddings + concept tagging
python -m src.local_scan         # which of them are already downloaded here

semantic build y vision build son lo que hace que "estructuras de hormigón para retener agua" y las consultas de concepto visual encuentren tus activos. Si los omites, la búsqueda sigue funcionando, pero solo con palabras clave exactas.

Ejecuta local_scan después de tener un catálogo, no antes. Si se escanea contra un almacén vacío, no tiene nada contra lo que comparar los nombres de archivo, así que archiva cada paquete en caché como su propia entrada simple. Inofensivo: el siguiente escaneo los concilia con el catálogo real, pero verás duplicados hasta entonces.

¿Ya tienes exportaciones CSV de las tiendas? Omite el navegador por completo:

python -m src.ingest             # eats any CSVs in data/seed/
python -m src.semantic build     # still needed — see the note above
python -m src.local_scan         # then find what's already on disk

Conecta tus agentes:

Opción A: Auto-registro (un comando)

# Standalone binary users:
Quartermaster-mcp.exe --register --all

# Source users:
python -m src.register --all             # Claude Desktop, Cursor, Windsurf, Antigravity
python -m src.register --all --dry-run   # look before you leap

El registro se fusiona con las configuraciones de cliente existentes y crea primero un .quartermaster-backup. No machacará tus otros servidores.

Opción B: Configuración manual Pega el bloque del servidor en la configuración de tu cliente:

Binario independiente:

{
  "mcpServers": {
    "quartermaster": {
      "command": "C:/path/to/Quartermaster/Quartermaster-mcp.exe",
      "args": []
    }
  }
}

Desde el código fuente:

{
  "mcpServers": {
    "quartermaster": {
      "command": "python",
      "args": ["-m", "src.mcp_server"],
      "cwd": "C:/path/to/Quartermaster"
    }
  }
}

Claude Desktop lee %APPDATA%/Claude/claude_desktop_config.json, Cursor ~/.cursor/mcp.json, Windsurf ~/.codeium/windsurf/mcp_config.json.

[!NOTE] Calentamiento del modelo en el primer uso: En la primera búsqueda de lenguaje natural o visión, los modelos de embeddings (BAAI/bge-small-en-v1.5 y clip-ViT-B-32) se descargan y se guardan en caché localmente mediante ONNX Runtime (~150 MB). La primera consulta puede tardar de 3 a 5 segundos mientras se carga en memoria; cada consulta posterior se ejecuta en ~100 ms.

Herramientas del agente

Herramienta

Respuestas

search_owned_assets(query, ...)

¿Qué tengo que encaje con esto? Híbrida: palabras clave + semántica.

get_asset_details(asset_id)

Metadatos completos, notas de uso, galería, URL de la tienda.

get_stack_recommendations(brief)

Asigna un brief de funcionalidad a paquetes que posees.

validate_stack(asset_ids)

¿Se pelearán entre sí? Conflictos de rol, prerrequisitos faltantes.

list_stack_recipes()

Stacks de producción seleccionados resueltos contra tu biblioteca.

audit_project(project_dir)

Motor, versión y pipeline de renderizado de un proyecto objetivo.

import_asset_to_project(asset_id, project_dir)

Desempaqueta un paquete local en Assets/.

list_asset_categories()

Desglose de categorías y recuentos.

get_vault_stats()

Totales por motor y categoría, local vs nube.

Dos archivos te permiten enseñar a Quartermaster tu propio vocabulario, sin necesidad de cambios de código:

  • data/recipes.json — roles, prerrequisitos y stacks seleccionados. Esto es con lo que razona el linter de conflictos: qué activos compiten por el mismo trabajo, qué necesita qué, y qué combinaciones consideras un stack de probada eficacia.

  • data/concepts.json — el vocabulario visual contra el que CLIP puntúa tus capturas de pantalla. La lista incluida está pensada para juegos; si haces archviz o previs, reemplázala y reconstruye.

Ambos son JSON plano que se lee en tiempo de ejecución, y ambos tienen una página de referencia en docs/.

Otras formas de entrar

  • Aplicación de escritorio (run_desktop.bat) — búsqueda spotlight PySide6 con icono en la bandeja; pulsa Win+Alt+V en cualquier lugar de Windows. Se ejecuta junto a tu agente sin estorbar: la base de datos funciona en modo WAL, así que la GUI escribiendo mientras tu agente busca no bloquea a ninguno de los dos.

  • Interfaz web (run_ui.bat) — panel en modo oscuro en http://localhost:7890.

  • En Unity — importa editor_bridge/Quartermaster-Bridge.unitypackage y luego Window > Quartermaster. Busca e importa sin salir del editor. Pequeño inciso: ese paquete puente lo genera src/build_bridge.py, que escribe el mismo formato tar que lee unpacker.py. Dogfooding a propósito.

Seguridad

Esta cosa guarda las sesiones de las tiendas y escribe en tus proyectos, así que se toma la API local en serio:

  • Cada endpoint que modifica el estado requiere un token (generado en la primera ejecución, almacenado en data/.auth_token, replicado para el puente de Unity). Envíalo como X-Quartermaster-Token o Authorization: Bearer; la interfaz web recibe automáticamente una cookie SameSite=Strict.

  • Las peticiones de origen cruzado se rechazan incluso con un token válido.

  • El sandbox del desempaquetador colapsa los segmentos .., elimina las letras de unidad y los caracteres de control, reubica cualquier cosa que esté fuera de Assets/ en Assets/_Quartermaster_Imported/ y garantiza que la ruta final quede dentro del proyecto — respaldado por pruebas, no por corazonadas (python run_tests.py -v).

  • El proxy de imágenes se limita a una lista blanca de dominios, bloquea rangos privados y endpoints de metadatos, revalida cada salto de redirección, limita los tamaños y poda las entradas más antiguas cuando la caché supera su límite de archivos.

Nada llama a casa. Tu biblioteca, los embeddings, las rutas de disco y las sesiones de las tiendas permanecen en esta máquina.

Configuración

Claves opcionales en config.json (creado en la primera ejecución):

Clave

Predeterminado

Propósito

server_port

7890

Puerto de la interfaz web / API.

embedding_model

BAAI/bge-small-en-v1.5

Cualquier modelo compatible con fastembed. Cámbialo y reconstruye el índice.

fab_vault_dirs

Detección automática

Sobrescribe las ubicaciones de VaultCache de Fab.

strip_dirs / strip_exts

demos, docs, PDFs

Lo que descarta el desempaquetador.

enrich_batch_size / enrich_batch_pause

20 / 3s

Limitador de cortesía para el enriquecimiento.

media_cache_enabled

true

Caché en disco para las carátulas servidas mediante proxy.

Limitaciones honestas

  • Windows primero. El escaneo de caché asume rutas de Windows. La búsqueda MCP funciona en cualquier parte; la detección de importación local, no.

  • Una máquina, un usuario. Sin sincronización, sin modo servidor. Deliberado.

  • La recolección es scraping. Unity y Fab cambian sus internals cuando les place, y de hecho ya lo han hecho — los tamaños de chunk, los endpoints y las formas GraphQL que hay aquí eran correctos el día en que lo publiqué, no para siempre. Cuando una descarga vuelve vacía, data/store_harvest.log registra cada respuesta JSON vista; ahí es donde empezar a investigar.

  • La taxonomía es heurística. Las categorías se infieren mediante una combinación multimodal de tokens de límite de palabra, etiquetas de la tienda y minería de conceptos visuales CLIP zero-shot a partir de capturas de pantalla. Los títulos muy estilizados sin capturas de pantalla se asignan por defecto a Tools & Utilities, aunque la búsqueda vectorial semántica y la búsqueda híbrida siempre cubren el vault completo, independientemente de la categoría asignada. El ajuste del vocabulario visual está documentado en docs/concepts.md.

  • La indexación se detiene en el límite del paquete y los metadatos de la tienda son ruidosos. La búsqueda opera sobre títulos, descripciones, etiquetas y embeddings CLIP de imagen completa de las capturas de la galería. Se enfrenta a dos límites estructurales:

    1. Sin indexación de activos internos: No desempaqueta el contenido de los archivos comprimidos para indexar sub-mallas, prefabs o nombres de archivo internos individuales (p. ej., buscar un subelemento arquitectónico concreto como una «teja árabe» o una «contrahuella de hormigón curvo» dentro de un paquete de entorno modular no dará resultados a menos que se declare en el texto del listado o sea prominente en los renders de la galería).

    2. Texto de plantilla vacío de la tienda: Una fracción notable de los listados de la tienda (en particular el og:description con plantilla de Unity) contiene texto de marketing puro ("Elevate your workflow with...") que no aporta ninguna información técnica. Los embeddings CLIP visuales existen precisamente para salvar esta brecha, pero los vectores de imagen completa no siempre pueden resolver subelementos de grano fino.

  • El desempaquetado es solo para Unity. Los activos de Fab se indexan y son buscables, pero la extracción de .unitypackage obviamente no aplica.

Cuando se rompe

Abre un issue. Es un proyecto en solitario, así que no puedo prometer un tiempo de respuesta, pero sí los leo.

Lo que ayuda, según el síntoma:

  • Una descarga volvió vacía o incompleta. Es lo que tiene más probabilidades de romperse, porque las tiendas cambian sus internals sin previo aviso. data/store_harvest.log registra cada respuesta JSON que vio la recolección — la cola de ese archivo es el diagnóstico completo. Inclúyela.

  • La búsqueda no devuelve nada sensato. Comprueba primero python -m src.vision status. Un índice sin construir degrada en silencio la búsqueda a solo palabras clave, y eso explica la mayoría de los informes de «la búsqueda está rota».

  • Categorías incorrectas, o un conflicto que no es real. Eso suele ser la base de conocimiento, más que el código — docs/recipes.md y docs/concepts.md explican cómo arreglarlo tú mismo, y un PR a data/recipes.json con una regla para la que no tengo los activos necesarios para probarla es genuinamente bienvenido.

  • La aplicación independiente no arranca. Es --windowed, así que falla en silencio. %LOCALAPPDATA%\Quartermaster\data\crash.log es donde va a parar.

Si construyes algo chulo con esto, de verdad me gustaría saberlo.

Nota sobre las tiendas

Quartermaster lee tu propia cuenta, desde tu propia máquina, en un navegador en el que has iniciado sesión tú mismo. No guarda credenciales, no envía nada a ningún servidor mío y no tiene telemetría — la sesión vive en un perfil de navegador local y la biblioteca en un archivo SQLite local. No hay ningún backend compartido que pueda filtrarse.

No está afiliado a Unity Technologies ni a Epic Games, no cuenta con su respaldo ni tiene conexión con ellas. Unity, Unity Asset Store, Fab y Unreal Engine son marcas comerciales de sus respectivos propietarios. Automatizar el acceso a cualquier servicio es una decisión que debes tomar tú conforme a los términos de ese servicio, y esta herramienta no la toma por ti.

Licencia

MIT. Consulta LICENSE.

A
license - permissive license
Not graded
quality - not tested
A
maintenance

Maintenance

0dRelease cycle
4Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A Model Context Protocol server that integrates AI assistants like Claude and Cursor directly into the Unity Editor to automate game development workflows. It provides over 40 built-in tools for scene manipulation and project management, while offering a simple C# API for creating custom extensions.
    9
    GPL 3.0
  • A
    license
    B
    quality
    D
    maintenance
    Control Unity Editor from AI agents. 200+ MCP tools for GameObjects, Scenes, Assets, Materials, Prefabs, Terrain, Physics, Lighting, and more. Works with Claude, Cursor, Windsurf, VS Code Copilot — any MCP client. Zero config: just npx and go.
    62
    25
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Connect any MCP-compatible AI client (Claude Code, Cursor, Windsurf) to Unity or Godot. 300+ granular tools, an editor aware system prompt, game design document project context, script semantic search, and skill calibration.
    204
    MIT

View all related MCP servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Tanshaydar/Quartermaster'

If you have feedback or need assistance with the MCP directory API, please join our Discord server