Skip to main content
Glama
nhodges
by nhodges

mcp-vroid

Ein MCP-Server, der die GUI von VRoid Studio steuert. Er stellt jedem MCP-Client (Claude Code oder allem anderen, das das Protokoll spricht) einen Satz Tools zur Verfügung, um die App zu starten, sie anzusehen, Widgets im Bild zu finden, zu klicken und zu tippen, Parameter zu setzen und eine .vrm zu exportieren – auf Arch + Hyprland (Wayland), wobei VRoid Studio unter Steam/Proton läuft.

Es gibt keine Skripting-API in VRoid Studio, daher funktioniert das nur auf die einzige verfügbare Weise: Das Fenster zuschneiden, Dinge mit OCR und Farbabgleich lokalisieren und echte Zeiger- und Tastaturfunktionen autorengen.

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

Die Basis des Servers ist die tools/vroid-driver-Spike aus meinem arrakis-Projekt, hier eingefügt als mcp_vroid.driver – gleicher Code, neu verpackt, sodass er von einem MCP-Client installiert und gestartet werden kann.


Anforderungen

Bestandteil

Grund

Hyprland (>= 0.55, Lua-Dispatch-API)

Fenstererkennung, Fokus, Arbeitsflächen

VRoid Studio via Steam/Proton (App-ID 1486350)

die zu steuernde App

grim

Bildschirmfotos

tesseract und eng-Trainingsdaten

OCR

gcc, wayland-scanner, libwayland-client

Erstellung des Zeiger-Helfers

Xwayland (DISPLAY)

Tastatur und Mausrad laufen über X11 XTEST

Python 3.11+, uv

der Server selbst

Python-Abhängigkeiten (uv sync installiert sie): mcp, pillow, numpy, opencv-python-headless, pytesseract, python-xlib.

Related MCP server: blockout-mcp

Installation

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 kompiliert einen \~150-Zeilen-C-Client für zwlr_virtual_pointer_unstable_v1 (das Protokoll-XML liegt unter native/protocols/). Ohne ihn schlagen alle Zeiger-Werkzeuge mit native/vpointer fehlt fehl. vroid_status gibt an, ob er vorhanden ist.

Warum ein C-Helfer: ydotool ist auf der Referenzmaschine nicht installiert und /dev/uinput ist 0600 root:root, sodass evdev-Einspritzung sudo oder eine udev-Regel erfordern würde. Das Wayland-Virtual-Pointer-Protokoll braucht keins von beidem, bewegt den echten Cursor des Compositors und funktioniert über jedem Fenster.

Bei einem Client registrieren

Claude Code:

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

Allgemeines mcpServers-JSON:

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

Clients starten Server oft mit einer bereinigten Umgebung. Dieser Server stellt XDG_RUNTIME_DIR, WAYLAND_DISPLAY, HYPRLAND_INSTANCE_SIGNATURE und DISPLAY beim Start aus dem Laufzeitverzeichnis wieder her (src/mcp_vroid/session_env.py), sodass hyprctl/grim/XTEST trotzdem funktionieren; vroid_status zeigt, was ergänzt werden musste. Was in der Umgebung bereits vorhanden ist, hat Priorität.

Optionale Umgebungsvariablen:

Variable

Standard

Bedeutung

MCP_VROID_CAPTURES

$XDG_STATE_HOME/mcp-vroid/captures

Standardverzeichnis für Bildschirmfotos

MCP_VROID_OUT

$XDG_STATE_HOME/mcp-vroid/out

Standardverzeichnis für Exporte/Downloads

MCP_VROID_VPOINTER

<checkout>/native/vpointer

Pfad zum Zeiger-Helfer

MCP_VROID_MAX_IMAGE_PX

1600

längere ganz Wir „nie” an den Client gesendete Bildkante (0 = nie verkleinern)

Tools

Lifecycle

Tool

Beschreibung

vroid_launch(restart=false, timeout=240)

Startet bei Bedarf VRoid über Steam, dockt es auf Hyprland-Arbeitsfläche 9 setzt, merkt sich deine vorherige Arbeitsfläche, fokussiert und vollbildert es. restart=true beendet zuerst die laufende Instanz – ungerettete Arbeit geht verloren.

vroid_status()

Fenster vorhanden/odiert/Titel/Geometrie, aktive Arbeitsfläche, Basis-Kataloge usw., zeigt ob Availability von vpointer/grim/grim/ etc. – nur lesen, keine OCR.

vroid_release()

Wechsel zur Arbeitsfläche des Benutzers zurück. VRoid läuft weiter auf Arbeitsfläche 9.

Sehen

Tool

Beschreibung

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

Erfasst das Fenster (oder das ganze Ausgabegerät, zum Beispiel für den Wine-Speicherdialog), speichert es in seiner Basisz Grafiken und gibt es als MCP-Bildinhalt zurück. Berichtet die Bildgröße und den angewandten Verkleinerungsfaktor.

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

Ermittelt durch neue Erfassung + OCR

neue Erfassung + OCR

`mache Textfelder und deren Mitten in Bildpunkten. Region angeben – vollständige Vollbild-OCR dauert ungefähr 10 s, ein kleiner Bereich nur 2 s.

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

Findet VRoids Vollfarbe #0096FA-Pills über Farbvergleich, weil in Tesseract weiße Beschriftungen auf blau Pills verloren gehen. Bei einer grauen Pill ist die Taste deaktiviert.

vroid_current_screen()

start / Editor / export_vrm / "" / "unknown".

UEben (Roher Eingang)

Tool

Beschreibung

vroid_click(x, V, space='image', button='left', double=true)

Gleitet den Zeiger über ein paar Schritten und klickt mit der linken/gleich... (sohh Hover-Zustände ausgelöst werden).

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

Drückt → entspricht in 24 Schritten → loslassen. Rechtsklick driebt orbs die Kamera, mittlere Maustast bzw. Tastatur verschiebt.

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

dy (Richtungswert -1/1) nach oben/unten, dx die Horizontalbewegung. Zeiger über das Bedienfeld platzieren, das scrollen soll.

vroid_type(type, clear_first=false)

Tippt in das fokussierte Feld über XTEST.

vroid_key(combo, runs=1)

Return, Escape, strg+s , Strg+Umschalt+s`, usw.

Ebenenden: (Abnläufe)

Tool

Zweck

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

Startbildschirm → Create New → Base → Editor.

vroid_open_tab(list)

Gesicht / Haustil / Körper / Outfit / Bekleidung / Look.

vroid_set_slider(label, value, )

Blättert im Bedienfeld zu der Zeile und gibt genauen numberischen Wert ein.

vroid_set_color(label, hex)

Dasselbe, a Kuur #RRUGGBB farbcode

vroid_export_vrm(path, avatar_name, bebauteen, version='1.0')

Kompletter Ablauf für das Exportieren als VRM, inklusive VRM-Instellungen-Metadaten und Wine Speichern. version wählt VRM1.0 oder VRM0.0.

vroid_save_prj(name?)

Beim Speichern über Strg+Bildtaste gesetztem Namen... oder automatisch ohne Namen, per normalen Speichervorgang, auf './smol' –

Jedes Aktions-Tool fokussiert zuerst VRoid und verweigert die Aktion, wenn nicht VRoid Studio das aktive Fenster ist.

So treibt man es

Meist so: Bildschirmfoto → anschauen → Position finden → Akt auslösen → wieder

  1. vroid_launch()

  2. vroid_screenshot() und den Bild ans mal

  3. vroid_find_text("Export") (oder alternativ vroid_find_button()) für Koordinaten

  4. vroid_click(x, y) – Koordinaten immer von einem neuen Bild,

  5. vroid_screenshot(), um Sicherung zu bekommen, was wirklich passiert ist.

Praxisregeln, die man aus der ursprünglich leicht unbekannt ins Om erkundet hat:

  • Den Glaube, ${», – ** lies Insgesamt, nicht den Ausschnitt.** Ein „Close Hairstyle Editor"-Dialog hing deutlich in der Bildschirmmit bisher 6 gescheiterte Transaktionen, weil die Prüfung nur die oberen 60 Pixel las.

  • Schließe nicht aus Änderungen im 3D-View. VRoid flackt/verwirbelt jedes Bild, ein Vollabdruck wird ungefähr ~8.98 . Und selbst, wenn nichts geschehen ist etwas, sehen Sie nur VVI.

  • Über NUM extrem besser ... Numerische Eingabefelder statt Schieberegler. vroid_set_slider tippt den exakteEARL, – ziehen für öffnete Elemente.

  • Beurteile nächte per „„primary“ massbes beurteilen; statt mit dem Text. blau statt graue Pille heißt: Pflichtfeld ist noch nicht gesetzt..

  • OCR eines komplett 2560×1440-Bildes braucht um "~10 Sekunden. Übergib eines region müssen.

Koordinatenräume

Alle drei Maßsysteme sind beteiligt und unterscheiden sich:

Raum

Größe auf der Referenzmaschine

verwendet

Hyprland Layout (logisch)

2048 × 11580

hyprctl, Virtual Si`

Pixel eines Aufnahme

2560 × 1560

Tesser[besser]und, CSS, de Gebauchtsienauft

X11 Pixel (Xwayland)

2560 × 1200

XTEST

Die Tools erhalten und ausgeben standardmäßig Bildpixel (space="image") und konvertieren das intern – also . dato die von vroid_find_text` gemeldete Mitten directly pass on to vroid click. Wenn du später mit nek lang Returns*, multiplicate man die + sind “ we can get = from, pink {@ ...

In Hdd: , after female *" Females maintain with straight face. When the MAX_IMAGE_PX person resized See Image No“.

– Normally, (o-V)


TT. Prior → Exit -per long etc. command ihre Platz["schwellen".

If sich etc. the Kob. Adjust«."

[marginal]

UI-Referenz (VRoid 2.14.0e)

Angießt sind image px auf einem 2560×1440 Screenshot vom Vollbild. Behandeln Sie diese als grobe Orientierung – die Orte locking via vroid_find_text first.;

Also die. put.notes away.

StartbildschirmCreate New-Karte mit + bei ≈ (118, 218), Beschriftung bei (118, 328); New / Open oben rechts bei (2439, 99) / (2495, 100); darunter das „Sample Models“-Raster. „Create New“ öffnet ein modales Fenster mit dem Titel „Wähle eine Basis zum Starten“ und den Bildunterschriften Fem (1199, 862) und Masc (1359, 862) — klicken Sie die Miniaturansicht etwa 100 px über der Bildunterschrift.

Editor — Registerleiste bei y ≈ 23: Face 97 · Hairstyle 198 · Body 302 · Outfit 392 · Accessories 509 · Look 622. Hamburger-Menü bei (29, 23) → Speichern (Ctrl+S), Speichern unter… (Ctrl+Shift+S), Import/Massenexport, Rückgängig/Wiederholen, zurück zur Modellauswahl — Escape schließt dieses Menü nicht, klicken Sie stattdessen woanders hin. Werkzeugleiste oben rechts: Kamera (2415, 23), Teilen/Export (2464, 23), Kebab-Menü (2512, 23). Linke Symbolleiste (x ≈ 24, erstes Symbol bei y ≈ 77, dann alle ca. 48 px) = Unterkategorie des aktuellen Tabs. Linkes Panel = Preset-Raster mit Presets/Custom bei y ≈ 120. Rechtes Panel = Anpassen, dann Parameter.

Steuerelemente des rechten Panels

Steuerelement

Bedienung über

Schieberegler

das Zahlenfeld bei x ≈ 2505 (vroid_set_slider); die Laufspur reicht von x ≈ 2278 → 2516, mit 0.0 in der Mitte

Farbe

das #RRGGBB-Feld bei x ≈ 2450 (vroid_set_color)

Kontrollkästchen / Optionsfeld

Klick auf das Rechteck / den Kreis

Akkordeon

Klick auf die Überschrift (z. B. > Reduce Polygons)

Dropdown

nur in den nativen Wine-Dialogen; klicken, dann Pfeiltasten verwenden

Die Body-Parameter beginnen mit Model's Height : 161.2 cm, danach folgen Fem Height, Masc Height, Body Size, Head Size, Head Width, Head Tip (Y), Neck Length/Thickness/Width, Soften Collarbone, … Die Face-Parameter: Eye Size X/Y, Eyes Position (X/Y), Rotate Eye Socket, Inner/Outer Eye , ... (ca. 40 Zeilen; die Werkzeuge scrollen sie für Sie).

Haar-Editor — Hairstyle-Tab → linkes Leisten-Symbol → Untertab Custom+ Create New → rechtes Panel Edit Hairstyle. Im Inneren: Add Freehand Hair Guides / Add Procedural Hair Guides, eine Hair Groups-Liste, eine Werkzeugpalette bei (330 / 365 / 398 / 432, 83), Rückgängig/Wiederholen bei (76, 23) / (133, 23). Beim Verlassen wird zuerst nachgefragt: Das bei (23, 23) öffnet ein Modal „Close Hairstyle Editor“ mit Save as new item / Overwrite / Close without saving.

Als VRM exportieren — Teilen-Symbol (2464, 23) → Export as VRM → Vollbild-Exportseite mit der blauen Export-Pill bei ≈ (2412, 197) → VRM-Settings-Modal (zentriert, ungefähr x 1000–1560, scrollbar): Export Format-Buttons VRM1.0/VRM0.0, Avatar Name Pflichtfeld, Version, Creators Pflichtfeld, Urheber/Kontakt/Referenzen, Nutzungskontrollkästchen; die Export-Pille bleibt grau und wurde grau undinaktiv, bis beide Pflichtfelder ausgefüllt sind → Wine-Speicherdialog (eigenes Fenster, Titel Export): Das Feld File name: ist beim Öffnen fokussiert und vorausgewählt, sodass eine Windows-Pfadangabe diesen Inhalt ersetzt und die Eingabetaste den vorbelegten Button auslöst. Das Proton-Präfix mappt Z:\ auf /, also wird aus /home/nuri/x Z:\home\nuri\x. **Klicken Sie nicht** auf einen durch OCR gefundenen Save-Button: Die Beschriftung Save in: passt auf dieselbe Suchvorlage.

Was ist fragil

  • OCR ist die gesamte Verortungslogik. Kleine, gesperrt geschriebene oder helle Symbole auf dunklem Grund werden geteilt oder übersehen (ExportE + xport). Icons haben überhaupt keinen Text – diese Anker sind fest codierte Fensteranteile und verschieben sich, wenn pixiv die UI umstellt.

  • Feste Anker sind anteilige Werte, die bei 2560×1440 und Skalierung 1,25 gemessen wurden. Ein anderer Monitor erfordert eine Neubemessung.

  • Modaldialoge erscheinen außerhalb des Suchbereichs und schlucken Klicks lautlos.

  • Timeing. Die 3D-Ansicht erscheint ca. 5 s nach Auswahl einer Basis; der Export dauert 5–30 s (bei größeren Modellen länger).

  • Der Wine-Dialog ist ein separates Fenster mit eigener Klasse und Geometrie – verwenden Sie dort vroid_screenshot(whole_screen=true).

  • Sprache. Diese Suchvorlagen setzen die englische UI voraus. Falls VRoid auf Deutsch? Nein – Englisch? Wenn VRoid Japanisch ist, wastonen Sie in kebab → Settings → Language umstellen.

  • Der Bildschirmschoner können die Sitzung mitten im Lauf übernehmen. Der Schoner weigert sich, den Text und das zu bedienen... eigentlich: Der Schutzmechanismus verweigert die Eingabe in den Bildschirmschoner und schließt dieses eine Fenster (und nur dieses), bevor er etwas tut.

Sicherheitshinweis

Dieser Server injiziert echte Maus- und Tastaturereignisse in Ihre live-Desktop-Sitzung und erstellt zu davon Screenshots. Das ist der entire Zweck, und es genau das Risiko:

  • Screenshots können beliebige Bildschirminhalte erfassen – whole_screen=true zeichnet alles auf, und die Aufnahmen landen unverschlüsselt auf der Festplatte.

  • Tastatureingaben gehen an das Element, das den Fokus gerade hält. Der Treiber weigert sich, zu handeln, solange nicht VRoid Studio das aktive Fenster ist, aber ein kompromittierter oder sorgloser Prompt kann trotzdem überall innerhalb von VRoid klicken.

  • vroid_launch(restart=true) tötet VRoid Studio und verwirft ungespeicherte Arbeit.

  • Hier ist nichts sandboxed, und es gibt keinen Bestätigungsschritt.

Führen Sie es beaufsichtigt – in einer Sitzung, die Sie überwachen auf eine laufende Session und überwachen Sie, undlassen Sie keinen Agenten unbeaufsichtigt daran arbeiten. vroid_release() gibt den Desktop zurück, wenn Sie fertig sind.

Entwicklung

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.driverre.CLI) ist die Shell-Schnittstelle the "implementation" – launch, shot, find, click, tab, slider usw. – handlich zum Debuggev, ohne einen MCP-Client in die Schleife einzubeziehen.

Dankeschön und Lizenz

Der Treiber (src/mcp_vroid/driver/, native/) entstand als der Sprachtest tools/vroid-driver inn meinem eigenen arrakis-Projekt und ist hier zusammen mit dem MCP-Server darum entfernt.

MIT – siehe 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