Drive VRoid Studio from any MCP client - Wayland GUI automation with OCR and a virtual pointer
mcp-vroid demonstrates solid naming conventions (verb_noun pattern: vroid_launch, vroid_screenshot, vroid_click) and comprehensive parameter schemas with types and descriptions. However, descriptions vary significantly in quality, some are excellent (vroid_launch: 280 chars with prerequisites and idempotency notes), while others are minimal (vroid_scroll: 47 chars). Output schemas are not formally documented in the visible code; responses appear to be ad-hoc dictionaries. Error handling is present but lacks recovery guidance. The server follows good composition patterns (single responsibility per tool, proper chaining via coordinates), but lacks structured output documentation and some parameter constraints are informal.
Click at a coordinate in the VRoid window.
Close the hair editor and optionally save changes.
Drag from one coordinate to another in the VRoid window.
Drag a slider handle to a fraction (0..1) of its track.
Walk the whole Export-as-VRM flow and return the written file.
Locate a primary (accent-coloured) button in the VRoid window.
Locate text in the VRoid window using OCR.
Output schemas not formally documented. Tools return ad-hoc dictionaries (e.g., _match_dict, _win_dict) without explicit schema declarations in tool registration. LLMs cannot reliably predict response structure for downstream chaining.
Minimal descriptions on low-level tools. vroid_scroll (47 chars), vroid_find_button (60 chars), vroid_open_tab (60 chars) lack context on when to use them vs alternatives. Descriptions should be 50-200 chars with WHEN/WHY guidance.
Parameter constraints are informal. vroid_click 'space' param accepts 'image|window|layout' but no enum constraint visible in schema. vroid_set_color 'hexcode' lacks regex pattern validation. vroid_set_slider 'value' has no min/max bounds.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2025-06-18+ | v2 |
Press a key in the VRoid window.
Start VRoid Studio (Steam appid 1486350, Proton) and take control of it. Idempotent: if the window already exists it is reused, not relaunched. Then the window is parked on Hyprland workspace 9, the workspace the user was on is remembered (vroid_release puts them back), and the window is focused and fullscreened so its geometry - and therefore every coordinate you will read off a screenshot - is stable. Cold start over Proton takes 30-90 s; the call blocks until the window is up. It does NOT wait for the start screen to finish drawing, so take a vroid_screenshot and look before clicking anything.
From the start screen: Create New -> pick a base -> land in the editor.
Open the hair editor from the Hairstyle tab.
Open an editor tab by name (Face, Hairstyle, Body, Outfit, Accessories, Look).
Hand the desktop back: switch to the workspace the user was on before. Leaves VRoid running on workspace 9. Call this when you are done with a session, or before handing control back to the human.
Capture the VRoid window and return a PNG image.
Scroll the mouse wheel in the VRoid window.
Set a color box (Main Color, Highlight Color, etc.) to a hex color.
Set a Parameters slider by typing into its numeric box.
Report whether VRoid Studio is running, focused, and where it sits. Cheap and side-effect free (no OCR, no input) - use it before anything else, and after anything that might have lost focus. `focused` false means every acting tool will refuse until vroid_launch (or any acting tool's own focus step) takes the window back. Also reports whether the external helpers this server needs are present: the vpointer binary (built by native/build.sh), grim, tesseract, hyprctl.
Type text into the focused VRoid window.
Error handling lacks recovery guidance. Code raises RuntimeError('VRoid Studio is not running...') but does not suggest next steps (e.g., 'Call vroid_launch first'). Errors should categorize as retryable/user-fixable/fatal.
No idempotency hints in tool annotations. vroid_launch documents idempotency in description but lacks @idempotent annotation. Destructive tools (vroid_launch with restart=true, vroid_export_vrm) lack @destructive annotation.