gvm mcp
This server does not currently have a deployable release on Glama. Follow the repository's setup instructions to install and configure it for your MCP client, including any required credentials and local dependencies.
GVM DMX Controller: CLI and MCP Server
Control GVM PRO-BD45R 48" RGB LED tube lights over DMX512 from a laptop, with a
command-line tool (gvm) and a local MCP server so Claude (or any MCP client) can run the
lights: "make the tubes warm white at 40%", "run a slow cyan meteor", "paint a sunset gradient".
White light 2700–10000 K with green/magenta, solid colours (names, hex, RGB, hue), HSI
Per-pixel control: each tube is 33 individually addressable pixels
Gradients and exact per-pixel painting
Software versions of all six GVM pixel effects (rolling, rainbow, blockgame, pingpong, wave, meteor), plus rig effects across tubes (colour cycle, chase, table ping pong)
Works with cheap FTDI "Open DMX" USB cables (tested with the DSD TECH SH-RS09B)
The tubes hold their last look, so static commands set it and exit. Effects stream until stopped.
Every rig setting (adapter, addresses, modes, pixel layout, orientation) comes from a config file or command-line options / MCP tool parameters
New here? Set each tube's menu first (Settings on each light), then read the setup guide. It covers the wiring, the XLR-to-RJ45 pinout (the most common reason nothing works), install, first tests, connecting Claude, and troubleshooting.
GVM's own documents: the BD45R DMX channel table (PDF) and the BD25R / BD45R user manual (PDF). Cable pinouts: Wiring and pinouts. More under Reference documents.
Settings on each light
Nothing works until each tube's own menu matches the software's patch. On each BD45R, press MODE until the Set up menu appears, press TAB to move between items and + / − to change them:
Set up menu item | Tube 1 | Tube 2 | Why |
CONTROL | DMX | DMX | In |
DMX ADDR | 1 | 232 | Each tube uses 231 channels (1–231 and 232–462), so they mustn't overlap |
DMX MODE | CCT&RGB | CCT&RGB | Per pixel: intensity, colour temperature, green/magenta, white↔colour crossfade, R, G, B |
DMX PIXEL | 1 | 1 | Every one of the 33 pixels is controlled separately. All effects run in software, so the menus never need changing again |
The software shows the same settings for the config in use, so they can't drift apart:
gvm setupprints the exact menu values per tube, the wiring chain, the adapter pinout and the terminator.gvm infoadds aset on the light:line under each tube.The MCP server's
rig_infotool includesset_on_lightfor each tube, and itslight_setup_guidetool returns the full checklist, so Claude can walk you through it.
Other layouts (other modes, fewer pixels, more tubes) are in setup §3, including how to work out addresses.
Symptom | Setting to check |
A tube ignores everything but stays lit | CONTROL is still |
Setting one pixel lights the whole tube | DMX PIXEL is 33, not 1 |
Tubes copy each other or interfere | DMX ADDR overlaps (tube 2 must be 232) |
Effects run the wrong way on one tube |
|
Tubes flicker or ignore DMX entirely | the XLR-to-RJ45 adapter's pinout, or a missing terminator (see Wiring and pinouts) |
Using more than one tube
With more than one tube, effects can play across the whole rig, not just along each tube: a chase
that runs from one tube into the next, colors that travel down a row of tubes, or a ping-pong ball
that bounces between two tubes facing each other. For that, the software needs to know which way
each tube is mounted. Each tube's pixel order can be flipped with reverse (in gvm.toml, or
:reverse in a --patch spec).
You don't have to work this out yourself. Describe your layout to the agent, for example:
"My two tubes face each other across a table. Set them up so effects travel around the table."
It runs a test pattern, asks what you see, and sets reverse for each tube to match.
Related MCP server: elgato-keylight
Contents
How it fits together
Claude / MCP client ──stdio──▶ gvm mcp ─┐
├─▶ Controller ─▶ FTDI D2XX ─▶ USB-DMX cable ─▶ XLR→RJ45 ─▶ Tube 1 ─▶ Tube 2 ─▶ terminator
You ─────────────────────────▶ gvm ... ─┘ │
└─ universe state file (last values of all 512 channels)Open DMX adapter: the SH-RS09B is a bare USB-to-RS485 bridge, so this software generates the DMX signal itself (break, mark-after-break, 512 slots at 250 kbaud, about 25 frames/s).
The tubes hold their last values when DMX stops, so a static command opens the adapter, sends briefly and closes it again.
Shared state: the last universe is saved to a state file and restored on the next command, so the CLI and the MCP server can take turns, and changing one tube never resets another.
Wiring and pinouts
Parts
Part | Example | What to check |
USB-to-DMX cable | DSD TECH SH-RS09B, 3 m (the one used here, Amazon, maker's page) | FTDI FT232R "Open DMX" type. Its DMX end is a female 3-pin XLR |
XLR-to-RJ45 DMX adapter | SIRS-E RJ45-to-XLR DMX adapter: choose Male, 3 PIN (RJ45-XLRM3-MK2), or Event Horizon 3-pin XLR-M to RJ45: choose pinout "ESTA Standard (Pinout A)" | Must be ESTA-wired: XLR 3 → RJ45 1 (Data+), XLR 2 → RJ45 2 (Data−), XLR 1 → RJ45 7/8 (ground). Needs a male XLR to mate with the SH-RS09B. Check it with a meter before use (see below) |
Cat5/Cat6 patch cable | any straight-through Ethernet cable | tube 1 DMX OUT → tube 2 DMX IN |
DMX terminator (required) | the one used here (Amazon), or make one (below) | 120 Ω across Data+ and Data− in the last tube's DMX OUT. RJ45 type, since the tube's jacks are RJ45 |
Don't skip the terminator. DMX is a 120 Ω bus. Without a terminator at the far end, the signal reflects back down the cable, and the last tube can flicker, glitch or ignore commands, especially on longer runs. To make one, wire a 120 Ω, ¼ W resistor between pins 1 and 2 of an RJ45 plug (or of a short patch cable cut off near the plug), and plug it into the last tube's DMX OUT. A 3-pin XLR terminator (120 Ω between XLR pins 2 and 3) only works if that end of the chain is XLR.
Adapter warning. Sellers rarely publish pinouts, and many "XLR to RJ45" or "DMX" adapters (audio types, LED-strip controllers) are wired differently. One tested for this project mapped XLR 1/2/3 to RJ45 1/6/7, and the tubes only flickered. SIRS-E lists RJ45 pin 1 Data+ (white/orange), pin 2 Data− (orange) and pins 7/8 ground, matching XLR pins 3/2/1 by wire colour. Event Horizon builds to the pinout you select. Neither has been tested with these tubes, so check any adapter with a meter, or build one from the table below.
Pinouts
Laptop USB ─ USB-DMX cable (XLR) ─ XLR→RJ45 DMX adapter ─▶ Tube 1 DMX IN
Tube 1 DMX OUT ─ Cat5 ─▶ Tube 2 DMX IN ─ Tube 2 DMX OUT ─ 120 Ω terminatorThe tubes' DMX jacks are RJ45, so the XLR end of the USB cable needs an adapter, and the adapter must be wired to the DMX-over-Cat5 standard (ANSI/ESTA E1.27-2). Many "XLR to RJ45" adapters (audio types, and some sold for LED-strip controllers) use other pins. With one of those, the tubes flicker or ignore DMX.
Signal | 3-pin XLR | RJ45 pin | T568B wire colour |
Data + | 3 | 1 | white/orange |
Data − | 2 | 2 | orange |
Common / ground | 1 | 7 (and optionally 8) | white/brown (brown) |
RJ45 pins are numbered 1–8 left to right with the gold contacts facing you, the clip at the back and the cable hanging down. The full details are in the setup guide: wiring and pinouts, including how to check an adapter with a multimeter, how to build one, and connector genders. The standard itself is in the ANSI E1.27-2 wiring guide (PDF).
Quick start
Wire it up (Wiring and pinouts): USB cable → ESTA XLR-to-RJ45 adapter → tube 1 IN, tube 1 OUT → tube 2 IN, terminator in tube 2 OUT.
Set each tube's menu (Settings on each light): CONTROL DMX, DMX MODE CCT&RGB, DMX PIXEL 1, DMX ADDR 1 and 232.
Install the software. It needs Python 3.11+ and the FTDI driver, which Windows installs automatically for the cable.
git clone https://github.com/cleemullins/GVM-DMX-Controller---CLI-and-MCP-Server.git gvm
cd gvm
python -m pip install -e .Check the adapter is seen, and compare the settings the software expects with each tube's menu:
gvm portsgvm setupThen try the lights:
gvm white 100 5600gvm fx allIf gvm isn't found, use python -m gvm instead, or add Python's Scripts folder to PATH (see
setup §5).
Connect Claude or another assistant: see Using the MCP server.
CLI reference
gvm [rig options] COMMAND [command options]Command | What it does | Example |
| Print the menu settings each tube needs (CONTROL / DMX ADDR / DMX MODE / DMX PIXEL), wiring, pinout, terminator |
|
| Write a starter config to |
|
| Show config source, state file, adapter, each tube's channels |
|
| List COM ports and FTDI adapters |
|
| White: intensity %, kelvin, |
|
| Solid colour: name, |
|
| Hue (°) and saturation (%) |
|
| Intensity only, keep colour |
|
| Intensity to 0 |
|
| Gradient along each tube (33 colours = one per pixel) |
|
| Software effect; |
|
| Test: fade white up and down |
|
| The tube's built-in effects (tube must be in EFFECT / PIXEL FX mode) |
|
| Write absolute DMX channels |
|
| Interactive prompt |
|
| Run the MCP server over stdio |
|
Targeting: -f/--fixture NAME (repeatable; default all tubes) and -s/--segment N
(repeatable; 1–33).
Rig options override the config file. Put them before the command:
Option | Meaning |
| Config file (default: |
| Define a tube, replacing the file's fixtures (repeatable) |
| DMX driver ( |
| FTDI serial number (d2xx) or COM port (serial) |
| DMX frame rate |
| Universe state file (default |
| Seconds to send after a static command (default 0.3); |
gvm --patch "tube1:1:CCT&RGB:1:reverse" --patch "tube2:232:CCT&RGB:1" white 50gvm --driver serial --device COM3 infoRun gvm --help or gvm COMMAND --help for every option.
Using the MCP server
The MCP server lets Claude, or any other MCP-capable assistant, run the lights in plain language:
"set both tubes to 3200 K at 40%", "make tube 2 deep blue", "run a slow cyan meteor", "paint a
sunset gradient", "stop the effect". It runs locally over stdio: your MCP client starts
gvm mcp as a subprocess on your computer and talks to it over stdin/stdout. No network port is
opened, and nothing leaves the machine except what the assistant itself sends.
1. Before you start
The lights work from the CLI. Wiring, tube settings and install are done (see Quick start), and
gvm white 50 5600lights both tubes. If the CLI can't drive the lights, the MCP server can't either.Find the Python that has
gvminstalled. MCP clients often don't share your terminal's PATH, so use the full path topython.exein client configs. To print it:python -c "import sys; print(sys.executable)"It looks like
C:\Users\<you>\AppData\Local\Python\pythoncore-3.15-64\python.exe.Make the config findable. The client starts the server in a folder of its choosing, so
./gvm.tomlmay not be found. Either pass--configin the client config (as in the examples below), or put the config in the per-user location thatgvmalways checks:gvm initThis writes
%APPDATA%\gvm\gvm.toml. Edit it to match your tubes, or copy this repo'sgvm.tomlover it.Check the server starts. This prints nothing and waits for a client; stop it with Ctrl+C. An error here, such as a missing config or a bad patch, is the same one a client would hit.
python -m gvm mcp
2. Connect it to your assistant
The server is the command python -m gvm [rig options] mcp. Every client below just needs that
command and its arguments. Rig options (--config, --patch, --driver, --device) go
before mcp.
Claude Code, in this repo. Nothing to do: the repo's .mcp.json declares the
gvm-lights server. Open Claude Code in this folder and approve the server when asked. It uses
python from your PATH and ./gvm.toml.
Claude Code, in any folder. Register it once for your user (with a per-user config, step 1.3):
claude mcp add --scope user gvm-lights -- python -m gvm mcpUse the full python.exe path instead of python if it isn't on your PATH, and add
--config C:\path\to\gvm.toml before mcp to pin a config.
Claude Desktop. Settings → Developer → Edit Config opens claude_desktop_config.json
(%APPDATA%\Claude\ on Windows, ~/Library/Application Support/Claude/ on macOS). Add the server,
save, and fully quit and reopen Claude Desktop:
{
"mcpServers": {
"gvm-lights": {
"command": "C:\\Users\\<you>\\AppData\\Local\\Python\\pythoncore-3.15-64\\python.exe",
"args": ["-m", "gvm", "--config", "C:\\git\\gvm\\gvm.toml", "mcp"]
}
}
}Other MCP clients (VS Code, Cursor, Windsurf, Zed, and others) take the same command and
arguments in their own config file. For example, VS Code's .vscode/mcp.json:
{
"servers": {
"gvm-lights": {
"type": "stdio",
"command": "C:\\path\\to\\python.exe",
"args": ["-m", "gvm", "--config", "C:\\git\\gvm\\gvm.toml", "mcp"]
}
}
}Any client that supports stdio MCP servers works. The server needs no environment variables or API keys.
Without an assistant. The MCP Inspector lets you call the tools by hand in a browser (needs Node.js):
npx @modelcontextprotocol/inspector python -m gvm mcp3. Check it's connected
Claude Code: run
/mcp.gvm-lightsshould show as connected, with its 12 tools.Claude Desktop: the tools/connectors menu in the chat box should list
gvm-lights.Then ask: "What lights do you have?" The assistant should call
rig_infoand report two tubes with 33 segments each, plus the menu settings each tube needs.
4. Things to ask
Ask | The assistant uses |
"Set both tubes to 100% at 5600 K." |
|
"Make tube 2 warm, 3200 K at 30%, and leave tube 1 alone." |
|
"Turn tube 1 red and tube 2 blue." |
|
"Dim everything to 20%." |
|
"Light just the first five pixels of tube 1 in orange." |
|
"Paint a sunset gradient across both tubes." |
|
"Run a slow cyan meteor." / "Do the table ping pong for 30 seconds." |
|
"Stop the effect." / "Lights off." |
|
"Tube 2 isn't responding. What should its menu say?" |
|
"I moved tube 2 to address 300." |
|
Colours can be names (red, amber, teal, …), #rrggbb, r,g,b or hue:DEG[,SAT].
Intensities are 0–100 %. Segments are numbered 1–33 along each tube.
5. How it behaves
Static tools (
set_white,set_color,set_hsi,set_intensity,paint,lights_off) return as soon as the look is set. The tubes keep it after that, even when the server stops.Effects run in the background.
start_effectreturns immediately, and the animation keeps going untilstop_effect, another lighting tool, itssecondsrunning out, or the client closing the server. Then the tubes go dark.One adapter, one user at a time. A running effect holds the USB-DMX adapter, so stop it before using the
gvmCLI or other DMX software, or they report the adapter as busy. Static changes hold it for only a fraction of a second.Shared state. The last values of all 512 channels are saved per user, so the MCP server and the CLI can take turns without resetting each other's tubes.
The patch can change mid-session. If a tube's DMX ADDR, DMX MODE or DMX PIXEL is changed on the light, tell the assistant: it calls
configure_rigfor that session. Updategvm.tomlto make the change permanent.
6. Tools
Tool | Parameters | Does |
| – | Tubes (names, channels, mode, segments, reverse, |
| – | Menu steps, the CONTROL / DMX ADDR / DMX MODE / DMX PIXEL values per tube, wiring, adapter pinout, terminator, orientation |
|
| White light |
|
| Solid colour |
|
| Colour by hue |
|
| Brightness only |
|
| Gradient / per-pixel colours |
|
| Off (stops any effect) |
|
| Background animation (see Effects) |
| – | Stop the running animation |
|
| Change the patch for this session (file untouched) |
|
| Raw DMX |
fixtures takes tube names or numbers (omit for all), and segments takes 1–33 (omit for the
whole tube).
7. Troubleshooting the MCP server
Problem | Fix |
Server shows as failed / disconnected | Run the client's exact command in a terminal (step 1.4) to see the error |
| Use the full path to the |
| Add |
Tools work but the lights don't change | Same checks as the CLI: try |
| A CLI command, another server instance or other DMX software has it. Stop that, or call |
New tools don't appear after updating | Restart the client (Claude Desktop: fully quit) so it restarts the server |
Using with a camera and motion control
The lights are one part of a studio. With a camera MCP server (for example, one for a Nikon) and edelkrone's MCP server for sliders and heads, one assistant can light, move and shoot in a single request. Each device keeps its own server: register all three with the same client, and the assistant coordinates them.
{
"mcpServers": {
"gvm-lights": { "command": "C:\\path\\to\\python.exe", "args": ["-m", "gvm", "--config", "C:\\git\\gvm\\gvm.toml", "mcp"] },
"camera": { "...": "your camera MCP server" },
"edelkrone": { "...": "edelkrone's MCP server" }
}
}How the lights fit in
Set the look, then shoot. Static looks (
set_white,set_color,paint) stay on the tubes with nothing left running, so they don't change during an exposure.Effects run while other things happen.
start_effectreturns straight away, so the camera can start recording and the slider can move while the tubes animate. End withstop_effect.Frame-by-frame work (turnarounds, time-lapse, stop-motion): change the light → move → wait for the motion to settle → capture, repeated. Use static looks between frames, not effects.
Match white balance. When using white light, set the camera's white balance to the tubes' colour temperature.
Motion is real hardware. edelkrone's server asks the assistant to read its SDK info and safety rules first. Confirm move ranges before the first run.
Example requests
Rename capabilities to match what your camera server exposes.
Request | What happens |
"Product setup: tubes 5600 K at 70%, camera 5600 K white balance, f/8, ISO 100, slider to center, then a test shot." | Light → camera settings → move → capture |
"12-frame turnaround: rotate the head 30° per frame, wait for it to settle, shoot. Keep the tubes at 4300 K, 60%." | Static look held for every frame |
"Same position, three shots at 3200 K, 4300 K and 5600 K, matching white balance each time, then one with tube 1 red and tube 2 blue." | Light and camera changed together per frame |
"10-second push-in: start recording, run the slider end to end, and fade the tubes from 10% to 80% warm white over the same time." | Lighting fade in step with the move |
"Record 30 seconds of table ping pong on the tubes while the head pans back and forth." | Background effect during motion and recording |
"Time-lapse: 120 frames, slider one step per frame, shifting the tubes from 3200 K toward 6500 K across the sequence." | A new static look before each frame |
"Interview: tube 1 key at 4300 K 80%, tube 2 fill at 35%, camera 4300 K at 1/50 s, f/2.8, head 15° off-axis, test frame." | A full setup in one request |
"Set both tubes to 5600 K at 50%, shoot them, and adjust tube 2 until they match." | Uses camera feedback, if the camera server returns images or exposure data |
Configuration
gvm.toml (this repo's copy is set up for two tubes):
driver = "d2xx" # "d2xx" (FTDI library, recommended) or "serial"
device = "" # FTDI serial (from `gvm ports`) or COM port; "" = first adapter
fps = 25
[[fixture]]
name = "tube1"
address = 1 # = the tube's DMX ADDR
mode = "CCT&RGB" # = DMX MODE: CCT&RGB | CCT&HSI | CCT | RGB | HSI | EFFECT | PIXEL FX
pixel = 1 # = DMX PIXEL: 33 (whole tube) | 11 | 3 | 1 (33 pixels)
reverse = true # flip pixel order (see "Using more than one tube")
[[fixture]]
name = "tube2"
address = 232
mode = "CCT&RGB"
pixel = 1
reverse = falseLookup order: --config, $GVM_CONFIG, ./gvm.toml, %APPDATA%\gvm\gvm.toml
(~/.config/gvm/gvm.toml on Linux/macOS). See setup §3
for working out addresses for other layouts.
Effects
gvm fx list / the rig_info tool lists them. All take speed 1–10 (5 = normal) and seconds
(0 = until stopped). Pixel effects need DMX PIXEL below 33.
Effect | Kind | Options |
| pixel |
|
| pixel | – |
| pixel |
|
| pixel |
|
| pixel |
|
| pixel |
|
| rig |
|
| rig |
|
| rig |
|
gvm fx wave --color red --bg green --wavelength 8 --seconds 20gvm fx cycle --stagger 10 --seconds 30Python library
from pathlib import Path
from gvm import Controller, RigConfig
from gvm.animations import Options
ctl = Controller(RigConfig.load(Path("gvm.toml")))
ctl.white(60, 4300)
ctl.color((255, 0, 128), 40, fixtures=["tube2"])
ctl.paint([(255, 0, 0), (0, 0, 255)])
ctl.start("meteor", Options(color=(0, 255, 255), speed=7)) # background thread
ctl.stop()The lower layers are gvm.dmx.OpenDmx (raw universe output) and gvm.bd45r.BD45R (the tube's
channel map). The channel chart is in docs/bd45r-dmx-channels.md.
Development
python -m pip install -e ".[test]"python -m pytestThe tests don't need hardware. CI runs them on every push (see .github/workflows/tests.yml).
Project layout
Path | Contents |
| DMX512 output through an FTDI Open DMX adapter (D2XX or COM port) |
| BD45R channel layouts and value encoding |
|
|
| Shared engine for the CLI and MCP: sessions, saved state, background effects |
| Software pixel and rig effects |
| Colour parsing and gradients |
| Light settings / wiring checklist for |
| Guidance for AI agents working in this repo |
| The |
| The MCP server |
| Setup guide: wiring, pinouts, tube settings, install, MCP, troubleshooting |
| DMX channel reference and what was verified on real tubes |
| Reference rig config |
Reference documents
Document | What's in it |
Official channel layout for all 28 DMX modes: CCT&RGB, CCT&HSI, CCT, RGB, HSI at each DMX PIXEL setting, EFFECT and PIXEL FX values | |
Controls and menus (Set up → CONTROL, DMX ADDR, DMX MODE, DMX PIXEL), modes, specifications, app pairing | |
This project's condensed version of the channel table, plus what was verified on real tubes | |
This project's setup guide | |
XLR and RJ45 pinouts, the wiring chain, testing and building an adapter | |
The RJ45 pinout the XLR-to-RJ45 adapter must follow |
License
MIT © 2026 Chris Mullins. GVM and BD45R are trademarks of their owner; this project is not affiliated with or endorsed by GVM.
This server cannot be deployed
Maintenance
Related MCP Connectors
MCP server for Producer/Riffusion AI music generation
Build, run, schedule, and publish AI video pipelines to YouTube and TikTok from any MCP client.
Use AI models for chat, image, and video generation from Claude Code and other MCP hosts.
Direct AI video, image, music and storyboard production from any MCP client.
Related MCP Servers
- AlicenseBqualityDmaintenanceAn MCP server that lets AI assistants control grandMA2 lighting consoles via Telnet, exposing 41 high-level tools for cue management, fixture control, preset management, executor control, macro editing, appearance assignment, bulk operations, console state queries, show file management, read-back verification, and music show workflows.10017Apache 2.0
- AlicenseAqualityDmaintenanceMCP server for controlling Elgato Key Lights. Enables turning lights on/off, adjusting brightness and color temperature, applying presets, and triggering effects via Claude.13Apache 2.0
- AlicenseNot gradedqualityDmaintenanceControl a Govee BLE RGBIC LED strip from Claude (or any MCP client) over Bluetooth on macOS.MIT
- AlicenseNot gradedqualityBmaintenanceEnables Claude to discover and connect to Behringer digital mixers over OSC, read and write parameters, dump subtrees to show files, and push edited files back to the desk.MIT