VRM Toolkit

Inspecciona, valida y previsualiza archivos de avatares y animaciones VRM / VRMA localmente. 5 herramientas, stdio, sin acceso a red en tiempo de ejecución.

Documentación

vrm-toolkit-mcp

v0.1.1 — npm / GitHub

Un servidor MCP (Model Context Protocol) que permite a un agente de IA inspeccionar, validar y previsualizar archivos VRM / VRMA en tu máquina. Cinco herramientas, transporte stdio, sin acceso a red en tiempo de ejecución.

Un servidor MCP que permite usar desde un agente de IA la inspección, extracción de información y previsualización de archivos VRM / VRMA. Cinco herramientas, transporte stdio, sin acceso a red en tiempo de ejecución.

Herramientas

HerramientaQué haceDescripción
vrm_inspectJSON estructurado: metadatos (nombre/autor/licencia y campos de permisos), mapa de huesos humanoides, expresiones, estadísticas de polígonos/texturasSalida estructurada de metadatos (nombre/autor/licencia), huesos, expresiones, escala de polígonos/texturas
vrm_validateLista de hallazgos: huesos humanoides requeridos faltantes, referencias de nodos rotas, campos de metadatos/licencia faltantes, extensiones requeridas desconocidas, presupuestos configurables de tamaño/triángulos/texturasLista de inspección: mapeo humanoid faltante, referencias rotas, metadatos/licencia faltantes, extensiones requeridas desconocidas, exceso de tamaño, etc.
vrma_inspectPistas, huesos humanoides objetivo, pistas de expresión, duración, velocidad de fotogramas estimadaPistas, huesos objetivo, pistas de expresión, duración, estimación de velocidad de fotogramas
vrma_previewAplica un VRMA a un VRM y renderiza una imagen PNG o un clip WebM corto (máx. 10 s) mediante Chrome/Edge sin interfaz localAplica VRMA a VRM y exporta una imagen PNG o un video WebM corto con Chrome/Edge sin interfaz local
vrm_snapshotRenderiza un PNG en pose de reposo con pesos de expresión opcionales y vistas preestablecidas (frente / tres cuartos / lateral / primer plano de rostro)Captura de pantalla estática con pesos de expresión y vistas preestablecidas (frente / tres cuartos / lateral / primer plano de rostro)

Las herramientas estructurales (vrm_inspect, vrm_validate, vrma_inspect) analizan el contenedor GLB/glTF directamente en Node y no necesitan navegador. Las herramientas de renderizado (vrma_preview, vrm_snapshot) usan un navegador basado en Chromium ya instalado mediante puppeteer-core; no se descarga nada.

Las 3 herramientas estructurales analizan GLB/glTF directamente con Node, sin navegador. Las 2 herramientas de renderizado usan un navegador Chromium ya instalado mediante puppeteer-core (sin descargas adicionales).

Entradas admitidas: VRM 0.x (extensions.VRM), VRM 1.0 (extensions.VRMC_vrm), VRMA (extensions.VRMC_vrm_animation), contenedor GLB o glTF JSON simple.

Requisitos

  • Node.js 20+
  • Para vrma_preview / vrm_snapshot: un Chrome o Edge local (detección automática; se puede anular con la variable de entorno VRM_TOOLKIT_CHROME)
  • Presupuesto de tamaño de entrada: 512 MiB por defecto (VRM_TOOLKIT_MAX_BYTES para anular)

Configuración

Registro con Claude Code:

claude mcp add vrm-toolkit -- npx -y vrm-toolkit-mcp

Otros hosts MCP: comando npx, argumentos ["-y", "vrm-toolkit-mcp"] (stdio).

Desde el código fuente:

npm install
npm run build
claude mcp add vrm-toolkit -- node /absolute/path/to/vrm-toolkit/dist/main.js

Ejemplos de ejecución

Salidas reales de la ejecución de prueba local (2026-08-05, rutas de archivo abreviadas).

vrm_inspect

Entrada: un avatar VRM 1.0 exportado desde 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 }
}

(Salida truncada para legibilidad; la herramienta devuelve las listas completas de huesos e imágenes).

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

Una lista de hallazgos con códigos estables y 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 error

Cada fallo es un error de herramienta estructurado con uno de: FILE_NOT_FOUND, SIZE_BUDGET_EXCEEDED, NOT_A_GLB, NOT_A_VRM, NOT_A_VRMA, BROWSER_NOT_FOUND, RENDER_FAILED, OUTPUT_WRITE_FAILED. El proceso del servidor nunca se bloquea con un archivo de entrada incorrecto.

Privacidad

Todo el procesamiento es local. El servidor no abre conexiones de red, no envía telemetría y solo escribe los archivos de salida que usted nombre.

Desarrollo

npm test   # build + 25 self-verification tests (structural, boundary, headless rendering)

Las pruebas de renderizado se omiten con un aviso cuando no se encuentra Chrome/Edge local.

Licencia

MIT (ver LICENSE). / Licencia MIT (ver LICENSE).