ATEM MCP Server

ATEM MCP Server

Enables natural language control of Blackmagic ATEM video switchers via the Model Context Protocol. It allows users to manage camera switching, transitions, audio mixing, macros, and streaming operations through AI assistants.

Category
访问服务器

README

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/node with your full Node.js path (run which node to 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

  1. Go to claude.ai/settings/connectors
  2. Click Add custom connector
  3. Enter your MCP URL (e.g., https://atem.yourdomain.com/mcp)
  4. Click Connect — the OAuth flow completes automatically
  5. 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
  • cloudflared CLI installed (brew install cloudflared on 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 atem-mcp atem.yourdomain.com

3. Create config file (~/.cloudflared/config.yml)

tunnel: <TUNNEL_ID>
credentials-file: ~/.cloudflared/<TUNNEL_ID>.json

ingress:
  - hostname: atem.yourdomain.com
    service: http://localhost:3000
  - service: http_status:404

4. Start the server and tunnel

# Terminal 1: MCP server
TRANSPORT=http BASE_URL=https://atem.yourdomain.com ATEM_HOST=192.168.1.100 node dist/index.js

# Terminal 2: Cloudflare tunnel
cloudflared tunnel run atem-mcp

Your MCP endpoint is now live at https://atem.yourdomain.com/mcp.

Critical: Disable Cloudflare AI Bot Blocking

If you use Cloudflare and connect from claude.ai, you must disable AI bot blocking or claude.ai's requests will be silently blocked with a 403.

Claude.ai's backend uses the Claude-User user agent from Google Cloud Platform IPs. Cloudflare's "Block AI training bots" managed rule blocks these requests before they reach your server.

To fix:

  1. Go to Cloudflare Dashboard > select your domain
  2. On the Overview page, find "Block AI training bots" on the right sidebar
  3. Change from "Block on all pages" to "Do not block (allow crawlers)"

You can verify in Security > Analytics > Events — blocked requests show as Service: Managed rules, Rule: Manage AI bots, User agent: Claude-User.

Run as a Background Service (macOS)

sudo cloudflared service install

This creates a launch daemon that starts the tunnel on boot.

Useful Commands

cloudflared tunnel list              # List all tunnels
cloudflared tunnel info atem-mcp     # Show tunnel details
cloudflared tunnel cleanup atem-mcp  # Remove stale connections
cloudflared tunnel delete atem-mcp   # Delete the tunnel entirely

Available Tools (58 tools)

Connection

Tool Description
atem_connect Connect to an ATEM switcher by IP
atem_disconnect Disconnect from the ATEM
atem_get_status Get model, inputs, program/preview state

Switching

Tool Description
atem_set_program Set program (live) input
atem_set_preview Set preview (next) input
atem_cut Hard cut transition
atem_auto_transition Auto transition (dissolve/wipe/etc.)
atem_fade_to_black Toggle Fade to Black
atem_preview_and_auto Set preview + auto transition in one call

Transitions

Tool Description
atem_set_transition_style Set mix, dip, wipe, DVE, or stinger
atem_set_transition_rate Set transition duration in frames
atem_set_transition_position Manual T-bar position (0.0–1.0)
atem_get_transition_state Get current transition settings

Routing & Keyers

Tool Description
atem_set_aux_source Route input to aux output
atem_get_aux_source Get current aux routing
atem_set_dsk_on_air Downstream keyer on/off air
atem_auto_dsk Auto transition for DSK
atem_set_dsk_sources Set DSK fill and key sources
atem_set_usk_on_air Upstream keyer on/off air
atem_set_usk_sources Set USK fill and cut sources

Macros

Tool Description
atem_macro_run Run a macro by index
atem_macro_stop Stop running macro
atem_macro_continue Continue paused macro
atem_list_macros List all defined macros

Recording & Streaming

Tool Description
atem_start_recording Start recording
atem_stop_recording Stop recording
atem_start_streaming Start streaming
atem_stop_streaming Stop streaming
atem_get_recording_status Get recording/streaming status

Super Source

Tool Description
atem_get_supersource_state Get all box positions, sources, art, and border settings
atem_set_supersource_box Configure a single box (source, position, size, crop)
atem_set_supersource_layout Set layout with presets (side-by-side, 2x2 grid, PiP, etc.)
atem_set_supersource_art Configure art fill/cut source, foreground/background
atem_set_supersource_border Configure border width, color, bevel, light source
atem_go_gallery 2x2 gallery grid: host + 3 guests, prioritizes active speakers via audio levels
atem_cut_to_active_speaker Cut full-screen to whoever is currently talking (detected via audio levels)
atem_auto_switch_on Start auto-switching: program mode (full-screen), ssrc_box mode (Super Source box), or host_ssrc mode (host full-screen + guest side-by-side)
atem_auto_switch_off Stop auto-switching mode
atem_get_auto_switch_status Check if auto-switch is running, see stats
atem_save_look Save current Super Source layout as a named "look" (boxes, art, border)
atem_load_look Load a saved look and apply it — optionally override sources for different guests
atem_list_looks List all saved looks with descriptions and box counts
atem_delete_look Delete a saved look

Audio Mixer (Fairlight + Classic)

Audio tools auto-detect the mixer type. Fairlight is used on ATEM Mini Extreme, Constellation, and newer models. Classic is used on ATEM Mini, Mini Pro, and older models.

Tool Description
atem_set_audio_mixer_input Set input gain, fader, balance, mix mode (Fairlight or Classic)
atem_set_audio_master_output Set master output gain/fader
atem_get_audio_state Get full audio mixer state (reports mixer type)

Fairlight EQ & Dynamics

Full parametric EQ, compressor, limiter, and gate/expander control for ATEM models with Fairlight audio (Mini Extreme, Constellation, and newer). Includes EQ presets for common use cases.

Tool Description
atem_set_fairlight_eq Set individual EQ band (shape, frequency, gain, Q) on an input
atem_set_fairlight_eq_preset Apply EQ preset: vocal, podcast, music, de_mud, or flat
atem_set_fairlight_compressor Set compressor (threshold, ratio, attack, hold, release)
atem_set_fairlight_limiter Set limiter (threshold, attack, hold, release)
atem_set_fairlight_gate Set noise gate/expander (threshold, range, ratio, attack, release)
atem_get_fairlight_eq_state Get full EQ + dynamics state for an input
atem_set_fairlight_master_eq Set EQ band on master output
atem_set_fairlight_master_compressor Set compressor on master output
atem_set_fairlight_master_limiter Set limiter on master output
atem_set_fairlight_makeup_gain Set makeup gain on an input
atem_reset_fairlight_dynamics Reset compressor/limiter/gate to factory defaults
atem_reset_fairlight_eq Reset EQ to factory defaults

Common Input IDs

ID Source
1–20 Physical SDI/HDMI inputs
1000 Color Bars
2001 Color Generator 1
2002 Color Generator 2
3010 Media Player 1
3011 Media Player 1 Key
3020 Media Player 2
3021 Media Player 2 Key
6000 Super Source
10010 Black
10011 Clean Feed 1 (Program)
10012 Clean Feed 2

Example Conversations

Basic switching:

"Put camera 1 on program"
"Set preview to camera 3 and do a 2-second dissolve"
"Cut to color bars"

Show setup:

"Set transition style to mix with a 45-frame rate"
"Route camera 1 to aux 1 for the confidence monitor"
"Put DSK1 on air for the lower third graphic"

Streaming/Recording:

"Start streaming and recording"
"What's the recording status?"
"Stop streaming but keep recording"

Audio (Fairlight & Classic):

"Lower camera 2 audio by 5 dB" "Set camera 1 audio to audio-follow-video mode" "Mute audio on input 3" "Set master output to -3dB" "Show me the audio mixer state"

Fairlight EQ & Dynamics:

"Apply vocal EQ preset to mic 1" "Boost presence at 3kHz on camera 2 audio" "Add a compressor to mic 1 — 4:1 ratio, threshold at -20dB" "Gate mic 2 so it cuts off below -40dB" "Put a limiter on the master at -3dB" "Show me the EQ and dynamics state for input 1" "Reset all EQ on camera 1 to flat"

Gallery & Active Speaker:

"Go gallery" "Go gallery with guests on cameras 2, 3, and 5" "Cut to active speaker" "Auto switch" (starts following the active speaker continuously) "Auto switch host + active speaker" (host full-screen when talking, side-by-side when guest talks) "Auto switch off" "Set up a side-by-side with cameras 1 and 2" "Cut to host with 3"

Save & Recall Looks:

"Save this look as podcast4" "Load podcast4" "Load podcast4 with cameras 2, 3, 6, 7" (reuses layout geometry with different sources) "What looks do I have saved?" "Delete the old_test look"

Architecture

This server uses the atem-connection library (by NRK/Sofie TV Automation) which implements Blackmagic's proprietary ATEM protocol over UDP. It's the same protocol that ATEM Software Control uses, so all changes are reflected in real time across all connected clients.

The MCP server wraps atem-connection methods as MCP tools that Claude (or any MCP-compatible AI) can call. Each tool maps to one or more ATEM commands.

Transport modes:

  • stdio (default) — for Claude Desktop, Cursor, and local MCP clients
  • HTTP (TRANSPORT=http) — Streamable HTTP with OAuth 2.0, for claude.ai, Claude Mobile, and remote access. Uses Express + raw http.createServer for proper header handling with the MCP SDK.

Live Show Usage

When using this server to control an ATEM during a live production, you need every command to execute instantly — no confirmation dialogs, no approval prompts, no delays. The experience varies by client:

Client Behavior

Client Tool Approval Best For
claude.ai No approval needed — tools run immediately Live shows, remote control
Claude Mobile No approval needed — tools run immediately On-the-go control
Claude Desktop No approval needed — tools run immediately Local production control
Claude Code (CLI) Requires approval for each tool call Development and testing only
Cursor May require approval depending on settings Development and testing

For live production, use claude.ai, Claude Mobile, or Claude Desktop. These clients execute MCP tool calls without interruption — you say "cut to camera 2" and it happens immediately.

Claude Code (the terminal CLI) is designed for software development and has a safety system that prompts for approval before running tools. This is great for coding but unsuitable for live switching where every second counts.

Pre-Show Checklist

Run through this checklist before going live to catch issues early:

  1. Verify connection"Show me the switcher status"
  2. Test switching"Put camera 1 on preview, then cut to it"
  3. Test transitions"Set transition to mix at 30 frames and dissolve to camera 2"
  4. Test audio"Show me the audio mixer state"
  5. Test recording/streaming"Start recording" → verify → "Stop recording"
  6. Test Super Source (if using) — "Set up a side-by-side with cameras 1 and 2"
  7. Set your show defaults — transition style, rate, audio levels, EQ presets

Tips for Live Production

  • Set ATEM_HOST in your environment so the server auto-connects on startup — no need to manually connect each time
  • Use specific language"Cut to camera 3" is faster than "Can you switch to the third camera please?"
  • Combine commands"Put camera 2 on preview and dissolve to it" executes as a single preview_and_auto call
  • Keep a fallback — Always have ATEM Software Control or a hardware panel available in case of network issues

Troubleshooting

Hammer icon not showing in Claude Desktop:

  • Make sure you're using the full path to node (run which node)
  • Check logs: ~/Library/Logs/Claude/mcp*.log
  • Restart Claude Desktop completely (quit, not just close window)

Can't connect to ATEM:

  • Verify the ATEM is on the same network
  • Try pinging the ATEM IP from terminal
  • Default ATEM port is 9910 (UDP)
  • Make sure ATEM Software Control isn't blocking the connection

claude.ai connector shows auth error:

  • Check Cloudflare "Block AI training bots" is set to "Do not block" (see Cloudflare section)
  • Check Security > Analytics > Events in Cloudflare dashboard for blocked requests
  • Verify BASE_URL matches your public tunnel URL exactly
  • Test with curl -X POST https://your-url/mcp — should return 401 JSON (not 403 HTML)

HTTP server returns 406 Not Acceptable:

  • The MCP SDK requires Accept: application/json, text/event-stream but some clients send Accept: */*
  • The server includes a built-in workaround that patches the Accept header at the raw HTTP level

Commands not working:

  • Some features require specific ATEM models (e.g., streaming/recording on Mini Pro+)
  • Check atem_get_status to verify connection

Credits

License

MIT

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选