Skip to main content
Glama

video-capture-mcp

macOS, iOS Simulator, and Android screen recording plus key-frame extraction for MCP-aware AI agents.

PyPI CI License: MIT Python macOS

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_extract for one-shot recording plus ffmpeg key-frame extraction.

  • FastMCP Image inline responses for extracted frames.

Related MCP server: Mobile Device MCP

Requirements

  • macOS 12 or newer.

  • Python 3.11 or 3.12 for PyPI and uvx installs. Homebrew installs its own Python dependency.

  • uv for the uvx install method (Option 1), which provides the uvx command. 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.

  • ffmpeg and ffprobe.

  • Xcode Command Line Tools for iOS Simulator recording.

  • Android platform-tools and adb for 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.

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-mcp

Claude 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-mcp

Codex:

[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-mcp

Codex:

[mcp_servers.video_capture]
command = "video-capture-mcp"
args = []

Quickstart (Claude Code)

  1. Install uv.

    curl -LsSf https://astral.sh/uv/install.sh | sh
    # or: brew install uv

    uvx (used below) ships with uv.

  2. Install ffmpeg.

    brew install ffmpeg
  3. Register the MCP server.

    claude mcp add --scope user --transport stdio video_capture -- uvx video-capture-mcp
  4. Grant macOS Screen Recording permission.

    Recording requires Screen Recording permission. See the macOS Permissions section just below for the exact steps, and run check_macos_permissions from the agent if you are unsure which process to add.

  5. 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_recording with the returned session_id.

macOS Permissions

See docs/permissions.md for full details.

  • Screen Recording is required for start_recording target=macos and start_app_window_recording.

  • Accessibility is required for move_pointer and hover_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_permissions when 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 uvx and pip, this is usually the Python interpreter for that environment. For Homebrew, it is the installed video-capture-mcp executable.

Tools

Tool

Purpose

Key args

start_recording

Start recording on selected target

target, duration_seconds, options

stop_recording

Stop a session and normalize orientation

session_id

stop_all_recordings

Stop active sessions, optionally by target

target

start_app_window_recording

macOS app-window-bounded recording

app_name, duration_seconds, options

get_window_region

Activate and measure front-window visibility

app_name, min_visible_ratio

hover_sequence

Mouse-move sequence without clicks

points, hold_seconds, app_name

move_pointer

Single mouse-move without click

x, y

extract_frames

ffmpeg scene or fixed-fps frame extraction

video_path, mode, max_frames

record_and_extract

Record and extract in one call

target, duration_seconds, output_dir

list_active_sessions

List current recordings

none

cleanup_stale_processes

Reap recordings from dead previous server PIDs

none

check_macos_permissions

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 when output_path is omitted. Defaults to the system temp directory under video-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 tools
check_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

    A4.4/5.0

    Scored across 12 tools

    Disambiguation5/5

    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.

    Naming Consistency5/5

    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.

    Tool Count5/5

    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.

    Completeness4/5

    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

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      C
      maintenance
      MCP 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.
      38
      357 npm
      131
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      An 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 npm
      54
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Free, open-source screen recording MCP server for AI agents. Enables screen capture, screenshots, and frame extraction locally without cloud dependencies.
      6 npm
      1
      Apache 2.0
    • A
      license
      Not graded
      quality
      B
      maintenance
      MCP server providing AI-friendly computer-use primitives (capture, detect, click) to let LLM agents drive desktop GUI applications on Windows, macOS, and Linux.
      2
      MIT