Pointing an AI assistant at pMix
There are two ways to hand pMix.studio to an AI assistant, and which one you use depends entirely on whether your client supports MCP.
| MCP | REST + a primer | |
|---|---|---|
| Client speaks MCP | Claude Code, Claude Desktop, Cursor, Windsurf, Zed | — |
| Client doesn’t | — | ChatGPT, a browser chat, your own agent code |
| Setup | One command | Paste one block of text |
| Tool discovery | Automatic | The assistant fetches /manifest |
Both hit the same dispatcher inside the app, so behaviour is identical either way.
The one thing to know: /manifest
Don’t try to teach an assistant the whole API by hand — it’ll go stale and you’ll get hallucinated endpoints. Instead, point it at:
GET http://<ipad-address>:6006/manifest
/manifest is an unauthenticated, machine-readable description of every operation your installed version supports: the id, the domain it belongs to, whether it’s a read or a write, a risk rating, a human description, and the full JSON input schema. It’s the same registry the MCP server serves its tool list from, so it can never disagree with what the app actually does.
An assistant that fetches /manifest once at the start of a session knows the real, current API — including anything added since these docs were written.
GET /info is the lighter version: device identity plus a flat list of REST endpoints.
Option A — MCP (best, if your client supports it)
Claude Code
claude mcp add --transport http pmix http://192.168.1.42:6006/mcp
Read-only tools work straight away. Add the token so writes work too:
claude mcp add --transport http pmix http://192.168.1.42:6006/mcp \
--header "Authorization: Bearer <token>"
Get the token from Settings → Control API → API Token on the iPad.
Clients that only speak stdio
Bridge with mcp-remote. The --allow-http flag is required — the Control API is plain HTTP on your LAN, not HTTPS.
{
"mcpServers": {
"pmix": {
"command": "npx",
"args": ["-y", "mcp-remote", "http://192.168.1.42:6006/mcp", "--allow-http"]
}
}
}
Anything else
The endpoint is POST /mcp, JSON-RPC 2.0 over Streamable HTTP, protocol version 2025-03-26. Standard initialize / tools/list / tools/call. Check the catalog by hand:
curl -sS -X POST -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' \
http://192.168.1.42:6006/mcp
Read-only tools need no token. Write tools return the inner 401 as an error result, so the assistant can see what went wrong and ask you for the token rather than silently failing.
Option B — REST plus a primer
For an assistant with no MCP support but the ability to make HTTP requests (ChatGPT with a tool, a browser agent, your own code), paste the block below into the system prompt or the first message. Replace the address with your iPad’s.
You can control a pMix Studio live video mixer over the local network.
BASE URL: http://192.168.1.42:6006
Before doing anything else, fetch GET /manifest. It returns every operation
this mixer supports, with a JSON input schema for each. Treat it as the
authoritative API reference and prefer it over anything you remember. GET /info
returns the flat endpoint list if you want something smaller.
AUTH
Reads (GET) need no token.
Writes (POST/PUT/DELETE) need: Authorization: Bearer <TOKEN>
GET /screenshot also needs the token — it can capture on-screen credentials.
My token is: <PASTE TOKEN HERE>
CORE READS
GET /state full production state: switcher, inputs, mixer, output,
scenes, recording
GET /inputs input slots and their source_ids
GET /switcher what is on program and preview right now
GET /mixer audio rows, volumes, mutes, groups
GET /output streaming/recording state and destinations
GET /snapshot JPEG of the current program frame
CORE WRITES
POST /switcher/preview {"source_id": "..."}
POST /switcher/program {"source_id": "..."} cuts straight to air
POST /switcher/cut {} preview -> program
POST /switcher/take {} animated transition
PUT /mixer/sources/{id} {"volume": 0.8, "mute": false}
PUT /mixer/master {"volume": 0.9}
POST /output/start {} GOES LIVE
POST /output/stop {}
CONVENTIONS
Volumes are 0.0 (silent) to 1.0 (unity), never dB.
Bitrate fields end in _bps, durations end in _s, and JSON keys are snake_case.
All ids are strings; get source_ids from GET /inputs, never invent one.
Errors are {"error": {"code": "...", "message": "..."}}. When you send an
invalid enum value the message lists the valid ones — read it and retry.
HOW TO WORK
Read GET /state before acting so you know what is actually on air.
Standard switching is preview-then-cut: set preview, confirm it is right,
then cut. POST /switcher/program puts a source on air immediately with no
preview step.
Never call /output/start, /output/stop, /recording/stop, or /switcher/ftb
without asking me first. Those are visible to the audience.
The primer is also available as a plain-text file you can hand to an assistant by URL, which is handy for clients that can fetch a page but can’t reach your LAN to read /manifest themselves:
https://pmix.studio/control-api.txt
Working safely on a live show
An assistant driving a mixer is driving something an audience is watching. A few things worth putting in your prompt:
- Name the destructive operations.
/output/start,/output/stop,/recording/stop, and/switcher/ftb(fade to black) are all instantly visible. Tell the assistant to confirm before any of them. Every entry in/manifestcarries ariskrating —read,safe_write,show_affecting,destructive, orui_automation— so an assistant can filter on it, but saying it in plain language too tends to work better. - Prefer preview-then-cut.
POST /switcher/programskips preview and goes straight to air. For anything the assistant isn’t certain about, have it set preview and describe what it sees first. - Let it look.
GET /snapshotreturns a JPEG of the current program frame, andGET /snapshot/{source_id}any individual source. A vision-capable assistant can check its own work before cutting. ThescreenshotMCP tool returns the whole app window as an image block for the same reason. - Give it read-only access if you want. Simply don’t hand over the token. Every GET keeps working, so the assistant can monitor, report, and answer questions about the show without being able to change anything.
- Watch the stream instead of polling.
GET /events?topics=*is a server-sent-events feed — a snapshot on connect, then deltas as things change, plus audio levels every tick. Much better than an agent hammering/statein a loop.