mcp-vroid
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 | die zu steuernde App |
| Bildschirmfotos |
| OCR |
| Erstellung des Zeiger-Helfers |
Xwayland ( | Tastatur und Mausrad laufen über X11 XTEST |
Python 3.11+, | 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 optionalnative/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-vroidAllgemeines 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 |
|
| Standardverzeichnis für Bildschirmfotos |
|
| Standardverzeichnis für Exporte/Downloads |
|
| Pfad zum Zeiger-Helfer |
|
| längere ganz Wir „nie” an den Client gesendete Bildkante (0 = nie verkleinern) |
Tools
Lifecycle
Tool | Beschreibung |
| Startet bei Bedarf VRoid über Steam, dockt es auf Hyprland-Arbeitsfläche 9 setzt, merkt sich deine vorherige Arbeitsfläche, fokussiert und vollbildert es. |
| Fenster vorhanden/odiert/Titel/Geometrie, aktive Arbeitsfläche, Basis-Kataloge usw., zeigt ob Availability von |
| Wechsel zur Arbeitsfläche des Benutzers zurück. VRoid läuft weiter auf Arbeitsfläche 9. |
Sehen
Tool | Beschreibung | ||
| 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. | ||
| 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. |
| Findet VRoids Vollfarbe | ||
|
|
UEben (Roher Eingang)
Tool | Beschreibung |
| Gleitet den Zeiger über ein paar Schritten und klickt mit der linken/gleich... (sohh Hover-Zustände ausgelöst werden). |
| Drückt → entspricht in 24 Schritten → loslassen. Rechtsklick driebt orbs die Kamera, mittlere Maustast bzw. Tastatur verschiebt. |
|
|
| Tippt in das fokussierte Feld über XTEST. |
|
|
Ebenenden: (Abnläufe)
Tool | Zweck |
| Startbildschirm → Create New → Base → Editor. |
| Gesicht / Haustil / Körper / Outfit / Bekleidung / Look. |
| Blättert im Bedienfeld zu der Zeile und gibt genauen numberischen Wert ein. |
| Dasselbe, a Kuur |
| Kompletter Ablauf für das Exportieren als VRM, inklusive VRM-Instellungen-Metadaten und Wine Speichern. |
| 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
vroid_launch()vroid_screenshot()und den Bild ans malvroid_find_text("Export")(oder alternativvroid_find_button()) für Koordinatenvroid_click(x, y)– Koordinaten immer von einem neuen Bild,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_slidertippt 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
regionmüssen.
Koordinatenräume
Alle drei Maßsysteme sind beteiligt und unterscheiden sich:
Raum | Größe auf der Referenzmaschine | verwendet |
Hyprland Layout (logisch) | 2048 × 11580 |
|
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.
Startbildschirm — Create 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 ( |
Farbe | das |
Kontrollkästchen / Optionsfeld | Klick auf das Rechteck / den Kreis |
Akkordeon | Klick auf die Überschrift (z. B. |
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 (
Export→E+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=truezeichnet 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 herevroid-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.
Maintenance
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
- FlicenseBqualityDmaintenanceEnables 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
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to control the Blockout previs desktop app for AI filmmaking, allowing staging of 3D worlds, character animation, camera framing, timeline control, and viewport screenshotting through MCP tools.6Apache 2.0
- AlicenseAqualityAmaintenanceWraps the Live2D Cubism Editor's external application integration API as MCP tools, enabling AI agents to control Cubism Editor for modeling operations via natural language.1712MIT
- FlicenseNot gradedqualityBmaintenanceEnables AI assistants to show, animate, and control a VRM character on the desktop, including posing and motion installation via MCP tools.1
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.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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