Skip to main content
Glama

screen-recorder-mcp

MCP server that gives Claude and AI agents start/stop control over full-screen recordings on macOS — powered by FFmpeg avfoundation.

CI


What Is This?

This is a Model Context Protocol (MCP) server that wraps macOS screen recording via FFmpeg's avfoundation input. It lets Claude, or any MCP-compatible AI agent, start and stop full-desktop screen recordings with a simple tool call — no manual terminal commands needed.

Perfect for recording demos, bug reproductions, or documentation walkthroughs driven entirely by AI.

Related MCP server: video-capture-mcp

Demo

You:    "Record my screen to ~/Desktop/demo.mp4 in high quality"
Claude: calls start_recording(output_path: "~/Desktop/demo.mp4", quality: "high")
        "Recording started! Screen index: 1, FPS: 30, Quality: high."

        ... you do the demo ...

You:    "Stop the recording"
Claude: calls stop_recording()
        "Recording stopped. Saved to ~/Desktop/demo.mp4 (34s, 12.8 MB)"

Prerequisites

Requirement

How to get it

macOS 12+

Monterey or later

FFmpeg

brew install ffmpeg

Node.js 18+

brew install node or nodejs.org

Screen Recording permission

System Settings (see Permissions Setup)

Installation

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "screen-recorder": {
      "command": "npx",
      "args": ["screen-recorder-mcp"]
    }
  }
}

Then restart Claude Desktop.

Claude Code

Add as an MCP server — works immediately without restart:

claude mcp add screen-recorder -- npx screen-recorder-mcp

Then in any Claude Code conversation:

You: "List my screen devices"
You: "Start recording my screen"
You: "Stop the recording"

To remove:

claude mcp remove screen-recorder

Global Install

npm install -g screen-recorder-mcp

Cursor / VS Code / Other MCP Clients

Add to your MCP client's configuration file (e.g., .cursor/mcp.json, .vscode/mcp.json):

{
  "mcpServers": {
    "screen-recorder": {
      "command": "npx",
      "args": ["screen-recorder-mcp"]
    }
  }
}

Smithery Registry

This server is listed on Smithery for one-click installation in compatible MCP clients.

Permissions Setup

Screen recording on macOS requires explicit user consent:

  1. Open System Settings

  2. Navigate to Privacy & Security > Screen Recording

  3. Enable your terminal application (Terminal, iTerm2, Warp, VS Code, etc.)

  4. Restart the terminal application after granting permission

Note: If recording fails with a permission error, the tool returns a structured error with these exact instructions.

Available Tools

Tool

Description

Key Params

start_recording

Start full-screen recording

output_path, screen_index, audio_index, fps, quality, preset

stop_recording

Stop active recording

(none)

get_recording_status

Check if recording is active

(none)

list_recordings

List all past recordings

limit

list_screen_devices

Discover screens & audio devices

(none)


start_recording

Start recording the macOS desktop. Only one recording can be active at a time.

Parameter

Type

Default

Description

output_path

string

auto-generated

Output .mp4 file path. Relative paths resolve to ~/Movies/screen-recordings/

screen_index

number

primary display

avfoundation device index (use list_screen_devices to find)

audio_index

number

none

Audio device index. Omit for no audio, -1 to explicitly disable

fps

number

30

Frames per second (1-60)

quality

string

"medium"

"low" (CRF 35), "medium" (CRF 28), "high" (CRF 18)

preset

string

"ultrafast"

FFmpeg preset: ultrafast, superfast, veryfast, faster, fast

{
  "success": true,
  "session_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "output_path": "/Users/you/Movies/screen-recordings/recording-2025-03-22-143012.mp4",
  "message": "Recording started. Screen index: 1, FPS: 30, Quality: medium. Use stop_recording to end."
}

stop_recording

Stop the active recording. Sends a graceful q signal to FFmpeg and waits for the file to finalize.

{
  "success": true,
  "session_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "output_path": "/Users/you/Movies/screen-recordings/recording-2025-03-22-143012.mp4",
  "duration_seconds": 47,
  "file_size_bytes": 15234048,
  "file_size_human": "14.5 MB",
  "message": "Recording stopped. File saved to ... (47s, 14.5 MB)"
}

get_recording_status

Check whether a recording is in progress, and get elapsed time.

{
  "status": "recording",
  "is_recording": true,
  "current_session": { "id": "...", "startedAt": "...", "outputPath": "..." },
  "elapsed_seconds": 23,
  "total_recordings": 5
}

list_recordings

Returns past recordings sorted by most recent first.

Parameter

Type

Default

Description

limit

number

20

Max recordings to return

list_screen_devices

Discover available screens and audio devices. Run this first if you're unsure which screen_index or audio_index to use.

{
  "screen_devices": [
    { "index": 1, "name": "Capture screen 0", "type": "screen" },
    { "index": 2, "name": "Capture screen 1", "type": "screen" }
  ],
  "audio_devices": [
    { "index": 0, "name": "Built-in Microphone", "type": "audio" },
    { "index": 1, "name": "BlackHole 2ch", "type": "audio" }
  ],
  "recommended_screen_index": 1,
  "ffmpeg_version": "6.1.2"
}

Use Cases

AI-Driven Demo Recording

Let Claude record polished product demos while you narrate and click through the UI. Ask it to start, pause at key moments, and stop — all through natural conversation.

Automated Bug Reproduction

Have Claude record your screen while you reproduce a bug, then reference the recording when filing issues. Especially useful in QA workflows where evidence is required.

Documentation Walkthroughs

Record step-by-step tutorials with Claude managing the recording lifecycle. Combine with voice narration for instant how-to videos.

CI/CD Visual Testing

Integrate screen recordings into automated test pipelines to capture visual regressions or end-to-end test flows.

Pair Programming Sessions

Record your coding sessions with Claude Code as a pair programming partner. Review recordings later to document architectural decisions.

Usage Examples

Record a demo:

"Start recording my screen to ~/Desktop/demo.mp4, high quality" ... do the demo ... "Stop the recording and tell me the file size"

Record with audio:

"List my screen devices, then start recording screen 1 with my built-in microphone"

Multi-monitor:

"List screen devices, start recording the second monitor"

Low-resource recording:

"Start a screen recording at 15 fps, low quality, ultrafast preset"

Check what's recording:

"What's the current recording status? How long has it been going?"

Review past recordings:

"List my last 5 recordings with their file sizes"

Error Handling

All tools return structured errors with resolution hints — they never throw unhandled exceptions to the MCP client:

{
  "success": false,
  "error_type": "ScreenRecordingPermissionError",
  "error": "Screen Recording permission not granted.",
  "resolution": "Open System Settings > Privacy & Security > Screen Recording > enable your terminal app."
}

Error Type

Cause

Resolution

FfmpegNotFoundError

ffmpeg not in PATH

brew install ffmpeg

ScreenRecordingPermissionError

macOS permission denied

Enable in System Settings

RecordingAlreadyActiveError

Tried to start while recording

Call stop_recording first

NoActiveRecordingError

Tried to stop with nothing active

Check get_recording_status

InvalidOutputPathError

Bad file path or extension

Use a path ending in .mp4

Troubleshooting

Problem

Solution

"ffmpeg not found"

brew install ffmpeg

"Permission denied" / blank recording

Grant Screen Recording permission in System Settings

Recording starts but file is 0 bytes

Wrong avfoundation device index — use list_screen_devices

No audio in recording

Add audio_index param — use list_screen_devices to find device

High CPU during recording

Use preset: "ultrafast" and lower fps

How It Works

Claude (MCP Client)          screen-recorder-mcp           FFmpeg
        |                            |                        |
        |-- start_recording -------->|                        |
        |                            |-- spawn ffmpeg ------->|
        |                            |   -f avfoundation      |
        |                            |   -i "3:none"          |
        |                            |   -vcodec libx264      |
        |<-- session_id, path -------|   recording...         |
        |                            |                        |
        |-- stop_recording --------->|                        |
        |                            |-- stdin: "q\n" ------->|
        |                            |          (graceful)     |
        |                            |<-- exit 0 -------------|
        |<-- duration, size ---------|                        |

Development

git clone https://github.com/jakubkrzysztofsikora/screen-recording.git
cd screen-recorder-mcp
npm install

npm run dev          # Run server in dev mode (tsx)
npm test             # Run unit tests
npm run test:coverage # Run tests with coverage report
npm run typecheck    # TypeScript strict mode check
npm run build        # Build to dist/
npm run check-deps   # Verify ffmpeg + list devices
npm run inspect      # Open MCP Inspector

Project Structure

src/
  index.ts       # MCP server entry point & tool registration
  recorder.ts    # FFmpeg process management (start/stop/status)
  devices.ts     # avfoundation device discovery
  storage.ts     # Recording file registry (in-memory + disk manifest)
  types.ts       # All shared TypeScript types & error classes
tests/
  recorder.test.ts
  devices.test.ts
  storage.test.ts

Contributing

See CONTRIBUTING.md for development setup, coding standards, and PR checklist.

License

MIT

Available Tools

5 tools
get_recording_statusA

Get the current recording status. Returns whether a recording is active, current session details if recording, and total count of past recordings.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry behavioral disclosure. It states the read-oriented nature via 'Get' and describes exactly what is returned, including the conditional session-details behavior. It could mention side-effects/perms explicitly, but for a zero-parameter getter the disclosed return contract is solid.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the core action, then a compact enumeration of outputs. No filler or repeated schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-input status retrieval tool with no output schema, the description communicates the primary return dimensions. It is complete enough for selection and invocation, though 'current session details' is slightly underspecified and could leave an agent unsure of exact fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0 parameters and 100% schema coverage, the schema already fully describes the input contract. Baseline 4 applies; the description adds no parameter semantics because none are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Uses the verb 'Get' with a specific resource, 'current recording status', and enumerates the meaningful return categories: active flag, session details, and past-recording count. This clearly distinguishes it from start/stop mutations and list_recordings, which would be used for past recording details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit statement of when to use this tool versus start_recording, list_recordings, or stop_recording. The word 'current' and the return fond focus imply it is for checking live state, but the description leaves the comparison to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_recordingsA

List all recordings captured in this session and from the persistent manifest. Includes file path, duration, size, and timestamp for each recording.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of recordings to return. Default: 20.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of behavioral disclosure. It conveys that the operation is a listing (implying read-only), covers both current session and persistent manifest, and specifies the output fields. This is more informative than a minimal description, though it does not explicitly state side-effect-freeness or ordering.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. The core purpose and scope are front-loaded, and the field list adds concrete value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple listing tool with one optional parameter and no output schema, the description adequately covers what the tool returns and its data scope. Minor details like ordering or empty-result behavior are absent, but they are not critical for this tool's completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, 'limit', is fully documented in the schema with a default value and meaning. Since schema_description_coverage is 100%, the description does not need to add parameter details, and it doesn't. This meets the baseline for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action ('List all recordings') and resource ('recordings captured in this session and from the persistent manifest'). It also enumerates the included fields (file path, duration, size, timestamp), which distinguishes it from sibling tools like start_recording or get_recording_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The verb 'List' and scope ('all recordings') imply the appropriate use case: enumerating existing recordings rather than starting/stopping or checking status. However, no explicit alternatives or exclusions are mentioned, so the guidance is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_screen_devicesA

List all available screen and audio capture devices detected by FFmpeg avfoundation. Use the index values when calling start_recording. Run this first if you're unsure which screen_index to use.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the disclosure burden. It reveals the implementation backend (FFmpeg avfoundation) and that the output includes index values usable by start_recording. It does not explicitly state that listing is side-effect-free, though 'List' and the discovery framing imply a read-only operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each with a distinct job: declare the function, connect the output to start_recording, and provide a when-to-run condition. No filler or repeated schema information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The definition is complete for a zero-parameter discovery tool: it states what is listed, the platform, how the results are used, and when to invoke it. Without an output schema, the description still conveys that index values are returned, which is enough for an agent to call and interpret the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters and 100% schema coverage, so the baseline is 4. The description adds no parameter details, which is appropriate because there are no parameters to explain.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action ('List') with a clear resource ('all available screen and audio capture devices') and platform context ('FFmpeg avfoundation'). This distinguishes it from list_recordings, which lists recording files, and clarifies the device-discovery role. The instruction to use returned index values in start_recording reinforces the tool's purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit sequential guidance: run first when unsure which screen_index to use, and use the returned index values when calling start_recording. It doesn't name alternatives or exclusions, but the sibling tools are clearly different lifecycle/listing operations, so the stated guidance is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_recordingA

Start recording the full macOS desktop to a video file. Records all connected screens (by default the primary display) using FFmpeg avfoundation. Only one recording can be active at a time. Returns a session ID and output path. Requires Screen Recording permission granted to this terminal app in System Settings.

ParametersJSON Schema
NameRequiredDescriptionDefault
fpsNoFrames per second. Range 1–60. Default: 30. Use 15 for smaller files, 60 for smooth demos.
presetNoFFmpeg encoding speed preset. Faster = lower CPU but larger file. Default: ultrafast (minimal system impact during recording).
qualityNoVideo quality. low=small file, medium=balanced (default), high=crisp. Maps to H.264 CRF 35/28/18.
audio_indexNoavfoundation audio device index. Use list_screen_devices to find audio device indices. Omit for no audio. Use -1 to explicitly disable audio.
output_pathNoOutput file path. Must end in .mp4. Relative paths resolve to ~/Movies/screen-recordings/. If omitted, auto-generates a timestamped filename.
screen_indexNoavfoundation screen device index. Use list_screen_devices to find available indices. Defaults to primary display (usually index 1).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full disclosure burden and does well: it reveals side effects (captures desktop, produces a video file), scope of capture (all connected screens, primary by default), the single-active-session constraint, the return contract (session ID and output path), and the OS-level permission requirement. It does not cover failure modes (e.g., behavior when permission is missing or a recording is already active), which keeps it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five sentences, each carrying distinct information: purpose, scope/mechanism, concurrency constraint, return values, and permission prerequisite. The purpose is front-loaded, and there is zero redundancy or repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter tool with no output schema and no annotations, the description covers the essentials an agent needs: what the tool does, its system requirements, the active-session limit, and the meaningful return values (session ID and output path). Edge behavior (errors when permission is denied or a recording is already active, whether the call blocks) is undisclosed, which is a minor gap given the absence of an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline of 3 applies even though the tool description itself adds no parameter-level information. The schema descriptions are notably rich (defaults, enum tradeoffs, CRF mapping, cross-references to list_screen_devices, path-resolution rules), but that is credit to the schema, not the description under evaluation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Start recording the full macOS desktop to a video file') and differentiates itself from its siblings: starting contrast with stop_recording, and the recording/device focus contrasts with get_recording_status, list_recordings, and list_screen_devices. The scope detail ('Records all connected screens (by default the primary display)') and mechanism (FFmpeg avfoundation) make the tool's identity unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear invocation context: a concurrency precondition ('Only one recording can be active at a time') and a hard prerequisite ('Requires Screen Recording permission granted to this terminal app'). It does not explicitly name alternatives or state when-not-to-use conditions, but the single-active-recording constraint effectively tells an agent to check get_recording_status first, and the schema cross-references list_screen_devices.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

stop_recordingA

Stop the currently active screen recording. Sends a graceful shutdown signal to FFmpeg and waits for the file to be finalized. Returns the completed recording session details including duration and file size.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does well by disclosing the graceful FFmpeg shutdown signal, the waiting behavior for file finalization, and the returned session details. This gives the agent useful expectations about the tool's execution behavior beyond merely saying 'stop recording'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise at three sentences, with the primary action front-loaded. Every sentence adds valuable information: what it stops, how it stops it, and what it returns. There is no redundant or vague wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with no output schema, the description covers the core operation, the mechanism, and the return details well. It could mention what happens if no recording is active, but the level of completeness is otherwise strong for the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema coverage is 100%, so there is no ambiguity in the input. Per the baseline for zero-parameter tools, the description need not add parameter information, and it appropriately focuses on behavior and output.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action ('stop'), the resource ('currently active screen recording'), and distinguishes it from siblings like start_recording, get_recording_status, and list_recordings. The verb and resource are unambiguous, making the tool's purpose immediately understandable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context by specifying that it acts on the currently active recording, implying it should be used when a recording is in progress. It does not explicitly mention alternatives or when not to use it, but the scope is clear enough for an agent to select it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updatesv0.1.0
    • First observedget_recording_status
    • First observedlist_recordings
    • First observedlist_screen_devices
    • First observedstart_recording
    • First observedstop_recording

TDQS

A4.4/5.0

Scored across 5 tools

Disambiguation5/5

Each tool maps to a distinct lifecycle concern: starting, stopping, querying active status, listing recorded files, and enumerating capture devices. There is no functional overlap between any pair.

Naming Consistency5/5

All tool names follow a consistent snake_case verb_noun pattern with clear verbs: start, stop, get, list. The naming style is uniform and predictable.

Tool Count5/5

Five tools is well-scoped for a screen recorder: no redundant helpers or missing essentials. Each tool earns its place in the workflow.

Completeness5/5

The domain of screen recording is covered end-to-end: device discovery, start, stop, status, and listing past recordings. There are no obvious dead ends or missing operations for this use case.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers