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

Этот проект начался с того, что я хотел создать прототип плотины.

Ничего серьёзного — короткое демо, а возможно, и больше, если бы получилось. Прежде чем что-либо строить, я захотел посмотреть, что у меня уже есть из того, что могло бы ускорить работу. Я поискал в своей библиотеке «плотину» — и ничего не нашлось. Конечно, ничего и не нашлось — ни один ассет не называется плотиной. Но в четырёх пакетах, которые у меня уже были, оказались изогнутые бетонные меши, водная система и каменистая местность. Всё, что нужно плотине. Большую часть этого я храню годами и ни разу не соединил эти куски.

Вот что делают с тобой ~1500 ассетов из двух магазинов. Почти всё это — из наборов и распродаж, и ни один не запомнен. И дело не только во мне — ни один ИИ-ассистент этого тоже не знает. Попроси его о помощи — и он либо построит всё с нуля, либо отправит тебя за покупками, хотя на твоём диске лежат активы на сотни долларов — ровно то, что нужно.

Quartermaster индексирует всю вашу библиотеку Unity Asset Store и Fab локально и предоставляет её вашему агенту кода через MCP. Это инструмент, который мне хотелось иметь в тот день: спроси про плотину — и узнай, что у тебя уже есть изогнутые бетонные меши.

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

Каждый результат — то, за что вы уже заплатили. Ничего не выдумано.

Quartermaster spotlight search

Вы вводите описание, а не название — ни один из этих результатов не имеет ни одного общего слова с запросом.

Почему Quartermaster? Работа квартирмейстера никогда не заключалась в том, чтобы помнить, что лежит на складах, — а в том, чтобы ты был снаряжён, когда наступает время выступать. Это ближе к настоящей проблеме, чем забывчивость. Я ничего не терял; я знал, что у меня есть кое-что. Чего я не мог — так это перейти от «хочу прототип плотины» к «открой эти четыре пакета» без часа раскопок, а может, и больше, если получится не переживает часа раскопок. Идеи, которые приходят таким образом, не отвергаются. Они просто тихо не случаются, и ты никогда не узнаешь, могли ли они осуществиться.

То, о чём никто не говорит

Ни один магазин не признается, чем вы владеете.

Unity удалил /account/purchases (404 с августа 2026). У Fab нет API владения, нет кнопки экспорта, вообще ничего. История ваших покупок существует только внутри их приватного GraphQL, за SSO, MFA и защитой от ботов.

Чтобы добраться до этой информации, понадобилось четыре попытки, три из которых провалились:

  1. Встроенный в Playwright Chromium — капча Epic наотрез отказывает ему («enable JavaScript»).

  2. Playwright, управляющий вашим настоящим браузером — внедряет обнаруживаемые перехватчики; после ввода пароля Epic выставляет вторую стену безопасности.

  3. Подключённый отладчик при входе в систему — тот же результат. Всё, что касается процесса входа, помечается.

  4. Что действительно работает: полностью отказаться от автоматизации входа. Вы входите через обычное окно браузера — без отладочного порта, ничто не стоит между вами и магазином — потому что именно автоматизация и запускала системы риска. Только после того, как вы закончили, в сессии, которую вы создали сами, Quartermaster подключает отладчик и воспроизводит собственные постраничные запросы магазина — с его CSRF-заголовками, с его разбивкой (по 42 ID на запрос, потому что так отправляет клиент Unity).

Этот трюк — большая часть проекта. Остальное — поиск, линтинг, распаковка — по сравнению с ним, честно говоря, элементарно.

Два правила, доставшихся тяжёлым трудом и заложенные в дизайн, если вы когда-нибудь решите копаться в этом сами:

  • Браузеры должны закрываться штатно (taskkill без /F). Внезапное завершение процесса приводит к потере cookie доверия устройства Unity, и на каждой будущей сессии вам придётся проходить MFA.

  • Никогда не запускайте загрузку библиотеки в headless-режиме. Headless-режим запускает систему риска Unity даже с валидными куками.

Related MCP server: glade-mcp

Что вы получаете

Поиск, который понимает намерение и визуальный образ. В этом и заключается проблема плотины.

  • Точные ключевые слова через SQLite FTS5.

  • Смысл запроса на естественном языке через локальные текстовые эмбеддинги ONNX (BAAI/bge-small-en-v1.5) — «бетонные конструкции для удержания воды» находит меши и шейдеры, в описаниях которых плотина вообще не упоминается.

  • Кросс-модальное визуальное понимание через эмбеддинги ONNX CLIP (Qdrant/clip-ViT-B-32) — поиск «готический собор» буквально оценивает ваши скриншоты и промо-рендеры, находя ассеты даже тогда, когда их текстовые описания полностью молчат.

Все три сигнала объединяются с помощью 3-стороннего Reciprocal Rank Fusion (RRF) на вашем CPU. Никакого GPU, никакого процесса векторной БД, никакого облачного API — ONNX Runtime и матрица numpy в том же процессе, что и всё остальное.

Замерено на хранилище из ~1800 ассетов: ~480 МБ пиковой памяти при постоянно загруженных обеих моделях, ~1,5 с на первый запрос (загрузка BGE и CLIP), ~110 мс в тёплом состоянии после этого. Модели загружаются лениво, поэтому агент, который никогда не ищет, за них не платит.

Достоверные данные о вашем диске. Сканирует %APPDATA%/Unity/Asset Store-5.x/ и VaultCache Epic, поэтому каждый результат знает, скачан ли он уже или доступен только в облаке. Агенты предпочитают локальное — импорт без загрузки лучше, чем на 4 ГБ.

Линтер для стеков. Два рендерера растительности будут конфликтовать. Модуль MicroSplat без основного MicroSplat молча ничего не делает. Шейдер только для URP в проекте HDRP рендерится розовым. Quartermaster ловит это до того, как вы потратите на них полдня.

Прямая распаковка. Извлекает кэшированные .unitypackage-файлы прямо в Assets/, отбрасывая по пути /Demo/, /Samples/, /Documentation/ и PDF — как правило, на 60–80% меньше мусора в каждом пакете. Каждый объявленный путь нормализуется и проверяется внутри <project>/Assets/; выход за пределы структурно невозможен, а не просто фильтруется.

Установка

Автономная сборка — скачайте Quartermaster-windows-x64.zip из Releases, распакуйте в любое место. Python не требуется.

  • Quartermaster.exe — настольный GUI с поиском-спотлайтом по Win+Alt+V, сбором из магазинов, просмотром библиотеки и прямой распаковкой.

  • Quartermaster-mcp.exe — автономный MCP stdio-сервер для Claude Desktop, Cursor, Antigravity и Windsurf.

Данные вашей библиотеки безопасно хранятся в %LOCALAPPDATA%\Quartermaster, так что обновления сводятся к простой замене папок с нулевой потерей данных.

Из исходников — требуется Python 3.10+.

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

Заполните библиотеку:

1. Войдите. Единственный шаг, который требует вашего участия. Откроется обычное окно браузера; 2FA и капчи ведут себя ровно как всегда. Закройте его, когда закончите, — сессия сохранится локально.

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

2. Сбор и обогащение. Долгие, возобновляемые операции, которые безопасно перезапускать, — каждая продолжается с того места, где остановилась.

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. Постройте локальные индексы, затем просканируйте диск.

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 и vision build позволяют «бетонным конструкциям для удержания воды» и запросам по визуальным концепциям находить ваши ассеты. Пропустите их — поиск продолжит работать, но только по точным ключевым словам.

Запускайте local_scan после того, как у вас появится каталог, а не до. При сканировании пустого хранилища ему не с чем сопоставлять имена файлов, поэтому каждый кэшированный пакет он заносит как отдельную голую запись. Это безвредно — следующее сканирование сверяет их с реальным каталогом, — но до тех пор вы будете видеть дубли.

Уже есть CSV-экспорт из магазинов? Тогда пропустите браузер целиком:

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

Подключите агентов:

Вариант A: Авторегистрация (одна команда)

# 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

Регистрация вливается в существующие конфигурации клиентов и сначала создаёт .quartermaster-backup. Она не затрёт ваши другие серверы.

Вариант B: Ручная настройка

Вставьте блок сервера в конфигурацию вашего клиента:

Автономный бинарник:

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

Из исходников:

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

Claude Desktop читает %APPDATA%/Claude/claude_desktop_config.json, Cursor — ~/.cursor/mcp.json, Windsurf — ~/.codeium/windsurf/mcp_config.json.

[!NOTE] Прогрев моделей при первом запуске: При самом первом поиске на естественном языке или по изображению эмбеддинг-модели (BAAI/bge-small-en-v1.5 и clip-ViT-B-32) загружаются и кэшируются локально через ONNX Runtime (~150 МБ). Первый запрос может занять 3–5 секунд на загрузку в память; каждый последующий запрос выполняется за ~100 мс.

Инструменты агента

Tool

Answers

search_owned_assets(query, ...)

Что у меня есть подходящего? Гибрид ключевых слов и семантики.

get_asset_details(asset_id)

Полные метаданные, заметки об использовании, галерея, URL магазина.

get_stack_recommendations(brief)

Сопоставляет бриф с имеющимися пакетами.

validate_stack(asset_ids)

Будут ли они конфликтовать? Конфликты ролей, отсутствующие обязательные зависимости.

list_stack_recipes()

Подобранные производственные стеки с учётом вашей библиотеки.

audit_project(project_dir)

Движок, версия, рендер-пайплайн целевого проекта.

import_asset_to_project(asset_id, project_dir)

Распаковать локальный пакет в Assets/.

list_asset_categories()

Разбивка по категориям и количество.

get_vault_stats()

Итоги по движкам и категориям: локально и в облаке.

Два файла позволяют научить Quartermaster вашей собственной лексике без изменений в коде:

  • data/recipes.json — роли, обязательные зависимости и подобранные стеки. Именно с этим работает линтер конфликтов: какие ассеты конкурируют за одну роль, что чему требуется и какие комбинации вы считаете проверенным рабочим стеком.

  • data/concepts.json — визуальный словарь, по которому CLIP оценивает ваши скриншоты. Поставляемый список заточен под игры; если вы занимаетесь архвизом или превизом, замените его и пересоберите.

Оба — обычный JSON, который читается во время выполнения, и у обоих есть справочная страница в docs/.

Другие способы доступа

  • Настольное приложение (run_desktop.bat) — поиск-спотлайт на PySide6 со значком в трее; нажмите Win+Alt+V в любом месте Windows. Работает рядом с вашим агентом, не мешая ему: база данных работает в режиме WAL, поэтому запись из GUI во время поиска агента никогда никого не блокирует.

  • Веб-интерфейс (run_ui.bat) — панель управления в тёмной теме по адресу http://localhost:7890.

  • В Unity — импортируйте editor_bridge/Quartermaster-Bridge.unitypackage, затем Window > Quartermaster. Ищите и импортируйте, не покидая редактор. Небольшое отступление: этот мостовой пакет генерируется скриптом src/build_bridge.py, который использует тот же формат tar, что читает unpacker.py. Намеренный догфудинг.

Безопасность

Эта штука хранит сеансы магазинов и вносит изменения в ваши проекты, поэтому она серьёзно относится к локальному API:

  • Каждый эндпоинт, изменяющий состояние, требует токен (генерируется при первом запуске, хранится в data/.auth_token, дублируется для моста Unity). Отправляйте его как X-Quartermaster-Token или Authorization: Bearer; веб-интерфейс автоматически получает cookie SameSite=Strict.

  • Запросы с других источников отклоняются, даже если токен действителен.

  • Песочница распаковщика схлопывает сегменты .., удаляет буквы дисков и управляющие символы, перемещает всё, что находится за пределами Assets/, в Assets/_Quartermaster_Imported/, и гарантирует, что итоговый путь окажется внутри проекта — это обеспечивается тестами, а не ощущениями (python run_tests.py -v).

  • Прокси изображений работает по белому списку доменов, блокирует частные диапазоны адресов и эндпоинты метаданных, повторно проверяет каждый переход при редиректе, ограничивает размеры и удаляет самые старые записи, когда кэш превышает лимит файлов.

Никаких «звонков домой». Ваша библиотека, эмбеддинги, пути на диске и сеансы магазинов остаются на этой машине.

Конфигурация

Необязательные ключи в config.json (создаётся при первом запуске):

Ключ

По умолчанию

Назначение

server_port

7890

Порт веб-интерфейса / API.

embedding_model

BAAI/bge-small-en-v1.5

Любая модель, совместимая с fastembed. Измените и пересоберите индекс.

fab_vault_dirs

автоопределение

Переопределяет расположение Fab VaultCache.

strip_dirs / strip_exts

demos, docs, PDFs

Что отбрасывает распаковщик.

enrich_batch_size / enrich_batch_pause

20 / 3s

Вежливое ограничение частоты для обогащения.

media_cache_enabled

true

Дисковый кэш для проксированных обложек.

Честные ограничения

  • Сначала Windows. Сканирование кэша предполагает пути Windows. Поиск через MCP работает где угодно; определение локального импорта — нет.

  • Одна машина, один пользователь. Никакой синхронизации, никакого серверного режима. Осознанно.

  • Сбор данных — это скрапинг. Unity и Fab меняют своё внутреннее устройство когда захотят — и уже меняли: размеры чанков, эндпоинты и формы GraphQL здесь верны на день релиза, а не навсегда. Когда запрос возвращается пустым, data/store_harvest.log записывает каждый увиденный JSON-ответ; с этого стоит начать копать.

  • Таксономия эвристическая. Категории определяются с помощью мультимодальной комбинации токенов по границам слов, тегов магазина и zero-shot CLIP-анализа визуальных концепций на скриншотах. Сильно стилизованные названия без скриншотов по умолчанию относятся к Tools & Utilities, хотя семантический векторный поиск и гибридный поиск всегда покрывают всё хранилище независимо от назначенной категории. Настройка визуального словаря описана в docs/concepts.md.

  • Индексация останавливается на границе пакета, а метаданные магазина зашумлены. Поиск работает по названиям, описаниям, тегам и полным CLIP-эмбеддингам изображений из галереи скриншотов. Он сталкивается с двумя структурными ограничениями:

    1. Нет индексации внутренних ассетов: Он не распаковывает содержимое архивов, чтобы индексировать отдельные под-сетки, префабы или внутренние имена файлов (например, поиск конкретного архитектурного под-элемента вроде «пазовой черепицы» или «криволинейного бетонного подступенка» внутри набора модульных окружений не сработает, если это не заявлено в тексте описания или не заметно на рендерах галереи).

    2. Пустой шаблонный текст магазина: Заметная доля описаний в магазине (особенно шаблонный og:description Unity) содержит чистый маркетинговый шаблон («Улучшите свой рабочий процесс с помощью...»), который не несёт никакой технической информации. Визуальные CLIP-эмбеддинги существуют именно для того, чтобы закрыть этот разрыв, но векторы целых изображений не всегда могут разрешить мелкие под-элементы.

  • Распаковка только для Unity. Ассеты Fab индексируются и доступны для поиска, но извлечение .unitypackage, очевидно, неприменимо.

Когда что-то ломается

Откройте issue. Это сольный проект, поэтому я не могу обещать время ответа, но я их читаю.

Что помогает, по симптомам:

  • Запрос вернулся пустым или неполным. Это самое вероятное место поломки, потому что магазины меняют своё внутреннее устройство без предупреждения. data/store_harvest.log записывает каждый JSON-ответ, который видел сборщик, — хвост этого файла и есть полная диагностика. Приложите его.

  • Поиск не возвращает ничего вразумительного. Сначала проверьте python -m src.vision status. Несобранный индекс молча деградирует до режима только ключевых слов, и этим объясняется большинство сообщений «поиск сломан».

  • Неверные категории или конфликт, которого на самом деле нет. Обычно дело в базе знаний, а не в коде — docs/recipes.md и docs/concepts.md описывают, как исправить это самостоятельно, и PR в data/recipes.json с правилом, для проверки которого у меня нет ассетов, действительно приветствуется.

  • Автономный клиент не запускается. Он в режиме --windowed, поэтому падает молча. Он попадает в %LOCALAPPDATA%\Quartermaster\data\crash.log.

Если вы создадите с помощью этого что-то классное, мне правда хочется об этом услышать.

Примечание о магазинах

Quartermaster читает вашу собственную учётную запись, с вашей собственной машины, в браузере, в который вы вошли сами. Он не хранит учётные данные, ничего не отправляет ни на один мой сервер и не имеет телеметрии — сеанс живёт в локальном профиле браузера, а библиотека — в локальном файле SQLite. Нет общего бэкенда, из которого могла бы произойти утечка.

Он не аффилирован с Unity Technologies или Epic Games, не одобрен ими и не связан с ними. Unity, Unity Asset Store, Fab и Unreal Engine являются товарными знаками их соответствующих владельцев. Автоматизация доступа к любому сервису — это ваше решение, которое нужно принимать с учётом условий этого сервиса, и этот инструмент не принимает его за вас.

Лицензия

MIT. См. 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_dirYes

Output Schema

ParametersJSON 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
asset_idYes

Output Schema

ParametersJSON 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limit_per_categoryNo
problem_descriptionYes

Output Schema

ParametersJSON 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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
asset_idYes
project_dirYes

Output Schema

ParametersJSON 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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON 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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON 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.
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
engineNoall
sourceNoall
categoryNoall
pipelineNoall
local_onlyNo

Output Schema

ParametersJSON 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
asset_idsYes

Output Schema

ParametersJSON 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.
    212
    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
    30
    MIT