Skip to main content
Glama
nhodges
by nhodges

mcp-vroid

MCP‑сервер, который управляет графическим интерфейсом VRoid Studio. Он даёт любому MCP‑клиенту (Claude Code или чему угодно, что говорит по этому протоколу) набор инструментов для запуска приложения, просмотра изображения, поиска виджетов на картинке, кликов, ввода текста, установки параметров и экспорта в .vrm — на Arch + Hyprland (Wayland), при этом VRoid Studio запускается через Steam/Proton.

В VRoid Studio нет скриптового API, поэтому это работает единственным доступным способом: снимок окна, поиск объектов через OCR и сопоставление цветов, затем инъекция настоящих событий мыши и клавиатуры.

   grim ──► PNG ──► tesseract / cv2 ──► (x, y) ──► virtual pointer / XTEST
    ▲                                                        │
    └────────────────────  screenshot again  ◄───────────────┘

Движок под сервером — это набросок tools/vroid-driver из проекта arrakis, подключённый сюда как mcp_vroid.driver. Тот же код, переупакованный так, чтобы его было удобно устанавливать и запускать через MCP‑клиент.


Требования

Компонент

Для чего

Hyprland (>= 0.55, Lua dispatch API)

поиск окон, фокус, рабочие места

VRoid Studio через Steam/Proton (appid 1486350)

управляемое приложение

grim

скриншоты

tesseract + TRAINEDDATA eng

OCR

gcc, wayland-scanner, libwayland-client

сборка помощника для указателя

Xwayland (DISPLAY)

клавиатура и колесо мыши через X11 XTEST

Python 3.11+, uv

сам сервер

Python‑зависимости (устанавливает uv sync): mcp, pillow, numpy, opencv-python-headless, pytesseract, python-xlib.

Related MCP server: blockout-mcp

Установка

git clone https://github.com/nhodges/mcp-vroid
cd mcp-vroid
uv sync                 # virtualenv + dependencies
bash native/build.sh    # builds native/vpointer  <-- REQUIRED, not optional

native/build.sh компилирует C‑клиент примерно на 150 строк для протокола zwlr_virtual_pointer_unstable_v1 (XML протокола подключён в native/protocols/). Без него каждый инструмент указателя завершится ошибкой native/vpointer missing. vroid_status сообщает, есть ли он.

Почему C‑помощник: ydotool не установлен на эталонной машине, а /dev/uinput имеет права 0600 root:root, поэтому evdev‑инъекция потребовала бы sudo или правила udev. Протокол виртуального указателя Wayland не требует ни того, ни другого, двигает реальный курсор композитора и работает поверх любого окна.

Регистрация у клиента

Claude Code:

claude mcp add vroid -- uv run --directory /path/to/mcp-vroid mcp-vroid

Обычный JSON mcpServers:

{
  "mcpServers": {
    "vroid": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/mcp-vroid", "mcp-vroid"]
    }
  }
}

Клиенты часто запускают серверы в очищенном окружении. Этот сервер при старте возвращает XDG_RUNTIME_DIR, WAYLAND_DISPLAY, HYPRLAND_INSTANCE_SIGNATURE и DISPLAY из каталога рантайма (src/mcp_vroid/session_env.py), поэтому hyprctl/grim/XTEST работают в любом случае; vroid_status показывает, что ему пришлось дозаполнить. Всё, что уже есть в окружении, выигрывает.

Опциональные переменные окружения:

Переменная

По умолчанию

Смысл

MCP_VROID_CAPTURES

$XDG_STATE_HOME/mcp-vroid/captures

каталог, куда пишутся скриншоты

MCP_VROID_OUT

$XDG_STATE_HOME/mcp-vroid/out

каталог для экспортов/сохранений по умолчанию

MCP_VROID_VPOINTER

<checkout>/native/vpointer

путь к помощнику для указателя

MCP_VROID_MAX_IMAGE_PX

1600

длинное ребро картинки, отправляемой клиенту (0 = никогда не уменьшать)

Инструменты

Жизненный цикл

Инструмент

Что делает

vroid_launch(restart=false, timeout=240)

Запускает VRoid через Steam при необходимости, ставит её на рабочем месте Hyprland 9, запоминает рабочее место пользователя, фокусирует и разворачивает её в полноэкранный режим. restart=true сначала убивает запущенный процесс — несохранённая работа будет потеряна.

vroid_status()

Информация о наличии/фокусе/заголовке/геометрии окна, активном рабочем месте, каталогах снимков, а также о доступной vpointer/grim/tesseract/hyprctl. Только чтение, без OCR.

vroid_release()

Возвращает на то рабочее место, где был пользователь. VRoid остаётся работать на ws 9.

Наблюдение

Инструмент

Что делает

vroid_screenshot(region?, tag?, whole_screen?, full_resolution?)

Снимает окно (или весь вывод, для диалога сохранения Wine), сохраняет в каталог снимков и возвращает как изображение MCP, чтобы модель клиента могла рассмотреть. Сообщает нативный размер картинки и применённый фактор масштабирования для передачи.

vroid_find_text(query, region?, exact?, limit?)

Выполняет свежий снимок + tesseract; возвращает координаты и рамки слов в пикселях изображения. Укажите region — OCR полного кадра занимает ~10 секунд, региональной области ~2 секунды.

vroid_find_button(color='primary'|'disabled', label?, region?)

Находит сплошные кнопки-«пилюли» VRoid #0096FA по цвету, потому что tesseract полностью теряет белые подписи на синем. Серый пилюль означает disabled.

vroid_current_screen()

Возвращает start / editor / export_vrm / hair_editor / unknown.

Действия (низкоуровневый ввод)

Инструмент

Что делает

vroid_click(x, y, space='image', button='left', double=false)

Плавно ведёт указатель за несколько шагов (чтобы сработали ховы), затем кликает.

vroid_drag(x1, y1, x2, y2, space='image', button='left')

Неважно → 24 шага перемещения → отпустить. Правый кнопка-перетаскивание вращает камеру, средний — панорамирует.

vroid_scroll(dy, dx=0, x?, y?, space='image')

Колесо мыши, как кнопки X11 4/5 (6/7 по горизонтали). Удерживайте указатель над панелью, которую хотите прокрутить.

vroid_type(text, clear_first=false)

Вводит текст в сфокусированном виджете через XTEST.

vroid_key(combo, times=1)

Return, Escape, ctrl+s, ctrl+shift+s, …

Действия (сценарии)

Инструмент

Что делает

vroid_new_character(base='Fem'|'Masc')

Стартовый экран → Create New → базовый тип → редактор.

vroid_open_tab(name)

Face / Hairstyle / Body / Outfit / Accessories / Look.

vroid_set_slider(label, value)

Прокручивает панель Parameters до нужного ряда и вводит точное значение в числовое поле.

vroid_set_color(label, hex)

То же самое для поля цвета #RRGGBB.

vroid_export_vrm(path, archive, creator, version='1.0')

Весь процесс экспорта «Export as VRM», включая модальное окно метаданных VRM Settings и диалог сохранения Wine. version выбирает VRM1.0 или VRM0.0.

vroid_save_project(name?)

Ctrl+Shift+S в нужный путь .vroid или просто Save без аргументов.

Каждый инструмент‑действие сначала фокусирует VRoid и отказывается действовать, если активное окно — не VRoid Studio.

Как им пользоваться

В основе: снимок → смотрим → находим → действуем → снова снимок.

  1. vroid_launch()

  2. vroid_screenshot() и смотрим на картинку

  3. vroid_find_text("Export") (или vroid_find_button()) — для координат

  4. vroid_click(x, y) — координаты только из свежей картинки

  5. vroid_screenshot(), чтобы проверить, что реально произошло

Эмпирические правила, которые были выработаны сложным путём в оригинале:

  • Читайте весь кадр, а не обрезок. Модел окно подтверждения «Close Hairstyle Editor» стояло в центре экрана при шести неудачных кликах, потому что проверка искала только верхние 60 px.

  • Не судите об изменениях по 3D‑вьюпорту. VRoid делает дизеринг буквально каждого кадра, поэтому сравнение полных кадров даёт дельту — а она равна ~0.98 даже когда ничего не происходило. Смотрите на полосу интерфейса.

  • Числовые поля лучше, чем перетаскивание слайдера. vroid_set_slider вводит точное значение; для перетаскивания — только контролы без числового поля.

  • Первичные кнопки ищут по цвету, а не по тексту. Серый цвет лепестки вместо синего — это признак приложения, что обязательная строка как бы пуста.

  • Книга OCR всего кадра 2560×1440 занимает ~10 с. Передавайте регион.

Пространства координат

Одндутся два пространства:

пространство

размер на эталонной машине

кто использует

Layout Hyprland (логический)

2048 × 1152

hyprctl, виртуальный указатель

Пиксели изображения: снимок экрана

2560 × 1440

tesseract, cv2 и всё, что вы видите

Пиксели X11 (Xwayland)

2560 × 1440

XTEST

Инструменты по умолчанию принимают и возвращают пиксели изображения (space="image") и преобразуют их между системами, так что можно передавать результат vroid_find_text сразу в vroid_click. Если MCP_VROID_MAX_IMAGE_PX уменьшил картинку, которую вы видите, умножьте координаты, которые вы прочитали на ней, на значение, обратное множителю downscale — или просто используйте vroid_find_text, который всегда возвращает натуральные пиксели.

Карта интерфейса (VRoid Studio 2.14.0, English)

Координаты — это пиксели изображения на снимке 2560×1440 полноэкранного окна. Относитесь к ним как к подсказкам: инструменты определяют объекты через OCR чтобы полноценно.

Стартовый экран — карточка Create New + в точке ≈ (118, 218), подпись в (118, 328); New / Open сверху справа в (2439, 99) / (2495, 100); ниже сетка Sample Models. Create New открывает модальное окно «Select a base to start with» с подписями Fem (1199, 862) и Masc (1359, 862) — нажмите на миниатюру примерно в 100 px над подписью.

Редактор — строка вкладок на y ≈ 23: Face 97 · Hairstyle 198 · Body 302 · Outfit 392 · Accessories 509 · Look 622. Бургер-меню в (29, 23) → Save (Ctrl+S), Save As… (Ctrl+Shift+S), импорт/массовый экспорт, отмена/повтор, возврат к выбору модели — Escape не закрывает это меню, кликните в другом месте. Панель инструментов сверху справа: камера (2415, 23), поделиться/экспорт (2464, 23), кебаб-меню (2512, 23). Левая вертикальная полоса иконок (x ≈ 24, первая иконка y ≈ 77, затем каждые ~48 px) — подкатегория текущей вкладки. Левая панель — сетка пресетов с Presets / Custom на y ≈ 120. Правая панель — Customize, затем Parameters.

Элементы правой панели

элемент

как управлять

ползунок

числовое поле на x ≈ 2505 (vroid_set_slider); дорожка занимает x ≈ 2278 → 2516, 0.0 по центру

цвет

поле #RRGGBB на x ≈ 2450 (vroid_set_color)

чекбокс / радио

клик по квадратику/кружку

аккордеон

клик по заголовку (например, > Reduce Polygons)

выпадающий список

только в нативных диалогах Wine; кликните, затем стрелками

Параметры Body начинаются с Model's Height : 161.2 cm, далее Fem Height, Masc Height, Body Size, Head Size, Head Width, Head Tip (Y), Neck Length/Thickness/Width, Soften Collarbone, … Параметры Face: Eye Size X/Y, Eyes Position (X/Y), Rotate Eye Socket, Inner/Outer Eye Slant, Iris Size X/Y, Gaze (Y), … (~40 строк; инструменты прокрутят за вас).

Редактор волос — вкладка Hairstyle → на левой полосе значок волос → подраздел Custom+ Create New → правая панель Edit Hairstyle. Внутри: Add Freehand Hair Guides / Add Procedural Hair Guides, список Hair Groups, палитра инструментов на (330 / 365 / 398 / 432, 83), отмена/повтор в (76, 23) / (133, 23). При выходе сначала появится запрос: кнопка в (23, 23) открывает модальное окно Close Hairstyle Editor с Save as new item / Overwrite / Close without saving.

Export as VRM — значок поделиться (2464, 23) → Export as VRM → полноэкранная страница экспорта с синей кнопкой-пилюлей Export в ≈ (2412, 197) → модальное окно VRM Settings (по центру, примерно x 1000–1560, прокручивается): радиокнопки Export Format VRM1.0 / VRM0.0, Avatar Nameобязательное, Version, Creatorsобязательное, поля copyright/contact/references, чекбоксы использования. Кнопка-пилюля Export остаётся серой и неактивной, пока не заполнены оба обязательных поля → диалог сохранения Wine (отдельное окно с заголовком Export): поле File name: при открытии получает фокус и выделенный текст, поэтому ввод полного пути Windows заменяет его, а Return активирует кнопку по умолчанию. Префикс Proton отображает Z:\ на /, поэтому /home/nuri/x соответствует Z:\home\nuri\x. **Не** нажимайте Save, найденную через OCR — подпись Save in: попадает под тот же шаблон.

Что может ломаться

  • Вся навигация завязана на OCR. Мелкие, разрежённые или светлые надписи на тёмном фоне расщепляются или теряются (ExportE + xport). У иконок нет текста вообще — их якоря прописаны как доли окна и будут сдвигаться, если pixiv перекомпонует UI.

  • Фиксированные якоря — это доли, калиброванные под 2560×1440 при масштабе 1.25. На другом мониторе их, возможно, придётся замерять заново.

  • Модальные окна могут открываться за пределами области поиска и молча поглощать клики.

  • Тайминги. Трёхмерный вьюпорт появляется через ~5 с после выбора основы; экспорт длится 5–30 с (тяжёлые модели — дольше).

  • Диалог Wine — отдельное окно со своим классом и геометрией — там используйте vroid_shunchot(whole_screen=true).

  • Язык. Эти шаблоны ожидают английский интерфейс. Если VRoid поднялся на японском, переключите его в кебаб-меню → Settings → Language.

  • Экранная заставка, уходящая в idle, может захватить сессию в середине работы. Защита отказывается печатать в ней и закрывает только это одно окно перед действием.

Примечание о безопасности

Этот сервер передаёт реальные события мыши и клавиатуры в ваш живой рабочий стол и делает снимки экрана. В этом его суть, и в этом же его вис.

  • Снимки экрана могут захватить всё, что выведено на экран: whole_screen=true снимает всё, и они сохраняются на диск без шифрования.

  • Клавиши нажатия уходят приложения, у которого фокус. Драйвер отказывается работать, если VRoid Studio не имеет фокуса, но скомпрометированный или невнимательный промпт может нажать в любую точку внутри VRoid Studio.

  • vroid_launch(restart=true) завершает VRoid Studio и теряет все несохранённые изменения.

  • Здесь нет изоляции и нет шага подтверждения.

Запускайте его вручную, на наблюдаемых вами сессии, и не оставляйте агента управлять им без присмотра. vroid_release() вернёт рабочий стол по завершении.

Разработка

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 here

vroid-driver (mcp_vroid.driver.cli) — интерфейс оболочки спайка: launch, shot, find, click, tab, slider, export, cam, apply-params, … — удобно для отладки без MCP-клиента в цепочке.

Авторы и лицензия

Драйвер (src/mcp_vroid/driver/, native/) начался как спайк tools/vroid-driver в моём проекте arrakis и включен сюда вместе с обёрткой MCP-сервера.

MIT — см. LICENSE.

Install Server
A
license - permissive license
A
quality
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • F
    license
    B
    quality
    D
    maintenance
    Enables GUI automation for controlling PIX4Dmatic on Windows through MCP. Supports launching, focusing, capturing screenshots, sending hotkeys, clicking UI elements, opening projects, starting processing, and checking outputs.
    18
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables 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.
    6
    Apache 2.0
  • A
    license
    A
    quality
    A
    maintenance
    Wraps the Live2D Cubism Editor's external application integration API as MCP tools, enabling AI agents to control Cubism Editor for modeling operations via natural language.
    17
    12
    MIT

View all related MCP servers

Related MCP Connectors

  • Generate, edit, and deploy immersive 3D/WebGL web projects from any MCP assistant.

  • Hosted real Google Chrome MCP with per-user persistent state. Navigate, click, type, screenshot.

  • Create App Store screenshots, icons, ASO copy, localization, and revisions via hosted MCP.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/nhodges/mcp-vroid'

If you have feedback or need assistance with the MCP directory API, please join our Discord server