Quartermaster
Quartermaster
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 strippedJedes Ergebnis ist etwas, das du bereits bezahlt hast. Nichts ist erfunden.

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:
In Playwright gebündeltes Chromium — Epics Captcha lehnt es rundweg ab („JavaScript aktivieren“).
Playwright steuert deinen echten Browser — injiziert erkennbare Hooks; Epic wirft nach dem Passwort eine zweite Sicherheitswand auf.
Debugger während der Anmeldung angehängt — gleiches Ergebnis. Alles, was den Login-Ablauf berührt, wird markiert.
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 (
taskkillohne/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 mitWin+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.txtBefü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 fab2. 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 browser3. 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 heresemantic 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 diskVerbinde 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 leapDie 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.5undclip-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 |
| Was besitze ich, das dazu passt? Hybride Stichwort- + semantische Suche. |
| Vollständige Metadaten, Verwendungshinweise, Galerie, Store-URL. |
| Ordnet ein Feature-Briefing vorhandenen Paketen zu. |
| Kämpfen diese miteinander? Rollenkonflikte, fehlende Voraussetzungen. |
| Kuratierte Produktions-Stacks, abgeglichen mit deiner Bibliothek. |
| Engine, Version, Render-Pipeline eines Zielprojekts. |
| Entpacke ein lokales Paket nach |
| Kategorie-Aufschlüsselung und Anzahl. |
| 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ückeWin+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 unterhttp://localhost:7890.In Unity — importiere
editor_bridge/Quartermaster-Bridge.unitypackage, dannWindow > Quartermaster. Suche und importiere, ohne den Editor zu verlassen. Kleine Randnotiz: Dieses Bridge-Paket wird vonsrc/build_bridge.pyerzeugt, das dasselbe Tar-Format schreibt, dasunpacker.pyliest. 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_tokengespeichert, für die Unity-Brücke gespiegelt). Sende es alsX-Quartermaster-TokenoderAuthorization: Bearer; die Web-UI erhält automatisch einSameSite=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 vonAssets/nachAssets/_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 |
|
| Port für Web-UI / API. |
|
| Beliebiges fastembed-kompatibles Modell. Ändern und den Index neu aufbauen. |
| automatisch erkannt | Überschreibt Fab-VaultCache-Speicherorte. |
| demos, docs, PDFs | Was der Entpacker verwirft. |
|
| Höflichkeits-Drosselung für die Anreicherung. |
|
| 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.logjede 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 & Utilitieszurück, obwohl semantische Vektorsuche und hybride Suche immer den gesamten Vault abdecken, unabhängig von der zugewiesenen Kategorie. Die Feinabstimmung des visuellen Vokabulars ist indocs/concepts.mddokumentiert.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:
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).
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
.unitypackageentfä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.logprotokolliert 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.mdunddocs/concepts.mdzeigen, wie man es selbst behebt, und ein Pull-Request andata/recipes.jsonmit einer Regel, für die ich keine Assets zum Testen besitze, ist ausdrücklich willkommen.Das Standalone-Programm startet nicht. Es wird mit
--windowedgestartet, daher schlägt es still fehl.%LOCALAPPDATA%\Quartermaster\data\crash.logist 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 toolsaudit_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.
| Name | Required | Description | Default |
|---|---|---|---|
| project_dir | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| asset_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit_per_category | No | ||
| problem_description | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| asset_id | Yes | ||
| project_dir | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| engine | No | all | |
| source | No | all | |
| category | No | all | |
| pipeline | No | all | |
| local_only | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| asset_ids | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
9 tool updates
v1.3.0- First observed
audit_project - First observed
get_asset_details - First observed
get_stack_recommendations - First observed
get_vault_stats - First observed
import_asset_to_project - First observed
list_asset_categories - First observed
list_stack_recipes - First observed
search_owned_assets - First observed
validate_stack
TDQS
Scored across 9 tools
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.
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.
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.
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
Related MCP Connectors
Your memory, everywhere AI goes. Build knowledge once, access it via MCP anywhere.
Generate game-ready 3D models, textures, and audio from natural language, over MCP.
Persistent memory, knowledge graph, task management and more for AI agents via MCP.
shared AI-context layer for teams — persistent memory your agents search and update over MCP
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceThe first Model Context Protocol server for Unity projects. It gives AI assistants real understanding of Unity scenes, prefabs, and C# scripts through a queryable knowledge graph.42 npm1MIT

glade-mcpofficial
AlicenseNot gradedqualityAmaintenanceConnect 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.213MIT- AlicenseAqualityAmaintenanceMCP 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.3631MIT
- AlicenseAqualityBmaintenanceLicense-aware game development resource discovery MCP server. Helps AI coding agents find reusable game assets with commercial-use filtering, license classification, and attribution generation.91MIT