Quartermaster

Seu cofre de ativos de jogos, consultável e executável por agentes de IA (Unity Asset Store & Fab / Unreal) via Model Context Protocol (MCP).

Documentação

Quartermaster

Release License: MIT Quartermaster MCP server – quality and maintenance score on Glama MCP Ready Platform Telemetry Tests

Este projeto começou porque eu queria prototipar uma represa.

Nada sério — uma demo curta, talvez mais se desse certo. Antes de construir qualquer coisa, eu queria ver o que já possuía que pudesse acelerar o processo. Então pesquisei na minha biblioteca por "represa": nada voltou. Claro que nada voltou — nenhum asset se chama represa. Mas espalhados por quatro pacotes que eu já possuía estavam malhas de concreto curvo, um sistema de água, algum terreno rochoso. Tudo o que a represa precisava. Eu tinha a maior parte disso há anos e nunca conectei as peças.

Foi isso que ~1.500 assets em duas lojas fizeram comigo quando isso começou — uma biblioteca que desde então cresceu para mais de 7.500 assets em cinco ecossistemas. Quase tudo de bundles e promoções, nada disso lembrado. E não sou só eu — nenhum assistente de IA sabe também. Peça ajuda a um e ele ou constrói tudo do zero ou manda você fazer compras, enquanto centenas de dólares da coisa exatamente certa estão no seu disco.

O Quartermaster indexa tudo o que você possui na Unity Asset Store, Fab, Quixel Megascans, Gumroad e Leartes Cosmos — localmente, na sua máquina — e serve isso ao seu agente de codificação via MCP. É a ferramenta que eu desejei que existisse naquele dia: pergunte sobre uma represa, e descubra que você já possui malhas de concreto curvo.

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
          └─ Nordic Coastal Cliff (Quixel) · 5785 px/m · 2.03 × 2.92 × 2.44 m
             maps: Basecolor, Normal, Displacement, Cavity, AO, Roughness…
          validate_stack([...])           checks none of them fight each other
          import_asset_to_project(...)    unpacks into Assets/, demos stripped

Todo resultado é algo que você possui ou pode reivindicar gratuitamente — nada é inventado.

Quartermaster spotlight search

Digitando uma descrição, não um nome — nenhum desses resultados compartilha uma palavra com a consulta.

Por que Quartermaster? O trabalho de um intendente nunca foi lembrar o que está nos depósitos — é garantir que você esteja equipado quando for a hora de se mover. Isso está mais perto do problema real do que esquecer. Eu não tinha perdido nada; eu sabia que possuía coisas. O que eu não conseguia fazer era ir de "quero prototipar uma represa" para "abra esses quatro pacotes" sem uma hora de busca antes — e talvez mais se desse certo não sobrevive a uma hora de busca. Ideias que chegam assim não são rejeitadas. Elas simplesmente silenciosamente não acontecem, e você nunca descobre se teriam funcionado.

O que ele indexa

FonteO que entraComo
Unity Asset StorePacotes possuídos, descrições, arte da galeriaColeta autenticada
Fab (Epic)Listagens possuídas de Unreal e UnityColeta autenticada
Quixel Megascans / MegaplantsO catálogo, com densidade de texel, área de escaneamento e listas de mapasSincronização de catálogo público
GumroadProdutos possuídosColeta autenticada
Leartes CosmosInventário Cosmos possuído e reivindicável, com galerias de capturas de tela profundas (18 em média, até 71)Coleta autenticada

Tudo cai em uma única tabela SQLite atrás de uma superfície de busca, então uma consulta cruza todas elas de uma vez. Nada é limitado por engine: uma superfície Megascans e um shader Unity voltam da mesma pergunta se ambos a respondem.

A parte que ninguém te conta

Nenhuma das lojas admite o que você possui.

A Unity removeu /account/purchases (404 desde agosto de 2026). A Fab não tem API de propriedade, nenhum botão de exportação, nada. Seu histórico de compras existe apenas dentro do GraphQL privado deles, atrás de SSO, MFA e detecção de bots.

Conseguir isso levou quatro tentativas, três delas falhas:

  1. Chromium empacotado do Playwright — o captcha da Epic recusa categoricamente ("habilite JavaScript").
  2. Playwright dirigindo seu navegador real — injeta hooks detectáveis; a Epic lança uma segunda parede de segurança após a senha.
  3. Depurador anexado durante o login — mesmo resultado. Qualquer coisa que toque no fluxo de login é sinalizada.
  4. O que realmente funciona: pare de automatizar o login completamente. Você faz login através de uma janela de navegador comum — sem porta de depuração, nada entre você e a loja — porque a automação em si era o que disparava os sistemas de risco. Somente depois que você termina, em uma sessão que você mesmo estabeleceu, o Quartermaster anexa um depurador e reproduz as consultas paginadas da própria loja — com seus próprios cabeçalhos CSRF, seu próprio chunking (42 IDs por requisição, porque é isso que o cliente da Unity envia).

Esse truque é a maior parte deste projeto. O resto — busca, linting, descompactação — é honestamente simples em comparação.

Duas regras duramente conquistadas incorporadas ao design, se você algum dia hackear isso você mesmo:

  • Navegadores devem fechar graciosamente (taskkill sem /F). Um encerramento abrupto perde o cookie de confiança de dispositivo da Unity e você será desafiado com MFA em toda sessão futura.
  • Nunca execute uma coleta de biblioteca em modo headless. Headless dispara o sistema de risco da Unity mesmo com cookies válidos.

Quixel Megascans, e por que sua biblioteca Fab parece curta

A visualização da biblioteca da Fab e o catálogo Megascans não são a mesma lista, e não há exportação que as reconcilie — você pode ter direitos sobre muito mais conteúdo Megascans do que sua página de biblioteca exibe. Qualquer que seja a causa, o resultado prático é o mesmo: rolar e procurar manualmente por algo que você já tem.

O Quartermaster contorna isso. Ele sincroniza os catálogos de vendedores Quixel Megascans e Quixel Megaplants diretamente da Fab — 5.580 listagens no momento em que escrevo — independentemente de o que sua visualização de biblioteca mostra, e os arquiva ao lado de tudo o mais que você possui, marcados por status:

  • vault_owned — na sua biblioteca
  • catalog_grant — reivindicável gratuitamente sob a Licença de Conteúdo Epic, ainda não adquirido

Ambos são pesquisáveis, e todo resultado diz qual é, então um agente pode distinguir "você possui isso" de "você pode ter isso de graça" sem adivinhar.

Linhas Megascans também carregam suas especificações físicas onde a listagem as publica — densidade de texel, área de escaneamento e a lista de mapas (basecolor, normal, displacement, cavity, AO, roughness…). Essa é a diferença entre um agente dizendo que encontrou uma rocha e um agente dizendo que encontrou um escaneamento de 1×1 m a 8192 px/m com displacement — que é a parte que decide se é utilizável.

python -m src.store_client sync-quixel      # catalog
python -m src.store_client enrich-quixel    # texel density, scan area, maps

O que você obtém

Busca que entende intenção e visão. Este é o problema da represa.

  • Palavras-chave exatas via SQLite FTS5.
  • Intenção em linguagem natural via embeddings de texto ONNX locais (BAAI/bge-small-en-v1.5) — "estruturas de concreto para conter água" traz à tona malhas e shaders cujas listagens nunca mencionam represas.
  • Compreensão visual multimodal via embeddings CLIP ONNX (Qdrant/clip-ViT-B-32) — buscar "catedral gótica" literalmente pontua suas capturas de tela e renders promocionais, encontrando assets mesmo quando suas descrições de texto são completamente silenciosas. Um acerto visual também devolve qual captura de tela correspondeu, não apenas a arte da capa.
  • Todo resultado mostra seu raciocínio. Cada acerto carrega um campo match — keyword, semantic+vision, keyword+semantic+vision — para que você e seu agente possam ver qual sinal disparou. Um acerto puramente visual em uma listagem com texto de marketing inútil é um tipo diferente de resultado do que uma correspondência exata de título, e deve ser legível como tal.
  • Tags de conceito extraídas de capturas de tela. A passagem de visão offline pontua cada imagem da galeria contra um vocabulário visual e escreve os sobreviventes de volta no índice FTS, então "vila medieval" e "atmosfera de terror sombrio" se tornam pesquisáveis por palavra-chave em assets cujas descrições nunca disseram nenhum dos dois. O vocabulário é um arquivo JSON que você pode substituir — veja docs/concepts.md. Todos os três sinais são fundidos com Fusão de Classificação Recíproca (RRF) de 3 vias na sua CPU. Sem GPU, sem processo de banco de dados vetorial, sem API em nuvem — ONNX Runtime e uma matriz numpy, no mesmo processo que todo o resto.

Medido em um cofre de ~7.500 assets: ~520 MB de pico de RAM com ambos os modelos residentes, ~1,4 s para a primeira consulta (carregando BGE e CLIP), ~85 ms quente depois disso. Os modelos carregam preguiçosamente, então um agente que nunca busca nunca paga por eles.

Verdade fundamental sobre seu disco. Escaneia %APPDATA%/Unity/Asset Store-5.x/ e o VaultCache da Epic para que todo resultado saiba se já está baixado ou apenas na nuvem. Agentes preferem o que é local — uma importação sem download vence uma de 4 GB.

Um linter para stacks. Dois renderizadores de vegetação vão brigar. Um módulo MicroSplat sem o MicroSplat principal silenciosamente não faz nada. Um shader apenas-URP em um projeto HDRP renderiza rosa. O Quartermaster pega esses problemas antes de você gastar uma tarde neles.

Descompactação direta. Extrai arquivos .unitypackage em cache diretamente em Assets/, descartando /Demo/, /Samples/, /Documentation/ e PDFs no caminho — tipicamente 60–80% menos inchaço por pacote. Todo caminho declarado é normalizado e verificado dentro de <project>/Assets/; escapes são estruturalmente impossíveis, não apenas filtrados.

Instalação

O pacote autônomo — baixe Quartermaster-windows-x64.zip de Releases, descompacte em qualquer lugar. Sem Python necessário.

  • Quartermaster.exe — GUI de desktop com busca spotlight Win+Alt+V, coleta de lojas, navegação de biblioteca e descompactação direta.
  • Quartermaster-mcp.exe — Servidor MCP stdio autônomo para Claude Desktop, Cursor, Antigravity e Windsurf.

Seus dados de biblioteca vivem com segurança em %LOCALAPPDATA%\Quartermaster, então atualizações são simples substituições de pasta com zero perda de dados.

A partir do código-fonte — requer Python 3.10+.

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

Semeie sua biblioteca:

1. Entre. O único passo que precisa de você. Uma janela de navegador normal abre; 2FA e captchas se comportam exatamente como sempre. Feche-a quando terminar e a sessão persiste localmente.

python -m src.store_client login unity
python -m src.store_client login fab
python -m src.store_client login gumroad     # optional
python -m src.store_client login cosmos      # optional — Leartes Cosmos

2. Colete e enriqueça. Longo, retomável, seguro para reexecutar — cada um continua de onde parou.

python -m src.store_client fetch unity
python -m src.store_client fetch fab
python -m src.store_client fetch gumroad     # if you signed in above
python -m src.store_client fetch cosmos      # if you signed in above
python -m src.store_client sync-quixel       # Megascans/Megaplants catalog — no login needed
python -m src.store_client enrich            # descriptions and cover art, politely batched
python -m src.store_client enrich-quixel     # Megascans scan specs
python -m src.store_client fab-deep-media    # Fab only: plain HTTP is 403'd, galleries need the authed browser

3. Construa os índices locais, depois escaneie seu 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 e vision build são o que fazem "estruturas de concreto para conter água" e consultas de conceito visual encontrarem seus assets. Pule-os e a busca ainda funciona, mas apenas em palavras-chave exatas.

Execute local_scan depois de ter um catálogo, não antes. Escaneado contra um cofre vazio, não tem nada para corresponder nomes de arquivo, então arquiva cada pacote em cache como sua própria entrada simples. Inofensivo — o próximo escaneamento os reconcilia contra o catálogo real — mas você verá duplicatas até lá.

Já tem exportações CSV das lojas? Pule o navegador completamente:

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

Conecte seus agentes:

Opção A: Auto-registro (um 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

O registro mescla-se nas configurações de cliente existentes e cria um .quartermaster-backup primeiro. Não vai sobrescrever seus outros servidores.

Opção B: Configuração manual Cole o bloco do servidor na sua configuração de cliente:

Binário autônomo:

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

A partir do código-fonte:

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

O Claude Desktop lê %APPDATA%/Claude/claude_desktop_config.json, o Cursor ~/.cursor/mcp.json, o Windsurf ~/.codeium/windsurf/mcp_config.json.

[!NOTE] Aquecimento do modelo na primeira execução: Na primeira busca de linguagem natural ou visão, os modelos de embedding (BAAI/bge-small-en-v1.5 e clip-ViT-B-32) são baixados e armazenados em cache localmente pelo ONNX Runtime (~150 MB). A primeira consulta pode levar 3–5 segundos enquanto carrega na memória; toda consulta subsequente executa em ~100 ms.

Ferramentas do agente

FerramentaResponde
search_owned_assets(query, ...)O que eu possuo que se encaixa nisso? Híbrido palavra-chave + semântico.
get_asset_details(asset_id)Metadados completos, notas de uso, galeria, URL da loja.
get_stack_recommendations(brief)Mapeia um resumo de recurso para pacotes possuídos.
validate_stack(asset_ids)Eles vão brigar entre si? Conflitos de função, pré-requisitos ausentes.
list_stack_recipes()Stacks de produção curados resolvidos contra sua biblioteca.
audit_project(project_dir)Engine, versão, pipeline de renderização de um projeto alvo.
import_asset_to_project(asset_id, project_dir)Descompacta um pacote local em Assets/ (pacotes UPM empacotados em Packages/).
list_asset_categories()Divisão por categoria e contagens.
get_vault_stats()Totais por fonte e categoria, local vs nuvem.

Dois arquivos permitem que você ensine ao Quartermaster seu próprio vocabulário, sem mudanças de código:

  • data/recipes.json — funções, pré-requisitos e stacks curados. É com isso que o linter de conflitos raciocina: quais assets competem pela mesma vaga, o que precisa do quê e quais combinações você considera uma stack conhecida e boa.
  • data/concepts.json — o vocabulário visual contra o qual o CLIP pontua suas capturas de tela. A lista enviada tem formato de jogo; se você faz arquitetura ou pré-visualização, substitua-a e reconstrua.

Ambos são JSON simples lidos em tempo de execução, e ambos têm uma página de referência em docs/.

Outras formas de acesso

  • Aplicativo desktop (run_desktop.bat) — busca spotlight em PySide6 com ícone na bandeja; pressione Win+Alt+V em qualquer lugar no Windows. Funciona junto com seu agente sem atrapalhar — o banco de dados roda em modo WAL, então a GUI gravando enquanto seu agente pesquisa nunca bloqueia nenhum dos dois.

    É mais do que a barra de busca, embora seja a parte que você usará mais:

    • Pressione espaço em qualquer resultado para uma prévia em tamanho real, como o Finder faz. Os painéis de detalhes carregam até 24 imagens da galeria, decodificadas e armazenadas em cache em segundo plano.
    • Linhas do Megascans mostram suas especificações de scan inline — densidade de texel, dimensões físicas, lista de mapas PBR — para você distinguir um penhasco de 5785 px/m de uma superfície de 1 m com tile sem abrir a página da loja.
    • Revelar no Explorer, Extrair para Unity (mesmo sandbox e remoção de demos que a ferramenta MCP) e Copiar Contexto, que despeja o título, editor, pipelines, formatos, especificações e caminho em disco de um asset como um bloco de texto simples que você pode colar direto num chat.
    • Filtre por fonte (Unity, Fab, Quixel, Gumroad, Cosmos), por pipeline (HDRP, URP, Built-in) ou pelo que já está no disco.
    • Logins, coletas e a sincronização do Quixel rodam daqui com progresso ao vivo e ETA contínuo, e todos são retomáveis.
  • Interface web (run_ui.bat) — painel em modo escuro em http://localhost:7890.

  • No Unity — importe editor_bridge/Quartermaster-Bridge.unitypackage e depois Window > Quartermaster. Pesquise e importe sem sair do editor. Observação rápida: esse pacote de ponte é gerado por src/build_bridge.py, que escreve o mesmo formato tar que o unpacker.py lê. Dogfooding de propósito.

Segurança

Esta ferramenta guarda sessões de loja e escreve em seus projetos, então ela leva a API local a sério:

  • Todo endpoint que altera estado exige um token (gerado na primeira execução, armazenado em data/.auth_token, espelhado para a ponte Unity). Envie-o como X-Quartermaster-Token ou Authorization: Bearer; a interface web recebe um cookie SameSite=Strict automaticamente.
  • Requisições de origens cruzadas são rejeitadas mesmo com token válido.
  • O sandbox do extrator colapsa segmentos .., remove letras de unidade e caracteres de controle, realoca qualquer coisa fora de Assets/ para Assets/_Quartermaster_Imported/ (exceto um pacote UPM embutido bem formado, que é confinado à sua própria pasta Packages/<name>/) e garante que o caminho final caia dentro do projeto — reforçado por testes, não por achismo (python run_tests.py -v).
  • O proxy de imagens é permitido por domínio, bloqueia faixas privadas e endpoints de metadados, revalida cada salto de redirecionamento, limita tamanhos e remove as entradas mais antigas quando o cache passa do limite de arquivos.

Nada envia dados para fora. Sua biblioteca, embeddings, caminhos de disco e sessões de loja permanecem nesta máquina.

Configuração

Chaves opcionais em config.json (criado na primeira execução):

ChavePadrãoFinalidade
server_port7890Porta da interface web / API.
embedding_modelBAAI/bge-small-en-v1.5Qualquer modelo compatível com fastembed. Altere e reconstrua o índice.
fab_vault_dirsdetectado automaticamenteSubstituir locais do VaultCache do Fab.
strip_dirs / strip_extsdemos, docs, PDFsO que o extrator descarta.
enrich_batch_size / enrich_batch_pause20 / 3sLimite de cortesia para enriquecimento.
media_cache_enabledtrueCache em disco para capas via proxy.

Limitações honestas

  • Prioridade para Windows, capaz no Linux. Windows é a plataforma testada, e o atalho Win+Alt+V é exclusivo do Windows. Uma build linux-x64 é distribuída e a varredura de disco conhece as raízes de cache do Linux e macOS, mas elas recebem muito menos uso do que os caminhos do Windows. Não há build para macOS.
  • Uma máquina, um usuário. Sem sincronização, sem modo servidor. Deliberado.
  • Coleta é scraping. Unity e Fab mudam seus internals quando bem entendem, e já mudaram — os tamanhos de bloco, endpoints e formatos GraphQL aqui estão corretos no dia em que enviei, não para sempre. Quando uma busca volta vazia, data/store_harvest.log registra cada resposta JSON vista; é daí que se começa a investigar.
  • Taxonomia é heurística. Categorias são inferidas por uma mistura multimodal de tokens de fronteira de palavra, tags da loja e mineração visual de conceitos CLIP zero-shot a partir de capturas de tela. Títulos altamente estilizados sem capturas de tela caem no padrão Tools & Utilities, embora a busca vetorial semântica e a busca híbrida sempre cubram todo o vault independentemente da categoria atribuída. Ajustar o vocabulário visual está documentado em docs/concepts.md.
  • A indexação para no limite do pacote e os metadados da loja são ruidosos. A busca opera sobre títulos, descrições, tags e embeddings CLIP de imagem inteira das capturas da galeria. Ela enfrenta dois limites estruturais:
    1. Sem indexação interna de assets: Ela não extrai o conteúdo de arquivos para indexar sub-malhas, prefabs ou nomes de arquivos internos (por exemplo, buscar um sub-elemento arquitetônico específico como "telha" ou "espelho curvo de concreto" dentro de um pacote de ambiente modular não encontrará nada, a menos que esteja declarado no texto da listagem ou seja proeminente nos renders da galeria).
    2. Texto padrão vazio da loja: Uma fração notável das listagens da loja (particularmente o og:description modelado da Unity) contém texto de marketing puro ("Eleve seu fluxo de trabalho com...") que carrega zero informação técnica. Os embeddings visuais CLIP existem justamente para preencher essa lacuna, mas vetores de imagem inteira nem sempre conseguem resolver sub-elementos de granularidade fina.
  • A extração é exclusiva do Unity. Assets do Fab são indexados e pesquisáveis, mas a extração .unitypackage obviamente não se aplica.

Quando quebrar

Abra uma issue. É um projeto solo, então não posso prometer um tempo de resposta, mas eu leio todas.

O que ajuda, por sintoma:

  • Uma busca voltou vazia ou curta. É o que tem mais chance de quebrar, porque as lojas mudam seus internals sem aviso. data/store_harvest.log registra cada resposta JSON que a coleta viu — o final desse arquivo é o diagnóstico completo. Inclua-o.
  • A busca não retorna nada sensato. Verifique python -m src.vision status primeiro. Um índice não construído degrada silenciosamente para apenas palavras-chave, e isso responde pela maioria dos relatos de "busca quebrada".
  • Categorias erradas, ou um conflito que não é real. Isso geralmente é a base de conhecimento, não o código — docs/recipes.md e docs/concepts.md cobrem como corrigir você mesmo, e um PR para data/recipes.json com uma regra para a qual eu não tenho os assets para testar é genuinamente bem-vindo.
  • O executável não inicia. Ele é --windowed, então falha silenciosamente. %LOCALAPPDATA%\Quartermaster\data\crash.log é onde ele cai.

Se você construir algo legal com isso, eu realmente gostaria de saber.

Uma nota sobre as lojas

O Quartermaster lê sua própria conta, da sua própria máquina, em um navegador no qual você fez login você mesmo. Ele não guarda credenciais, não envia nada para nenhum servidor meu e não tem telemetria — a sessão vive em um perfil de navegador local e a biblioteca em um arquivo SQLite local. Não há backend compartilhado para vazar.

Ele não é afiliado, endossado ou conectado à Unity Technologies, Epic Games, Gumroad ou Leartes Studios. Unity, Unity Asset Store, Fab, Unreal Engine, Quixel, Megascans, Gumroad, Leartes e Cosmos são marcas registradas de seus respectivos proprietários. Automatizar o acesso a qualquer serviço é uma decisão sua contra os termos desse serviço, e esta ferramenta não decide por você.

Licença

MIT. Veja LICENSE.