Skip to main content

Lights-Pi · v2.14.0

Stage lights,on the network.Now they take instructions.

A headless QLC+ controller for the Raspberry Pi. Drive your DMX rig from any browser on the network — or hand the keys to Claude, ChatGPT, or any MCP-capable agent over the built-in Streamable HTTP endpoint.

live

Endpoint

5001/mcp
Transport
Streamable HTTP
LATEST
Auth
bearer token · optional
OFF BY DEFAULT
Resource
lights://workspace
ONE-SHOT CONTEXT

Hand your rigto an agent.

Lights Pi exposes the entire control surface as a Model Context Protocol endpoint over Streamable HTTP. Wire Claude Desktop, ChatGPT, Cursor, or a custom agent into the rig with a single line of configuration. The LLM gets structured tool calls — your rig stays the single writer.

claude_desktop_config.jsonpaste
{
  "mcpServers": {
    "qlc-lights": { "url": "http://lights.local:5001/mcp" }
  }
}
Read MCP_SERVER.md

Tools · 48

get_statuslist_fixturesget_fixture_channelslist_groupslist_sceneslist_templatesget_channel_valuesactivate_sceneapply_templateadjust_brightnessadjust_colorcolor_temperaturepalettestrobefadegenerate_sceneset_channelsave_scenesnapshot_sceneblackoutbatch_actionidentify_fixturecreate_groupdelete_groupupdate_groupadd_fixtures_to_groupremove_fixtures_from_groupdescribe_scenedelete_scenerename_sceneduplicate_scenelist_chasesdescribe_chasecreate_chasedelete_chasestart_chasestop_chaselist_cue_listsdescribe_cue_listget_active_cue_listscreate_cue_listupdate_cue_listdelete_cue_listgo_cue_liststop_cue_listtest_dmxget_logsget_system_info

Live transcript

Real conversation.Real DMX.

No quotes. No avatars. Just the actual exchange between an LLM agent and a Lights Pi rig — natural language in, structured MCP tool calls out, DMX over the wire in milliseconds.

The agent here is Claude Desktop, but any MCP-capable client works the same way.

lights.local:5001/mcp
session · 0x4f2a
user

Group the three front pars as 'key-lights', then set them to 3200K tungsten.

claude

Creating the group, then dialing the white balance.

batch_action([
  create_group("key-lights", fixtures: [0, 3, 4]),
  color_temperature(3200, groups: ["key-lights"])
])
2 actions · 3 fixtures at 3200K · warm 220, cool 35· 62ms
user

Set three-point lighting — tungsten key, daylight fill, magenta back.

claude

Assigning the palette across all three groups in one call.

palette({
  "key-lights":  3200,
  "fill-lights": 5600,
  "back-lights": "magenta"
})
3/3 groups · 8 fixtures lit· 54ms
user

Save this as 'evening edit'.

claude

Snapshotting current channel state.

snapshot_scene("evening edit")
Scene 14 saved · workspace updated· 18ms
user

Build me a cue list for a 30-second intro: open on daylight, sunset transition at eight seconds, strobe accent at twenty-two, fade out at twenty-eight.

claude

Building the show. Press GO when your audio rolls.

create_cue_list("Intro", cues: [
  { at: "0:00",  scene:  "Daylight" },
  { at: "0:08",  chase:  "Sunset" },
  { at: "0:22",  action: "strobe", parameters: { rate: 8 } },
  { at: "0:24",  action: "strobe", parameters: { rate: "off" } },
  { at: "0:28",  action: "fade",   parameters: { target: "0", duration: "2" } },
  { at: "0:30",  action: "blackout" }
])
Cue list 3 created · 6 cues · 0:30.000 total· 47ms
user

GO.

claude

Running.

go_cue_list("Intro")
Started at 14:07:32 · 6 cues queued · 0:30.000 duration· ack 11ms · runtime 30.0s
user