Windows-only local-first VRM desktop companion with playback-driven lip sync, animations, and MCP controls.
VoxAvatar demonstrates solid tool design with clear verb-noun naming (play_animation, list_animations, control_window, get_status, show_message, set_character_state). All 6 tools have descriptions (avg ~150 chars, within baseline 34-392 range). Input schemas are present with proper types and enums. However, output schemas are not documented, LLMs cannot predict response structure for chaining. Parameter descriptions are adequate but lack format/constraint details (e.g., show_message.text maxLength is in schema but not emphasized in description). Error handling is minimal; no recovery guidance or actionable error messages visible. Tool composition is clean (single responsibility per tool), but missing pagination/batch variants and output schema documentation limits agent planning.
Show, hide, or toggle the local VoxAvatar window. Hiding the window does not quit VoxAvatar.
Read VoxAvatar's window visibility, voice state, listener status, and whether agent messages are enabled or currently visible. Never returns message text or history.
Read the current playable VoxAvatar action names, descriptions, and trigger scenarios. The result reflects Settings changes immediately.
Play one randomly selected clip from an installed character action. This shows VoxAvatar and temporarily takes priority over voice-driven body motion. Playable actions: (dynamically generated from animation catalog)
Set a presentation state for the desktop character (idle, listening, speaking, working, reviewing, success, failed). Does not invent chat content. Optional ttl_ms bounds how long the state stays active; session disconnect clears it.
Display a short caption, emoji, or kaomoji beside the avatar. Only use when the user asked for a brief status note. Do not send long text, secrets, Markdown, links, images, or token streams. Requires Settings opt-in.
Output schemas not documented. LLMs cannot predict response structure (fields, types, nested objects) for list_animations, get_status, or other tools. This breaks tool chaining and forces agents to guess what data is available.
No error handling guidance. Tools lack recovery hints (e.g., 'animation not found, call list_animations() to see available options'). Agents cannot self-correct on failures.
show_message description warns against 'long text, secrets, Markdown, links, images, token streams' but does not explain WHY or what happens if violated. Constraint rationale missing.
play_animation description includes dynamically-generated animation list ('dynamically generated from animation catalog') but does not explain how LLM discovers valid values. Should reference list_animations() as discovery tool.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | <=2025-11-25 | v2 |
set_character_state ttl_ms parameter description uses technical jargon ('session disconnect clears it') without explaining user-facing impact. Clarity for LLM reasoning is low.