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

Dieses Projekt entstand, weil ich einen Staudamm prototypisieren wollte.

Nichts Ernstes — eine kurze Demo, vielleicht mehr, wenn es funktioniert hätte. Bevor ich irgendetwas baute, wollte ich wissen, was ich bereits besaß, das den Prozess beschleunigen könnte. Also durchsuchte ich meine Bibliothek nach „dam“: nichts kam zurück. Natürlich kam nichts zurück — kein Asset trägt den Namen dam. Aber verteilt über vier Pakete, die ich bereits besaß, gab es gekrümmte Beton-Meshes, ein Wassersystem, felsiges Gelände. Alles, was der Damm brauchte. Den Großteil davon hatte ich seit Jahren, ohne die Teile je zusammenzusetzen.

Das bewirken ~1.500 Assets in zwei Stores. Fast alles davon aus Bundles und Sales, nichts davon im Gedächtnis. Und es geht nicht nur mir so — auch kein KI-Assistent weiß es. Bittet man einen um Hilfe, baut er entweder alles von Grund auf neu oder schickt einen einkaufen, während hunderte Dollar des exakt Richtigen auf der eigenen Festplatte liegen.

Quartermaster indexiert deine gesamte Unity-Asset-Store- und Fab-Bibliothek lokal und stellt sie deinem Coding-Agenten über MCP bereit. Es ist das Werkzeug, das ich mir an jenem Tag gewünscht hätte: Frag nach einem Damm und erfahre, dass du bereits gekrümmte Beton-Meshes besitzt.

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

Jedes Ergebnis ist etwas, das du bereits bezahlt hast. Nichts ist erfunden.

Quartermaster spotlight search

Eine Beschreibung eintippen, keinen Namen — keines dieser Ergebnisse teilt ein Wort mit der Suchanfrage.

Warum Quartermaster? Die Aufgabe eines Quartiermeisters war nie, sich zu merken, was in den Lagern liegt — sondern sicherzustellen, dass du ausgerüstet bist, wenn es losgeht. Das kommt dem eigentlichen Problem näher als das Vergessen. Ich hatte nichts verloren; ich wusste, dass ich Zeug besaß. Was ich nicht konnte, war, von „Ich möchte einen Staudamm prototypisieren“ zu „Öffne diese vier Pakete“ zu gelangen, ohne vorher eine Stunde zu graben — und vielleicht mehr, wenn es funktioniert hätte überlebt keine Stunde Graben. Ideen, die auf diese Weise entstehen, werden nicht verworfen. Sie finden nur stillschweigend nicht statt, und man erfährt nie, ob sie funktioniert hätten.

Was dir niemand sagt

Keiner der beiden Stores gibt zu, was du besitzt.

Unity hat /account/purchases entfernt (seit August 2026 404). Fab hat keine Ownership-API, keinen Export-Button, nichts. Deine Kaufhistorie existiert nur in deren privatem GraphQL, hinter SSO, MFA und Bot-Erkennung.

Um da heranzukommen, brauchte es vier Versuche, drei davon Fehlschläge:

  1. In Playwright gebündeltes Chromium — Epics Captcha lehnt es rundweg ab („JavaScript aktivieren“).

  2. Playwright steuert deinen echten Browser — injiziert erkennbare Hooks; Epic wirft nach dem Passwort eine zweite Sicherheitswand auf.

  3. Debugger während der Anmeldung angehängt — gleiches Ergebnis. Alles, was den Login-Ablauf berührt, wird markiert.

  4. Was tatsächlich funktioniert: die Anmeldung gar nicht erst zu automatisieren. Du meldest dich über ein normales Browserfenster an — kein Debug-Port, nichts zwischen dir und dem Store —, denn die Automatisierung selbst war es, die die Risikosysteme ausgelöst hat. Erst nachdem du fertig bist, hängt Quartermaster in einer Sitzung, die du selbst eingerichtet hast, einen Debugger an und spielt die eigenen paginierten Abfragen des Stores ab — mit dessen eigenen CSRF-Headern, dessen eigenem Chunking (42 IDs pro Anfrage, weil das Unitys Client so sendet).

Dieser Trick macht den Großteil dieses Projekts aus. Der Rest — Suche, Linting, Entpacken — ist ehrlich gesagt einfach im Vergleich.

Zwei hart erkämpfte Regeln sind ins Design eingebacken, falls du selbst daran herumschraubst:

  • Browser müssen sauber geschlossen werden (taskkill ohne /F). Ein abruptes Beenden verliert Unitys Device-Trust-Cookie, und du wirst bei jeder künftigen Sitzung zu MFA aufgefordert.

  • Führe einen Bibliotheksabruf niemals headless aus. Headless triggert Unitys Risikosystem selbst mit gültigen Cookies.

Related MCP server: glade-mcp

Was du bekommst

Suche, die Absicht & Bild versteht. Das ist das Damm-Problem.

  • Exakte Schlüsselwörter per SQLite FTS5.

  • Natürlichsprachliche Absicht über lokale ONNX-Text-Embeddings (BAAI/bge-small-en-v1.5) — „concrete structures for holding back water“ spürt Meshes und Shader auf, deren Listings Dämme nie erwähnen.

  • Cross-modales visuelles Verständnis über ONNX-CLIP-Embeddings (Qdrant/clip-ViT-B-32) — die Suche nach „gothic cathedral“ bewertet buchstäblich deine Screenshots und Promo-Render und findet Assets selbst dann, wenn ihre Textbeschreibungen völlig schweigen. Alle drei Signale werden mit 3-Wege-Reciprocal-Rank-Fusion (RRF) auf deiner CPU fusioniert. Keine GPU, kein Vektor-Datenbankprozess, keine Cloud-API — ONNX Runtime und eine numpy-Matrix, im selben Prozess wie alles andere.

Gemessen an einem Bestand von ~1.800 Assets: ~480 MB RAM-Peak mit beiden residenten Modellen, ~1,5 s für die erste Abfrage (Laden von BGE und CLIP), danach ~110 ms warm. Die Modelle werden lazy geladen, sodass ein Agent, der nie sucht, nie dafür zahlt.

Der tatsächliche Zustand deiner Festplatte. Scannt %APPDATA%/Unity/Asset Store-5.x/ und Epics VaultCache, sodass jedes Ergebnis weiß, ob es bereits heruntergeladen oder nur in der Cloud ist. Agenten bevorzugen, was lokal ist — ein Import ohne Download schlägt einen mit 4 GB.

Ein Linter für Stacks. Zwei Vegetations-Renderer werden sich streiten. Ein MicroSplat-Modul ohne das Kern-MicroSplat tut stillschweigend nichts. Ein URP-only-Shader in einem HDRP-Projekt rendert pink. Quartermaster erkennt das, bevor du einen Nachmittag damit verbringst.

Direktes Entpacken. Extrahiert gecachte .unitypackage-Dateien direkt nach Assets/ und verwirft dabei /Demo/, /Samples/, /Documentation/ und PDFs — typischerweise 60–80 % weniger Ballast pro Paket. Jeder deklarierte Pfad wird normalisiert und innerhalb von <project>/Assets/ geprüft; Pfadausbrüche sind strukturell unmöglich, nicht nur herausgefiltert.

Installation

Das Standalone-Bundle — lade Quartermaster-windows-x64.zip von Releases herunter und entpacke es irgendwohin. Kein Python erforderlich.

  • Quartermaster.exe — Desktop-GUI mit Win+Alt+V-Spotlight-Suche, Store-Harvesting, Bibliotheksdurchsuchen und direktem Entpacken.

  • Quartermaster-mcp.exe — eigenständiger MCP-stdio-Server für Claude Desktop, Cursor, Antigravity und Windsurf.

Deine Bibliotheksdaten liegen sicher in %LOCALAPPDATA%\Quartermaster, sodass Upgrades einfache Ordnerersetzungen ohne Datenverlust sind.

Aus dem Quellcode — benötigt Python 3.10+.

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

Befülle deine Bibliothek:

1. Anmelden. Der eine Schritt, der dich braucht. Ein normales Browserfenster öffnet sich; 2FA und Captchas verhalten sich genau wie immer. Schließe es, wenn du fertig bist, und die Sitzung bleibt lokal erhalten.

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

2. Sammeln und anreichern. Langlaufend, fortsetzbar, gefahrlos wiederholbar — jeder Durchlauf macht dort weiter, wo er aufgehört hat.

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. Die lokalen Indizes erstellen, dann deine Festplatte scannen.

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 und vision build sorgen dafür, dass „concrete structures for holding back water“ und visuelle Konzeptanfragen deine Assets finden. Überspringst du sie, funktioniert die Suche weiterhin, aber nur mit exakten Schlüsselwörtern.

Führe local_scan erst nach einem vorhandenen Katalog aus, nicht davor. Bei einem Scan gegen einen leeren Bestand gibt es nichts, womit Dateinamen abgeglichen werden könnten, also legt er jedes gecachte Paket als eigenen, nackten Eintrag ab. Harmlos — der nächste Scan gleicht sie mit dem echten Katalog ab —, aber bis dahin siehst du Doppelte.

Du hast bereits CSV-Exporte aus den Stores? Überspringe den Browser komplett:

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

Verbinde deine Agenten:

Option A: Automatische Registrierung (ein Befehl)

# 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

Die Registrierung fügt sich in bestehende Client-Konfigurationen ein und erstellt zuerst ein .quartermaster-backup. Sie überschreibt deine anderen Server nicht.

Option B: Manuelle Konfiguration Füge den Server-Block in deine Client-Konfiguration ein:

Standalone-Binary:

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

Aus dem Quellcode:

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

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

[!NOTE] Modell-Aufwärmen beim ersten Start: Bei der allerersten natürlichsprachlichen oder visuellen Suche werden die Embedding-Modelle (BAAI/bge-small-en-v1.5 und clip-ViT-B-32) von ONNX Runtime heruntergeladen und lokal zwischengespeichert (~150 MB). Die erste Abfrage kann 3–5 Sekunden dauern, während sie in den Speicher geladen werden; jede weitere Abfrage läuft in ~100 ms.

Agent-Tools

Tool

Antworten

search_owned_assets(query, ...)

Was besitze ich, das dazu passt? Hybride Stichwort- + semantische Suche.

get_asset_details(asset_id)

Vollständige Metadaten, Verwendungshinweise, Galerie, Store-URL.

get_stack_recommendations(brief)

Ordnet ein Feature-Briefing vorhandenen Paketen zu.

validate_stack(asset_ids)

Kämpfen diese miteinander? Rollenkonflikte, fehlende Voraussetzungen.

list_stack_recipes()

Kuratierte Produktions-Stacks, abgeglichen mit deiner Bibliothek.

audit_project(project_dir)

Engine, Version, Render-Pipeline eines Zielprojekts.

import_asset_to_project(asset_id, project_dir)

Entpacke ein lokales Paket nach Assets/.

list_asset_categories()

Kategorie-Aufschlüsselung und Anzahl.

get_vault_stats()

Gesamtzahlen nach Engine und Kategorie, lokal vs. Cloud.

Zwei Dateien ermöglichen es dir, Quartermaster dein eigenes Vokabular beizubringen, ohne Codeänderungen:

  • data/recipes.json — Rollen, Voraussetzungen und kuratierte Stacks. Damit arbeitet der Konflikt-Linter: welche Assets um dieselbe Aufgabe konkurrieren, was was braucht und welche Kombination du als bewährten Stack betrachtest.

  • data/concepts.json — das visuelle Vokabular, gegen das CLIP deine Screenshots bewertet. Die mitgelieferte Liste ist auf Spiele zugeschnitten; wenn du Archviz oder Previs machst, ersetze sie und baue die Indizes neu.

Beides sind einfache JSON-Dateien, die zur Laufzeit gelesen werden, und beide haben eine Referenzseite unter docs/.

Weitere Wege

  • Desktop-App (run_desktop.bat) — PySide6-Spotlight-Suche mit Tray-Symbol; drücke Win+Alt+V überall in Windows. Läuft neben deinem Agenten, ohne ihm in die Quere zu kommen — die Datenbank läuft im WAL-Modus, sodass das Schreiben der GUI während der Suche deines Agenten keinen von beiden blockiert.

  • Web-UI (run_ui.bat) — Dashboard im dunklen Modus unter http://localhost:7890.

  • In Unity — importiere editor_bridge/Quartermaster-Bridge.unitypackage, dann Window > Quartermaster. Suche und importiere, ohne den Editor zu verlassen. Kleine Randnotiz: Dieses Bridge-Paket wird von src/build_bridge.py erzeugt, das dasselbe Tar-Format schreibt, das unpacker.py liest. Bewusstes Dogfooding.

Sicherheit

Dieses Ding verwaltet Store-Sitzungen und schreibt in deine Projekte, also nimmt es die lokale API ernst:

  • Jeder zustandsändernde Endpunkt erfordert ein Token (beim ersten Start generiert, in data/.auth_token gespeichert, für die Unity-Brücke gespiegelt). Sende es als X-Quartermaster-Token oder Authorization: Bearer; die Web-UI erhält automatisch ein SameSite=Strict-Cookie.

  • Cross-Origin-Anfragen werden selbst mit einem gültigen Token abgelehnt.

  • Die Entpacker-Sandbox löst ..-Segmente auf, entfernt Laufwerksbuchstaben und Steuerzeichen, verschiebt alles außerhalb von Assets/ nach Assets/_Quartermaster_Imported/ und stellt sicher, dass der endgültige Pfad innerhalb des Projekts liegt — erzwungen durch Tests, nicht durch Bauchgefühl (python run_tests.py -v).

  • Der Bild-Proxy ist auf eine Domain-Allowlist beschränkt, blockt private IP-Bereiche und Metadaten-Endpunkte, validiert jeden Redirect-Hop erneut, begrenzt Größen und entfernt die ältesten Einträge, sobald der Cache sein Dateilimit überschreitet.

Nichts telefoniert nach Hause. Deine Bibliothek, Embeddings, Festplattenpfade und Store-Sitzungen bleiben auf diesem Rechner.

Konfiguration

Optionale Schlüssel in config.json (beim ersten Start erstellt):

Schlüssel

Standard

Zweck

server_port

7890

Port für Web-UI / API.

embedding_model

BAAI/bge-small-en-v1.5

Beliebiges fastembed-kompatibles Modell. Ändern und den Index neu aufbauen.

fab_vault_dirs

automatisch erkannt

Überschreibt Fab-VaultCache-Speicherorte.

strip_dirs / strip_exts

demos, docs, PDFs

Was der Entpacker verwirft.

enrich_batch_size / enrich_batch_pause

20 / 3s

Höflichkeits-Drosselung für die Anreicherung.

media_cache_enabled

true

Festplatten-Cache für per Proxy geladene Cover-Bilder.

Ehrliche Einschränkungen

  • Windows-lastig. Die Cache-Suche setzt Windows-Pfade voraus. Die MCP-Suche funktioniert überall; die Erkennung lokaler Importe nicht.

  • Ein Rechner, ein Benutzer. Keine Synchronisierung, kein Servermodus. Bewusste Entscheidung.

  • Harvesting ist Scraping. Unity und Fab ändern ihre Interna, wann immer es ihnen passt, und haben das auch getan – die hier enthaltenen Chunk-Größen, Endpunkte und GraphQL-Formen entsprechen dem Stand des Tages, an dem ich es ausgeliefert habe, nicht für immer. Wenn ein Abruf leer zurückkommt, protokolliert data/store_harvest.log jede gesehene JSON-Antwort; dort sollte man ansetzen.

  • Taxonomie ist heuristisch. Kategorien werden über eine multimodale Mischung aus Wortgrenzen-Tokens, Store-Tags und Zero-Shot-CLIP-Mining visueller Konzepte aus Screenshots abgeleitet. Stark stilisierte Titel ohne Screenshots fallen standardmäßig auf Tools & Utilities zurück, obwohl semantische Vektorsuche und hybride Suche immer den gesamten Vault abdecken, unabhängig von der zugewiesenen Kategorie. Die Feinabstimmung des visuellen Vokabulars ist in docs/concepts.md dokumentiert.

  • Die Indizierung endet an der Paketgrenze & Store-Metadaten sind verrauscht. Die Suche erstreckt sich über Titel, Beschreibungen, Tags und CLIP-Embeddings ganzer Galerie-Screenshots. Sie stößt auf zwei strukturelle Grenzen:

    1. Keine Indizierung interner Assets: Der Inhalt von Archiven wird nicht entpackt, um einzelne Sub-Meshes, Prefabs oder interne Dateinamen zu indizieren (z. B. findet die Suche nach einem bestimmten architektonischen Unterelement wie einer „Dachpfanne“ oder „gebogenen Betonstufe“ in einem modularen Umgebungspaket keinen Treffer, sofern es nicht im Listungstext angegeben oder in Galerie-Renderings deutlich sichtbar ist).

    2. Hohler Store-Standardtext: Ein merklicher Teil der Store-Einträge (insbesondere Unitys vorlagenbasiertes og:description) enthält reine Marketing-Floskeln („Optimieren Sie Ihren Workflow mit …“), die keinerlei technische Informationen enthalten. Die visuellen CLIP-Embeddings existieren genau, um diese Lücke zu schließen, aber Ganzbild-Vektoren können feingranulare Unterelemente nicht immer auflösen.

  • Entpacken ist nur für Unity. Fab-Assets werden indiziert und sind durchsuchbar, aber die Extraktion von .unitypackage entfällt natürlich.

Wenn etwas schiefgeht

Öffne ein Issue. Es ist ein Solo-Projekt, ich kann also keine Antwortzeit versprechen, aber ich lese sie wirklich.

Was hilft, sortiert nach Symptom:

  • Ein Abruf kam leer oder unvollständig zurück. Das ist das wahrscheinlichste Problem, denn die Stores ändern ihre Interna ohne Ankündigung. data/store_harvest.log protokolliert jede JSON-Antwort, die der Harvest gesehen hat – das Ende dieser Datei ist die komplette Diagnose. Füge es bei.

  • Die Suche liefert nichts Brauchbares. Prüfe zuerst python -m src.vision status. Ein nicht erstellter Index fällt stillschweigend auf eine reine Stichwortsuche zurück, und das erklärt die meisten Meldungen „Suche ist kaputt“.

  • Falsche Kategorien oder ein Konflikt, der keiner ist. Das liegt in der Regel an der Wissensbasis und nicht am Code – docs/recipes.md und docs/concepts.md zeigen, wie man es selbst behebt, und ein Pull-Request an data/recipes.json mit einer Regel, für die ich keine Assets zum Testen besitze, ist ausdrücklich willkommen.

  • Das Standalone-Programm startet nicht. Es wird mit --windowed gestartet, daher schlägt es still fehl. %LOCALAPPDATA%\Quartermaster\data\crash.log ist der Ort, an dem es landet.

Wenn du damit etwas Cooles baust, würde ich wirklich gern davon hören.

Ein Hinweis zu den Stores

Quartermaster greift auf dein eigenes Konto zu, von deinem eigenen Rechner aus, in einem Browser, in dem du dich selbst angemeldet hast. Es speichert keine Zugangsdaten, sendet nichts an irgendeinen meiner Server und hat keine Telemetrie – die Sitzung lebt in einem lokalen Browserprofil und die Bibliothek in einer lokalen SQLite-Datei. Es gibt kein gemeinsames Backend, das undicht sein könnte.

Es ist weder mit Unity Technologies oder Epic Games verbunden, noch von ihnen unterstützt oder in sonstiger Weise mit ihnen verknüpft. Unity, der Unity Asset Store, Fab und Unreal Engine sind Marken ihrer jeweiligen Inhaber. Ob du den Zugriff auf einen Dienst automatisierst, ist deine Entscheidung im Rahmen der Bedingungen dieses Dienstes, und dieses Tool trifft sie nicht für dich.

Lizenz

MIT. Siehe LICENSE.

Available Tools

9 tools
audit_projectA

Detect the engine, version and render pipeline of a game project (Unity: from ProjectVersion.txt / manifest.json; Unreal: .uproject / DefaultEngine.ini). Call this BEFORE recommending or importing assets so pipeline mismatches (e.g. URP-only shader into an HDRP project) are caught.

NameRequiredDescriptionDefault
project_dirYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. The verb 'Detect' strongly implies a read-only operation; however, it does not explicitly state that no modifications or side effects occur. The description gives sufficient functional context but stops short of stating non-destructive behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, consisting of two sentences that deliver purpose and usage without fluff. The parenthetical examples add useful specificity without unnecessary elaboration.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity, the description covers the essential context: what it detects, when to use it, and why it matters (avoiding pipeline mismatches). It does not describe the return format, but that is not critical for a detection tool and the output schema exists separately.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, project_dir, is not elaborated in the description at all. While the name suggests a file path, there is no mention of expected format, whether it should point to a root folder or a specific file, or any related constraints. With 0% schema coverage, the description should compensate but does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with a specific verb ('Detect') and resource ('engine, version and render pipeline of a game project'). It distinguishes itself from sibling tools by focusing on detection rather than mutation or retrieval.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly instructs when to use the tool: 'Call this BEFORE recommending or importing assets.' This provides a direct usage trigger and sets expectations for preconditions, leaving no ambiguity about when it should be invoked.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_asset_detailsB

Full details for one owned asset: summary, usage notes, gallery/video links, store URL.

NameRequiredDescriptionDefault
asset_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. It conveys a read-only lookup and previews the output fields, but it does not disclose failure modes, authorization/ownership consequences, or any limitations. It is minimally adequate for a simple getter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; every phrase contributes either scope ('one owned asset') or expected content. Exemplary concision for a simple lookup.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema covers return-value structure, so the description doesn't need to restate it, and the one-parameter tool is simple. However, the description omits when to use the tool versus its siblings and leaves parameter semantics underspecified, so it is adequate but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the lone asset_id parameter is never defined, formatted, or tied to the description beyond the phrase 'one owned asset.' The description does not compensate for the missing parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource ('one owned asset') and enumerates the returned content ('summary, usage notes, gallery/video links, store URL'). It does not use an explicit verb beyond the tool name, and the contrast with siblings like search_owned_assets is only implicit, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'One owned asset' implies this is for retrieving details on a specific already-known asset rather than searching across assets, but the description never explicitly says when to prefer it over search_owned_assets or other siblings. Usage context is implied, not stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_stack_recommendationsA

Given a game/feature description (e.g. 'third-person fantasy open world with magic combat and a village'), sweep the vault using 3-way hybrid search (FTS + BGE + CLIP) and recommend which owned packages fit which aspect of the problem.

NameRequiredDescriptionDefault
limit_per_categoryNo
problem_descriptionYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations available, the description carries the full burden and does disclose meaningful behavior: it performs a 3-way hybrid search (FTS + BGE + CLIP) and returns recommendations mapped to aspects of the problem. It does not explicitly mention side effects, permissions, or non-mutation, but 'recommend' strongly implies a read-only sweep.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense, well-structured sentence. It front-loads the input and purpose, includes a useful example, and adds meaningful algorithmic detail without wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the main input, the search approach, and the intent of the output, and the output schema can explain return values. However, it omits the semantics of limit_per_category and provides no guidance on how this tool compares to sibling search/recommendation tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description gives clear semantics for problem_description, including a concrete example, but says nothing about limit_per_category. With schema description coverage at 0%, the optional parameter's meaning is left entirely to inference from its title and default value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states what the tool does: it sweeps the vault via hybrid search and recommends owned packages for a given game/feature description. It is distinct in behavior from siblings like search_owned_assets, though it does not explicitly name or contrast them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The usage context is implied: provide a game/feature description to get package recommendations. However, it does not state when to prefer this tool over search_owned_assets or other sibling tools, nor does it provide any exclusions or alternative conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_vault_statsA

Overall vault stats: total assets per engine, per category, and how many are already downloaded locally vs cloud-only.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the behavioral disclosure burden. It discloses the nature of the output in useful detail: totals per engine, per category, and download status breakdown. Being a read-only stats endpoint, this is sufficient transparency, though it does not explicitly state that no mutation occurs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler. Every phrase adds concrete information about the aggregation dimensions and the local-versus-cloud distinction.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter aggregate stats tool with an output schema present, the description tells the agent exactly what dimensions the stats cover. Nothing crucial is missing for selecting or invoking this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so parameter semantics are inherently non-issue. The baseline of 4 applies, and the description correctly implies that the tool operates over the entire vault without requiring arguments.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies a specific resource (vault) and the kind of output (overall stats), listing concrete aggregation dimensions: assets per engine, per category, and local vs cloud-only counts. It implies a broad overview role among the siblings, though it does not explicitly name an alternative to distinguish itself.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Overall vault stats' signals that this tool is for high-level aggregate information rather than per-asset or per-category detail, so usage context is implied. However, there is no explicit statement of when to use this tool versus siblings like get_asset_details or list_asset_categories, and no exclusions are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

import_asset_to_projectA

Unpack a locally-downloaded Unity Asset Store package (.unitypackage) directly into a Unity project's Assets/ folder. Only works for assets tagged local=true (check with search first). project_dir must be the Unity project root (the folder containing Assets/). A UPM package shipped inside it (Packages// with a package.json) is installed as an embedded package in /Packages// and listed in embedded_packages.

NameRequiredDescriptionDefault
asset_idYes
project_dirYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does disclose real traits: the local=true restriction, the required shape of project_dir, and the non-obvious side effect of installing a bundled UPM package as an embedded package in <project>/Packages/<name>/. It does not mention overwrite/reversibility or permissions, so it is not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the core action and constraint. The embedded-package sentence is dense but adds genuinely useful behavior rather than restating the schema, so little is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value explanation is unnecessary, and the description still flags embedded_packages as a notable output signal. For a write tool with no annotations, it should ideally note overwrite behavior or failure modes, but the essentials for correct invocation are present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: project_dir is explained as the project root (the folder containing Assets/), and asset_id is tied to the local=true tagging rule. The two parameters are semantically covered, though asset_id format is not specified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource: unpack a locally-downloaded .unitypackage directly into a Unity project's Assets/ folder. It implicitly separates this from the discovery siblings by noting that search comes first, so an agent can tell it apart from search_owned_assets and get_asset_details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states an explicit precondition (only assets tagged local=true) and routes the agent to check with search first, which maps to the search sibling. It does not state when NOT to use it or what happens on a non-local asset beyond 'only works', leaving a small gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_asset_categoriesA

List all categories and how many owned assets fall into each.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral burden. The verb 'List' implies a read-only operation and the description states the output shape, but it does not disclose potential nuances such as whether categories with zero assets are included, ordering, or data freshness.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with the action and resource, containing no redundant or filler information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With zero parameters and an output schema present, the description fully covers what an agent needs to invoke the tool correctly. There is no need to explain return values because the output schema already exists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is no semantic ambiguity to clarify. The baseline of 4 applies because there are no parameters at all.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and resource ('categories'), and clearly states the output: how many owned assets fall into each category. This distinguishes it from siblings like search_owned_assets or get_vault_stats, which target different resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives, no mention of scenarios that favor a sibling, and no exclusions or prerequisites. An agent must infer usage solely from the name and the literal description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_stack_recipesA

Curated production stacks ('asset recipes') resolved against the user's OWN library. Each recipe lists which owned assets fill each slot.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden. It discloses that the tool is personalized by resolving against the user's OWN library and explains the output shape: each recipe lists which owned assets fill each slot. This gives meaningful behavioral context beyond the tool name, though it does not explicitly state side-effect absence.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences with no filler. It front-loads the core purpose and immediately clarifies the key distinguishing behavior and return format, making every sentence informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters, no annotations, and an existing output schema, the description is complete enough for an agent to invoke the tool correctly. It defines the resource, the personalization scope, and what each returned recipe contains, so no critical operational detail is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters, so the baseline is 4. The description adds value by indicating that the user context is implicit and that results are scoped to the user's own library, which is the relevant semantic context despite the empty parameter list.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('list') and a clear resource ('curated production stacks' / 'asset recipes'), then clarifies the differentiating scope: they are resolved against the user's OWN library. This distinguishes it from siblings like get_stack_recommendations and search_owned_assets by emphasizing curated, owned-asset-specific recipes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool: when the user wants curated recipes resolved against their own library rather than generic recommendations or raw asset search. However, it does not explicitly state when-not-to-use it or name any sibling alternative, so usage guidance is inferred rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_owned_assetsA

Search the user's asset vault across Unity, Fab, Quixel Megascans, Gumroad, and Cosmos. Hybrid: keyword (FTS5) fused with BGE text embeddings and CLIP visual vectors via 3-way RRF. Results include 'match' attribution ('keyword+semantic+vision') and 'ownership' ('vault_owned' vs 'catalog_grant').

engine: target game engine compatibility (all|unity|unreal|godot). Engine-agnostic sources (Quixel FBX/textures, Cosmos) match both unity and unreal.
source: filter by marketplace provider (all|unity|fab|quixel|gumroad|cosmos).
pipeline: render pipeline (all|HDRP|URP|Built-in).
local_only: only assets already downloaded to disk.
limit: max results to return.
NameRequiredDescriptionDefault
limitNo
queryYes
engineNoall
sourceNoall
categoryNoall
pipelineNoall
local_onlyNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full behavioral burden and delivers substantive traits: the 3-way RRF fusion of FTS5/BGE/CLIP, result 'match' attribution ('keyword+semantic+vision'), and the ownership distinction ('vault_owned' vs 'catalog_grant'). It also discloses engine-agnostic matching behavior for Quixel and Cosmos sources. It stops short of pagination, rate limits, and error behavior, but the core result-interpretation behaviors are well covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose line is front-loaded, followed by two compact behavioral notes, then a terse parameter block where each line earns its place with inline enums. No filler, no repetition of schema defaults. The structure is scannable and information-dense.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema covers return structure, so the description rightly focuses on filtering semantics and result interpretation. For a 7-parameter hybrid-search tool with zero annotations, it covers the essentials: marketplaces, engine-agnostic matching, render pipeline, and ownership/match attribution. Remaining gaps—query syntax, pagination beyond limit, and empty-result behavior—are modest for a search tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does for 5 of 7 parameters: engine, source, pipeline, local_only, and limit all receive meaningful semantics with inline enum values (e.g., 'all|unity|fab|quixel|gumroad|cosmos'). The engine note adds genuine nuance ('Engine-agnostic sources... match both unity and unreal'). query and category remain unexplained, with query—the only required parameter—lacking any guidance on accepted query syntax.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource: 'Search the user's asset vault across Unity, Fab, Quixel Megascans, Gumroad, and Cosmos.' The enumerated marketplaces and the vault scope clearly distinguish it from siblings like get_asset_details, list_asset_categories, and get_vault_stats. The hybrid-search detail ('keyword (FTS5) fused with BGE text embeddings and CLIP visual vectors') reinforces that this is the vault search operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied rather than explicit: the name and first line mark this as the vault search tool, and filters like local_only ('only assets already downloaded to disk') hint at concrete use cases. However, the description never states when to prefer this over siblings (e.g., get_asset_details for a known asset, list_asset_categories for taxonomy) or any exclusion conditions. An agent must infer the division of labor from sibling names alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_stackA

Lint a set of owned assets that are planned for one project/stack. Detects role conflicts (two weather systems, two vegetation renderers, …), same-product family notes, and missing prerequisites (e.g. MicroSplat module without core MicroSplat). Call before importing multiple assets together.

NameRequiredDescriptionDefault
asset_idsYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. 'Lint' and 'detects' imply a non-mutating validation pass, and the specific detection categories explain what the tool does. It does not explicitly state side-effect freedom or permission requirements, but the language strongly signals read-only analysis for a pre-import check.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler: purpose, concrete detection examples, and a single usage directive. The most important information is front-loaded, and every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a single input parameter, no annotations, and an existing output schema, the description covers purpose, input semantics, and when to call it. It could explicitly confirm that no changes are made or name sibling alternatives, but it leaves no major workflow ambiguity for a validation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the only parameter, asset_ids, has an empty items schema. The description compensates by clarifying that these are 'owned assets planned for one project/stack,' and the plural usage plus 'importing multiple assets' conveys that all intended assets should be passed together.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Lint a set of owned assets that are planned for one project/stack.' It also enumerates concrete outputs (role conflicts, family notes, missing prerequisites), which makes it clearly distinct from siblings like get_stack_recommendations or audit_project without requiring schema inspection.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit invocation context: 'Call before importing multiple assets together.' It does not name alternative tools or exclusion conditions, but the workflow placement is clear enough for an agent to choose this over search, recommendation, or import tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 9 tool updatesv1.3.0
    • First observedaudit_project
    • First observedget_asset_details
    • First observedget_stack_recommendations
    • First observedget_vault_stats
    • First observedimport_asset_to_project
    • First observedlist_asset_categories
    • First observedlist_stack_recipes
    • First observedsearch_owned_assets
    • First observedvalidate_stack

TDQS

A3.9/5.0

Scored across 9 tools

Disambiguation4/5

Most tools have clearly distinct purposes: auditing a project, searching assets, importing assets, validating stacks, and retrieving stats. The main overlap is among the stack-oriented tools (get_stack_recommendations, list_stack_recipes, validate_stack), but their descriptions distinguish recommendation, curation, and linting roles well enough for an agent to choose correctly.

Naming Consistency5/5

All tool names use consistent snake_case with clear verb_noun patterns (audit_project, list_asset_categories, get_asset_details, search_owned_assets, validate_stack, etc.). There is no mixing of camelCase or inconsistent verb styles.

Tool Count5/5

Nine tools is well-scoped for an asset vault and project-integration server. Each tool earns its place, covering discovery, inspection, recommendation, validation, and import without excessive breadth.

Completeness4/5

The surface covers core workflows: project audit, asset search/details, category/stats overview, stack recommendation/validation, and Unity import. Minor gaps exist, such as no Unreal/Fab import path and no explicit asset removal or metadata update operation, but agents can work around these for the stated purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • 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.
    213
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    MCP server for controlling the Unity Editor from AI clients. 140+ tools for scenes, GameObjects, components, assets, Shader Graph, PlayTest DSL, screenshots with visual diff, batch operations with Undo rollback, and in-editor chat. Token-efficient plain-text protocol.
    36
    31
    MIT