mcp-vroid
mcp-vroid
Un servidor MCP que controla la interfaz gráfica de VRoid Studio. Ofrece a cualquier cliente MCP (Claude Code, o cualquier otra cosa que hable con el protocolo) un conjunto de herramientas para lanzar la aplicación, verla, localizar widgets en la imagen, hacer clic y escribir, ajustar parámetros y exportar un .vrm — en Arch + Hyprland (Wayland), con VRoid Studio ejecutándose bajo Steam/Proton.
No existe una API de scripting en VRoid Studio, así que esto funciona de la única manera que está disponible: capturar la ventana, localizar las cosas con OCR y coincidencia de color, e inyectar eventos reales de puntero y teclado.
grim ──► PNG ──► tesseract / cv2 ──► (x, y) ──► virtual pointer / XTEST
▲ │
└──────────────────── screenshot again ◄───────────────┘Elmotor bajo el servidor es el espiga tools/vroid-driver de mi proyecto arrakis, incluido aquí como mcp_vroid.driver — el mismo código, reempaquetado para que un cliente MCP pueda instalarlo y ponerlo en marcha.
Requisitos
cosa | por qué |
Hyprland (>= 0.55, API de despacho) | descubrimiento de ventanas, foco, disgnadores |
VRoid Studio vía Steam/Proton (appid | la app que se está controlando |
| capturas de pantalla |
| OCR |
| compilar el asistente de puntero |
Xwayland ( | el teclado y la rueda pasan por X11 XTEST |
Python 3.11+, | el propio servidor |
Dependencias Python (uv sync las instala): mcp, pillow, numpy, opencv-python-headless, pytesseract, python-xlib.
Related MCP server: Persona Motion Studio
Instalación
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 compila un cliente C de ~150 líneas para zwlr_virtual_pointer_unstable_v1 (el XML de protocolo está vendido en native/protocols/). Sin él, todo tool de puntero falla con native/vpointer missing. vroid_status informa si está presente.
Por qué un asistente en C: ydotool no está instalado en la máquina de referencia y /dev/uinput es 0600 root:root, así que la inyección evdev requeriría sudo o una regla de udev. El protocolo de puntero virtual de Wayland no necesita ninguna de las dos, mueve el cursor real del compositor y funciona con cualquier ventana.
Cliente mcpServers JSON:
claude mcp add vroid -- uv run --directory /path/to/mcp-vroid mcp-vroidGenérico mcpServers JSON:
{
"mcpServers": {
"vroid": {
"command": "uv",
"args": ["run", "--directory", "/path/to/mcp-vroid", "mcp-vroid"]
}
}
}Los clientes suelen lanzar los servidores con un entorno saneado. Este servidor recupera XDG_RUNTIME_DIR, WAYLAND_DISPLAY, HYPRLAND_INSTANCE_SIGNATURE y DISPLAY del directorio de runtime al arrancar (tools/ndc_vdvoice) para que hyprctl/grim/XTEST funcionen igualmente; vroid_status muestra lo que tuvo que completar. Cualquier que ya esté en el entorno gana.
Variables de entorno opcionales:
var | valor predeterminado | significado / función |
|
| señal importante: a capturar |
|
| directorio por defecto para exportar/guardar |
|
| ruta al asistente de puntero |
|
| el lado más largo de las imágenes y colores (0 = nunca reducir) |
Herramientas
Ciclo de vida
Herramienta | Cómo lo hace |
| Lanza VRoid cuando haga falta, va al escritorio 9 de Hyprland, recuerda en el escritorio que estabas y lo enfoca, y lo maximiza. |
| Ventana presente / enfocada / título / geometría, escritorio activo, carpetas de captura y si |
| Vuelva al escritorio en el que vivía el usuario. VR Studio sigue abierto en el escritorio 9. |
Viendo
tool | qué hace lo que haces |
| Captura la ventana (o toda la salida, esp. para el diálogo de guardado de Wine), la guarda en la carpeta de capturas y te la devuelve como contenido de imagen MCP para que el modelo del cliente pueda verla. Informa del tamaño nativo de la imagen y del factor de reducción aplicado para la transferencia. |
| Nueva captura + tesseract; devuelve las cajas y centros de las palabras coincidentes en px de imagen. Pasa |
| Localiza los botones de color sólido de VRoid |
|
|
Contacto (entrada sin procesar)
Herramienta | Descripción |
| Mueve el puntero deslizando en un pocos pasos (para que se activen los estados hover) y cliquea. |
| click ⟶ deslizamiento en 24 pasos ⟶ soltar. El arrastre con el botón derecho orbita la cámara; el del botón central pega. |
| Rueda, como teclas X11 4/5 (6/7 para horizontal). Sitúa el puntero sobre el panel que quieras desplazar. |
| Escribe en el elemento enfocado mediante XTEST. |
|
|
Acting (flujos completos)
Herramienta | Qué hace |
| Pantalla de inicio → Create New → base → editor. |
| Face / Hairstyle / Body / Outfit / Accessories / Look. |
| Desplaza el panel de parámetros a la fila y escribe un valor exacto en su caja numérica. |
| Igual que el otro, pero para una casilla de color |
| El paseo completo por Export-as-VRM, incluido el modal de ajustes de VRM y el diálogo de guardado de Wine Wine. El parámetro |
| Ctrl+Shift+S a una ruta |
Todas las herramientas de acción enfocan primero la VR y se niegan a actuar if not focused if window focused is VR Studio.
Cómo usarlo
Resumen: cóđului → observar → localizar → actuar → capturar de nuevo.
vroid_launch()vroid_screenshot()y observa la imagenvroid_find_text("Export")(ovroid_find_button()) para obtener las coordenadasvroid_click(x, y)— coordenadas de una captura fresca, siemprevroid_screenshot()para confirmar lo que realmente pasó
Trucos aprendidos a la fuerza en el prototipo original:
Hay que mirar el plano entero, no un recorte. Un modal de confirmación de “Cerrar Editor de Peinados” estaba en el centro de la pantalla y se quedó ahí durante seis clics fallidos porque la comprobación singular oreado.
No juzgues el cambio por el viewport 3D. VRoid entremezcla cada frame, así que la diferencia entre dos pantallas enteras lee ~0.98 aunque no haya pasado nada. Para saber si eso pasa, mira una banda de la UI.
Preferir las cajas numéricas a arrastrar el slider.
vroid_set_sliderescribe un valor exacto, mientras que arrastrar solo es para controles que no tienen caja.Los botones primarios se buscan por color, no por texto. Un pastil gris donde esperas azul es la app indicándote que hay un campo obligatorio vacío.
El OCR de un fotograma completo de 2560×1440 tarda ~10s en. Pasa un
region.
Esp ediciones de coordenadas
Hay tres espacios en juego, y todos son distintos:
espacio | tamaño en la máquina de referencia | quién lo usa |
layout (lógico) | 2048 × 1152 |
|
píxeles esde píxel de la imagen | 2560×1440 | tesseract, cv2, todo lo que ves |
X11 (controlador Xwayland) | 2560 × 1440 | XTEST |
Las herramientas aceptan y devuelven pxx (space='image') de imagen por defecto y convierten internamente, así que directamente pega lo que devuelve vroid_find_text en vroid_click. Si MCP_VROID_MAX_IMAGE_PX redujo la imagen que te mostraron y leíste las coordenadas, multiplica las coordenadas por el inverso del factor downscale reportado — o simplemente pide a f, que siempre devuelve px nativas.
Mapa de la interfaz (VRoid Studio 2.14.0, English)
Las coordenadas están en px de una captura de 2560×1440 de la ventana a pantalla completa. Son pistas—las herramientas reales primero hacen el OCR.
Pantalla de inicio — la tarjeta Create New + está en ≈ (118, 218) y su rótulo en (118, 328); New / Open arriba a la derecha en (2439, 99) / (2495, 100); debajo, la cuadrícula de Sample Models. Create New abre un modal "Select a base to start with" con los rótulos Fem (1199, 862) y Masc (1359, 862): haz clic en la miniatura ~100 px por encima del rótulo.
Editor — la barra de pestañas en y ≈ 23: Face 97 · Hairstyle 198 · Body 302 · Outfit 392 · Accessories 509 · Look 622. La hamburguesa ☰ en (29, 23) → Save (Ctrl+S), Save As… (Ctrl+Shift+S), importación/exportación masiva, deshacer/rehacer, volver a la selección de modelos — Escape no cierra este menú; haz clic en otro sitio. Barra de herramientas arriba a la derecha: cámara (2415, 23), compartir/exportar (2464, 23), menú kebab ⋮ (2512, 23). La columna de iconos de la izquierda (x ≈ 24, primer icono en y ≈ 77 y luego cada ~48 px) es la subcategoría de la pestaña actual. El panel izquierdo es la cuadrícula de preajustes, con Presets/Custom en y ≈ 120. El panel derecho es Custom en primer lugar y Parameters después.
Controles del panel derecho
control | cómo se maneja |
slider | la caja numérica en x ≈ 2505 ( |
color | la caja |
checkbox / radio | haz clic en la casilla o en el círculo |
acordeón | haz clic en el rótulo (p. ej. |
menú desplegable | solo en los diálogos nativos de Wine; haz clic y luego con las flechas del teclado |
Los parámetros de Body empiezan en Model's Height : 161.2 cm, y siguen Fem Height, Masc Height, Eye Size X/Y? No, en realidad la lista: Fem Height, Masc Height, Body Size, Head Size, Head Width, Head Tip (Y), Neck Length/Thickness/Width, Soften Collarbone, … Los de Face: Eye Size X/Y, Eyes Position (X/Y), Rotate Eye Socket, Inner/Outer Eye Slant, Iris Size X/Y, Gaze (Y), … (unos ~40 renglones; las herramientas hacen scroll por ti).
Editor de peinado — pestaña Hairstyle → icono de la columna izquierda → subpestaña Custom → + Profile New → panel derecho Edit Hairstyle. Dentro: Add Freehand Hair Guides / Add Procedural Hair Guides, una lista Hair Groups, una paleta de herramientas en (330 / 365 / 398 / 432, 83), deshacer/rehacer en (76, 23) / (133, 23). Al salir pregunta primero: la ✕ en (23, 23) abre el modal Close Hairstyle Editor con Save as new head / Overwrite / Close without saving.
Export as VRM — icono de compartir (2464, 23) → Export as VRM → página de exportación a pantalla completa con la píldora azul Export en ≈ (2412, 197) → modal VRM Settings (centrado, con x de ~1000 a 1560, desplazable): Export Format con los botones de opción VRM1.0/VRM0.0, Avatar Name obligatorio, Version, Creators obligatorio, copyright/contacto/referencias, casillas de uso; la píldora Export sigue gris y sin respuesta hasta que se rellenan esos dos campos obligatorios → cuadro de diálogo para guardar de Wine (su propia ventana, título Export); el campo File name: se abre enfocado y con el texto seleccionado, de modo que escribir una ruta de Windows lo reemplaza y Enter activa el botón predeterminado. El prefijo de Proton mapea Z:\ a /, así que /home/nuri/x es Z:\home\nuri\x. No hagas clic en un Save localizado con OCR: la etiqueta Save in: coincide con la misma aguja.
Qué es frágil
El OCR es todo el sistema de localización. Las etiquetas pequeñas, con separación amplia o claras sobre oscuro se dividen o se pierden (
Export→E+xport). Los iconos no tienen texto; esos anclajes se basan en fracciones fijas de la ventana y se moverán si pixiv reorganiza la interfaz.Los anclajes fijos son fefracciones calibradas para 2560×1440 con escala 1.25. Con otro monitor quizá haya que volver a medirlas.
Los modales aparecen fuera de tu región de búsqueda y se tragan los clics en silencio.
Tempo. La ventana 3D tarda unos 5 s en aparecer después de escoger una base; la exportación demora 5–30 s (más con modelos pesados).
El diálogo de Wine es una ventana aparte, con su propia clase y geometría: usa ahí
vroid_screenshot(whole_screen=true).Idioma. Estas agujas suponen la interfaz en inglés.labrasta. Si VRoid sale en japonés, esvíalo por el menú kebab
⋮→ Settings → Language.El protector de pantalla inactivo puede llevarse la sesión a mitad de ejecución. El guardián no escribe en esa ventana y cierra esa única ventana (y solo esa) antes de actuar.
Nota de seguridad
Este servidor inyecta eventos reales del mouse y teclado en tu sesión de escritorio activa y captura pantallas de la misma. Esa es toda la gracia, y también el riesgo:
Las capturas pueden mostrar cualquier cosa en la salida;
whole_screen=truecaptura absolutamente todo, y las capturas se guardan en el disco sin cifrar.Las pulsaciones van a donde tiene el foco. El controlador se niega a actuar a menos que la ventana de VRoid Studio tenga el foco, pero una instrucción comprometida o descuidada de igual forma puede hacer clic en cualquier lugar dentro de VRoid.
vroid_launch(restart=true)cierra VRoid Studio al instante y se pierden cambios sin guardar.Ninguna de estas acciones va en un entorno aislado y no hay ningún paso de confirmación.
Ejecútalo vigilado, con sesión supervisionada, y no dejes un agente conduciéndolo en secreto; vroid_release() te devuelve el escritorio al terminar.
Desarrollo
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) es la interfaz de la shellía del juguete — launch, shot, find, click, tab, slider, export, cam, apply-params, … — muy útil para depurar sin un cliente MCP en el bucle.
Crédicos y licencia
El driver (src/mcp_vroid/driver/, native/) nació como el spike tools/vroid-driver dentro de mi proyecto arrakis y se incluye aquí con el servidor MCP envuelto alrededor.
MIT — consulta LICENSE.
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
Build editable 3D scenes, direct characters and cameras, and export AI video references with MCP.
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.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables 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
- 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.562,949 npm2MIT
- AlicenseNot gradedqualityBmaintenanceEnables Windows MCP clients to author MikuMikuDance scenes by controlling characters, cameras, lighting, physics, timeline editing, MME effect assignments, and AVI video output through natural language or scripted tool calls.30MIT No Attribution