obs-mcp: Turning Claude into an OBS Technical Director

A protocol-first MCP server that maps OBS WebSocket v5 into safe, structured tools, so an AI assistant can switch scenes, mute sources, and drive a live production without falling apart when OBS does.

8 to 10 min read • View on GitHub • More from royshil

A wide broadcast desk with an OBS preview on one side and a conversational AI panel on the other, connected by a thin control line. The scene shows that the assistant is not just chatting about production, it is issuing live commands into a real studio workflow.
The pitch is simple. An AI assistant becomes a technical director for OBS, but only because the bridge is strict enough to survive live software.
Key Takeaways

The director who never touches OBS

The useful trick here is not that OBS can be controlled from code. OBS has been scriptable for years. The shift is that Claude can now act like a live technical director, asking for scene changes, audio mutes, transitions, and recording controls in plain language while the server translates those requests into OBS actions.

That makes obs-mcp interesting in a way most glue code is not. It sits between a conversational model and a stateful broadcast app, where timing matters, state changes matter, and failure is not theoretical.

Why OBS is a hard target for AI control

OBS is not an API-first backend. It is a live desktop application with scenes, sources, hotkeys, authentication, and a moving target of runtime state. If the app disappears and returns, the control plane has to recover without dragging the whole assistant session down with it.

Control modeSetup burdenNatural languageRestart resilienceAutomation depthBest fit
Manual clicking in OBSLowNoDepends on the operatorHigh, but human-limitedOne-off changes and ad hoc production
Stream Deck or hotkeysMediumNoGood for local bindingsMediumFast muscle-memory workflows
Raw OBS WebSocket scriptingHighNoDepends on the scriptVery highCustom automation and integrations
obs-mcp through MCPMediumYesBuilt for reconnectsHighAssistant-driven live control

OBS is a hard target because it is stateful and failure-prone. The bridge has to validate inputs, track requests, and reconnect without tearing down the MCP server.

The protocol-first bet

The repo does not expose a vague chatbot wrapper around OBS. It maps a broad slice of OBS WebSocket v5 into discrete MCP tools, which is a very different choice. The payoff is that the assistant gets specific capabilities, not a single command bucket that has to be interpreted every time.

That design shows up in the codebase structure. The TypeScript side is modular, with tool groups for scenes, sources, streaming, recording, and general operations. The project also carries a parallel Python tree and a split protocol JSON set under docs, which suggests that the API surface is being treated like something to model, not something to hand-wave.

A close-up mechanical bridge with a request card on the left, a validation chamber in the middle, and OBS WebSocket packets on the right. The image explains how structured tool calls are checked, routed, and resolved before the response reaches the assistant.
The bridge is the product. Tool calls do not go straight to OBS. They pass through validation, request tracking, and a response map first.

Inside the bridge: MCP on one side, OBS on the other

The architecture is more interesting than a simple client-server sketch. On one side, the MCP host talks over stdio. On the other, the server maintains a WebSocket connection to OBS, with a custom client handling the handshake, authentication, event stream, and request-response correlation.

Model request
  -> MCP tool call
  -> Zod validation
  -> OBS request with ID
  -> pendingRequests map stores promise
  -> OBS WebSocket response
  -> promise resolves
  -> MCP content block returns to the client

OBS events flow separately
  -> EventEmitter
  -> tool state updates / notifications

That request map matters. WebSockets are asynchronous, but the assistant still needs a clean response for the exact call it made. By pairing each outbound request with an ID and resolving the right promise when the reply comes back, the server keeps the conversation deterministic even when OBS is noisy.

How it stays alive when OBS disappears

This is the most production-minded part of the repo. The server is designed to keep running even if OBS is closed, restarted, or temporarily unreachable. A watchdog checks the connection, retry logic backs off, and the MCP process stays alive instead of collapsing into a dead session.

Failure caseNaive wrapperobs-mcp behavior
OBS is not running at startupServer fails hardMCP server stays up and retries in the background
OBS closes during a sessionTooling breaks immediatelyReconnect loop keeps looking for OBS
A request is in flight during reconnectState is ambiguousPending request tracking and retry logic reduce drift
The assistant keeps asking for actionsCalls are blocked or crashThe MCP side remains available and can recover

That matters because the whole point of local control is that local software is messy. A cloud API can assume availability. OBS cannot. If you want an AI assistant to operate a live studio, resilience is not a nice-to-have. It is the feature that makes the rest believable.

Why this is different from scripts, Stream Decks, and direct WebSocket calls

ApproachStrengthWeaknessWhat obs-mcp adds
ScriptsFlexible and familiarCan get brittle fastA structured MCP interface with schemas and tool discovery
Stream Decks and hotkeysFast for operatorsRequires manual mappingNatural language control and broader automation
Direct OBS WebSocket callsClose to the metalMore integration workA ready-made assistant-facing control plane
obs-mcpAssistant-friendly and resilientStill tied to OBS and MCP clientsA protocol-first bridge that survives app churn

The result is not a universal replacement. It is a better fit for a specific job: structured, recoverable, assistant-driven control of a real desktop production tool. That is a narrower claim than magic, and a more useful one.

What this project suggests about the future of local software control

OBS is a good proof case because it is familiar, operationally complex, and unforgiving. If MCP can handle a tool like this, then the pattern is bigger than broadcast software. It can become a practical control layer for other local apps that have state, timing, and failure modes that do not fit a plain chat interface.

That is the real significance of obs-mcp. It shows that an LLM does not have to be a fuzzy assistant on top of software. With the right protocol boundary, it can be a reliable operator inside a messy real-world workflow.