mcp-vroid
This server lets an MCP client (e.g. Claude) fully drive the VRoid Studio desktop application on Linux/Wayland by seeing screenshots and sending real mouse/keyboard input.
Lifecycle control: launch VRoid Studio, check its status, release the desktop back to the user.
Visual perception: take screenshots (window or full screen), OCR the UI to find text, and find VRoid's blue/grey action buttons by colour.
Raw input: click, drag, scroll, type text, and send key combinations (e.g. Ctrl+S, Return, Escape) as real input events.
Editor navigation: switch between top tabs (Face, Hairstyle, Body, Outfit, Accessories, Look) and create a new character from a base model.
Parameter editing: set numeric sliders exactly and set colour swatches by hex values.
Export and saving: export the model as a .vrm file (VRM 1.0 or 0.0) with metadata and drive Wine's save dialog, and save .vroid projects.
Screen awareness: identify which screen is currently shown (start, editor, export, hair editor) to prevent and diagnose flow failures.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-vroidLaunch VRoid Studio and export the current character as a .vrm file."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp-vroid
Drive VRoid Studio from any MCP client, on Linux/Wayland. Launch the app,
look at it, find widgets in the picture, click and type, set parameters, and
export a .vrm — all as MCP tools.
Why
VRoid Studio has no scripting API, no CLI, no plugin surface. The only way in
is the one a person uses: look at the window and move the mouse. So that is
what this does — screenshot the window with grim, locate things with OCR and
colour matching, and inject real pointer and keyboard events at the compositor
level. The MCP client's model is the eyes; these tools are the hands.
grim ──► PNG ──► tesseract / cv2 ──► (x, y) ──► virtual pointer / XTEST
▲ │
└──────────────────── screenshot again ◄───────────────┘Related MCP server: Cubism External Edit MCP
Demo
Everything below was done by an MCP client calling these tools — no human at the mouse.
Setting body parameters by typing exact values into the Parameters panel
(vroid_open_tab("Body") → vroid_set_slider("Head Size", -0.15)):

Inside the hair editor, tuning procedural hair guides (vroid_click on the
group, vroid_set_slider on Height / Interval / Twist Intensity):

Filling the VRM Settings modal on the way to an export (vroid_export_vrm
walks the whole flow, including Wine's save dialog):

Requirements
Developed and tested on Arch Linux + Hyprland, with VRoid Studio 2.14.0 (English UI) running under Steam/Proton. What is actually load-bearing:
needed for | how portable | |
Hyprland ≥ 0.55 | window discovery, focus, workspaces, closing the screensaver — via | Hyprland-specific. All of it lives in |
| screenshots | any wlroots compositor ( |
| moving and clicking the real cursor | any wlroots compositor |
Xwayland ( | keyboard and wheel, via X11 XTEST | any Wayland session with Xwayland |
| OCR — the entire locating story | portable |
| building the pointer helper | portable |
VRoid Studio via Steam/Proton (appid | the app being driven | the Steam launch path is assumed; a native/Wine install needs the launch command changed |
Python 3.11+ and | the server itself | portable |
So: wlroots + Xwayland for the input and capture layer, Hyprland only for window management. On Arch:
sudo pacman -S grim tesseract tesseract-data-eng wayland gcc pkgconfQuickstart
git clone https://github.com/nhodges/mcp-vroid
cd mcp-vroid
uv sync # virtualenv + dependencies
bash native/build.sh # builds native/vpointer <-- REQUIRED, not optionalnative/build.sh compiles a ~150-line C client for the Wayland
virtual-pointer protocol (the protocol XML is vendored under
native/protocols/). Without it every pointer tool fails with
native/vpointer missing; vroid_status tells you whether it is there.
Register it with Claude Code:
claude mcp add vroid -- uv run --directory /path/to/mcp-vroid mcp-vroid…or with any client that takes an mcpServers block:
{
"mcpServers": {
"vroid": {
"command": "uv",
"args": ["run", "--directory", "/path/to/mcp-vroid", "mcp-vroid"]
}
}
}Then ask your client to call vroid_status, and if it looks healthy,
vroid_launch().
Clients often start servers with a sanitised environment. This server
recovers XDG_RUNTIME_DIR, WAYLAND_DISPLAY, HYPRLAND_INSTANCE_SIGNATURE
and DISPLAY from the runtime dir at startup
(src/mcp_vroid/session_env.py), so hyprctl / grim / XTEST work anyway.
vroid_status reports what it had to fill in; anything already in the
environment wins.
Optional environment variables:
var | default | meaning |
|
| where screenshots are written |
|
| default dir for exports/saves |
|
| path to the pointer helper |
|
| longest edge of images sent to the client (0 = never downscale) |
Tools
18 tools, in four groups.
Lifecycle
tool | what it does |
| Start VRoid via Steam if needed, park it on Hyprland workspace 9, remember the workspace you were on, focus + fullscreen it. |
| Window present/focused/title/geometry, active workspace, capture dirs, and whether |
| Switch back to the workspace the user was on. VRoid keeps running on ws 9. |
Seeing
tool | what it does |
| Capture the window (or the whole output, for the Wine save dialog), save it, and return it as MCP image content for the client's model to look at. Reports native size and the downscale factor applied for transport. |
| Fresh capture + tesseract; returns matching word boxes and centres in image px. Pass |
| Finds VRoid's solid |
|
|
Acting — raw input
tool | what it does |
| Glides the pointer in a few steps (so hover states fire) and clicks. |
| Press → 24-step glide → release. Right-drag orbits the camera, middle-drag pans. |
| Wheel, as X11 buttons 4/5 (6/7 horizontal). Park the pointer over the panel you mean to scroll. |
| Types into the focused widget over XTEST. |
|
|
Acting — flows
tool | what it does |
| Start screen → Create New → base → editor. |
| Face / Hairstyle / Body / Outfit / Accessories / Look. |
| Scrolls the Parameters panel to the row and types an exact value into its numeric box. |
| Same, for a |
| The whole Export-as-VRM walk, including the VRM Settings metadata modal and Wine's save dialog. |
| Ctrl+Shift+S to an explicit |
Every acting tool focuses VRoid first and refuses to act if the focused window is not VRoid Studio.
How it works
The loop is see → locate → act → see again:
vroid_launch()vroid_screenshot()— the image goes to the client's model, which looks at itvroid_find_text("Export")orvroid_find_button()for coordinatesvroid_click(x, y)— always with coordinates from a fresh capturevroid_screenshot()to confirm what actually happened
Seeing is grim on the Hyprland window geometry, then tesseract for word
boxes and OpenCV for solid-colour buttons (VRoid's primary pills are
#0096FA, and OCR reliably loses white-on-blue labels).
Acting goes down two different paths, for annoying reasons:
Pointer — a small C client (
native/vpointer.c) speakingzwlr_virtual_pointer_unstable_v1. It moves the real compositor cursor, so hover states and drags behave exactly as they do for a human, and it needs no permissions:ydotool's/dev/uinputroute is0600 root:rootand would need sudo or a udev rule.Keyboard and wheel — X11 XTEST through Xwayland, because the virtual-pointer protocol has no keyboard counterpart and VRoid is an Xwayland client anyway.
Coordinate spaces. Three are in play and they are all different:
space | size on the reference machine | who uses it |
Hyprland layout (logical) | 2048 × 1152 |
|
image pixels of a capture | 2560 × 1440 | tesseract, cv2, everything you see |
X11 pixels (Xwayland) | 2560 × 1440 | XTEST |
Tools take and return image px (space="image") by default and convert
internally, so vroid_find_text output can be handed straight to
vroid_click. If MCP_VROID_MAX_IMAGE_PX downscaled the picture you were
shown, multiply coordinates read off it by the inverse of the reported
downscale — or just ask vroid_find_text, which always reports native px.
Rules of thumb, learned the hard way:
Read the whole frame, not a crop. A "Close Hairstyle Editor" confirm modal sat in the middle of the screen through six failed clicks because the check only OCR'd the top 60 px.
Don't judge change by the 3D viewport. VRoid dithers every frame, so a full-window diff reads ~0.98 even when nothing happened. Watch a UI strip.
Prefer numeric boxes to slider drags.
vroid_set_slidertypes an exact value; dragging is for controls that have no box.Primary buttons are found by colour, not text. A grey pill where you expect blue is the app telling you a required field is empty.
A detailed map of VRoid's UI — tab strip, rails, panels, the export flow, the hair editor, with measured coordinates — is in docs/ui-map.md.
Limitations and brittleness
This is GUI automation with no API underneath. Be realistic about it:
OCR is the whole locating story, and it is imperfect. Small, letter-spaced or light-on-dark labels get split or dropped (
Export→E+xport). White-on-blue is lost entirely, which is whyvroid_find_buttonexists. Icons have no text at all — those anchors are hard-coded fractions of the window.Coupled to the UI version. Needles and fractional anchors were calibrated on VRoid Studio 2.14.0, English, at 2560×1440 / scale 1.25. A pixiv UI reflow, another language, or a different monitor can require re-measuring. (Japanese UI → kebab
⋮→ Settings → Language.)Modals appear outside your search region and swallow clicks silently.
Timing is guessed. The 3D viewport takes ~5 s after a base is chosen; export takes 5–30 s, longer for heavy models.
The Wine save dialog is a separate window with its own class and geometry — use
vroid_screenshot(whole_screen=true)there.Single instance, single session. One VRoid window, one desktop, no headless mode, no parallelism. It drives your screen.
The idle screensaver can grab the session mid-run. The guard refuses to type into it and closes that one window (and only that one) before acting.
Attended use is recommended. See below.
Security
This server injects real mouse and keyboard events into your live desktop session and takes screenshots of it. That is the entire point, and it is also the risk:
Screenshots may capture anything on the output —
whole_screen=truecaptures everything, and captures are written to disk unencrypted.Keystrokes go to whatever holds keyboard focus. The driver refuses to act unless VRoid Studio is focused, but a careless or hostile prompt can still click anywhere inside VRoid.
vroid_launch(restart=true)kills VRoid Studio and loses unsaved work.Nothing here is sandboxed and there is no confirmation step.
Run it attended, on a session you are watching. Don't run it on a shared
or multi-user machine, don't leave an agent driving it unsupervised, and treat
the captures directory as sensitive. vroid_release() gives the desktop back
when you're done.
Development
uv run python scripts/smoke_test.py # start the server, list tools, call vroid_status
uv run python scripts/smoke_test.py --screenshot # + one passive capture if VRoid is open
uv run vroid-driver shot # the original driver CLI, still herevroid-driver (mcp_vroid.driver.cli) is a shell interface to the same
engine — launch, shot, find, click, tab, slider, export, cam,
apply-params, … — handy for debugging without an MCP client in the loop.
Layout:
src/mcp_vroid/server.py MCP tool definitions (stdio)
src/mcp_vroid/session_env.py recovers the Wayland/X session env
src/mcp_vroid/driver/ the engine
window.py hyprctl: find / launch / focus / workspaces <- Hyprland-specific
capture.py grim + coordinate spaces
locate.py tesseract OCR + colour button matching
input.py vpointer (Wayland) + XTEST (X11)
actions.py the VRoid-specific flows
native/vpointer.c zwlr_virtual_pointer clientContributing
Issues and PRs welcome. Useful things to bring:
A port to another wlroots compositor. Only
driver/window.pyis Hyprland-specific; the rest already works anywheregrimandzwlr_virtual_pointerdo.Anchors for other resolutions or DPI scales, or for the Japanese UI.
Bug reports — include your compositor, VRoid Studio version, monitor resolution and scale, and the output of
vroid_status. A capture from the failing step helps enormously.
Nothing here is auto-formatted or linted by CI; match the surrounding style.
Licence
MIT — see LICENSE. VRoid Studio is a product of pixiv Inc.; this project is unaffiliated with pixiv and simply drives the app's UI.
Available Tools
18 toolsvroid_clickA
Click a point in the VRoid window with the real compositor cursor.
Refuses unless VRoid Studio is the focused window; it focuses the window itself first (workspace 9, fullscreen) and raises rather than clicking into somebody else's app.
The pointer glides to the target in a few steps so hover states fire, then clicks and settles ~0.35 s. Coordinates must come from a CURRENT capture - take a fresh vroid_screenshot or vroid_find_text right before clicking, because panels reflow and modals move.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | X coordinate in `space`. | |
| y | Yes | Y coordinate in `space`. | |
| space | No | 'image' = pixels of a window capture (what vroid_screenshot / vroid_find_* report - the default, and almost always what you want); 'window' = Hyprland layout units relative to the window's top-left; 'layout' = absolute Hyprland layout units of the whole output. | image |
| button | No | Mouse button. right/middle also orbit/pan the 3D viewport when dragged. | left |
| double | No | Send two clicks (selects a word in a text box). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without any annotations, the description carries the full burden and does so richly: it discloses the focus/raise behavior, refusal condition, pointer glide timing (~0.35 s), and the requirement for fresh captures. This goes well beyond what the schema conveys and gives the agent a clear model of side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three paragraphs, with the core action stated first, followed by essential behavioral caveats. It is reasonably tight—each sentence contributes (focus behavior, pointer glide, coordinate freshness). No redundant fluff, though it could be compressed slightly. The structure is logical and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and parameter schema covers everything, the description supplies needed behavioral context: when it refuses, how it moves the cursor, and the freshness requirement. It does not mention return values, but the output schema handles that. It is complete enough for an agent to invoke correctly, leaving no major gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes all 5 parameters with 100% coverage. The description adds only context about coordinate freshness (stale coordinates cause misses), but does not elaborate on 'space', 'button', or 'double'. Since the schema is exhaustive, the description adds little extra but is not deficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States precisely that it clicks a point in the VRoid window using the real compositor cursor, distinguishing it from drag, scroll, and other sibling actions. The verb, resource, and mechanism are explicit, so an agent can clearly understand the tool's role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance that coordinates must come from a current capture, and that it will focus/raise the VRoid window itself, refusing to click into other apps. This conveys when to use it (for interacting with VRoid) and warns against stale coordinates. However, it does not explicitly contrast with sibling click-like tools (though drag/scroll are self-evident).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vroid_current_screenA
Identify which VRoid screen is on top: start, editor, export_vrm, hair_editor, or unknown.
Cheap-ish (OCRs only the top strip, ~2 s) and worth calling whenever a flow tool fails - most failures are "you are not on the screen this tool expects". 'unknown' usually means a modal is up; screenshot the whole window and look.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that the tool is 'cheap-ish' (only OCRs the top strip, ~2 s) and that 'unknown' indicates a modal, which are useful behavioral traits. However, it does not explicitly state that the tool is read-only or has no side effects. For a diagnostic tool, this is a minor omission, so a 4 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: the first sentence states the primary purpose, and the second provides usage guidance and troubleshooting. Every sentence contributes meaningful information without redundancy. The 'unknown' tip is an efficient way to add depth.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter diagnostic tool, the description is complete. It covers purpose, possible outputs, cost, common failure interpretation, and a recommended next step. The output schema likely provides the exact return type, but the description already gives enough to the agent. No significant gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. The description adds value by enumerating the possible output values (the five screen states), which helps the agent interpret the result. No parameter details are needed, so this dimension is well-served.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: to identify which VRoid screen is on top, listing the possible outputs (start, editor, export_vrm, hair_editor, unknown). The verb 'identify' and the resource 'screen state' are specific, and the explicit list of possible values distinguishes it from sibling tools that perform actions rather than diagnostics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use it: 'worth calling whenever a flow tool fails' and explains the common failure mode. It also provides guidance on interpreting the 'unknown' result (modal is up) and suggests a follow-up action (take a full-window screenshot). This gives clear decision-making context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vroid_dragA
Press, glide and release - slider handles, the 3D camera, hair guides.
For Parameters sliders prefer vroid_set_slider, which types an exact value into the row's numeric box; dragging is only for controls that have no numeric box. The glide is 24 interpolated steps, which is what the app needs to register a drag rather than a click.
| Name | Required | Description | Default |
|---|---|---|---|
| x1 | Yes | Press point X in `space`. | |
| x2 | Yes | Release point X in `space`. | |
| y1 | Yes | Press point Y in `space`. | |
| y2 | Yes | Release point Y in `space`. | |
| space | No | 'image' = pixels of a window capture (what vroid_screenshot / vroid_find_* report - the default, and almost always what you want); 'window' = Hyprland layout units relative to the window's top-left; 'layout' = absolute Hyprland layout units of the whole output. | image |
| button | No | left = slider handles and drawing; right = orbit the camera (~400 image px is 90 deg of yaw); middle = pan the model. | left |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It adds key details: the glide is 24 interpolated steps to register a drag rather than a click, and the kinds of operations it performs (slider, camera orbit, pan). While it doesn't discuss failure modes or side effects, it covers the essential behavioral traits an agent would need to know before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short paragraphs: the first delivers the primary purpose in a compact phrase, and the second adds usage guidance and a behavioral detail. Every sentence earns its place, and the key scoping information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description gives enough context for correct invocation: it names target resources, the condition for using it, and the interpolation detail. An output schema exists, so return values are covered. It stops short of describing error handling or coordinate system conversion, but for a drag tool that's acceptable given the schema richness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% coverage with detailed descriptions for x1, y1, x2, y2, space, and button, including enums and defaults. The description does not add parameter-specific explanation beyond what the schema offers, so a baseline of 3 is appropriate because the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (press, glide, release) and the specific resources it acts on (slider handles, 3D camera, hair guides), and it distinguishes itself from sibling vroid_set_slider by noting dragging is only for controls without a numeric box. This leaves no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool versus vroid_set_slider, with a concrete rule: 'prefer vroid_set_slider for parameters sliders' and 'dragging is only for controls that have no numeric box.' It also mentions camera and hair guides, giving clear contexts for alternative use. No inference is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vroid_export_vrmA
Walk the entire Export-as-VRM flow and write a .vrm file.
Editor toolbar share icon -> 'Export as VRM' -> the blue Export pill -> the VRM Settings modal (fills Avatar Name and Creators, picks the export format, scrolls to the bottom and clicks Export) -> Wine's save dialog (types a Z:\ path and presses Return) -> waits for the file size to stop growing.
Must be started from the EDITOR screen with a model loaded. Takes 30 s to a few minutes depending on the model. Returns the written path and its size; raises with the path of a diagnostic screenshot if any step fails - read that screenshot before retrying, since a half-finished flow usually leaves a modal open that the next attempt will trip over.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Where to write the .vrm, as a normal Linux path. Translated to the Proton prefix's Z:\ mapping for the Wine save dialog. | |
| creator | Yes | VRM metadata 'Creators' - also REQUIRED. | |
| timeout | No | Seconds to wait for the file to finish being written. | |
| version | No | VRM spec version to export: '1.0' (VRoid's default) or '0.0' for the legacy VRM0.0 format. | 1.0 |
| avatar_name | Yes | VRM metadata 'Avatar Name' - REQUIRED by VRoid; the Export button stays grey until it is filled. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden, and it excels. It discloses the side effects (opens modals, uses Wine save dialog), the time cost (30s to minutes), the failure behavior (raises with a diagnostic screenshot path), and the recommended retry strategy (read the screenshot, beware of leftover modals). This is unusually rich and actionable, covering the obvious 'what happens to the system' and 'what to expect' questions an agent would have.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average, but it front-loads the core action ('Walk the entire Export-as-VRM flow and write a .vrm file') and structures the rest as a concise step chain, a prerequisite, a timing note, and a failure/retry note. Each sentence earns its place; there is no filler. It could arguably be trimmed slightly (e.g., the detailed UI path), but the richness contributes to transparency, so a 4 is fair.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema, the description explicitly states what it returns (the written path and its size) and how it signals failure (a diagnostic screenshot path), which complements the schema. It also covers prerequisites, duration, and the retry hazard. For a complex multi-step GUI automation tool, this is fully complete; an agent has everything needed to invoke it correctly and handle outcomes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%, so all five parameters already have explanations (e.g., path is a Linux path translated to Z:\, avatar_name is required for the Export button to activate). The tool description does not add any parameter-specific semantics beyond what the schema provides. Per the rubric, with full schema coverage, the baseline is 3, and the description adds no extra value here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool walks the entire 'Export as VRM' flow and writes a .vrm file, with a verb (walk/export), a specific resource (VRM file), and an explicit step sequence. It distinguishes itself from low-level siblings like vroid_click or vroid_type by being a composite workflow, and from vroid_save_project (which saves a project, not exports a VRM). The first sentence alone conveys the exact purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear prerequisite: 'Must be started from the EDITOR screen with a model loaded.' It also implies when to use it (when you need a .vrm export) and orients the user by narrating the UI steps. It does not explicitly name an alternative tool or describe when NOT to use it, but given the sibling set (most are atomic actions), the usage context is sufficient. A minor gap is the lack of explicit 'use this instead of manual steps' guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vroid_find_buttonA
Find VRoid's primary action buttons by their colour, not their text.
VRoid's confirm buttons ('Export', 'OK', 'Create') are solid #0096FA pills whose white labels tesseract regularly loses, so this matches the button chrome. Blobs come back biggest-first, in image px, ready for vroid_click.
A grey pill (color='disabled') where you expected a blue one means the
action is disabled - on the VRM Settings modal that means Avatar Name or
Creators is still empty.
| Name | Required | Description | Default |
|---|---|---|---|
| color | No | 'primary' finds the enabled blue #0096FA pill; 'disabled' finds the grey pill, which is the app telling you a required field is still empty. | primary |
| label | No | Optional label to disambiguate when several pills are visible; the button interior is OCR'd at high upscale to check it. | |
| limit | No | Max blobs to return. | |
| region | No | Restrict the search to this rectangle (image px). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries the burden of behavioral disclosure. It reveals the matching mechanism (button chrome), the output ordering (biggest-first, image px), and the semantic meaning of a disabled grey pill, including the specific validation context on the VRM Settings modal. This goes well beyond the schema and gives agents critical operational knowledge.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a compact three sentences, each earning its place: purpose and differentiation (sentence 1), technical rationale and output format (sentence 2), and practical interpretation of a key signal (sentence 3). It is front-loaded with the core purpose and contains no filler, making it highly efficient for agent parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is moderately complex with 4 parameters and an output schema, but the description covers the essential context: why this tool exists (OCR failure), how results are returned (blobs, ordered), and what a specific result indicates (disabled state). Combined with the exhaustive schema descriptions, nothing critical for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds little beyond what the schema already explains (e.g., the color enum semantics are already in the schema). It does reinforce the color meanings but does not add new parameter-level detail for label, limit, or region. The description therefore does not elevate above the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: finding VRoid buttons by color rather than text. It specifies the resource (primary action buttons), the method (color matching), and explicitly differentiates from text-based approaches. The mention of 'ready for vroid_click' also clarifies the intended downstream use, making the tool's role unambiguous relative to siblings like vroid_find_text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides strong usage context by explaining why color-based matching is necessary (tesseract loses white labels), implicitly steering agents away from text-based tools. It also gives guidance on interpreting results (grey pill means disabled) and notes the typical next step (click). However, it does not explicitly name alternative tools or enumerate when NOT to use this tool, which keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vroid_find_textA
OCR the current VRoid window and return where query appears.
Takes its own fresh screenshot, so coordinates are current. Results are image px, ordered by OCR confidence, ready to pass straight to vroid_click (which defaults to space='image').
Known OCR weaknesses in this UI: small, letter-spaced or light-on-dark labels get split or dropped ('Export' -> 'E' + 'xport'), and white text on VRoid's blue primary buttons often disappears entirely - use vroid_find_button for those. Icons (toolbar, left rail) have no text at all; the README's UI map has their fractional positions.
If nothing is found, that is information: the screen may not be the one you think it is, or a modal is covering it. Take a screenshot and look.
| Name | Required | Description | Default |
|---|---|---|---|
| exact | No | Require the whole word to match, not a substring. Use for captions that share a prefix with a heading (e.g. 'Name' vs 'Avatar Name'). | |
| limit | No | Max matches to return. | |
| query | Yes | Label to look for, e.g. 'Export', 'Hairstyle', 'Avatar Name'. Matching is case- and punctuation-insensitive substring by default. | |
| region | No | Restrict OCR to this rectangle (image px). Strongly recommended: OCR of a full 2560x1440 frame takes ~10 s, a panel-sized region under 2 s. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses behavior: it takes a fresh screenshot, returns coordinates in image pixels ordered by OCR confidence, and is designed for direct use with vroid_click. It candidly lists known OCR weaknesses ('Export' splits to 'E'+'xport', white text on blue buttons disappears) and performance implications (~10s full frame vs ~2s region). This is exceptionally transparent for a tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose in the first sentence, then flows logically through currentness, output format, limitations, alternatives, and failure handling. Every sentence carries substantive information—no filler. It is long but appropriately dense for a tool with this many behavioral caveats and integration points.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers everything an agent needs to invoke this tool correctly: what it does, output format and ordering, how to feed results into vroid_click, known failure modes (OCR splitting, missing white-on-blue text), performance guidance via region, alternative tool for buttons, and what a null result implies. Since an output schema exists, return details are not required in the description. For a computer-vision OCR tool with multiple integration touchpoints, this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter (query, exact, limit, region) already has detailed descriptions including defaults and examples. The tool description adds little beyond schema—it only mentions that results are ready for vroid_click, which is about output usage rather than parameter meaning. Baseline 3 is appropriate because the schema fully documents parameters and the description does not enhance it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise action and resource: 'OCR the current VRoid window and return where `query` appears.' It immediately distinguishes itself from the sibling vroid_find_button by noting it handles text labels, and even mentions specific limitations for button text. This makes the tool's purpose unmistakable relative to its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool versus alternatives: use vroid_find_button for blue primary buttons, and it notes that icons have no text so users should consult the UI map. It also advises when no result is found (screen may be wrong or modal covering) and recommends taking a screenshot. This is clear conditional guidance with exclusions and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vroid_keyA
Press a key combination in the focused VRoid widget.
Useful ones: Return confirms a value box or a Wine dialog's default button; ctrl+s saves the project; ctrl+shift+s is Save As; ctrl+z/ctrl+y undo/redo in the editor.
Note Escape does NOT close VRoid's hamburger menu - click elsewhere to dismiss it.
| Name | Required | Description | Default |
|---|---|---|---|
| combo | Yes | A key, optionally with modifiers, e.g. 'Return', 'Escape', 'Tab', 'BackSpace', 'ctrl+s', 'ctrl+shift+s', 'ctrl+z'. Names follow X keysyms; 'enter', 'esc', 'space', arrows are aliased. | |
| times | No | Repeat count. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses a notable behavioral nuance: Escape does not close the hamburger menu, and that key presses go to the focused widget. This is sufficient for a key-press tool, though it doesn't describe potential side effects or focus requirements beyond what's implied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: the primary objective is stated first, followed by a list of useful combos and a caveat. Every sentence contributes value, and there is no fluff. The layout is easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple key-press tool, the description covers what keys to press, gives practical examples, and highlights a relevant gotcha. It doesn't mention return values, but the output schema likely indicates success/failure, and for this tool it's not critical. It is sufficiently complete for an agent to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes both parameters (combo and times) with examples and aliases, so the baseline is 3. The description adds value by providing concrete, useful key combinations (e.g., 'Return confirms a value box', 'ctrl+s saves'), which goes beyond the schema's generic format explanation and clarifies likely inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Press a key combination in the focused VRoid widget.' It uses a specific verb and resource, and distinguishes itself from siblings like vroid_click and vroid_type by focusing on key combinations. The context of 'focused widget' adds clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides practical guidance by listing useful key combinations (Return, ctrl+s, ctrl+z, etc.) and their effects, which helps an agent decide when to use this tool. It also gives a specific caution about Escape not closing the hamburger menu. However, it does not explicitly mention alternatives or when not to use it, though the examples imply its use for shortcuts and confirmations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vroid_launchA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| restart | No | Kill a running VRoid Studio first (UNSAVED WORK IS LOST) and start a clean instance. | |
| timeout | No | Seconds to wait for the window to appear. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries behavioral disclosure. It details idempotency, window parking on workspace 9, focusing and fullscreening, blocking behavior, cold start timing, and the caveat that the start screen may not be ready. This is comprehensive for a launch tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and logically sequenced: purpose first, then idempotency, workspace details, and timing caveat. Each sentence adds necessary information without fluff. Slightly longer than minimal but justified by the behavioral details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and an output schema present, the description covers essential launch behavior, blocking, and post-launch guidance. It does not explicitly state return values, but the output schema likely handles that. It also does not mention error handling, but that is not critical for a launcher.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters have descriptive schema entries (restart warns about unsaved work, timeout defines wait). The description adds context around restart via idempotency but does not materially extend parameter meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Start VRoid Studio (Steam appid 1486350, Proton) and take control of it.' It distinguishes itself from siblings by describing idempotent behavior and workspace parking, making it clear this is the launcher, not any other action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit context: it can be reused if window exists, blocks for 30-90s on cold start, and instructs to take a screenshot before clicking. It names vroid_release as complementary, implying when not to use (though it does not explicitly exclude other tools). The guidance is clear and actionable, though slightly implicit about alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vroid_new_characterA
From the start screen: Create New -> pick a base -> land in the editor.
Locates the 'Create New' tile by text (so it survives the Recently Edited grid growing), clicks the card above its caption, picks the base thumbnail, then waits up to a minute for the editor - the 3D viewport takes several seconds to appear after a base is chosen.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Which base model the 'Select a base to start with' modal offers. | Fem |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It discloses that it locates the 'Create New' tile by text (robust to the Recently Edited grid growing), clicks the card, picks the base thumbnail, and waits up to a minute for the editor to appear, acknowledging the 3D viewport delays. This goes beyond the short intent, but it does not mention potential failure modes or side effects (e.g., what happens if the editor doesn't load). Still, it is substantially transparent for a creation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a compact block of text that clearly front-loads the purpose and then details the steps. Each sentence earns its place: the text-locating technique, the click sequence, and the wait time are all useful for execution. It could be slightly shorter, but it avoids redundancy and remains focused on actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (multi-step navigation with timing considerations) and the presence of an output schema (so return values need not be described), the description covers the essential context: the start screen prerequisite, the steps, and the wait behavior. It does not specify what happens if the start screen is not present or if the base selection fails, but these are edge cases that are not typically required for standard usage. Overall, it is complete for an agent to call the tool correctly under normal conditions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The parameter 'base' is fully described in the schema with an enum and a clear description ('Which base model the 'Select a base to start with' modal offers'). The tool description does not add any additional meaning beyond the schema, which is already explicit. Since schema coverage is 100%, a baseline score of 3 is appropriate; the description does not compensate with extra semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: navigating from the start screen to create a new character by clicking 'Create New', selecting a base, and landing in the editor. It specifies the exact workflow and distinguishes itself from sibling tools like vroid_launch (which likely starts the app) or vroid_open_tab (which opens tabs). The verb-resource pair is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description sets clear context by starting with 'From the start screen', implying the app must already be launched and on that screen. It does not explicitly mention alternatives or when not to use, but the procedural nature and the prerequisite are evident. It lacks explicit exclusions, but the context is clear enough for an agent to infer appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vroid_open_tabA
Switch the editor to a top-level tab, located by OCR of the tab strip.
Only works on the editor screen (not the start screen, the export screen or the hair editor). Waits ~2 s for the panels to redraw and returns the path of a verification screenshot - take a vroid_screenshot if you want to see the result.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | One of Face, Hairstyle, Body, Outfit, Accessories, Look (the editor's top tab strip). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the ~2 second wait for redraw, the return of a verification screenshot path, and the suggestion to take a screenshot to view results. It does not specify failure modes (e.g., what happens if OCR cannot find the tab), but the disclosed timing and return behavior are useful. No contradictions with annotations (since none exist).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise, with the core purpose in the first sentence and supporting details in a short second paragraph. It front-loads the function and then adds necessary constraints and behavior without any redundant or irrelevant content. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the availability of an output schema (though not shown) and high parameter schema coverage, the description provides sufficient context for an agent to call the tool correctly. It covers the environment limitation, the wait time, and the return value. Missing details include error handling when OCR fails, but for a tool that is part of a larger suite with similar patterns, this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description covers 100% of the single parameter 'name' with clear allowed values (Face, Hairstyle, Body, Outfit, Accessories, Look). The description does not add additional meaning about the parameter beyond what the schema already provides, which is acceptable given the high schema coverage. The baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Switch'), a clear resource ('top-level tab'), and the method ('located by OCR of the tab strip'). It clearly distinguishes this from sibling tools like vroid_click (which clicks generic elements) or vroid_find_text (which locates text), since it is specialized for tab switching. The screen restriction further refines its purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states the tool only works on the editor screen, excluding start, export, and hair editor screens, which tells the agent when not to use it. However, it does not directly mention alternatives or contrast with sibling tools like vroid_click when a tab is already visible. The guidance is clear on the environment constraint but lacks explicit 'use this instead of X' phrasing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vroid_releaseA
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses the workspace switch and that VRoid remains running, which is the primary behavior. It does not mention potential side effects like saving state or closing dialogs, but these are likely irrelevant for a simple release action. Slightly more detail would earn a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and usage context. Every word earns its place, with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with an output schema present, the description covers the purpose, the behavioral outcome, and the appropriate invocation time. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. No parameter descriptions are needed, and the description adds sufficient context for how the tool behaves regardless of inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise action: 'switch to the workspace the user was on before' and clarifies that VRoid remains running on workspace 9. This clearly distinguishes it from siblings like vroid_launch or vroid_open_tab, and leaves no ambiguity about the tool's core function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to call: 'Call this when you are done with a session, or before handing control back to the human.' This gives clear situational context and implies it should not be used mid-task, providing strong usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vroid_save_projectA
Save the .vroid project - plain Save, or Save As to an explicit path.
With name: presses Ctrl+Shift+S and drives Wine's save dialog the same
way the VRM export does, then waits for the file. Without name: opens
the hamburger menu and clicks Save, which overwrites the project's
existing file and opens the Wine dialog only if the project has never
been saved (in that case call this again WITH a name).
Worth doing before any risky experiment: nothing else in this server persists your work, and vroid_launch(restart=true) discards it.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Save As target: a bare name (written into the server's out dir as <name>.vroid) or an absolute Linux path. Omit to do a plain Save, which silently overwrites the project's existing file. | |
| timeout | No | Seconds to wait for the file to be written. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full responsibility. It discloses that plain Save silently overwrites the existing file, that Save As opens Wine's save dialog, and that without a name the dialog only appears if never saved. It also mentions it waits for the file and explains the persistence context. This is transparent and goes beyond mere operation to side effects and prerequisites.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: it states the core purpose first, then explains the two modes, then the critical warning. Each sentence earns its place, with no redundant phrasing or filler. The structure makes it easy for an agent to parse and act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with two modes and edge cases (unsaved project), the description covers everything needed: mode selection, what happens with and without a name, the dialog behavior, and the importance relative to other tools. It also addresses persistence and the destructive nature of vroid_launch(restart=true). No critical information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers both parameters fully (100% coverage) with descriptions. The tool description adds value by explaining the behavioral difference between supplying `name` (Save As) vs omitting it (plain Save), and clarifies that omitting it opens the dialog only if never saved. This adds operational meaning beyond the schema's straightforward parameter descriptions, so it exceeds the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description starts with 'Save the .vroid project - plain Save, or Save As to an explicit path' which clearly states the tool's specific action and distinguishes the two modes. It is distinct from siblings (no other save tool) and gives a concrete resource (the .vroid project).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides usage context: 'Worth doing before any risky experiment...' and explains that nothing else persists work and vroid_launch(restart=true) discards it. It also details when to use name (Save As) vs plain Save, including the caveat about the dialog appearing only when never saved and the instruction to retry with a name. This is clear, actionable guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vroid_screenshotA
Screenshot VRoid and return the image, plus the path it was saved to.
LOOK at the returned image before you decide anything - this is the only way to see the app. Every capture is also written to the captures dir so it can be re-read later.
Coordinate space: the reported image_size is the native capture size
(2560x1440 on the reference machine) and that is the space every other
tool means by space="image". The transported image may be downscaled
(downscale in the text block says by how much); if you read a coordinate
off the picture by eye, divide it by that factor before clicking. Better:
get coordinates from vroid_find_text / vroid_find_button, which always
report native image px.
Gotchas carried over from the driver: capture the WHOLE window, not a crop, when checking "did that work" - modals appear in the middle of the screen and a top-strip-only check will miss them. And do not judge change by the 3D viewport, which dithers every frame; watch a UI strip instead.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Short label used in the saved filename. | |
| region | No | Optional crop in image px of the window capture. Omit for the whole window. | |
| whole_screen | No | Capture the whole output instead of just the VRoid window - needed for the Wine save/export dialog, which is a separate window. | |
| full_resolution | No | Return the image at native resolution instead of downscaling it for transport. Large. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full behavioral burden and does so thoroughly. It discloses that every capture is saved to a captures directory, returned images may be downscaled, coordinates use native image pixel space, and there are driver quirks around modals and viewport dithering. This is unusually transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: purpose, return behavior, coordinate system, and practical gotchas. It is front-loaded with the core action and then layers important operational details so an agent can use the tool correctly without skimming irrelevant prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a screenshot tool with no output schema and no annotations, this is complete: the agent learns what is returned, where it is written, how coordinates should be scaled, what mode to use for verification, and what UI regions are reliable to observe. I see no important calling context missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes all four parameters, so the baseline is 3; the description adds meaningful coordinate-space and downscale context that directly affects how region and full_resolution should be interpreted. It does not separately expand on tag or whole_screen, but the schema handles those sufficiently.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Screenshot VRoid and return the image, plus the path it was saved to.' This clearly states the tool's purpose and main outputs, and the later coordinate-space discussion differentiates it from related perception tools like vroid_find_text and vroid_find_button.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit usage context: look at the returned image before deciding anything, capture the whole window when verifying changes, avoid relying on the dithered 3D viewport, and prefer vroid_find_text / vroid_find_button for coordinates. This goes far beyond a generic description and routes the agent to the right behavior and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vroid_scrollA
Wheel-scroll a panel or zoom the 3D viewport.
Sent as X11 button 4/5 (6/7 horizontally): VRoid is an XWayland client and ignores Wayland virtual-pointer axis events, so this is the only wheel that works on it.
Long Parameters lists need this - a label that vroid_find_text cannot see is usually just below the fold. vroid_set_slider scrolls to its own row automatically, so you rarely need to do it by hand.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | Park the pointer here first - the wheel goes to whatever is under the cursor, so this decides WHICH panel scrolls. ~(0.93w, 0.60h) is the right-hand Parameters panel, the centre is the 3D viewport. | |
| y | No | See `x`. | |
| dx | No | Horizontal wheel notches, positive = right. Rarely useful; VRoid's panels scroll vertically only. | |
| dy | No | Vertical wheel notches. POSITIVE scrolls DOWN (further into a panel); over the 3D viewport, positive zooms OUT. | |
| space | No | 'image' = pixels of a window capture (what vroid_screenshot / vroid_find_* report - the default, and almost always what you want); 'window' = Hyprland layout units relative to the window's top-left; 'layout' = absolute Hyprland layout units of the whole output. | image |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It explains that the wheel is sent as X11 button 4/5 (6/7 horizontally) because VRoid is an XWayland client that ignores Wayland virtual-pointer axis events. It also reveals the direction semantics: 'POSITIVE scrolls DOWN' and 'over the 3D viewport, positive zooms OUT.' This is rich, honest behavioral context beyond a simple 'scroll' statement, with no contradiction to any annotations (none exist).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with zero waste. It front-loads the purpose, then explains the platform-specific mechanism, then gives a concrete use case with a reference to alternatives. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity, the rich input schema (with parameter descriptions), and an output schema, the description is fully sufficient. It explains why the tool exists (XWayland limitation), when to use it (scrolling long panels), and how it contrasts with siblings. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so per the rubric the baseline is 3. The description does not add parameter-specific meaning beyond the schema; it focuses on when to use the tool and the underlying mechanism. The schema already contains detailed descriptions for each parameter (e.g., x: 'Park the pointer here first...'), so the description's lack of direct parameter elaboration is acceptable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource combination: 'Wheel-scroll a panel or zoom the 3D viewport.' It immediately differentiates from siblings by noting that vroid_set_slider scrolls automatically and vroid_find_text cannot see labels below the fold. This clearly tells an agent what the tool does and how it differs from related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use context: 'Long Parameters lists need this - a label that vroid_find_text cannot see is usually just below the fold.' It also explicitly states when not to use it: 'vroid_set_slider scrolls to its own row automatically, so you rarely need to do it by hand.' This gives clear guidance on selecting this tool over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vroid_set_colorA
Set a colour swatch by typing a hex code into its #RRGGBB box.
Scrolls the right-hand panel to the labelled row, clicks the hex field just below the label, replaces its contents and presses Return. Same caveat as sliders: the row must belong to the currently open tab and sub-category (left icon rail).
| Name | Required | Description | Default |
|---|---|---|---|
| hex | Yes | Colour as '#RRGGBB' or 'RRGGBB'. | |
| label | Yes | The colour row's label, e.g. 'Main Color', 'Highlight Color', 'Base Color'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full responsibility of behavioral disclosure. It transparently describes the step-by-step mechanism: scrolling the right-hand panel, clicking the hex field, replacing contents, and pressing Return. It also discloses the limiting condition about the currently open tab. This is a solid level of transparency for a UI automation tool, though it does not mention potential failure modes (e.g., label not found) or side effects beyond the described actions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is exceptionally concise—two sentences—and front-loads the purpose in the first sentence. The second sentence packs in the operational steps and the caveat with no wasted words. Every element contributes to understanding, and nothing is redundant with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the essential aspects of the tool: its purpose, the detailed interaction sequence, and a critical precondition (correct tab and sub-category). It does not explain error handling or what happens if the label is missing, but given that an output schema exists (though not shown) and the tool is relatively simple, the description is sufficiently complete for an agent to use it effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters have schema descriptions with examples, so the baseline is 3. The description adds extra meaning by explaining how each parameter is used in the operation: 'label' identifies the row to scroll to, and 'hex' is the value typed into the field. This contextualizes the parameters beyond their simple data type definitions, making the tool easier to invoke correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear, specific action: 'Set a colour swatch by typing a hex code into its #RRGGBB box.' It identifies the resource (colour swatch) and the method (typing hex code), and the focus on color differentiates it from sibling tools like vroid_set_slider. The purpose is unambiguous and actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a caveat ('Same caveat as sliders: the row must belong to the currently open tab and sub-category') which gives some usage context, but it does not explicitly state when to use this tool versus alternatives like vroid_set_slider or vroid_click. There is no direct 'use this when...' or 'do not use when...' guidance, leaving the agent to infer the appropriate scenario from the tool's purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vroid_set_sliderA
Set a Parameters slider exactly, by typing into its numeric box.
Scrolls the right-hand panel from the top until the labelled row is visible (so it works for parameters below the fold), clicks the numeric box at the end of that row, clears it, types the value and presses Return.
This is far more reliable than dragging the handle - use vroid_drag only for controls with no numeric box. Open the right tab first (vroid_open_tab): each tab has its own parameter list.
| Name | Required | Description | Default |
|---|---|---|---|
| label | Yes | The parameter's label as printed in the right-hand panel, e.g. 'Fem Height', 'Head Size', 'Eye Size X'. | |
| value | Yes | Value to type into the row's numeric box. Most VRoid parameters run -1.0..1.0 with 0 centred; the app clamps out-of-range values. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the exact sequence of actions (scrolls, clicks, clears, types, presses Return) and notes that it works for parameters below the fold. It does not cover failure behavior, but the described mechanics are transparent and complete for normal usage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight paragraphs. The first sentence states the purpose directly. The second details the method without fluff. The third gives usage distinction and prerequisite. Every sentence earns its place; no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a UI automation tool with two parameters and an output schema, the description covers the core usage: what it does, how it works, when to use it, and the prerequisite tab. It omits error handling and return-value details, but those are not critical for a correct first call. Minor gap, but overall sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%—both parameters have descriptive comments. The description does not add extra meaning beyond what the schema already provides (e.g., 'Value to type into the row's numeric box' matches). Baseline of 3 is appropriate; no further compensation needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Set') and resource ('Parameters slider') with the method ('typing into its numeric box'). It explicitly distinguishes from sibling vroid_drag by saying 'use vroid_drag only for controls with no numeric box', making it clear which tool to select.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear when-to-use ('This is far more reliable than dragging the handle'), when-not-to-use (use vroid_drag for controls without numeric box), and a prerequisite ('Open the right tab first (vroid_open_tab)'). No ambiguity about context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vroid_statusA
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly states that the tool is 'Cheap and side-effect free (no OCR, no input)' and describes the side effects of the `focused` flag on other tools, as well as the external helper dependencies it reports. This is transparent and thorough, even anticipating edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured into three clear parts: primary purpose, usage guidance, and helper reporting. It front-loads the most critical information (status report) and continues with actionable context. Every sentence adds value—'Cheap and side-effect free' justifies frequent use, and the helper list tells the agent what to expect. No fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with an output schema (which covers return format), this description provides all necessary context: what it reports, when to use it, side effects on other tools, and external dependencies. It even explains how `focused` false affects subsequent acting tools and how to recover. The tool is simple, and the description fully covers its use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline for this dimension is 4. The description appropriately focuses on behavior and usage rather than parameter details. No parameter explanations are needed, and the description does not introduce any parameter ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what the tool does: 'Report whether VRoid Studio is running, focused, and where it sits.' The verb 'Report' is specific, the resource (VRoid Studio) is clear, and the scope is distinct from the acting sibling tools (vroid_launch, vroid_click, etc.), which perform actions rather than status checks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance on when to use the tool: 'use it before anything else, and after anything that might have lost focus.' It also explains the consequence of `focused` false and names the alternative (vroid_launch) that can restore focus. This is clear, actionable usage guidance that distinguishes it from other tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vroid_typeA
Type into whatever widget currently has keyboard focus.
Click the field first (vroid_click) - this tool has no idea where the caret is. Keystrokes go through X11 XTEST because the Wayland virtual keyboard is mis-read by this Proton client (a whole string arrives as a single character).
Always screenshot afterwards to confirm the text landed in the field you meant: VRoid's forms have several boxes with near-identical captions, and typing into the wrong one leaves the primary button greyed out with no other symptom.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Literal text to type. '\n' presses Return. | |
| clear_first | No | Select-all + backspace before typing, so the field is replaced rather than appended to. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses the XTEST mechanism and the Proton mis-read issue, directly warns about caret independence, and explains the symptom of wrong-field typing. It also notes the effect of clear_first semantically. This is exemplary transparency for an input tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized: purpose statement, usage direction, and verification step. It front-loads the critical warning about clicking first. Slightly verbose but every sentence adds operational value, so it earns a high score rather than a 3.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (keyboard input on a misbehaving client), the description covers prerequisites, mechanism, verification, and failure modes. Output schema exists, so return value details aren't needed. All information an agent needs to call it correctly and detect errors is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters have descriptions. The text parameter's escape sequence ('\n' for Return) is already in the schema. The description adds context about literal text and the clear_first behavior, which is beyond the schema's simple description. A high score because the description reinforces the meaning and clarifies usage in context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (type), resource (keyboard focus), and clearly distinguishes from siblings (vroid_click, vroid_key). The purpose is unmistakable: type text into the currently focused widget. The caveat about having no idea where the caret is clarifies its scope versus click.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to click the field first (naming vroid_click as prerequisite), warns about XTEST versus Wayland issue, and mandates a screenshot afterwards to verify. It also identifies a specific failure mode (grayed-out primary button) and provides the verification step. This is complete when-to-use guidance with clear sequencing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
18 tool updates
v0.1.0- First observed
vroid_click - First observed
vroid_current_screen - First observed
vroid_drag - First observed
vroid_export_vrm - First observed
vroid_find_button - First observed
vroid_find_text - First observed
vroid_key - First observed
vroid_launch - First observed
vroid_new_character - First observed
vroid_open_tab - First observed
vroid_release - First observed
vroid_save_project - First observed
vroid_screenshot - First observed
vroid_scroll - First observed
vroid_set_color - First observed
vroid_set_slider - First observed
vroid_status - First observed
vroid_type
TDQS
Scored across 18 tools
Each tool addresses a distinct capability: launching, screen identification, OCR, clicking, typing, saving, exporting, etc. Even the 'seeing' tools (screenshot, find_text, find_button) have clearly separated purposes: one captures, one finds text, one finds buttons. The interaction primitives (click, drag, scroll, type, key) are mutually exclusive and well-defined. No two tools could be confused for the same action.
All tools share the 'vroid_' prefix and mostly follow a verb_noun pattern (open_tab, export_vrm, set_slider), but a few are single verbs or nouns (status, release, screenshot, click, type). The naming is predictable and readable, with only minor deviations like 'status' and 'release' being not strictly verb_noun. Overall consistent enough for an agent to infer actions.
18 tools is on the higher side but justified for a GUI automation server that needs primitives for every interaction type plus higher-level workflows like export and save. The count feels well-scoped for the domain—each tool earns its place since there's no redundant functionality. Slightly heavy but still reasonable.
The surface covers the full lifecycle: launch, status, screen detection, navigation (open_tab, scroll), interaction (click, drag, type, key, sliders, colors), inspection (screenshot, OCR), persistence (save_project), export (export_vrm), and creation (new_character). No obvious gaps—even edge cases like disabled buttons and modal detection are addressed. The server appears fully equipped for its stated purpose of automating VRoid Studio.
Maintenance
Related MCP Connectors
Generate, edit, and deploy immersive 3D/WebGL web projects from any MCP assistant.
Generate game-ready 3D models, textures, and audio from natural language, over MCP.
Remote MCP for RunComfy: ComfyUI deployments, hosted models, LoRA training. 31 tools.
Use AI models for chat, image, and video generation from Claude Code and other MCP hosts.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to control the Blockout previs desktop app for AI filmmaking, allowing staging of 3D worlds, character animation, camera framing, timeline control, and viewport screenshotting through MCP tools.6Apache 2.0
- AlicenseAqualityAmaintenanceWraps the Live2D Cubism Editor's external application integration API as MCP tools, enabling AI agents to control Cubism Editor for modeling operations via natural language.1726MIT
- FlicenseNot gradedqualityBmaintenanceEnables AI assistants to show, animate, and control a VRM character on the desktop, including posing and motion installation via MCP tools.1-
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to control a desktop virtual character (VRM) by playing animations, showing/hiding the character, and checking runtime status through the MCP protocol.313,617 npm2MIT