Control Blackmagic ATEM video switchers with AI assistants
ATEM MCP Server
Control Blackmagic ATEM video switchers with AI assistants using the Model Context Protocol. Works with Claude Desktop, claude.ai, Claude Mobile, Cursor, and any MCP-compatible client.
Talk to your switcher in plain English: "Put camera 2 on program and dissolve to it" or "Start streaming and recording" or "Run macro 3."
Supports both local (stdio) and remote (Streamable HTTP with OAuth 2.0) transports.
How It Works
You (natural language)
│
▼
Claude (Anthropic Cloud)
│ translates to MCP tool calls
▼
ATEM MCP Server (your Mac/PC)
│ uses atem-connection library
▼
ATEM Switcher (network)
│ executes commands
▼
ATEM Software Control / hardware
│ reflects changes in real time
Supported ATEM Models
The underlying atem-connection library (by NRK/Sofie) supports every ATEM generation:
- ATEM Mini, Mini Pro, Mini Pro ISO, Mini Extreme, Mini Extreme ISO
- ATEM Television Studio HD, HD8, HD8 ISO
- ATEM 1 M/E, 2 M/E, 4 M/E Production Studio / Constellation
- ATEM SDI, SDI Pro ISO, SDI Extreme ISO
- And all other Blackmagic ATEM models
Quick Start
1. Install
cd atem-mcp-server
npm install
npm run build
2. Configure Claude Desktop
Edit your Claude Desktop config file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"atem": {
"command": "/opt/homebrew/bin/node",
"args": ["/path/to/atem-mcp-server/dist/index.js"],
"env": {
"ATEM_HOST": "192.168.1.100"
}
}
}
}
Note: Replace
/opt/homebrew/bin/nodewith your full Node.js path (runwhich nodeto find it). Replace the IP with your ATEM's address.
3. Restart Claude Desktop
Quit and relaunch Claude Desktop. You should see the hammer (🔨) icon indicating MCP tools are available.
4. Start Talking to Your Switcher
- "Connect to my ATEM at 192.168.1.100"
- "Show me the current switcher status"
- "Put camera 3 on preview and dissolve to it"
- "Fade to black"
Environment Variables
| Variable | Description | Default |
|---|---|---|
ATEM_HOST |
ATEM IP address (enables auto-connect) | — |
ATEM_PORT |
ATEM port | 9910 |
TRANSPORT |
Transport mode: stdio or http |
stdio |
PORT |
HTTP server port (when TRANSPORT=http) |
3000 |
BASE_URL |
Public URL for OAuth endpoints (when behind a tunnel/proxy) | http://localhost:PORT |
If ATEM_HOST is set, the server auto-connects on startup. Otherwise, use atem_connect to connect manually.
Remote Access (claude.ai, Claude Mobile, HTTP)
The HTTP transport exposes the MCP server as a web endpoint with built-in OAuth 2.0. This enables remote access from claude.ai, Claude Mobile, and any HTTP-capable MCP client.
Quick Start (HTTP Mode)
TRANSPORT=http BASE_URL=https://atem.yourdomain.com ATEM_HOST=192.168.1.100 node dist/index.js
The server starts on port 3000 with:
- MCP endpoint:
POST /mcp(Bearer token required) - OAuth 2.0: Full auto-provisioning flow (discovery, registration, authorization, token exchange)
- Health check:
GET /health
Connect from claude.ai
- Go to claude.ai/settings/connectors
- Click Add custom connector
- Enter your MCP URL (e.g.,
https://atem.yourdomain.com/mcp) - Click Connect — the OAuth flow completes automatically
- Start a conversation and control your ATEM remotely
Connect from Claude Desktop (Remote)
{
"mcpServers": {
"atem": {
"url": "https://atem.yourdomain.com/mcp"
}
}
}
No command or args needed — the server runs remotely.
OAuth 2.0 Implementation
The HTTP server implements a complete OAuth 2.0 flow for MCP authentication:
| Endpoint | Purpose |
|---|---|
GET /.well-known/oauth-protected-resource |
RFC 9728 resource metadata |
GET /.well-known/oauth-authorization-server |
Authorization server metadata |
POST /register |
Dynamic Client Registration (DCR) |
GET /authorize |
Authorization endpoint (auto-approves) |
POST /token |
Token exchange (issues Bearer tokens) |
The OAuth server auto-provisions tokens without user interaction — designed for personal/trusted use. For production environments, consider adding proper authentication.
Expose with Cloudflare Tunnel
Use a named Cloudflare Tunnel for a permanent URL — no port forwarding, no dynamic DNS, no changing URLs.
Prerequisites
- A free Cloudflare account
- A domain managed by Cloudflare DNS
cloudflaredCLI installed (brew install cloudflaredon macOS)
Setup
1. Authenticate and create tunnel
cloudflared login
cloudflared tunnel create atem-mcp
Note the tunnel ID (a UUID).
2. Route DNS
cloudflared tunnel route dns at
Tools (1)
atem_connectConnect to an ATEM switcher at a specific IP addressEnvironment Variables
ATEM_HOSTATEM IP address (enables auto-connect)ATEM_PORTATEM portTRANSPORTTransport mode: stdio or httpPORTHTTP server port (when TRANSPORT=http)BASE_URLPublic URL for OAuth endpointsConfiguration
{"mcpServers": {"atem": {"command": "/opt/homebrew/bin/node", "args": ["/path/to/atem-mcp-server/dist/index.js"], "env": {"ATEM_HOST": "192.168.1.100"}}}}