Desktop application for VRChat avatar creation and optimization with MCP tool integration for avatar engineering tasks
VRCForge presents 4 tools with explicit schemas and descriptions. All tools have input schemas visible in the code (VRCForgeToolRegistry.cs shows CreateInputSchema() generating JSON Schema from VRCForgeParameterSchema). Descriptions are present and substantive (100-300+ chars), which is above the baseline average of 194 chars. However, there are significant gaps: (1) Tool names do not follow verb_noun conventions, 'vrc_configure_aao_merge_physbone' and 'vrc_atomic_reference_rename' are verbose and domain-specific rather than action-first; (2) No tool annotations visible (readOnlyHint, destructiveHint, idempotentHint) despite two tools being WRITE operations; (3) Output schemas are not documented, the code registers input schemas but does not show what the tools return; (4) Error handling guidance is absent from tool descriptions; (5) No parameters accept human-friendly identifiers (e.g., avatar names vs. paths); (6) Permission semantics are not declared in tool metadata. The schema structure itself is sound (type, description, enum support, required flags), and parameter descriptions are generally thorough. This positions VRCForge as solidly middle-of-pack, better than average for schema completeness, but missing LLM-critical patterns like annotations and output documentation.
Preview or atomically migrate one fixed-schema avatar object or parameter reference set.
When to use: preview or create one AAO 1.9.x Merge PhysBone component from exact existing VRCPhysBone object paths through AAO's public API. When NOT to use: do not use for automatic avatar optimization, arbitrary AAO components, existing Merge PhysBone edits, or missing/removed PhysBones. Negative example: do not use it to enable Trace and Optimize.
Scan AnimationClip bindings for object toggles, blendshapes, material properties, and unsupported asset-reference writes.
Calculate VRChat SDK avatar performance statistics and ranking for a scene avatar (read-only).
Tool names are verbose and domain-centric rather than action-first verb_noun. 'vrc_configure_aao_merge_physbone' is 32 chars; median production tool is 18 chars. LLMs cannot quickly parse intent from the name alone. Should be 'configure_physbone_merge' or similar.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite two tools being WRITE operations (vrc_configure_aao_merge_physbone, vrc_atomic_reference_rename). LLMs cannot infer safety/idempotency from names alone. Must annotate WRITE tools to guide agent planning.
Output schemas not documented. Tool descriptions state what is returned ('verified non-mutating plan', 'AnimationClip bindings', 'performance statistics') but do not specify field types, structure, or pagination. LLMs cannot plan downstream calls without knowing return schema.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 51 | 2025-06-18+ | v2 |
Error handling guidance absent from descriptions. No guidance on what errors might occur, how to recover, or what the LLM should do next (e.g., 'If scene not found, try list_scenes()' or 'Permission denied, verify user has avatar edit permission'). Descriptions explain success case only.
Parameters require opaque scene/object paths instead of accepting human-friendly identifiers. 'scenePath' and 'gameObjectPath' require exact hierarchy paths; users think in avatar names or component names. No resolution mechanism shown (e.g., list_scenes, search_objects). Forces extra lookup calls.
Massive conditional parameter complexity in vrc_configure_aao_merge_physbone and vrc_atomic_reference_rename: 15+ optional parameters required only for 'apply' mode but not for 'preview'. Descriptions state 'required for apply' but do not explain when/why LLM should set them. Undocumented parameter dependencies invite silent misuse.
vrc_scan_animation_bindings has 13 optional parameters with complex interdependencies (e.g., avatarPath vs controllerPath vs clipPaths, bindingView affecting bindingSelectors/offset/limit). No parameter relationship matrix or flow documentation. LLMs will guess which params to pass, leading to unexpected behavior.
No permission declarations in tool metadata. Tools touch scene files, components, and avatar configs; no scopes declared (e.g., 'avatar:read', 'scene:write'). Prevents least-privilege agent configuration and audit traceability.