video-capture-mcp
Provides screen recording capabilities for Android devices via ADB, allowing AI agents to capture UI motion and extract key frames.
Provides screen recording capabilities for iOS Simulator, enabling AI agents to record and extract frames from simulated iOS device interactions.
Provides screen recording capabilities for macOS, including app-window-bounded recording and cursor tracking, allowing AI agents to capture UI motion and extract key frames.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@video-capture-mcp record and extract frames from Finder"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
video-capture-mcp
macOS, iOS Simulator, and Android screen recording plus key-frame extraction for MCP-aware AI agents.
video-capture-mcp gives AI agents a stdio MCP server for recording UI motion while they operate apps, then extracting frames with ffmpeg. It is designed for bugs and requirements that screenshots miss, such as keyboards opening, hover/unhover states, and transient layout glitches.
Features
3 OS recording backends in one MCP server: macOS, iOS Simulator, and Android.
App-window-bounded macOS recording with activation and visible-region checks.
Manual start/stop recording across macOS, iOS Simulator, and Android.
Hover sequence API for UI demos that need mouse movement without clicks.
record_and_extractfor one-shot recording plus ffmpeg key-frame extraction.FastMCP
Imageinline responses for extracted frames.
Related MCP server: Mobile Device MCP
Requirements
macOS 12 or newer.
Python 3.11 or 3.12 for PyPI and
uvxinstalls. Homebrew installs its own Python dependency.uvfor theuvxinstall method (Option 1), which provides theuvxcommand. Option 2 (pip, standard CPython pip) and Option 3 (Homebrew) do not require uv. See the Quickstart for the install command, or the uv installation docs.ffmpegandffprobe.Xcode Command Line Tools for iOS Simulator recording.
Android platform-tools and
adbfor Android recording.
Installation
You do not need to clone this repository. Pick one install method below. New to MCP? Follow the numbered Quickstart instead: it walks through uv, ffmpeg, registration, and macOS permissions in order.
Option 1: uvx (zero install) [Recommended]
uvx is bundled with uv. If uv is not installed yet, see Quickstart step 1. Then register the server:
Claude Code:
claude mcp add --scope user --transport stdio video_capture -- uvx video-capture-mcpClaude Desktop:
{
"mcpServers": {
"video_capture": {
"command": "uvx",
"args": ["video-capture-mcp"]
}
}
}VS Code / Cursor:
{
"servers": {
"video_capture": {
"type": "stdio",
"command": "uvx",
"args": ["video-capture-mcp"]
}
}
}Codex:
[mcp_servers.video_capture]
command = "uvx"
args = ["video-capture-mcp"]Goose:
goose configure --name video_capture --command "uvx video-capture-mcp"Option 2: pip
python3 -m pip install video-capture-mcp
claude mcp add --scope user --transport stdio video_capture -- video-capture-mcpCodex:
[mcp_servers.video_capture]
command = "video-capture-mcp"
args = []Option 3: Homebrew
brew install Corvus400/tap/video-capture-mcp
claude mcp add --scope user --transport stdio video_capture -- video-capture-mcpCodex:
[mcp_servers.video_capture]
command = "video-capture-mcp"
args = []Quickstart (Claude Code)
Install
uv.curl -LsSf https://astral.sh/uv/install.sh | sh # or: brew install uvuvx(used below) ships withuv.Install
ffmpeg.brew install ffmpegRegister the MCP server.
claude mcp add --scope user --transport stdio video_capture -- uvx video-capture-mcpGrant macOS Screen Recording permission.
Recording requires Screen Recording permission. See the macOS Permissions section just below for the exact steps, and run
check_macos_permissionsfrom the agent if you are unsure which process to add.Record.
Ask Claude Code to start recording a visible app window:
{ "app_name": "Finder", "options": { "include_cursor": true } }Have the agent operate the UI, then call
mcp__video_capture__stop_recordingwith the returnedsession_id.
macOS Permissions
See docs/permissions.md for full details.
Screen Recording is required for
start_recording target=macosandstart_app_window_recording.Accessibility is required for
move_pointerandhover_sequence.This is a macOS TCC requirement and cannot be granted automatically by an MCP server. It is normally a one-time permission for the process that launches the server, not a per-recording step.
From Claude Code or Codex, use
check_macos_permissionswhen setup is unclear. It reports whether Screen Recording works, the launcher process macOS is evaluating, the System Settings location, and the required MCP client restart.Add the launcher process to System Settings > Privacy & Security > Screen Recording. For
uvxandpip, this is usually the Python interpreter for that environment. For Homebrew, it is the installedvideo-capture-mcpexecutable.
Tools
Tool | Purpose | Key args |
| Start recording on selected target |
|
| Stop a session and normalize orientation |
|
| Stop active sessions, optionally by target |
|
| macOS app-window-bounded recording |
|
| Activate and measure front-window visibility |
|
| Mouse-move sequence without clicks |
|
| Single mouse-move without click |
|
| ffmpeg scene or fixed-fps frame extraction |
|
| Record and extract in one call |
|
| List current recordings | none |
| Reap recordings from dead previous server PIDs | none |
| Diagnose macOS Screen Recording permission and setup guidance | none |
Detailed parameters and option schemas are in docs/tools.md.
Configuration
VIDEO_CAPTURE_MCP_OUTPUT_DIR: default output root for recordings whenoutput_pathis omitted. Defaults to the system temp directory undervideo-capture-mcp.
Troubleshooting
See docs/troubleshooting.md for TCC denial, missing ffmpeg, no booted Simulator, and unauthorized adb devices.
Development
See docs/development.md for clone, local install, tests, linting, package build, and the bin/video-capture-mcp from-source wrapper.
Security
See SECURITY.md. Report vulnerabilities through GitHub Private Security Advisories.
Explicit output_path values are treated as trusted MCP client input. Use MCP client approvals and filesystem policy to control where agents may write.
License
MIT. See LICENSE.
Available Tools
12 toolscheck_macos_permissionsA
Diagnose macOS Screen Recording permission for Claude Code/Codex users.
Use this before retrying `start_recording target="macos"` or
`start_app_window_recording` when macOS TCC may be blocking capture. The
response tells the client whether Screen Recording currently works, which
launcher process macOS is evaluating, where the user must grant permission,
and that the MCP client must be fully restarted after changing the setting.
Surface `user_message` directly when explaining the setup to the user.
This tool only checks Screen Recording. iOS Simulator and Android recordings
do not need Screen Recording. Pointer tools (`move_pointer` and
`hover_sequence`) need Accessibility permission instead.
Inputs: no named parameters. Returns: object
cleanup_stale_processesA
Clean up recording processes left by dead previous server processes.
start_recording automatically runs this check before creating a new session,
so explicit calls are normally only needed after a stale-process error or
after an interrupted client run.
Cleanup is limited to processes owned by the current OS user. The response
reports any killed process/session records under "cleaned".
Inputs: no named parameters. Returns: object
extract_framesA
Extract key frames or fixed-rate frames from a recorded video.
mode="scene" selects frames around visual changes and uses scene_threshold
to control sensitivity; lower thresholds produce more frames. mode="fixed_fps"
samples at fps and should be used when timing matters more than scene
changes.
max_frames limits output size. When more frames are found than allowed, the
response reports dropped_for_max. inline_images=True returns FastMCP Image
content for clients that can display frames directly.
rotate_degrees applies orientation normalization when a backend produced a
sideways recording. ffmpeg and ffprobe must be available on PATH.
Inputs: video_path (required), output_dir (required), mode, scene_threshold, +4 more. Returns: object
get_window_regionA
Return the visible front-window region for a macOS app.
Use this before macOS app or browser recording to verify the target window
is on screen, active, and sufficiently visible. The default
min_visible_ratio is 0.8; lower it only when partial visibility is
intentional.
The response includes visible, visible_ratio, region, frame, and screen
details. If visible is false, reposition or unminimize the window before
calling start_app_window_recording.
Inputs: app_name (required), padding, min_visible_ratio, activate. Returns: object
hover_sequenceA
Move the macOS pointer through hover/unhover points without clicking.
This is the preferred hover fallback for canvas-style, WebGL, native, or
otherwise inaccessible pages where Playwright cannot target DOM elements.
It posts only mouse-move events and does not click.
Pass app_name to activate the target app immediately before the hover
sequence. steps_per_segment controls interpolation density and
step_delay_seconds controls the pause between generated points.
The response includes moved_count and final position fields from pointer
movement. When app_name is provided, active_window contains the visibility
check result used before moving.
Inputs: points (required), hold_seconds, app_name, steps_per_segment, +1 more. Returns: object
list_active_sessionsA
List recording sessions owned by this running server process.
This does not discover recordings started by a dead prior server process;
use cleanup_stale_processes for that case. The response contains a
"sessions" list with session_id, target, target_key, video_path, mode,
started_at, duration_seconds, and pid for each active recording.
Inputs: no named parameters. Returns: object
move_pointerA
Move the macOS pointer to one coordinate without clicking.
Requires macOS Accessibility permission for the launcher process. Use this
for single-point hover-only desktop checks when Computer Use drag would send
a mouse-up event and might activate the target.
For multiple hover/unhover points, prefer hover_sequence because it can
activate an app_name first and interpolate movement across segments.
The response echoes the final x and y coordinates.
Inputs: x (required), y (required). Returns: object
record_and_extractA
Record a target for a fixed duration and extract frames in one call.
Use this when the recording length is known up front and no interactive
manual stop is needed. duration_seconds is required.
output_dir receives the captured recording file (recording.mov for macOS and
iOS Simulator, recording.mp4 for Android) and a frames/ directory containing
extracted images.
options are forwarded to start_recording. extract_options are forwarded to
extract_frames, including mode, scene_threshold, fps, max_frames,
inline_images, and rotate_degrees.
Inputs: target (required), duration_seconds (required), output_dir (required), options, +1 more. Returns: object
start_app_window_recordingA
Start recording only the visible front-window region of a macOS app.
This is the first choice for Chrome, Safari, and desktop-app debugging. It
activates app_name, verifies the front window meets min_visible_ratio, then
records only that visible region via screencapture -R instead of recording
the full desktop.
Omit duration_seconds for the preferred manual-stop workflow, then call
stop_recording with the returned session_id. Options are forwarded to the
macOS backend after region is injected.
If visibility validation fails, the response is {"error": ..., "window": ...}
so the client can reposition or unminimize the target and retry.
Inputs: app_name (required), duration_seconds, output_path, padding, +2 more. Returns: object
start_recordingA
Start recording a macOS, iOS Simulator, or Android screen target.
Target aliases:
- macOS: "macos", "mac", or "desktop"
- iOS Simulator: "ios_simulator", "ios-simulator", "ios", or "simulator"
- Android: "android"
Common options include orientation and rotate_degrees. macOS options include
region, display, include_cursor, include_clicks, and include_audio. iOS
Simulator options include device, udid, and display ("internal" or
"external"). Android options include serial, size, and bit_rate.
Omit duration_seconds for the preferred manual-stop workflow, then call
stop_recording with the returned session_id. The response includes
session_id, video_path, target, mode, started_at, pid, and target_key.
macOS recording requires Screen Recording permission for the launcher
process. For browser or desktop-app debugging, prefer
start_app_window_recording so the visible app window is checked and only
that window region is recorded.
Inputs: target (required), duration_seconds, output_path, options. Returns: object
stop_all_recordingsA
Stop all live recording sessions for this server process.
Use this when the client lost a session_id, duplicate-target protection is
blocking a new start_recording call, or before starting a fresh verification
run where old sessions would confuse results.
Pass target to filter by target family. Accepted values follow
start_recording aliases such as macos, ios_simulator, and android.
The response groups stopped session metadata under "stopped".
Inputs: target. Returns: object
stop_recordingA
Stop one manual recording session and verify the produced file.
Call this after start_recording or start_app_window_recording returned a
session_id and the UI interaction has finished.
Always inspect file_exists and file_size_bytes before extracting frames:
file_exists must be true and file_size_bytes must be greater than zero.
Android sessions may also include pull_returncode from adb file transfer.
If stopping fails or the file is missing/empty, use list_active_sessions and
cleanup_stale_processes before retrying. Permission failures usually require
user action in macOS System Settings or on the Android device.
Inputs: session_id (required). Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 12 tools
Each tool has a distinct purpose: permissions check, cleanup, frame extraction, window region detection, pointer movement, session management, and various recording start/stop variants. Even similar tools like start_recording and start_app_window_recording are clearly differentiated by target and use case.
All tool names follow a consistent verb_noun pattern in snake_case (e.g., check_macos_permissions, list_active_sessions, stop_recording). No mixing of camelCase or inconsistent verb styles.
With 12 tools, the server covers setup, recording, extraction, pointer control, and session management without being bloated. Each tool serves a clear function, and the count is appropriate for the domain.
Core workflows (record, stop, extract, cleanup, permissions) are covered. Minor gaps exist, such as no explicit tool to list available iOS simulators or Android devices, but the overall surface is comprehensive.
Maintenance
Related MCP Connectors
MCP server for Clipkit — gives AI agents a video toolbox via the Clipkit schema.
Hosted Screenshots MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
OCR, transcription, file extraction, and image generation for AI agents via MCP.
Give an AI agent an iPhone to see, tap and type on over MCP. Free early access (Simulator).
Related MCP Servers
- AlicenseAqualityCmaintenanceMCP server that gives AI agents full vision and control over Android devices via ADB and scrcpy. Supports screenshots, input, apps, UI automation, shell, files, and clipboard.38357 npm131MIT
- AlicenseNot gradedqualityCmaintenanceAn MCP server that lets AI agents control iOS and Android devices (tap, scroll, type, take screenshots, read UI trees, and run code). Works with multiple devices at the same time.94 npm54MIT
- AlicenseNot gradedqualityDmaintenanceFree, open-source screen recording MCP server for AI agents. Enables screen capture, screenshots, and frame extraction locally without cloud dependencies.6 npm1Apache 2.0
- AlicenseNot gradedqualityBmaintenanceMCP server providing AI-friendly computer-use primitives (capture, detect, click) to let LLM agents drive desktop GUI applications on Windows, macOS, and Linux.2MIT