VRM Toolkit
Inspecione, valide e visualize arquivos de avatar e animação VRM / VRMA localmente. 5 ferramentas, stdio, sem acesso à rede em tempo de execução.
Documentação
vrm-toolkit-mcp
Um servidor MCP (Model Context Protocol) que permite a um agente de IA inspecionar, validar e visualizar arquivos VRM / VRMA na sua máquina. Cinco ferramentas, transporte stdio, sem acesso à rede em tempo de execução.
Um servidor MCP que permite usar inspeção, extração de informações e visualização de arquivos VRM / VRMA a partir de um agente de IA. São 5 ferramentas, transporte stdio, sem acesso à rede em tempo de execução.
Ferramentas
| Ferramenta | O que faz | Descrição |
|---|---|---|
vrm_inspect | JSON estruturado: metadados (nome/autor/licença e campos de permissão), mapa de ossos humanoides, expressões, estatísticas de polígonos/texturas | Saída estruturada de metadados (nome/autor/licença), ossos, expressões e escala de polígonos/texturas |
vrm_validate | Lista de achados: ossos humanoides obrigatórios ausentes, referências de nós quebradas, campos de metadados/licença ausentes, extensões obrigatórias desconhecidas, orçamentos configuráveis de tamanho/triângulos/texturas | Lista de inspeção com mapeamento humanoide ausente, referências quebradas, metadados/licença ausentes, extensões obrigatórias desconhecidas, excedentes de tamanho etc. |
vrma_inspect | Trilhas, ossos humanoides alvo, trilhas de expressão, duração, taxa de quadros estimada | Trilhas, ossos alvo, trilhas de expressão, duração, estimativa de taxa de quadros |
vrma_preview | Aplica um VRMA a um VRM e renderiza um PNG estático ou um clipe WebM curto (máx. 10 s) via Chrome/Edge headless local | Aplica VRMA ao VRM e exporta PNG estático ou vídeo WebM curto via Chrome/Edge headless local |
vrm_snapshot | Renderiza um PNG em pose de repouso com pesos de expressão opcionais e predefinições de visualização (frente / três quartos / lateral / close-up do rosto) | Captura de tela estática com pesos de expressão e predefinições de visualização (frente / três quartos / lateral / close-up do rosto) |
As ferramentas estruturais (vrm_inspect, vrm_validate, vrma_inspect) analisam o
contêiner GLB/glTF diretamente no Node e não precisam de navegador. As ferramentas de renderização
(vrma_preview, vrm_snapshot) usam um navegador baseado em Chromium já instalado via
puppeteer-core; nada é baixado.
As 3 ferramentas estruturais analisam GLB/glTF diretamente apenas com Node, sem necessidade de
navegador. As 2 ferramentas de renderização usam um navegador Chromium já instalado via
puppeteer-core (sem downloads adicionais).
Entradas suportadas: VRM 0.x (extensions.VRM), VRM 1.0 (extensions.VRMC_vrm),
VRMA (extensions.VRMC_vrm_animation), contêiner GLB ou JSON glTF simples.
Requisitos
- Node.js 20+
- Para
vrma_preview/vrm_snapshot: um Chrome ou Edge local (detecção automática; substituível pela variável de ambienteVRM_TOOLKIT_CHROME) - Orçamento de tamanho de entrada: 512 MiB por padrão (
VRM_TOOLKIT_MAX_BYTESpara substituir)
Configuração
Registro com Claude Code:
claude mcp add vrm-toolkit -- npx -y vrm-toolkit-mcp
Outros hosts MCP: comando npx, argumentos ["-y", "vrm-toolkit-mcp"] (stdio).
A partir do código-fonte:
npm install
npm run build
claude mcp add vrm-toolkit -- node /absolute/path/to/vrm-toolkit/dist/main.js
Exemplos de execução
Saídas reais da execução de teste local (2026-08-05, caminhos de arquivo abreviados).
vrm_inspect
Entrada: um avatar VRM 1.0 exportado do VRoid Studio (15,7 MB).
{
"file": { "path": "...\\V1.vrm", "bytes": 15737992, "container": "glb" },
"vrm": { "specFamily": "vrm1", "specVersion": "1.0" },
"meta": {
"name": "V1",
"authors": ["D"],
"licenseUrl": "https://vrm.dev/licenses/1.0/",
"avatarPermission": "onlyAuthor",
"commercialUsage": "corporation",
"creditNotation": "required",
"allowRedistribution": false,
"modification": "prohibited"
},
"humanoid": {
"mappedBoneCount": 54,
"bones": [
{ "bone": "hips", "node": 1, "nodeName": "J_Bip_C_Hips" },
{ "bone": "spine", "node": 34, "nodeName": "J_Bip_C_Spine" }
],
"missingRequiredBones": []
},
"expressions": { "presetCount": 14, "presets": ["happy", "angry", "sad", "..."] },
"geometry": {
"meshCount": 3,
"totalVertices": 103489,
"totalTriangles": 33484,
"perMesh": [
{ "name": "Face (merged)", "vertices": 33640, "triangles": 7308 },
{ "name": "Body (merged)", "vertices": 57128, "triangles": 11548 },
{ "name": "Hair001 (merged)", "vertices": 12721, "triangles": 14628 }
]
},
"textures": { "imageCount": 26, "totalImageBytes": 8033934, "maxDimension": 2048 },
"materials": { "materialCount": 17 }
}
(Saída truncada para legibilidade; a ferramenta retorna a lista completa de ossos e imagens.)
vrma_inspect
{
"file": { "path": "...\\motion-walk-forward.vrma", "bytes": 3268, "container": "glb" },
"vrma": { "specVersion": "1.0" },
"humanoid": { "mappedBoneCount": 16, "bones": ["hips", "spine", "chest", "head", "..."] },
"animation": {
"animationCount": 1,
"channelCount": 2,
"channelsByPath": { "translation": 1, "rotation": 1, "scale": 0, "weights": 0 },
"totalKeyframes": 62,
"durationSec": 1.25,
"fpsEstimate": 24,
"frameCountEstimate": 31,
"humanoidBoneTracks": [
{ "bone": "hips", "paths": ["translation"] },
{ "bone": "chest", "paths": ["rotation"] }
]
}
}
vrm_validate
Uma lista de achados com códigos estáveis e severidades:
{
"ok": false,
"errorCount": 1,
"warningCount": 1,
"findings": [
{ "severity": "error", "code": "HUMANOID_REQUIRED_BONE_MISSING",
"message": "required humanoid bone is not mapped: leftHand (vrm1 required set)" },
{ "severity": "warning", "code": "META_LICENSE_OTHER_URL_MISSING",
"message": "licenseName is Other but otherLicenseUrl is empty" }
]
}
vrm_snapshot / vrma_preview
{
"output_path": "...\\v1-three-quarter-snapshot.png",
"format": "png", "bytes": 194005, "width": 768, "height": 1024,
"view": "three_quarter", "pose": "rest", "humanoid_bone_count": 54
}
{
"output_path": "...\\v1-walk-preview.webm",
"format": "webm", "bytes": 313597, "width": 768, "height": 768,
"clip_duration_sec": 1.25, "recorded_duration_sec": 3, "fps": 30
}
Códigos de erro
Toda falha é um erro de ferramenta estruturado com um dos seguintes:
FILE_NOT_FOUND, SIZE_BUDGET_EXCEEDED, NOT_A_GLB, NOT_A_VRM, NOT_A_VRMA,
BROWSER_NOT_FOUND, RENDER_FAILED, OUTPUT_WRITE_FAILED.
O processo do servidor nunca trava com um arquivo de entrada inválido.
Privacidade
Todo o processamento é local. O servidor não abre conexão de rede, não envia telemetria e grava apenas os arquivos de saída que você nomear.
Desenvolvimento
npm test # build + 25 self-verification tests (structural, boundary, headless rendering)
Os testes de renderização são pulados com um aviso quando nenhum Chrome/Edge local é encontrado.