MCP server for Yorishiro — a terminal desktop app pairing Claude Code with a 3D VRM character. Provides tools for pack management, UI state control, animations, effects, history, and workspace introspection.
Yorishiro MCP server demonstrates solid tool quality with 35 well-named, action-verb tools serving a complex 3D desktop application. Naming is consistently strong (verb_noun pattern: list_packs, disable_pack, set_ui_state, play animations, etc.). Descriptions are present for all tools and parameters, averaging 120-180 chars per tool description and 50-90 chars per parameter, within the productive 50-200 char LLM-optimization range. Input schemas are explicitly defined using schemars JsonSchema derivations; types are declared for all parameters. However, OUTPUT schemas are not documented in the tool definitions, forcing LLMs to infer response structure. Error handling guidance is minimal, tools describe what they do but not what failures look like or how to recover. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) are present, though risk levels are known (READ_ONLY, WRITE, REVERSIBLE). Overall tool composition is sound: each tool is single-purpose, naming is unambiguous, and parameter descriptions are clear. Main gaps: missing output schema documentation, lack of error recovery guidance, and absence of tool risk annotations.
Disable an ambient-ui pack by id.
Enable an ambient-ui pack by id.
Call a tool exposed by an amenity package.
Disable an amenity pack by id.
Enable an amenity pack by id.
List tools exposed by amenity packages (active or specified by id).
Capture a screenshot of the Yorishiro application window.
Play a body animation with optional fade, weight, loop, speed, foot contact, body mask, and root motion settings.
Output schemas are not documented for any tool. LLMs cannot infer what fields will be returned, preventing proper downstream tool selection and forcing speculation about response structure.
Tool risk annotations are missing. While internal code labels risks (READ_ONLY, WRITE, REVERSIBLE), these are not surfaced as tool annotations (readOnlyHint, destructiveHint, idempotentHint), leaving LLMs unable to distinguish safe read-only tools from destructive writes without semantic reasoning.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 69 | 2026-07-28+ | v2 |
Set a VRM expression preset (happy, angry, sad, relaxed, surprised, neutral, etc.) with optional intensity and duration.
Cancel the currently playing body motion/animation.
Read current F2 controls panel values. Scope can be 'scene' (default) or 'common'. Returns all visible controls if path is omitted.
Set a single F2 controls panel value by path.
Set multiple F2 controls panel values at once by scope and path-value map.
Smoothly transition controls over durationMs. Numeric and hex color values are interpolated; others apply immediately.
Disable a pack by id. Persists to config.
Enable a disabled pack by id. Persists to config.
Read UI state from the active scene pack. Returns full snapshot if key is omitted, or specific key value.
List all available history snapshots with their seq, timestamp, label, and approximate size.
Restore to a previous history snapshot by seq number.
Create a new history snapshot with optional human/AI label.
List all load errors from the last startup report, including phase (import/validate) and error details.
List all packs (scene, ui, persona, ambient-ui, amenity) with their status (loaded, disabled, failed), origin (bundled, user), and active state.
Diagnose a pack by id, optionally filtered by kind (e.g. 'scene' or 'effect'). Returns diagnosis status, manifest, load errors, and recommendations.
Set the primary persona pack by id.
Start a Pomodoro timer with optional work, short break, long break durations (ms) and round count.
Get the current Pomodoro timer status.
Stop the currently running Pomodoro timer.
Activate a scene pack by id. Pass null to clear current project override and fall back to global activeScene or bundled default.
Remove the current shared-display reference mark without stopping sharing.
Write a value to the active scene pack's UI state by key.
Play a space effect by kind (e.g. 'fireworks', 'letter', 'shake') with optional payload.
Read the current workspace state (active packs, presence, motion, etc.).
Read terminal context (cwd, history, recent commands, shell state).
Get recent terminal command runs up to the specified limit (clamped by TS runtime).
Activate a UI pack by id.
No error recovery guidance in tool descriptions. Tools describe what they do but not what failures look like, what error codes might be returned, or how to recover. E.g. 'Disable a pack by id' does not mention what happens if the pack is already disabled, or if the pack_id does not exist.
amenity_call tool is under-specified. Parameters include 'params' as type 'object' with description 'Tool parameters as JSON object' but no schema for what those parameters should be. LLMs must guess the structure and valid keys.
Optional parameters lack guidance on defaults. 'label' in history_snapshot is optional but the description does not state what happens if omitted. 'kind' in pack_diagnose is optional but unclear if omitting it returns all kinds or uses a default.
Three tools describe their input as 'empty object' (list_packs, list_load_errors via the visible request structs) but the JSON schema inference from empty struct derivations may not be explicit. Verify schemars generates proper empty object schemas.