Skip to main content
Glama

game-asset-mcp

AI 에이전트가 참조 이미지, 메시, PBR 텍스처, 출처 기록까지 게임용 3D 에셋을 처음부터 끝까지 제작하고, 이미 보유한 메시에 새 텍스처를 입힐 수 있게 해주는 MCP 서버입니다.

대부분의 에셋 생성 도구는 "프롬프트를 입력하면 메시가 나온다"에서 멈춥니다. 그것은 쉬운 절반입니다. 실제로 프로젝트를 막는 절반은 이미 가지고 있는 메시입니다. 지난주에 모델링한 키트배시, 아트 디렉션에 맞지 않는 재질이 적용된 마켓플레이스 프롭, 금요일까지 부식된 강철처럼 보여야 하는 그레이박스. texture_existing_asset은 사용자가 제공한 메시를 받아 이미 승인한 지오메트리를 재생성하지 않고 새 PBR 재질을 입힙니다.

모든 것이 기록됩니다. 모든 작업은 프롬프트, 시드, 공급자 모델 버전, 공급자 작업 ID, 다운로드된 모든 바이트의 SHA-256을 보관합니다. 그래서 6개월 후에도 "이 파일을 만든 것이 무엇인가?"라는 질문에 답할 수 있습니다.

서버는 구조적으로 공급자에 구애받지 않습니다. 현재는 3D용 Tripo와 참조 이미지 및 사운드 효과용 Leonardo.Ai를 세 개의 작은 인터페이스(ImageProvider, Model3DProvider, AudioProvider) 뒤에서 구동합니다. 공급자를 추가해도 도구 표면은 바뀌지 않습니다. 이렇게 구축한 이유는 docs/architecture.md를 참조하세요.


요구 사항

  • Node.js >= 18.17 — 서버는 전역 fetch, FormData, Blob, AbortController를 사용합니다.

  • 네이티브 모듈, 빌드 도구 체인, 데이터베이스가 필요 없습니다. Node가 실행되는 곳이면 어디서든 실행됩니다.

  • 선택 사항: 로컬 Blender 4.x+ 설치가 있으면 normalize_mesh와 batch_prepare_meshes의 복구 기능을 사용할 수 있습니다. 다른 모든 도구는 Blender 없이도 작동합니다. Blender가 없으면 도구가 지침과 함께 거부합니다. macOS에서는 Blender가 PATH에 없으므로 BLENDER_PATH를 설정하거나 번들된 /Applications/Blender.app 기본값을 사용하세요.

  • 공급자 API 키가 하나 이상 필요합니다 (Configuration 참조). 하나면 충분합니다 — 지연 검증됩니다.


Related MCP server: Context3D MCP Server

설치

GitHub에서 직접 설치합니다. 두 방식 모두 설치 중에 TypeScript를 빌드하므로 어느 쪽이든 실행 가능한 game-asset-mcp 바이너리를 얻습니다.

# run it without installing anything permanently
npx github:theisegoria/game-asset-mcp

# or add it to a project
npm install github:theisegoria/game-asset-mcp

# pin a specific version — recommended for anything you depend on
npm install github:theisegoria/game-asset-mcp#v0.3.8

버전을 고정하세요. #vX.Y.Z 접미사가 없으면 두 방식 모두 그 시점의 main을 가리키므로 안정적인 의존성이 아닙니다. 모든 릴리스에는 태그가 붙어 있으므로 #v0.3.8은 정확히 그 트리를 가져옵니다. 릴리스는 github.com/theisegoria/game-asset-mcp/releases에 나열되어 있으며, 각 릴리스는 해당 릴리스가 수정한 결함을 함께 명시합니다.

⛔ v0.3.0, v0.3.1, v0.3.2를 고정하지 마세요. 이후 검토에서 이 버전들에 전달한 메시를 파괴하고 성공을 보고하는 라이브 경로가 발견되었습니다. 이 버전들은 기록을 완전하게 유지하기 위해 태그만 붙어 있습니다. 릴리스 페이지에도 그렇게 명시되어 있습니다.

또는 클론에서 작업할 수도 있습니다. 무엇이든 변경하려는 경우에 적합한 방식입니다:

git clone https://github.com/theisegoria/game-asset-mcp.git
cd game-asset-mcp
npm install
npm run build     # emits dist/
node dist/server.js

npm에는 없습니다. npm install @theisegoria/game-asset-mcp는 존재하지 않습니다 — 패키지는 GitHub에서만 배포됩니다. 그 외의 말은 모두 오래된 정보입니다.

서버는 stdio를 통해 MCP를 사용합니다. 터미널에서 직접 시작하면 클라이언트가 연결할 때까지 그냥 대기합니다 — 이는 정상적인 동작이지 멈춤이 아닙니다. 로그는 stderr로 나가고, stdout은 프로토콜 전용입니다.


구성

MCP 클라이언트의 env 블록에 다음을 설정하세요 — 아래 스니펫을 참조하세요. .env 로딩은 없습니다: 서버는 process.env만 읽고 그 외에는 아무것도 읽지 않으므로, 디스크의 .env 파일은 셸이나 클라이언트가 먼저 내보내지 않는 한 아무 효과가 없습니다.

변수

필수 여부

기본값

용도

TRIPO_API_KEY

3D 도구용

—

Tripo API 키. platform.tripo3d.ai에서 생성하세요.

LEONARDO_API_KEY

이미지 및 오디오 도구용

—

API 액세스가 활성화된 Leonardo.Ai 키. 하나의 키로 참조 이미지와 사운드 효과를 모두 처리합니다.

LEONARDO_MODEL_ID

아니요

내장 기본값

기본 Leonardo 이미지 모델을 재정의합니다. 호출별 modelId도 존재합니다.

ASSET_OUTPUT_DIR

아니요

./assets/generated

에셋과 작업 기록이 기록되는 위치. 서버의 작업 디렉터리 기준 상대 경로입니다.

ASSET_MAX_DOWNLOAD_BYTES

아니요

268435456 (256 MiB)

단일 다운로드의 하드 상한. 스트리밍 중에 적용되며, 사용자가 제공한 로컬 파일에도 적용되므로 너무 큰 메시는 DOWNLOAD_TOO_LARGE로 거부됩니다.

ASSET_HTTP_TIMEOUT_MS

아니요

60000

요청당 HTTP 타임아웃.

ASSET_LOG_LEVEL

아니요

info

silent | error | warn | info | debug.

BLENDER_PATH

아니요

자동 감지

normalize_mesh 및 batch_prepare_meshes용 Blender 실행 파일. 자동 감지를 재정의합니다.

TRIPO_BASE_URL

아니요

Tripo v3 엔드포인트

3D 공급자를 재지정합니다. https://여야 합니다. http:// 값은 공급자가 처음 사용될 때 거부됩니다. 시작 시가 아니라, 공급자가 지연 생성되기 때문입니다.

LEONARDO_BASE_URL

아니요

Leonardo 엔드포인트

이미지/오디오 공급자를 재지정합니다. https://여야 하며, 같은 이유로 첫 사용 시 거부됩니다.

ASSET_SPEND_LIMIT_CENTS

아니요

무제한

세션 지출 상한(미국 센트). 크레딧을 소모하는 도구는 상한에 도달하면 공급자에 연락하기 전에 거부합니다.

⚠️ Tripo API 크레딧은 Tripo Studio 구독과 별도로 청구됩니다

거의 모든 사람이 여기서 걸립니다. Tripo Studio 웹 구독은 API 호출에 자금을 지원하지 않습니다. 이 둘은 서로 다른 제품이며 서로 다른 잔액을 가집니다. Studio 웹 앱에서 모델을 즐겁게 생성하다가 첫 create_3d_asset 호출이 크레딧 부족으로 거부된다면, 잘못 구성한 것이 아닙니다 — 개발자 플랫폼에서 API 크레딧이 필요합니다. Studio 앱이 아닌 platform.tripo3d.ai에서 구매하세요.

지출 상한 설정

ASSET_SPEND_LIMIT_CENTS를 설정하면 모든 크레딧 소모 도구가 공급자에 연락하기 전에 확인합니다 — 메시나 참조 이미지를 업로드하기 전에도 포함됩니다. 남은 잔액을 명시하면서 초과 지출 대신 거부합니다. 상한은 미국 센트 단위인데, 두 공급자가 서로 다른 단위로 청구하기 때문입니다 — Tripo는 $0.01 크레딧, Leonardo는 USD — 두 단위를 혼합한 한도는 의미가 없습니다.

공급자가 호출당 가격을 공개하는 경우 그 가격을 사용합니다. 공개하지 않는 경우 가드는 의도적으로 보수적인 자리 표시자를 사용하며 get_spend_report는 어떤 수치가 어떤 것인지 알려줍니다. 이는 가드이지 청구서가 아닙니다: 실제 청구는 추정치 이하로 나와야 하며, 초과해서는 안 됩니다.

공급자 하나면 충분합니다

자격 증명은 지연 검증됩니다. 도구가 필요로 하는 순간에만, 시작 시에는 절대 검증하지 않습니다. TRIPO_API_KEY만 설정하면 서버는 정상적으로 시작되고 모든 3D 도구가 작동합니다. 이미지 도구는 누락된 변수를 명시하는 명확한 CONFIG_MISSING 오류를 반환합니다. 반대의 경우도 마찬가지입니다. 원하지 않는 계정을 보유하지 않아도 파이프라인의 원하는 절반을 사용할 수 있습니다.


MCP 클라이언트 설정

Claude Code / Claude Desktop

MCP 구성에 추가하세요 (claude_desktop_config.json, 또는 Claude Code의 프로젝트 내 .mcp.json):

{
  "mcpServers": {
    "game-asset": {
      "command": "node",
      "args": ["/absolute/path/to/game-asset-mcp/dist/server.js"],
      "env": {
        "TRIPO_API_KEY": "tsk_...",
        "LEONARDO_API_KEY": "...",
        "ASSET_OUTPUT_DIR": "/absolute/path/to/your/project/assets/generated",
        "ASSET_LOG_LEVEL": "info"
      }
    }
  }
}

args와 ASSET_OUTPUT_DIR에는 절대 경로를 사용하세요. MCP 클라이언트의 작업 디렉터리는 생각하는 것과 다르며, 상대 출력 디렉터리는 에셋을 예상치 못한 곳에 흩뿌릴 수 있습니다.

다른 MCP 클라이언트

동일한 서버를 일반적으로 설명한 것입니다 — stdio 자식 프로세스:

{
  "name": "game-asset",
  "transport": "stdio",
  "command": "npx",
  "args": ["-y", "github:theisegoria/game-asset-mcp"],
  "env": {
    "TRIPO_API_KEY": "tsk_...",
    "LEONARDO_API_KEY": "...",
    "ASSET_OUTPUT_DIR": "/absolute/path/to/assets/generated"
  }
}

사용 가능한 도구

도구

크레딧 소모

기능

preview_asset_prompt

아니요

드라이 런. 스펙이 생성할 정확한 프롬프트와 네거티브 프롬프트를 보여주므로, 비용이 발생하기 전에 아트 디렉션을 수정할 수 있습니다.

generate_asset_reference

예

에셋 스펙을 재구성에 맞게 설계된 레퍼런스 이미지로 변환합니다 — 피사체를 분리하고, 전체 실루엣, 평평한 조명, 단순한 배경. 에셋 작업을 생성합니다.

generate_reference_variations

예

객체의 정체성을 고정한 채 한 가지 축(실루엣, 재질 처리, 디테일링, 웨어, 비율, 기능적 구성 요소)을 탐색합니다.

select_reference

아니요

3D 단계가 재구성할 레퍼런스 후보를 표시합니다. 로컬 기록만 처리합니다.

create_3d_asset

예

선택한 레퍼런스에서 PBR 텍스처가 포함된 메시를 재구성합니다 — 레퍼런스가 없으면 텍스트에서 직접. 폴링할 작업과 함께 즉시 반환됩니다.

texture_existing_asset

예

이미 소유한 메시(GLB/GLTF/FBX/OBJ/STL) 또는 이전에 생성한 메시에 새 PBR 머티리얼을 적용합니다. 지오메트리는 변경되지 않습니다.

get_asset_job

아니요

작업을 폴링합니다. 공급자의 상태 어휘를 하나의 정규화된 라이프사이클에 매핑하고 원시 상태도 함께 유지합니다.

download_asset

아니요

공급자의 모델, 텍스처, 프리뷰 렌더를 워크스페이스로 가져와 각 파일을 해싱하고 기록합니다.

inspect_asset

아니요

다운로드한 glTF/GLB를 읽고 실제로 무엇이 들어 있는지 보고합니다 — 메시, 머티리얼, 텍스처 채널, 크기.

extract_pbr_trio

아니요

glTF 머티리얼을 독립적인 알베도, 노멀, 러프니스 이미지로 분할하고 metallicRoughness를 디패킹합니다(러프니스 = 그린, 메탈릭 = 블루). 정확한 크기로 리샘플링하며, 리니어 라이트와 데이터 채널에서 색상을 직접 평균화합니다.

normalize_mesh

아니요

메시를 사용 가능하도록 복구합니다: UV가 없는 객체에 UV를 생성하고(메시에 텍스처를 입힐 수 없는 일반적인 이유), 일치하는 버텍스를 용접하고, 퇴화 삼각형을 제거하고, 모든 머티리얼에 이름을 지정하고 불투명 블렌딩을 강제합니다. 선택적 Blender 의존성.

generate_sound_effect

예

설명에서 짧은 게임 사운드 효과를 생성합니다 — 임팩트, 무기 발사음, UI 블립, 또는 끊김 없는 앰비언스 루프. 인라인으로 폴링하고 다운로드합니다.

create_game_prop

예 — 이미지만

의도 중심 진입점: 자연어 요청을 입력하면 에셋 스펙과 레퍼런스 후보가 출력됩니다. 3D 비용이 발생하기 전에 의도적으로 멈춰서 사람이나 에이전트가 먼저 레퍼런스를 선택하도록 합니다.

list_asset_jobs

아니요

알려진 작업을 최신순으로 간결한 요약으로 나열합니다.

rig_asset

예

생성된 에셋에 애니메이션을 적용할 수 있도록 스켈레톤과 스킨 웨이트를 구축합니다.

animate_asset

예

사전 설정된 애니메이션을 이미 리깅된 에셋에 리타깃합니다. 리깅되지 않은 소스는 비용을 청구하지 않고 거부합니다.

retopologize_asset

예

토폴로지를 재구축합니다. 기본적으로 쿼드 — 쿼드는 생성기 삼각형 수프보다 다운스트림 편집과 메시 검증에서 훨씬 잘 견딥니다.

validate_game_asset

아니요

출시 정책에 따라 메시를 판정하고 항목별 사유와 함께 통과/실패를 반환합니다 — UV, 노멀, 탄젠트, 삼각형 예산, 머티리얼, 텍스처 해상도, 바운딩 박스 정합성. 모든 임계값을 재정의할 수 있습니다.

batch_prepare_meshes

아니요

.glb/.gltf 경로 목록(최대 500개)에 대해 validate → normalize → validate를 실행하고 항목별 판정을 반환합니다. 이미 통과한 메시는 그대로 두고, 하나의 잘못된 파일은 해당 항목에 대해서만 보고되며 실행을 중단하지 않습니다.

get_spend_report

아니요

이 워크스페이스가 도구별로 지출한 금액, 남은 여유분 — 그리고 각 수치가 공개된 가격인지 보수적 자리표시자인지 여부.

비용이 발생할 수 있는 도구는 9개뿐이며, 각 도구는 호출되기 전에 설명에 그 사실을 명시합니다.


무료 로컬 절반 (API 키 없음, 네트워크 없음)

20개 도구 중 11개는 크레딧을 소모하지 않으며, 그중 네트워크를 사용하는 도구는 단 2개입니다 — get_asset_job은 폴링하고, download_asset은 가져옵니다. 둘 다 무료이지만 네트워크 호출입니다. 나머지 9개는 오프라인으로 작동합니다. 아래 5개는 메시 파이프라인이며, 이미 메시가 있다면 이 5개가 제품의 전부입니다.

도구

답변하는 질문

inspect_asset

이 glTF 안에 실제로 무엇이 있나? 메시, 머티리얼, 텍스처 채널, 크기, 경계.

validate_game_asset

출시 가능한가? 항목별 사유와 함께 통과/실패, 모든 임계값 재정의 가능.

normalize_mesh

복구: UV가 없는 객체에 UV 생성, 일치하는 버텍스 용접, 퇴화 삼각형 제거, 머티리얼 이름 지정.

batch_prepare_meshes

동일한 작업을 .glb/.gltf 경로 목록에 대해 항목별 판정과 함께 수행. 실패한 항목도 파일을 작성했을 수 있습니다 — 정규화는 성공했지만 결과가 정책을 충족하지 못한 경우, 메시는 검사를 위해 보존됩니다. 파일 수를 예측하려면 prepared가 아닌 outputsWritten을 사용하세요.

extract_pbr_trio

머티리얼을 알베도 / 노멀 / 러프니스 이미지로 분할하고 metallicRoughness를 올바르게 디패킹.

일반적인 루프는 validate → normalize → validate 순서이므로, 복구가 가정이 아니라 증명됩니다:

validate_game_asset  modelPath=/art/crate.glb
   → fails: uvs_present   ("nothing can texture this")
normalize_mesh       modelPath=/art/crate.glb  outputDir=/art/out
   → objectsUnwrapped=2, triangles 3183 → 1750
validate_game_asset  modelPath=/art/out/crate_normalized.glb
   → passes

batch_prepare_meshes는 해당 루프를 목록에 대해 실행하고 각 항목을 개별적으로 보고합니다. 이미 통과한 메시는 다시 쓰지 않고 그대로 두며, 하나의 잘못된 파일이 실행을 중단하지 않고, 같은 기본 이름을 공유하는 두 소스는 서로 덮어쓰지 않고 별도의 출력을 얻습니다.

UV 누락이 알아둬야 할 결함입니다. UV 좌표가 없는 메시는 어떤 도구로도 텍스처를 입힐 수 없습니다 — 이 도구도, 공급자도, 직접 손으로도 불가능합니다. 생성기와 마켓플레이스 에셋은 정기적으로 UV 없이 배포됩니다. validate_game_asset이 그 이유로 이를 첫 번째로 명시합니다.

정규화에는 Blender(4.x+)가 필요합니다. 없으면 도구는 여전히 검증하고 보고하지만 복구는 할 수 없습니다. macOS에서 Blender는 PATH에 없으므로 BLENDER_PATH를 설정하거나 번들된 /Applications/Blender.app 기본값에 의존하세요.


예제 워크플로우

전체 파이프라인: 아이디어에서 검사된 에셋까지

1. generate_asset_reference   → spends image credits, returns assetJobId + N candidates
2. (inspect the images)       → look at the returned reference images and choose one
3. select_reference           → free; records which candidate wins
4. create_3d_asset            → spends 3D credits, returns a task to poll
5. get_asset_job              → free; poll until status is "ready" (or "failed")
6. download_asset             → free; pulls model + textures + previews into the workspace
7. inspect_asset              → free; confirms what actually landed on disk

2단계는 장식이 아닙니다. 3D 크레딧을 소모하기 전에 레퍼런스를 선택하는 것이 파이프라인이 여기서 분리된 이유입니다: 잘못된 레퍼런스는 녹아내린 메시를 만들고, 재구성 비용을 지불한 후에야 그 사실을 알게 됩니다.

리텍스처링: 더 짧고, 더 저렴하며, 대부분의 도구가 갖지 못한 흐름

이미 메시가 있습니다. 레퍼런스할 것도, 선택할 것도, 재구성할 것도 없습니다:

1. texture_existing_asset     → spends texturing credits on a mesh you supply
2. get_asset_job              → free; poll until ready
3. download_asset             → free
4. inspect_asset              → free

유료 호출 1회가 2회 대신이며, 이미 승인한 지오메트리는 변경 없이 그대로 돌아옵니다.


비용 및 부작용

공급자 크레딧을 소모하는 호출: generate_asset_reference, generate_reference_variations, create_3d_asset, texture_existing_asset, generate_sound_effect, rig_asset, animate_asset, retopologize_asset, 그리고 create_game_prop 내부의 이미지 생성 단계. 이 서버에서 그 외의 어떤 것도 비용이 청구될 수 없습니다.

무료 호출: select_reference, get_asset_job, download_asset, inspect_asset, list_asset_jobs, preview_asset_prompt, extract_pbr_trio, normalize_mesh, validate_game_asset, batch_prepare_meshes, get_spend_report. 원하는 만큼 폴링, 검사, 분할, 다운로드하세요.

크레딧을 소모하는 POST는 자동으로 재시도되지 않습니다. 이는 의도적이고 중요한 규칙이며, 각 호출 지점이 아닌 HTTP 계층에 존재합니다. 생성 작업을 만드는 요청이 실패하면(타임아웃, 소켓 리셋, 502) 클라이언트는 연결이 끊기기 전에 공급자가 요청을 수락했는지 알 수 없습니다. 재시도는 무료일 수도 있고, 받지도 못할 메시에 대해 이중으로 청구될 수도 있습니다. 따라서 재시도하지 않고 오류가 그대로 반환되며, 다시 시도할지 여부는 사용자의 결정입니다. 멱등적인 읽기(상태 폴링, 파일 다운로드)는 반복해도 비용이 들지 않으므로 백오프와 함께 자유롭게 재시도됩니다.

알아두면 좋은 다른 부작용:

  • 파일은 디스크에 기록됩니다. 다운로드된 자산은 ASSET_OUTPUT_DIR 아래에 저장되며, 작업공간 루트를 벗어나는 다운로드 경로는 거부됩니다. 세 가지 도구는 의도적으로 다르게 동작합니다: extract_pbr_trio, normalize_mesh, batch_prepare_meshes는 작업공간 외부를 포함하여 사용자가 지정한 위치에 기록합니다. 이는 이미 소유한 메시를 대상으로 하며, 해당 메시는 자산 생성 디렉토리에 있지 않기 때문입니다. 의도한 대상 경로를 지정하세요.

  • download_asset과 generate_sound_effect는 destination을 허용하며, 해당 호출 한 번에 대해 ASSET_OUTPUT_DIR을 재정의합니다. 여전히 제한됩니다: 주어진 루트를 벗어나는 경로는 거부됩니다.

  • ASSET_OUTPUT_DIR은 절대 경로여야 합니다. 상대 경로는 MCP 클라이언트가 선택하는 서버의 작업 디렉토리를 기준으로 해석됩니다 — 여러 클라이언트는 /에서 시작합니다. 서버는 해석된 경로와 그 경로가 비롯된 작업 디렉토리를 명시하는 메시지와 함께 시작을 거부합니다. 이 진단은 현실적으로 발생할 수 있는 8가지 errno(ENOENT, EACCES, EPERM, EROFS, ENOTDIR, ELOOP, ENAMETOOLONG, ENOSPC)를 포함하며, ASSET_OUTPUT_DIR이 디렉토리가 아닌 파일을 가리키는 경우도 포함합니다. 다른 모든 오류는 원시 상태로 전파됩니다.

  • 아무것도 조용히 덮어쓰지 않습니다. 파생된 출력 이름에는 숫자 접미사(crate, crate_2, ...)가 붙어 이미 검토한 결과를 파괴하지 않으며, 이름은 배타적 생성으로 확보되므로 한 배치의 두 항목이 경쟁할 수 없습니다. 명시적인 outputPath는 파일이 이미 있으면 overwrite: true를 전달하지 않는 한 무조건 거부됩니다. 그리고 입력 메시로 해석되는 경우에는 옵트아웃 없이 무조건 거부됩니다. 이 해석은 심볼릭 링크, 하드 링크, 대소문자 구분 없는 볼륨, 그리고 익스포터가 확장자를 다시 쓰는 습관을 모두 고려합니다. 이 모든 경우가 여기서 소스 메시를 파괴한 적이 있기 때문입니다.

  • 다운로드는 ASSET_MAX_DOWNLOAD_BYTES로 제한되며, 이 제한은 Content-Length 헤더가 아닌 스트리밍 중에 적용됩니다 — 크기를 속이는 서버가 메모리를 고갈시킬 수 없습니다.

  • HTTPS만 허용됩니다. HTTPS가 아닌 URL은 공급자의 응답 내에 포함된 것까지 포함하여 무조건 거부됩니다.

  • API 키는 로그에서 중앙 집중식으로 삭제되므로 개별 로그 호출 지점이 키를 유출할 수 없습니다.


작업공간 구조

모든 자산은 자체 포함된 디렉토리를 얻습니다. 6개월 후 파일 브라우저에서 열어도 스스로 설명이 됩니다:

assets/generated/
├── .jobs/                          job records, one JSON file per job
│   └── asset_<uuid>.json
└── <asset_name>/
    ├── asset.json                  complete provenance: spec, prompt, seed,
    │                               model version, provider ids, file hashes
    ├── source/                     the reference image(s) the mesh was built from
    ├── model/                      the mesh (GLB by default)
    ├── textures/                   extracted PBR maps
    ├── previews/                   provider-rendered turnarounds

<asset_name>은 사양의 이름을 정리한 것입니다: 소문자로 변환되고, 영숫자가 아닌 문자는 밑줄로 축약됩니다. .jobs 디렉토리는 의도적으로 점 디렉토리입니다 — 자산 작업공간을 탐색할 때 장부가 아닌 자산이 보여야 하기 때문입니다.


문제 해결

모든 오류는 클래스를 명명하는 기계 판독 가능한 error 필드와 retryable 플래그를 전달하므로, 에이전트는 문장을 분석하지 않고 다음에 무엇을 할지 결정할 수 있습니다. 아래 이름은 해당 error 필드의 값입니다.

서버가 시작되자마자 종료됩니다 — 클라이언트는 "connection closed"라고만 말합니다. 세 가지 알려진 원인이 있으며, 서버는 이제 조용히 죽는 대신 처음 두 가지를 스스로 명명합니다.

  • 상대 경로 ASSET_OUTPUT_DIR. 이는 서버의 작업 디렉토리를 기준으로 해석되며, MCP 클라이언트가 선택합니다 — 여러 클라이언트는 /에서 시작하므로 assets/generated가 /assets가 되어 생성할 수 없습니다. 절대 경로를 사용하세요. 거부 메시지는 해석된 경로와 그 경로가 비롯된 작업 디렉토리를 명시합니다.

  • 프로세스가 쓸 수 없는 작업공간. 동일한 거부, 다른 errno.

  • 오래된 빌드. dist/가 엔트리 포인트 변경보다 이전이면 다시 빌드하세요. npm run verify는 빌드한 다음 실제 MCP 핸드셰이크를 완료하므로, 고장난 서버와 고장난 클라이언트 구성을 구분하는 가장 빠른 방법입니다.

normalize_mesh 또는 batch_prepare_meshes가 "Blender not found"로 거부합니다. PATH에 로컬 Blender가 없습니다. macOS에서는 Blender가 설치되어 있어도 앱 번들이 PATH에 없습니다 — BLENDER_PATH를 번들 내부의 실행 파일로 설정하세요. batch_prepare_meshes는 실패하는 대신 성능이 저하됩니다: 모든 메시를 검증하고 무엇을 수리해야 할지 보고합니다.

CONFIG_MISSING — 자격 증명 누락. 호출한 도구에 구성하지 않은 공급자가 필요합니다. 메시지는 정확한 환경 변수를 명명합니다. MCP 클라이언트의 env 블록에 설정하고 클라이언트를 다시 시작하세요. .env 파일은 절대 읽지 않습니다: dotenv 의존성이 없으므로 변수는 서버를 실행하는 프로세스가 내보내야 합니다.

PROVIDER_HTTP 상태 401/403 — 잘못된 API 키. 키가 잘못되었거나, 취소되었거나, 다른 공급자의 키입니다. 두 가지 특정 함정: Leonardo 키는 계정에서 API 액세스가 활성화되어야 합니다(웹 로그인만으로는 부여되지 않음), 그리고 API 크레딧 잔액이 없는 Tripo 키는 키 자체는 유효해도 첫 유료 호출에서 실패할 수 있습니다. 위의 크레딧 경고를 참조하세요.

RATE_LIMITED — HTTP 429. 재시도 가능으로 표시됩니다. 폴링은 백오프하고 자동으로 재시도합니다(400ms, 800ms, 1600ms, 최대 8초). 다운로드는 재시도하지 않습니다 — download_asset은 한 번의 시도로 스트리밍하므로 직접 다시 실행하세요; 공급자 URL은 만료되므로 오래된 URL을 재시도하는 대신 먼저 get_asset_job으로 다시 폴링하세요. 생성 요청도 의도적으로 재시도하지 않습니다. 비용이 들기 때문입니다. 다운로드 중 429는 RATE_LIMITED가 아닌 상태 429의 PROVIDER_HTTP로 표시됩니다.

PROVIDER_TASK_FAILED — 작업이 공급자 측에서 실패했습니다. HTTP 호출은 성공했지만 생성은 실패했습니다. 공급자의 자체 메시지는 오류 세부 정보에 보존됩니다. 검열 거부도 여기에 해당합니다: 프롬프트를 변경하지 않고 재시도하는 대신 다시 작성하세요. Tripo 응답은 HTTP 200과 0이 아닌 엔벨로프 code를 함께 전달할 수 있습니다. 이는 실패이며, 이 서버는 가짜 성공을 보고하는 대신 실패로 처리합니다.

다운로드가 PROVIDER_HTTP 403/404로 실패합니다 — URL이 만료되었습니다. 이것은 가장 흔한 놀라움입니다. 공급자 모델 및 미리보기 URL은 수명이 짧습니다. 서명되어 있고 만료되며, 20분 전에 작동했던 URL은 이제 죽었습니다. 해결책은 동일한 URL을 재시도하는 것이 아닙니다 — get_asset_job을 다시 호출하여 공급자에게 새 URL을 다시 폴링한 다음 즉시 download_asset을 호출하세요. 습관으로: 긴 세션이 끝날 때가 아니라 작업이 ready를 보고하자마자 다운로드하세요.

INVALID_INPUT — 지원되지 않는 이미지 형식. 참조 이미지는 표준 웹 안전 래스터 형식(PNG, JPEG, WebP)이어야 합니다. HDR, EXR, 레이어드 PSD, SVG, 다중 페이지 TIFF는 재구성 가능한 입력이 아닙니다. texture_existing_asset의 경우 메시는 GLB, GLTF, FBX, OBJ 또는 STL이어야 합니다. 먼저 변환하세요; 공급자가 대신 해주지 않습니다.

PROVIDER_MALFORMED_RESPONSE — 공급자가 예상치 못한 것을 반환했습니다. JSON이 아닌 본문, 빈 엔벨로프, 데이터 없는 성공, 또는 파일 토큰을 반환하지 않은 업로드. 일반적으로 공급자 측 장애 또는 API 버전 불일치를 의미합니다. ASSET_LOG_LEVEL=debug를 설정하여 요청 형태를 확인하고(키는 삭제됨), 버그가 로컬이라고 가정하기 전에 공급자의 상태 페이지를 확인하세요.

DOWNLOAD_TOO_LARGE. 파일이 ASSET_MAX_DOWNLOAD_BYTES를 초과했습니다. 고품질 PBR GLB는 클 수 있습니다. 파일이 정말 필요하면 제한을 높이세요.

PATH_ESCAPE. 공급자가 제공한 파일 이름이 작업공간 외부로 해석되려고 했습니다. 쓰기가 거부되었습니다. 정상 작동에서는 발생해서는 안 됩니다 — 발생하면 이슈를 열어주세요.


상태

이것은 초기 소프트웨어이며, 변경될 가능성이 가장 높은 부분은 조용히 가정하지 않고 그렇게 표시됩니다.

Tripo의 v3 엔드포인트 경로는 정확히 하나의 모듈(src/providers/model3d/tripo.ts)에 고정되어 있으며 그 상단의 주석에 문서화되어 있습니다. Tripo의 공개 문서는 v3 표면을 두 가지 다른 방식으로 설명합니다 — 일반 작업 엔드포인트와 작업별 경로 — 둘 다 현재 문서에 나타납니다. 이 클라이언트는 작업 형식을 구현하며, 이는 모든 생성이 폴링할 task_id를 반환한다는 관찰 가능한 동작과 일치하고, 코드를 편집하지 않고 대상을 변경할 수 있도록 TRIPO_BASE_URL을 노출합니다. 경로가 잘못되면 잘못된 API 키와 똑같이 보이는 404가 표시되므로 키보다 경로를 먼저 확인하세요.

실제 공급자 API에 대한 호출은 한 번도 이루어진 적이 없습니다. 이것이 여기서 가장 중요한 주의 사항이므로 묻어두지 않고 명확히 명시합니다. 394개의 테스트 모두가 목(mock) 또는 로컬 파일시스템에 대해 실행됩니다. 프롬프트 구성, 상태 매핑, 경로 안전성, 작업 저장소, HTTP 계층의 재시도 및 리디렉션 규칙, 실제 파일에 대한 glTF 검사를 다루지만 — 녹색 스위트는 Leonardo와 Tripo가 이 클라이언트가 가정하는 방식으로 동작한다는 것을 말해주지 않습니다.

구체적으로 다음은 검증되지 않은 상태입니다:

  • 위에서 설명한 Tripo v3 엔드포인트 경로.

  • texture_model이 업로드된 메시(file_token)를 허용하는지 아니면 이전 Tripo 작업(original_model_task_id)에서 생성된 메시만 허용하는지. 이는 이미 소유한 모델을 리텍스처링할 수 있는지 여부를 결정하며, 이 서버가 존재하는 이유입니다. 해결하는 데 HD 텍스처 호출 한 번이 듭니다.

  • 사운드 이펙트 생성은 검증되지 않았습니다. Leonardo는 Sound Effects v2 요청 계약(model, prompt, duration 1-22초, prompt_influence, loop, quantity)을 문서화하지만 응답 형태나 완성된 오디오를 검색하는 방법은 문서화하지 않습니다. 클라이언트는 여러 그럴듯한 형태에서 생성 ID와 오디오 URL을 읽고, 일치하는 것이 없으면 빈 성공을 보고하는 대신 응답의 최상위 키 이름(본문이 아닌 — 본문은 크거나 서명된 URL을 가질 수 있음)을 첨부하여 예외를 던집니다. 첫 실제 호출에서 수정이 필요할 것으로 예상하고, 본 페이로드 형태로 이슈를 열어주세요.

  • src/providers/image/leonardo.ts의 Leonardo 모델 ID는 게시된 문서에서 전사되었습니다. GET /platformModels와 대조해 확인하세요. 오래된 ID는 잘못된 요청 본문처럼 보이는 HTTP 400으로 실패합니다. LEONARDO_MODEL_ID와 호출별 modelId 모두 탈출구로 존재합니다.

실제 키로 이 서버를 처음 실행하는 사람이라면 엔드포인트 경로를 수정해야 할 것으로 예상하고, 발견한 내용으로 이슈를 열어주세요.

검증된 것: npm run verify는 서버를 빌드하고, 실제 MCP 클라이언트로 stdio를 통해 시작하고, 핸드셰이크를 완료하고, 20개 도구 모두가 등록되는지 확인합니다. 이는 버전 문자열이 아닌 프로토콜 왕복입니다 — 도구 등록에 실패한 서버도 여전히 완벽하게 시작됩니다.

로컬 파이프라인의 일부 — inspect_asset, extract_pbr_trio, normalize_mesh, validate_game_asset — 는 픽스처가 아닌 실제 출시 게임 자산에 대해 추가로 검사됩니다. 합성 픽스처와 이를 읽는 파서는 동일한 실수를 공유할 수 있고 둘 다 녹색으로 보일 수 있기 때문입니다. 여기서 실제로 발생했습니다: 잘못된 glTF 매직 상수가 전체 합성 스위트를 통과했고 실제 파일에서만 발견되었습니다. 이들이 사용하는 UV 없는 메시는 형제 체크아웃에서 읽는 대신 여기에 커밋되어 있습니다. 이전에는 게임 저장소에서 실시간으로 읽었는데, 해당 메시가 수리되었을 때 이 테스트는 완전히 올바른 변경에 대해 빨간색으로 바뀌었습니다 — 이 프로젝트가 제어하지 않는 파일에 대한 사실을 고정하는 단언이었습니다. 테스트는 소유하지 않은 콘텐츠에 의존할 수 없습니다.

하나의 테스트는 심볼릭 링크된 bin — 즉 node_modules/.bin이 실제로 포함하는 것 — 을 통해 빌드된 서버를 실행하고 MCP로 통신합니다. 엔트리 포인트 가드가 실패한 지점이 바로 그곳이기 때문입니다. 서버는 다른 모든 테스트를 통과하면서도 매 설치마다 즉시 종료되었습니다. 이 테스트는 설치 대신 심볼릭 링크를 사용하므로 files나 prepare의 패키징 회귀를 잡을 수 없습니다. GitHub에서 실제 npm install을 수행하는 것은 여전히 수동 확인 사항입니다.

테스트 수가 핵심이 아닌 이유

0.3.4에서는 이전 릴리스의 다섯 가지 주요 수정 사항을 각각 하나씩 되돌리고 스위트를 다시 실행했습니다. 다섯 가지 모두 살아남았습니다 — 모든 뮤턴트가 완전히 그린이었습니다. 수정 사항은 실제였고, 스위트에는 이를 붙잡는 것이 아무것도 없었습니다. 원인은 하나의 공유된 가정이었습니다. 모든 스텁된 Blender가 0으로 종료되고 정확히 하나의 영수증을 출력했기 때문에, 서브프로세스 프로토콜 강화 중 어느 것도 어떤 테스트로도 관찰할 수 없었습니다.

이것은 README에 명시할 가치가 있습니다. 어떤 테스트 수에 대한 정직한 해석이기 때문입니다. 스위트는 작성자의 가정을 증명하며, 가정 내부에 존재하는 결함은 그 가정 아래에서 작성된 모든 테스트에 보이지 않습니다. 변한 것은 수가 아니라 훈련입니다. 수정 사항은 이제 되돌린 코드에 대해 실행되어 실패하는 것이 관찰된 테스트로 고정되며, 공유된 페이크는 인프라가 아닌 용의자로 취급됩니다.

같은 검증이 한 자리에서 두 번이나 잘못된 증명을 잡아냈습니다. 용접 임계값 수정을 증명하기 위해 작성된 두 개의 연속된 픽스처가 코드가 올바를 때와 깨졌을 때 동일한 삼각형 수를 보고했고, 둘 중 하나라도 증거로 배포되었을 것입니다. 픽스처는 수정된 코드와 깨진 코드 양쪽에서 실행되고 두 숫자가 출력되기 전까지는 증명이 아닙니다.


기여

이슈와 풀 리퀘스트를 환영합니다. 제공자를 추가하려면 ImageProvider 또는 Model3DProvider를 구현하고 다른 것은 변경하지 마십시오. 새 제공자가 도구 표면의 변경을 강요한다면 추상화가 잘못된 것이며, 그것이 먼저 논의할 가치가 있는 버그입니다.

라이선스

MIT © 2026 Ben Haire. LICENSE 참조.

Available Tools

20 tools
animate_assetRetarget an animation onto a rigged assetA

SPENDS 3D CREDITS. Applies a preset animation to an asset that has ALREADY been rigged with rig_asset. Each animation costs separately. ASYNCHRONOUS: poll get_asset_job, then download_asset. Refuses when the source job was not a rig, because retargeting an unrigged model produces nothing while still being billed. NOTE: the provider task name is taken from published docs and is UNVERIFIED live.

NameRequiredDescriptionDefault
animationYesProvider preset animation name, e.g. "walk".
outFormatNoglb
assetJobIdYesA job produced by rig_asset.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond annotations (readOnlyHint=false, idempotentHint=false), the description discloses critical behaviors: it 'SPENDS 3D CREDITS', it is asynchronous (requiring polling), it refuses for non-rig jobs, and it flags the provider task name as 'UNVERIFIED live'. These operational and trust details are not present in the annotations, giving the agent a complete picture of consequences and limitations.

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?

Every sentence in the description carries essential content: cost, purpose, asynchronous workflow, failure condition, and a trust caveat. It is front-loaded with the most urgent constraint (credit spend) and structured so that prerequisites and post-conditions are immediately clear. No filler or redundant phrasing.

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 3-parameter tool with no output schema, the description covers all necessary usage context: the prerequisite rigging, the asynchronous flow with specific follow-up tools, the cost model, the refusal behavior for invalid inputs, and a warning about unverified provider metadata. An agent can confidently invoke it correctly without additional information.

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

Parameters3/5

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

Schema description coverage is 67% (assetJobId and animation have descriptions; outFormat only has enum/default). The description adds minimal param-specific meaning: it reinforces that assetJobId must be a rig job and notes cost per animation, but these are largely operational or redundant with the schema (which already says 'A job produced by rig_asset'). The baseline of 3 applies since coverage is moderate and the description only slightly supplements the schema.

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 states a specific verb ('Applies'), a resource ('a preset animation to an asset'), and a critical prerequisite ('ALREADY been rigged with rig_asset'). It clearly distinguishes this tool from other asset-creation tools by requiring a prior rig job, making its role in the pipeline unambiguous.

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?

It explicitly states the precondition (must be rigged), the follow-up workflow ('poll get_asset_job, then download_asset'), and a refusal condition ('Refuses when the source job was not a rig'). This tells an agent exactly when to use it, what to do after, and when it will fail, leaving no ambiguity about its place relative to siblings like rig_asset or download_asset.

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

batch_prepare_meshesNormalize and validate many meshes in one callA

FREE and fully local: no network call, no credits. Runs the preparation pipeline over a list of meshes — validate, normalize the ones that fail, validate again — and returns a per-item verdict plus a summary. Meshes that already pass are left untouched rather than rewritten. One failing item never stops the run; its error is reported and the batch continues. Normalization needs a local Blender install; without one this still validates and simply reports what would need repairing. Note that a FAILED item can still have written a file: when normalization succeeds but the result does not clear the policy, the mesh is kept for inspection and named in normalizedPath with outputKept set. Use outputsWritten, not prepared, to predict how many files are in the output directory — prepared is a verdict, not a file count.

NameRequiredDescriptionDefault
normalizeNoRepair meshes that fail validation. When false, only reports.
outputDirNoWhere normalized copies go, resolved against the SERVER's working directory. Omit to write beside each source; an empty string is rejected rather than silently meaning "beside the source".
modelPathsYesAbsolute paths to .glb/.gltf meshes.
requireUVsNo
maxTrianglesNo
minTextureSizeNo
skipAlreadyValidNoLeave meshes that already pass untouched instead of rewriting them.
timeoutSecondsPerItemNo

TDQS

A4.7/5.0
Behavior5/5

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

Annotations provide no guidance (all false), so description bears full burden. It discloses every significant behavior: validation pipeline, normalization dependency on Blender, per-item error handling, that FAILED items may still write files, and the critical distinction between prepared and outputsWritten. Extremely thorough.

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 dense paragraph with every sentence earning its place. Front-loads the free/local note and pipeline description, then addresses edge cases without redundancy. Length is justified given the complexity.

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 8 parameters and no output schema, the description provides surprisingly complete context: batch behavior, Blender dependency, error handling, file-writing edge case, and a caution about counting outputs. No critical information for correct invocation 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?

Schema coverage is only 50%, so description must compensate. It adds meaning to outputDir (resolved against server's working dir, empty string rejected) and clarifies skipAlreadyValid behavior. However, it does not cover requireUVs, maxTriangles, minTextureSize, or timeoutSecondsPerItem, which lack schema descriptions too. Partial compensation, but not complete.

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?

States a specific verb and resource: 'Runs the preparation pipeline over a list of meshes — validate, normalize the ones that fail, validate again'. Clearly distinguishes from siblings by being a batch operation, and adds a unique free/local selling point. No ambiguity about what it does.

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?

Implies use for multiple meshes (batch) and notes free/local, but does not explicitly contrast with single-mesh alternatives like normalize_mesh or validate_game_asset. It provides clear context (list, per-item verdict) but no explicit when-not or alternative naming.

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

create_3d_assetReconstruct a 3D assetA

SPENDS 3D CREDITS. Creates a textured 3D model. ASYNCHRONOUS — returns immediately with a job id; poll get_asset_job until status is "ready", then call download_asset. Provide exactly ONE source: assetJobId (uses that job's selected reference image), imagePath (a local png/jpg/webp), imageUrl (https), or textPrompt (skips images entirely). Model URLs from the provider EXPIRE, so download promptly once ready.

NameRequiredDescriptionDefault
pbrNoGenerate PBR material channels.
quadNoRequest quad topology. Costs extra credits, but is far kinder to downstream editing.
seedNo
specNoRequired when NOT using assetJobId, so the result has a name and provenance.
imageUrlNohttps URL of a reference image.
faceLimitNoCap the output triangle count.
imagePathNoAbsolute path to a local reference image.
assetJobIdNoAn existing job with a selected reference image.
textPromptNoGenerate directly from text, no reference image.
modelVersionNoProvider model version. Defaults to v3.0-20250812.
textureQualityNo"detailed" is the HD tier and costs more credits.detailed

TDQS

A4.5/5.0
Behavior4/5

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

Annotations indicate readOnlyHint=false, so the description's 'Creates' is consistent. The description adds valuable behavioral context not in annotations: it 'SPENDS 3D CREDITS,' is asynchronous (returns a job id), and model URLs expire. This provides important operational traits beyond the structured annotations, though it doesn't detail failure modes or input validation failures.

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 compact five-sentence paragraph, front-loading the most critical facts: credits, creation, asynchronous behavior, source options, and URL expiration. Each sentence serves a purpose with no fluff or repetition. The structure is efficient and agent-friendly.

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?

While the description covers the main workflow and source options, it omits a key requirement: that `spec` must be provided when not using assetJobId. The schema documents this, but the description does not call it out, which could lead an agent to submit a request without the required `spec` for image/text sources. Given the tool's complexity and absence of an output schema, this is a notable gap.

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 91%, so the baseline is 3. The description enhances understanding of the source parameters: it explains that assetJobId uses a job's selected reference image, imagePath must be local png/jpg/webp, imageUrl must be https, and textPrompt skips images. This goes beyond the schema's brief property descriptions and clarifies the one-source requirement.

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 states a clear verb and resource: 'Creates a textured 3D model.' It identifies the tool as the creation step in a larger workflow, and the title confirms 'Reconstruct a 3D asset.' It distinguishes from siblings like get_asset_job or download_asset by describing the creation action itself, making the purpose unmistakable.

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 tells the agent when to use this tool: 'Provide exactly ONE source' and enumerates the four options (assetJobId, imagePath, imageUrl, textPrompt). It also directs the follow-up actions: poll get_asset_job, then call download_asset. This is clear workflow guidance that distinguishes it from alternative tools and leaves nothing to inference.

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

create_game_propStart a game prop from a briefA

SPENDS IMAGE CREDITS ONLY. Convenience entry point: takes a loose brief, builds a reconstruction-grade prompt, and generates N candidate reference images. It deliberately STOPS THERE and does NOT spend 3D credits — look at the returned candidates, call select_reference with your choice, then create_3d_asset. This exists so art direction stays with you rather than being guessed at.

NameRequiredDescriptionDefault
nameYesShort identifier, e.g. "portable_atmospheric_processor".
categoryNo
numImagesNo
descriptionYesWhat the object is, in plain language.
waitSecondsNo
artDirectionNoFree-text style, materials and wear.
gameplayPurposeNo
dimensionsMetersNoReal-world size in metres. Used for scale sanity, not enforced by the generator.
targetTriangleCountNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations declare openWorldHint=true and readOnlyHint=false, but the description adds substantial behavioral value beyond those: it discloses the credit cost profile up front ('SPENDS IMAGE CREDITS ONLY' and not 3D credits), and reveals the transformation behavior (loose brief → reconstruction-grade prompt). No contradiction with annotations. It could go further on details like generation time or failure modes, which keeps it from a 5.

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?

Three dense sentences with zero filler. The most critical operational fact (credit spending) is front-loaded in all caps, followed by the workflow and the design rationale. Every sentence earns its place; the structure mirrors the tool's purpose as an entry point.

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?

For a tool with 9 parameters, a nested object, and no output schema, the description covers the workflow and handoff chain well but leaves parameter semantics to the schema, which is only 44% covered. The output shape ('candidate reference images') is hinted but not detailed. Given the strong sibling differentiation and workflow clarity, this is mostly complete with minor gaps around parameters and return details.

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

Parameters3/5

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

Schema description coverage is only 44%, and the description does not compensate by explaining individual parameters — it focuses on workflow. The schema itself carries descriptions for name, description, and dimensionsMeters, but parameters like category, artDirection, gameplayPurpose, waitSeconds, and targetTriangleCount have no descriptions and are not touched in the tool description. This is a real gap given the low coverage.

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?

States a specific verb-resource pair ('takes a loose brief, builds a reconstruction-grade prompt, and generates N candidate reference images') and explicitly frames itself as a 'convenience entry point' that deliberately stops short of 3D generation. It names the exact sibling tools it hands off to (select_reference, create_3d_asset), making the differentiation unambiguous without needing to open their schemas.

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?

Provides an explicit sequential workflow: 'look at the returned candidates, call select_reference with your choice, then create_3d_asset.' It also states when NOT to use it indirectly by declaring that it stops at reference generation and spends no 3D credits — the agent knows this is the reference-stage tool, not the modeling stage. The rationale ('so art direction stays with you') gives clear context for selection.

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

download_assetDownload a finished asset into the workspaceA

FREE: no credits. Downloads a completed asset job into a local workspace folder — the model, any PBR variant, the provider preview, the source reference image — and EXTRACTS embedded textures into textures/ as separate files. Also writes asset.json with complete provenance. Call this as soon as get_asset_job reports "ready": provider URLs expire. Never overwrites an existing workspace; a repeat download gets a new suffixed folder.

NameRequiredDescriptionDefault
assetJobIdYes
destinationNoOverride the output root. Defaults to ASSET_OUTPUT_DIR.
extractTexturesNoWrite embedded glTF images out as separate texture files.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations state readOnlyHint=false, openWorldHint=true, and destructiveHint=false, but the description adds concrete behaviors: writes multiple file types, extracts textures to a textures/ subdirectory, writes asset.json, and never overwrites existing workspaces. It also explains the urgency of expiring URLs, which is not captured by annotations. No contradictions.

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 sentences, front-loaded with a cost note ('FREE: no credits') and then a compact enumeration of what is downloaded. Every phrase adds value: the extraction detail, the asset.json provenance, the urgency trigger, and the no-overwrite guarantee. No redundancy or filler.

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 download tool with no output schema, the description conveys all essential operational facts: what is downloaded, where textures go, the asset.json side effect, the timing constraint, and the handling of repeated calls. It answers the key questions an agent would have to call it correctly. The lack of an explicit return value is acceptable given the action-oriented nature, and the description is otherwise complete.

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 covers 67% of parameters (destination and extractTextures have descriptions; assetJobId has none). The description adds meaning beyond the schema: it explains the output root concept via 'workspace folder', specifies the texture extraction location ('textures/'), and clarifies the non-overwrite behavior tied to destination. It does not explicitly describe assetJobId but implies it from get_asset_job, which is sufficient context.

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?

States a specific verb ('downloads'), resource ('completed asset job'), and destination ('local workspace folder'), enumerating exactly what gets downloaded (model, PBR variant, preview, source reference) and what is extracted/extended (textures, asset.json). It also implicitly differentiates from get_asset_job by referencing it as the prerequisite, and from other asset tools by focusing on fetching a finished job.

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?

Explicitly instructs when to call ('as soon as get_asset_job reports "ready"') and why (provider URLs expire). Also warns about repeat-download behavior (new suffixed folder instead of overwrite), which guides an agent on idempotency handling without needing to guess.

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

extract_pbr_trioSplit a material into separate PBR texture planesA

FREE and fully local: no network call, no credits. Splits a glTF material into independent albedo, normal and roughness images (plus metallic and occlusion when present), de-packing the glTF metallicRoughness texture — roughness is its GREEN channel, metallic its BLUE. Resamples to an exact resolution, averaging colour in linear light and data channels directly, and writes a receipt naming the source texture and channel behind every plane. Use after download_asset, or on any local glTF/GLB. Planes a material declares only as a scalar factor are emitted as flat images and marked source="factor" so a constant is never mistaken for measured data.

NameRequiredDescriptionDefault
modelPathNoAbsolute path to a local .glb or .gltf.
assetJobIdNoA job that has already been downloaded.
resolutionNoSquare output size. Defaults to the largest source texture dimension.
destinationNoOutput directory. Defaults to the workspace.
materialIndexNoWhich material to split when the file has several.

TDQS

A4.4/5.0
Behavior5/5

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

With annotations all false, the description carries the full burden of behavioral disclosure, and it does so thoroughly. It reveals the tool performs no network call, consumes no credits, de-packs channels with specific color-space handling (linear light), and writes a receipt with provenance. It also explains the 'source='factor'' edge case, which is exactly the kind of nuance an agent needs.

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 information-dense but well-organized: it leads with the key value proposition, then the core operation, then technical details, usage context, and a special case. Each sentence earns its place, and there is no redundant filler. Front-loading the local-free nature and the main split action aids quick comprehension.

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?

For a tool with 5 optional parameters and no output schema, the description covers almost everything an agent needs: input types, channel semantics, resolution behavior, receipt generation, and the factor distinction. The only notable gap is that it never explicitly states what the tool returns (e.g., a job ID or a list of output paths). Since it says 'writes a receipt,' the return value is implied but not defined, which is a minor omission.

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

Parameters3/5

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

The input schema has 100% description coverage, so the baseline is 3. The tool description adds some context (e.g., resolution default behavior and the flat image behavior for scalar factors) but doesn't materially enhance parameter meaning beyond what the schema already provides. The schema descriptions suffice.

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 states a specific verb ('splits'), a precise resource ('a glTF material'), and enumerates the outputs (albedo, normal, roughness, plus metallic and occlusion). It immediately distinguishes the tool from siblings by noting it is local and free, and by referencing the material's metallicRoughness de-packing, making the function unmistakable.

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 gives explicit context for when to use the tool: 'Use after download_asset, or on any local glTF/GLB.' This tells the agent the prerequisite and the acceptable inputs. It doesn't explicitly name alternatives or when not to use it, but the context is clear enough to guide correct invocation.

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

generate_asset_referenceGenerate reference images for a game assetA

SPENDS IMAGE CREDITS. Generates candidate reference images for a game asset, framed for 3D reconstruction rather than as concept art (isolated object, whole silhouette, neutral background, even lighting). Returns candidate image URLs for YOU to look at. It does NOT create a 3D model — after inspecting the candidates, call select_reference then create_3d_asset. Asynchronous: waits up to waitSeconds, then returns a job id to poll.

NameRequiredDescriptionDefault
seedNoFix the seed for a reproducible generation.
specYes
widthNo
heightNo
modelIdNoOverride the image model. Defaults to the provider recommendation.
numImagesNoHow many candidates to generate. Each one costs image credits.
waitSecondsNoSeconds to wait for the images before returning. 0 returns immediately with a job id. Bounded on purpose: this call never blocks indefinitely.

TDQS

A4.1/5.0
Behavior5/5

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

The description adds meaningful behavioral context beyond the annotations: it discloses the credit cost ('SPENDS IMAGE CREDITS'), the asynchronous execution model ('waits up to waitSeconds, then returns a job id to poll'), and the output nature ('candidate image URLs for YOU to look at'). It does not contradict the readOnlyHint=false or idempotentHint=false annotations, and it provides insight into side effects that annotations alone do not convey.

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?

The description is moderately long but each sentence adds value: credit cost, generation framing, output, not-3D warning, workflow, and async behavior. It front-loads the credit warning and core action. A minor redundancy exists in explaining the framing and the not-3D aspect, but overall it is efficient and well-structured.

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?

Given the tool's complexity (7 parameters, nested objects, no output schema), the description covers the high-level workflow and async behavior but omits parameter-level guidance. It does not explain what fields in 'spec' are essential or how waitSeconds interacts with job polling via get_asset_job. The mention of 'call select_reference then create_3d_asset' hints at the pipeline but leaves the agent to infer details from the schema. It is adequate for a basic invocation but incomplete for full correct usage of all options.

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 only 57%, leaving many parameters undocumented. The description does not compensate: it mentions 'waitSeconds' implicitly but does not explain the role of spec, numImages, or other nested parameters beyond what the schema already says. For a tool with complex nested objects (spec.artDirection, spec.geometry), the description offers almost no help in constructing valid parameters, falling short of the burden placed on it by low schema coverage.

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 verb ('generates'), the resource ('candidate reference images for a game asset'), and the specific framing ('for 3D reconstruction rather than concept art') with concrete visual details (isolated object, neutral background). It also explicitly distinguishes from the sibling create_3d_asset by stating it does NOT create a 3D model, making the purpose unambiguous.

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 provides a clear workflow: 'after inspecting the candidates, call select_reference then create_3d_asset'. It also notes asynchronous behavior and the need to poll for a job id. However, it does not mention when NOT to use this tool (e.g., for generating variations) or how it contrasts with generate_reference_variations, so it lacks explicit exclusion guidance.

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

generate_reference_variationsExplore variations of an existing referenceA

SPENDS IMAGE CREDITS. Generates variations of an existing asset job along ONE named axis (silhouette, material_treatment, industrial_detailing, wear, proportions, functional_components) while holding the object identity fixed — a variation should still be the same object, not a different one. Creates a NEW child job linked to the parent.

NameRequiredDescriptionDefault
axisYesWhich design dimension to explore.
seedNoFix the seed for a reproducible generation.
widthNo
heightNo
modelIdNoOverride the image model. Defaults to the provider recommendation.
numImagesNoHow many candidates to generate. Each one costs image credits.
assetJobIdYesThe parent job whose spec should be varied.
waitSecondsNoSeconds to wait for the images before returning. 0 returns immediately with a job id. Bounded on purpose: this call never blocks indefinitely.

TDQS

A4.2/5.0
Behavior4/5

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

The description discloses a critical side effect upfront: 'SPENDS IMAGE CREDITS.' It also explains that it creates a new child job and that the object identity is held fixed, which goes beyond the annotations (readOnlyHint=false, openWorldHint=true). While it doesn't mention every possible side effect, this is substantial behavioral context not present in the schema.

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, well-structured sentence that front-loads the cost warning. Every clause adds value: the credit warning, the axis constraint, the identity requirement, and the child-job relationship. There is zero fluff or repetition.

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?

For a tool with 8 parameters and no output schema, the description covers the core function and key side effects (credits, child job creation). It doesn't explain the return format, but it mentions creating a child job, which hints at a job reference. The waitSeconds behavior is defined in the schema, so the description doesn't need to repeat it. The remaining gaps (output details) are minor given the tool's role.

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

Parameters3/5

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

The schema already covers 75% of parameters with descriptions (axis, seed, modelId, numImages, assetJobId, waitSeconds). The description adds nuance by stating that only ONE axis is varied and that the object identity is fixed, which clarifies the axis and assetJobId parameters. However, this is supplementary rather than essential, and width/height lack descriptions both in schema and description without compensation.

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 states a specific verb ('Generates variations') and a specific resource ('existing asset job'), and clearly scopes the action to 'ONE named axis' with a concrete list. It distinguishes itself from siblings by emphasizing it creates a new child job linked to the parent rather than starting from scratch. This leaves no ambiguity about what the tool does.

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 gives clear context for use: you have an existing asset job and want variations along a single axis. It implies alternatives by mentioning 'existing asset job' (vs. creating from scratch) but does not explicitly name sibling tools or state when not to use it. The instruction to hold object identity fixed further constrains when it is appropriate.

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

generate_sound_effectGenerate a game sound effectA

SPENDS AUDIO CREDITS. Generates a short sound effect from a text description — weapon reports, impacts, footsteps, UI blips, or a seamless ambience loop. Set loop:true for anything that must tile without a seam. Each variation in quantity costs separately. Polls and downloads inline, returning local file paths; the wait is bounded, so a slow provider returns a job id to poll with get_asset_job rather than hanging. NOTE: the provider documents this request contract but not its response shape, so this path is UNVERIFIED against the live API — the first real call may need a client fix.

NameRequiredDescriptionDefault
loopNoRequest a seamless loop. Essential for ambience beds and engine tones.
nameYesShort identifier, e.g. "plasma_rifle_fire". Becomes the workspace folder.
promptYesWhat the sound is. Concrete physical description beats genre words.
quantityNoHow many variations. Each costs credits.
destinationNoOutput root. Defaults to ASSET_OUTPUT_DIR.
waitSecondsNoBounded wait before returning a job id instead. 0 returns immediately.
durationSecondsNoWhole seconds, 1-22. Provider default is 2.
promptInfluenceNo0..1. Higher follows the prompt more literally; lower explores.

TDQS

A4.3/5.0
Behavior5/5

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

Annotations only provide readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false, which say little about side effects or costs. The description carries the full burden and does so richly: it states 'SPENDS AUDIO CREDITS', explains each variation costs separately, describes polling behavior with a bounded wait, reveals the return format (local file paths), and even discloses that the path is UNVERIFIED against the live API. This goes well beyond the annotations and is a model of transparency.

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?

The description is longer than the ideal but every sentence serves a purpose. It front-loads the cost warning, then describes the tool, provides loop guidance, explains polling, and ends with an essential unverified caveat. It is not verbose or redundant, though it could be tightened slightly by omitting the repeated warning about variations in both the main text and the parameter schema.

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?

For a complex 8-parameter tool with no output schema, the description covers cost, loop behavior, variations, polling, bounded wait, and return format (local file paths). It also flags the unverified status. It does not specify error handling or edge cases, but given the schema covers parameter details and the description covers behavioral essentials, it is sufficiently complete for an agent to call correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description largely repeats what the schema already states (e.g., loop for seamless tiling, prompt advice 'Concrete physical description beats genre words' is in the schema's prompt description). It adds no new parameter semantics beyond the schema, so a 3 is appropriate.

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 clear verb+resource: 'Generates a short sound effect from a text description' and lists concrete examples (weapon reports, impacts, footsteps, UI blips, ambience loop). It is immediately distinct from sibling tools like create_3d_asset or get_asset_job, since it targets audio generation and even references get_asset_job for polling.

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 usage context: 'SPENDS AUDIO CREDITS' warns about cost, 'Set loop:true for anything that must tile without a seam' provides a condition for a parameter, and it explains when polling is needed ('a slow provider returns a job id to poll with get_asset_job rather than hanging'). It does not explicitly name alternatives or say when NOT to use this tool, but the context is clear enough for an agent to choose appropriately.

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

get_asset_jobGet asset job statusA
Read-only

Check an asset job, refreshing it from the provider if it is still running. READ-ONLY: makes a network call to the provider but never spends credits. Call this after create_3d_asset or texture_existing_asset until status is "ready", then call download_asset. Statuses: queued, generating_reference, reference_ready, generating_3d, processing, ready, failed, cancelled.

NameRequiredDescriptionDefault
detailNoReturn the FULL job record including prompts, provider parameters and every file. Defaults to false because full records are large and flood context on repeated polls.
assetJobIdYesThe local asset job id returned when the job was created.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, but the description adds that it 'makes a network call to the provider but never spends credits' and explains the refresh behavior. This adds concrete context beyond annotations. It doesn't describe return format or error handling, but given the annotation coverage, this is sufficient.

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?

The description is compact and front-loads the core purpose and read-only nature. The status list is dense but comprehensive, and the sequential guidance is clear. It could be split into a list for readability, but it's efficient and every sentence carries useful information.

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?

For a simple polling tool with two parameters and no output schema, the description covers the essential workflow: when to call, what statuses to expect, and the read-only safety. It doesn't detail error handling or response structure, but that's not critical given the tool's simplicity and the guidance provided.

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 100%, so both parameters are documented in the schema. The description adds extra value by explaining the 'detail' parameter's default and its rationale ('Defaults to false because full records are large and flood context on repeated polls'), which is not in the schema. This goes beyond the baseline of 3.

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 action: 'Check an asset job, refreshing it from the provider if it is still running.' It identifies the resource (asset job) and the specific behavior (refresh if running), and it distinguishes itself from siblings by tying it to the create/texture workflow and the subsequent download step. This is specific and unambiguous.

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 provides explicit sequential guidance: 'Call this after create_3d_asset or texture_existing_asset until status is "ready", then call download_asset.' This tells the agent exactly when to use it. However, it doesn't explicitly contrast with alternatives like list_asset_jobs (which is for listing, not polling a single job), so it's not a full when-not-to-use, but it is clear enough.

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

get_spend_reportReport what this session has spentA
Read-onlyIdempotent

FREE and fully local: no network call, no credits. Reports the estimated provider spend for this workspace, broken down by tool, plus the remaining headroom under ASSET_SPEND_LIMIT_CENTS if one is set. Figures are normalised to US cents because providers bill in different units. Costs marked "estimated" are pessimistic placeholders for providers that do not publish a per-call rate — treat them as a guard, not an invoice.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds valuable behavioral context: it is free, fully local, makes no network call, consumes no credits, normalizes figures to US cents, and clearly flags that estimated costs are pessimistic placeholders. This goes beyond the annotations to explain the nature of the data and its reliability, though it does not address any potential concurrency or rate-limit behavior (likely irrelevant for a local read).

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 sentences with no fluff. The leading 'FREE and fully local: no network call, no credits' is an efficient hook, followed by the core reporting function and the important estimation caveat. Every part adds value, and it is front-loaded with the most decision-relevant 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?

Given the tool has no parameters and no output schema, the description fully covers what the agent needs: what is reported (spend breakdown by tool, remaining headroom), the unit normalization, and the caveat about estimated costs. There is no missing detail that would prevent correct invocation or interpretation of results.

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, and the schema coverage is 100% (empty properties object). Per the baseline rule for 0 parameters, a score of 4 is appropriate. The description does not need to explain parameters since none exist, and it appropriately focuses on the output semantics instead.

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 states a specific verb ('Reports') and a specific resource ('estimated provider spend for this workspace, broken down by tool'), plus the additional output of remaining headroom. It clearly distinguishes from sibling tools, which are all asset-generation/job tools, by being the only spend-related tool. The purpose is unambiguous.

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 does not explicitly state when to use this tool versus alternatives, though no direct alternative exists among siblings. It does convey that it is free and local, implying it can be called without cost concerns, but it lacks an explicit 'use this when you need to check budget' or 'prefer this over external APIs' guidance. The usage context is implied rather than stated.

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

inspect_assetInspect a downloaded 3D assetA
Read-onlyIdempotent

FREE and fully local: no network call, no credits. Reports the technical properties of a downloaded glTF/GLB — mesh and triangle counts, materials, texture resolutions, bounding box in metres, and whether UVs, normals, tangents and PBR channels are present — plus warnings for anything that will cause downstream problems. Pass assetJobId to inspect a downloaded job, or modelPath to inspect any local file.

NameRequiredDescriptionDefault
modelPathNoAbsolute path to a local mesh. GLB and glTF are inspected directly; other mesh formats are accepted and will fail at decode, since only glTF can be read.
assetJobIdNoA job that has already been downloaded.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the tool is known to be safe. The description adds valuable context: 'FREE and fully local: no network call, no credits' and lists what it reports, including warnings for downstream problems. This goes beyond the annotations without contradicting them.

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?

The description is two sentences and front-loaded with the key benefit ('FREE and fully local'), then the purpose, then how to call it. The list of properties is somewhat lengthy but necessary to convey the output. It is efficient without being terse.

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?

There is no output schema, but the description enumerates what is reported (counts, materials, etc.) and mentions warnings, covering the return content. It also explains both parameters' usage. It does not detail error behavior beyond the schema's note on non-glTF formats, but that is sufficient for a read-only inspection 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 100%, so the schema already documents both parameters. The description adds meaning by clarifying the relationship: assetJobId is for a downloaded job and modelPath for any local file. This clarifies the distinction beyond the schema's bare descriptions.

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 states a specific verb ('inspect') and resource ('downloaded glTF/GLB' or local file), and enumerates the technical properties it reports (mesh/triangle counts, materials, texture resolutions, bounding box, presence of UVs/normals/tangents/PBR channels). It also notes warnings for downstream issues, making the purpose concrete and distinct from siblings like get_asset_job or validate_game_asset.

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 provides clear usage context for both parameters: 'Pass assetJobId to inspect a downloaded job, or modelPath to inspect any local file.' This tells the agent when each input is appropriate. However, it does not explicitly mention when not to use this tool versus alternatives, so it falls short of a 5.

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

list_asset_jobsList asset jobsA
Read-only

List local asset jobs, newest first. READ-ONLY and fully local: no network call, no credits. Does not refresh provider state — use get_asset_job for that.

NameRequiredDescriptionDefault
limitNo
statusNoFilter to one lifecycle status.

TDQS

A4.4/5.0
Behavior5/5

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

Even though readOnlyHint is true, the description adds critical context: 'fully local: no network call, no credits' and 'does not refresh provider state.' These details about cost, network access, and side effects go well beyond the annotation and help an agent gauge operational impact.

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?

Three concise sentences: the first states the core purpose and ordering, the second adds local/no-network/no-credit detail, and the third clarifies the exception. Information is front-loaded and every sentence earns its place with no fluff.

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?

For a read-only list tool with optional parameters, the description covers purpose, sorting, side-effect caveats, and the alternative tool. It does not describe the return structure or pagination, but the schema provides limit bounds and the tool's simplicity reduces the need. Overall, it is nearly 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?

The description does not mention either parameter (limit or status). Schema coverage is only 50% (status has a description, limit does not), and the description does not compensate by explaining limit's role or the enum's purpose. An agent must rely on the parameter names and defaults, which is insufficient for a low-coverage schema.

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 states a specific verb ('list') and resource ('local asset jobs'), adds a sorting guarantee ('newest first'), and explicitly distinguishes itself from get_asset_job by noting it does not refresh provider state. This makes the tool's scope unambiguous against a large sibling set.

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?

It provides an explicit exclusion: 'Does not refresh provider state' and directly names the alternative 'use get_asset_job for that.' This tells the agent exactly when to choose a different tool, leaving no ambiguity.

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

normalize_meshRepair a mesh so it can be textured and shippedA

FREE and fully local: no network call, no credits. Requires a local Blender install (optional dependency; the tool refuses with instructions if absent). Repairs a mesh for downstream use: generates UV coordinates for objects that have NONE — the single most common reason a mesh cannot be textured — welds coincident vertices, dissolves degenerate triangles, gives every material a stable non-empty name, forces opaque blending, and optionally decimates to a triangle budget. Existing UV layouts are never overwritten. Exports GLB and returns a receipt with before/after counts so the change is measurable.

NameRequiredDescriptionDefault
modelPathNoAbsolute path to a local mesh (.glb/.gltf/.obj/.fbx/.stl).
overwriteNoAllow an explicit outputPath to replace an existing file. Off by default: a silent overwrite destroys a result you may already have reviewed. Never permits writing over the input mesh.
assetJobIdNoA downloaded job whose model should be normalized.
outputPathNoWhere to write the GLB. Must end in .glb, or have no extension (in which case .glb is appended) — the exporter rewrites the extension, so a .gltf path would silently become .glb and could land on a different file. Refused if it resolves onto the input mesh, by filesystem identity, so symlinks, hardlinks and case-insensitive volumes all count. Use an ABSOLUTE path: a relative one resolves against the SERVER's working directory, which your MCP client chose, and a leading ~ is not expanded. Naming an existing directory writes a sibling file beside it, not inside it. Defaults to <input>_normalized.glb beside the source.
islandMarginNoUV island padding.
cleanGeometryNoWeld coincident vertices, dissolve degenerate faces, make normals consistent.
mergeDistanceNoWeld threshold in scene units. Larger values will change the silhouette.
timeoutSecondsNo
targetTrianglesNoDecimate down to roughly this many triangles. Omit to leave density alone.
unwrapMissingUVsNoGenerate UVs for objects that have none. Never touches an existing layout.
angleLimitDegreesNoSmart-project angle limit.
normalizeMaterialsNoName every material slot and force opaque blending.

TDQS

A4.3/5.0
Behavior5/5

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

Annotations carry no safety hints (all false/empty), so the description bears the full burden — and it exceeds it. It discloses the surprising 'forces opaque blending', guarantees 'Existing UV layouts are never overwritten', and repeatedly states it never writes over the input mesh. It also reveals the receipt with before/after counts. No contradiction with annotations (destructiveHint=false is consistent with the no-overwrite guarantee).

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?

A dense paragraph with no filler — every sentence contributes (dependency, behavior list, safety guarantees, return format). It is front-loaded with the cost model. Slightly long, but the information density justifies the length.

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?

For a 12-parameter, zero-required mutation tool with no output schema, the description covers the key decision points: dependency requirements, safety boundaries, and the measurable return receipt. It doesn't walk through every parameter, but the schema handles that; the main omission is explicit routing away from overlapping siblings.

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

Parameters3/5

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

Schema description coverage is 92%, so the schema documents nearly all parameters; the baseline of 3 applies and the description need not compensate. It does add a little value (decimation goal, UV generation intent) but leaves parameter-level details to the schema, which is appropriate at this coverage level.

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?

States a specific, unambiguous purpose: 'Repairs a mesh for downstream use' and enumerates the exact operations (UV generation, vertex welding, degenerate-triangle dissolution, material naming, opaque blending, optional decimation). Verb+resource are distinct and clearly differentiated from siblings such as retopologize_asset and texture_existing_asset.

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?

Provides strong context: it calls out that it is free/local with no credits, and flags the Blender optional dependency with refusal behavior. It explains the canonical scenario ('the single most common reason a mesh cannot be textured'). It doesn't name sibling alternatives explicitly with when-not conditions, so differentiation is implied rather than stated.

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

preview_asset_promptPreview the prompt that would be generatedA
Read-onlyIdempotent

FREE and fully local: no network call, no credits. Shows the exact reconstruction-oriented prompt and negative prompt that generate_asset_reference would send for a given spec. Use this to sanity-check art direction before spending image credits.

NameRequiredDescriptionDefault
specYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already establish readOnly, idempotent, non-destructive behavior. The description adds valuable context: it is free, fully local (no network call, no credits), and shows the exact prompt that the generator would send. This goes beyond the annotations by clarifying cost and network implications.

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?

Three tight sentences: first states the key benefit (free/local), second the core action, third the usage scenario. No filler, front-loaded with the most important differentiator.

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 description covers purpose, benefit, use case, and output type (prompt and negative prompt). It does not detail the spec schema, but that is fully documented in the input schema. For a non-destructive preview tool with robust annotations, this is sufficient; the only minor omission is any note about error handling or output format details, but those are not critical.

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

Parameters3/5

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

The description only refers to 'a given spec' without elaborating on its structure. However, the input schema's nested properties contain rich descriptions for each field (name, output, etc.), so the agent can understand the spec from the schema. The description adds no new meaning to the spec parameter itself, so it relies on the schema – baseline 3.

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 explicitly states the action ('Shows the exact...prompt') and the resource (the prompt that generate_asset_reference would send), and distinguishes itself as FREE and fully local, differentiating it from the generating sibling. It names the sibling tool and clearly communicates it's a preview, not the generator.

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?

It explicitly says 'Use this to sanity-check art direction before spending image credits,' giving a clear when-to-use condition. It names generate_asset_reference as the alternative that actually spends credits, and implies this tool is for pre-flight validation. No exclusions are needed.

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

retopologize_assetRebuild an asset's topology, optionally as quadsA

SPENDS 3D CREDITS. Rebuilds the topology of an existing generated asset. Quad output is the default because quads survive downstream mesh qualification and editing far better than the triangle soup generators typically emit. ASYNCHRONOUS: poll get_asset_job, then download_asset and validate_game_asset. NOTE: the provider task name is taken from published docs and is UNVERIFIED live.

NameRequiredDescriptionDefault
quadNoQuads rather than triangles.
faceLimitNoTarget face count.
assetJobIdYesA job whose 3D task produced a model.

TDQS

A4.1/5.0
Behavior5/5

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

The description adds significant behavioral context beyond annotations: it discloses credit spending, async execution with poll steps, and flags the provider task name as unverified. This is valuable transparency that annotations do not provide, and there is no contradiction with the annotations.

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?

The description is a few sentences, each contributing useful information: credit cost, purpose, rationale, async steps, and a verification note. It is front-loaded with the most critical constraint (credit spend) and avoids redundancy.

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?

For a mutation tool with no output schema, the description covers the essential context: the operation, cost, async flow, and follow-up steps. It could mention potential error conditions or prerequisites more explicitly, but the assetJobId parameter description in the schema helps fill that gap.

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

Parameters3/5

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

Schema description coverage is 100%, so all parameters are documented in the schema. The description adds minimal extra meaning—only reiterating the quad default, which is already in the schema. Baseline 3 is appropriate.

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 verb 'Rebuilds' and the resource 'topology of an existing generated asset', distinguishing it from siblings like normalize_mesh or texture_existing_asset. It also explains the rationale for quad output, reinforcing its specific role.

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 provides context on why quads are preferred but does not explicitly state when to use this tool versus alternatives like normalize_mesh. The async workflow is mentioned, but no exclusion criteria or comparisons are provided, leaving usage decisions partially implicit.

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

rig_assetGenerate a skeleton and skin weightsA

SPENDS 3D CREDITS. Rigs an existing generated asset — builds a skeleton and skin weights so it can be animated. Takes an asset job that already produced a model. ASYNCHRONOUS: poll get_asset_job, then download_asset. Rig before animating; retargeting an unrigged model wastes the credits. NOTE: the provider task name is taken from published docs and is UNVERIFIED live.

NameRequiredDescriptionDefault
specNoWhich skeleton convention to target.humanoid
outFormatNoglb
assetJobIdYesA job whose 3D task produced a model.

TDQS

A4.4/5.0
Behavior5/5

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

The description discloses several behavioral traits beyond the annotations: it spends 3D credits (cost), it is asynchronous requiring polling of get_asset_job and download_asset, and it notes that the provider task name is unverified. These are critical operational details that annotations (readOnlyHint=false, openWorldHint=true) do not capture. The description adds substantial transparency.

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?

Every sentence earns its place: the credit warning is front-loaded, the async workflow is stated, and the prerequisite and warning about wasted credits are included. It is information-dense but not bloated, with a clear logical flow from cost to action to next steps.

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 the complexity (asynchronous, credit-spending, dependency on prior job), the description covers all essential aspects: what it does, the prerequisite, the async polling pattern, and the cost implication. It even flags the unverified provider name. For a tool with no output schema, this is nearly complete for an agent to use correctly.

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 coverage is 67%, leaving outFormat undocumented. The description does not clarify what outFormat options are or how spec affects the rigging, beyond what the schema already states for assetJobId. While the description reinforces that assetJobId must reference a completed model, it adds minimal value to parameter understanding. The missing outFormat explanation is a clear gap.

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 action (rigs), the resource (an existing generated asset), and the outcome (builds skeleton and skin weights). It distinguishes from siblings like animate_asset and retopologize_asset by framing the purpose as enabling animation. The verb-resource combination is specific and unambiguous.

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 context: it must be used on an asset job that already produced a model, and it should precede animation ('Rig before animating'). It also warns about wasting credits by retargeting an unrigged model, which implies when this tool is the right choice. It does not explicitly name alternatives like animate_asset, but the sequencing guidance provides adequate usage direction.

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

select_referenceChoose which reference image to reconstructA
Idempotent

FREE and local: no network call, no credits. Records which candidate image should be used for 3D reconstruction. Call this after looking at the candidates from generate_asset_reference, and before create_3d_asset.

NameRequiredDescriptionDefault
assetJobIdYes
candidateIdYesThe candidate id, e.g. "cand_1".

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already provide idempotentHint=true and destructiveHint=false, but the description adds meaningful context: it is free and local (no network call, no credits) and that it 'records' which candidate image to use. This goes beyond the structured annotations and helps the agent understand side effects (state change, but idempotent) and cost implications.

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 concise sentences with no fluff. The free/local note is front-loaded, followed by the core action and workflow. Every sentence earns its place, and the structure is immediately scannable.

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?

For a simple two-parameter selection tool with no output schema, the description is largely complete: it explains the core action, the workflow sequence, and key behavior (free/local). The only gap is the undocumented assetJobId, but given the tool's simplicity and the workflow clarity, a 4 is reasonable.

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

Parameters3/5

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

Schema coverage is 50%: candidateId has a description, assetJobId does not. The description mentions 'candidate image' which indirectly relates to candidateId, but it does not clarify assetJobId at all. The description adds marginal value beyond the schema but fails to compensate for the undocumented parameter, so a 3 is appropriate.

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 states a specific action ('records which candidate image') on a specific resource ('for 3D reconstruction'), and explicitly places it between generate_asset_reference and create_3d_asset. This clearly differentiates it from siblings like generate_reference_variations or create_3d_asset.

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 workflow context: 'Call this after looking at the candidates from generate_asset_reference, and before create_3d_asset.' This is clear when-to-use guidance. It does not mention when not to use or list alternative tools, but the workflow sequencing is strong enough for a 4.

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

texture_existing_assetGenerate PBR textures for a mesh you already haveA

SPENDS 3D CREDITS. Applies newly generated PBR materials to an EXISTING mesh, keeping its geometry untouched. Use this when you already own a model and only the materials are missing or wrong — it is cheaper than regenerating and preserves the mesh exactly. Provide the mesh as either modelPath (local .glb/.gltf/.fbx/.obj/.stl) or originalAssetJobId (a previous job from this server whose 3D task produced a model). Direct the material with EITHER prompt OR styleImagePath, not both. ASYNCHRONOUS: poll get_asset_job until "ready", then download_asset. NOTE: providers may only support retexturing meshes that originated from their own prior task; if a provider rejects an uploaded mesh, use originalAssetJobId instead.

NameRequiredDescriptionDefault
pbrNo
specNoRequired with modelPath, so the result has a name and provenance.
promptNoText direction for the material.
modelPathNoAbsolute path to a local mesh file.
textureSeedNo
modelVersionNo
styleImagePathNoLocal image whose look should be transferred onto the mesh.
textureQualityNo"detailed" is the HD tier and costs more credits.detailed
textureAlignmentNo"geometry" aligns to the mesh shape; "original_image" to the reference image.
originalAssetJobIdNoA previous asset job from this server whose 3D task produced a model.

TDQS

A4.5/5.0
Behavior5/5

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

The description is richly transparent. It discloses cost ('SPENDS 3D CREDITS'), non-destructive behavior ('keeping its geometry untouched'), asynchronous operation with explicit polling instructions ('poll get_asset_job until "ready", then download_asset'), and a critical provider limitation with a fallback. These details go well beyond the annotations (readOnlyHint=false, destructiveHint=false, etc.) and give the agent a clear behavioral model.

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?

The description is substantial but every sentence serves a purpose: cost warning, function, use-case justification, input methods, material direction rule, async flow, and provider caveat. It is front-loaded with the cost and core purpose, and while it is longer than average, the information density justifies the length. The structure is logical and scannable.

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?

For a tool with 10 parameters and nested objects but no output schema, the description covers the essential operational flow: how to provide the mesh, how to direct the material, how to handle the async result, and a failure case. It does not detail output structure, but that is handled by the referenced job flow. The description is complete enough for an agent to invoke correctly without reading the entire schema.

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 description clarifies the most important parameter interactions: the mutual exclusivity of prompt and styleImagePath ('EITHER prompt OR styleImagePath, not both') and the two valid inputs for the mesh (modelPath or originalAssetJobId). With 70% schema coverage, this adds critical value beyond the schema, though it does not explain every parameter (e.g., textureSeed, modelVersion), which is acceptable given their optional nature.

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 function: applying newly generated PBR materials to an existing mesh while preserving geometry. It specifies the resource (existing mesh) and the action (apply materials), and distinguishes itself from sibling tools like create_3d_asset by explicitly framing the use case as 'when you already own a model and only the materials are missing or wrong.' This makes the purpose unambiguous.

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 instructions on when to use the tool (existing mesh, missing/wrong materials) and why it's preferable (cheaper, preserves geometry). It also explains two ways to provide the mesh and a fallback for provider limitations. However, it does not explicitly name alternative tools (e.g., create_3d_asset for new meshes) or state when NOT to use it beyond the implied existing-asset condition, so it falls short of a 5.

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

validate_game_assetCheck whether an asset is game-readyA
Read-onlyIdempotent

FREE and fully local: no network call, no credits. Judges a glTF/GLB against a shipping policy and returns a pass/fail verdict with per-check reasons — UVs, normals, tangents where a normal map is bound, triangle budget, material count, texture resolution, power-of-two textures, and bounding-box sanity. Errors fail the asset; warnings are judgement calls and do not. Every threshold is overridable, because an asset failing someone else's house style is not a defect. Pair with normalize_mesh: run this first to see what is wrong, normalize, then run it again to prove the repair.

NameRequiredDescriptionDefault
modelPathNoAbsolute path to a local .glb or .gltf.
assetJobIdNoA job that has already been downloaded.
requireUVsNo
maxMaterialsNo
maxTrianglesNo
minTextureSizeNo
requireNormalsNo
maxDimensionMetersNo
minDimensionMetersNo
requireBaseColorTextureNo
requirePowerOfTwoTexturesNo
requireTangentsWithNormalMapNo

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the description does not need to re-state safety. It adds valuable behavioral detail: errors fail the asset, warnings do not; every threshold is overridable (implying parameter customization). The note that it is free and fully local adds context about execution environment. This goes beyond what annotations provide, though it could be more explicit about output structure or error handling.

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?

The description is a single dense paragraph but is well-ordered: starts with 'FREE and fully local', then describes the core function, then error/warning behavior, then overridability, then the pairing workflow. Every sentence carries information and nothing is redundant. It could be broken into bullet points for scannability, but it's efficient and not bloated. Slight deduction for length; it could be shortened without losing content.

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 explains the output (pass/fail with per-check reasons) and the checks, but it omits critical usage details: it does not state that one of modelPath or assetJobId must be provided (both are optional in schema), nor does it mention default thresholds or units (e.g., triangle count, texture size). Without an output schema, the return format is only vaguely described. The pairing with normalize_mesh is helpful, but the description lacks completeness for an agent to call correctly without additional inference.

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

Parameters3/5

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

Schema description coverage is only 17% (only modelPath and assetJobId have descriptions). The description lists the checks performed (UVs, normals, tangents, triangle budget, etc.) but does not explicitly map each check to its corresponding parameter (e.g., requireUVs, maxTriangles). The statement 'Every threshold is overridable' implies parameters exist but doesn't clarify their semantics. Given the low schema coverage, the description should compensate more by naming parameters or specifying units. It adds some value by listing the checks, but an agent might still be unsure how to set specific thresholds.

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 judges glTF/GLB assets against a shipping policy and returns a pass/fail verdict with per-check reasons. It lists specific checks (UVs, normals, tangents, triangle budget, etc.) and distinguishes itself from normalize_mesh by describing the pairing workflow. This is a specific, actionable purpose that an agent can easily understand without opening the schema.

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 explicitly notes it is free and fully local (no network/credits), which is a condition for when to use it. It also instructs to pair with normalize_mesh: run this first, normalize, then run again to verify repair. This provides clear 'when to use' context. It does not explicitly mention when not to use or list alternatives, but given the tool's role as the validation step, the guidance is sufficient. A small deduction for not stating that it's a pre-shipping check among other potential validation paths.

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. 20 tool updatesv0.3.8
    • First observedanimate_asset
    • First observedbatch_prepare_meshes
    • First observedcreate_3d_asset
    • First observedcreate_game_prop
    • First observeddownload_asset
    • First observedextract_pbr_trio
    • First observedgenerate_asset_reference
    • First observedgenerate_reference_variations
    • First observedgenerate_sound_effect
    • First observedget_asset_job
    • First observedget_spend_report
    • First observedinspect_asset
    • First observedlist_asset_jobs
    • First observednormalize_mesh
    • First observedpreview_asset_prompt
    • First observedretopologize_asset
    • First observedrig_asset
    • First observedselect_reference
    • First observedtexture_existing_asset
    • First observedvalidate_game_asset

TDQS

A4.3/5.0

Scored across 20 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: generation (reference, variation, full 3D), selection, downloading, inspection, validation, normalization, PBR extraction, sound effects, rigging, animation, retopology, batch operations, and spend reporting. Even similar tools like generate_asset_reference and create_game_prop are differentiated by their roles (raw generation vs. convenience wrapper that stops at candidate selection).

Naming Consistency5/5

All tool names follow a consistent verb_noun snake_case pattern (e.g., get_asset_job, create_3d_asset, download_asset, validate_game_asset). Minor variation between 'create_' and 'generate_' is acceptable since they reflect different actions (creating a final asset vs. generating intermediate references). The naming is highly predictable.

Tool Count4/5

With 20 tools, the surface is broad but well-scoped for a comprehensive game asset pipeline covering generation, modification, validation, and auxiliary operations. It is on the higher end of typical, but each tool earns its place; no redundant or trivial tools exist.

Completeness4/5

The toolset covers the full asset lifecycle: generate references, select, create 3D, download, inspect, validate, normalize, extract PBR, rig, animate, retopologize, and batch prepare. Minor gaps include no explicit job deletion or advanced manual editing (e.g., UV sculpting), but these are not core to the stated purpose and can be worked around.

Maintenance

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers