screen-recorder-mcp
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., "@screen-recorder-mcpRecord my screen to ~/Desktop/demo.mp4"
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.
screen-recorder-mcp
MCP server that gives Claude and AI agents start/stop control over full-screen recordings on macOS — powered by FFmpeg avfoundation.
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 |
|
Node.js 18+ |
|
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-mcpThen 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-recorderGlobal Install
npm install -g screen-recorder-mcpCursor / 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:
Open System Settings
Navigate to Privacy & Security > Screen Recording
Enable your terminal application (Terminal, iTerm2, Warp, VS Code, etc.)
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 full-screen recording |
| |
Stop active recording | (none) | |
Check if recording is active | (none) | |
List all past recordings |
| |
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 |
| string | auto-generated | Output |
| number | primary display | avfoundation device index (use |
| number | none | Audio device index. Omit for no audio, |
| number |
| Frames per second (1-60) |
| string |
|
|
| string |
| FFmpeg preset: |
{
"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 |
| number |
| 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 |
| ffmpeg not in PATH |
|
| macOS permission denied | Enable in System Settings |
| Tried to start while recording | Call |
| Tried to stop with nothing active | Check |
| Bad file path or extension | Use a path ending in |
Troubleshooting
Problem | Solution |
"ffmpeg not found" |
|
"Permission denied" / blank recording | Grant Screen Recording permission in System Settings |
Recording starts but file is 0 bytes | Wrong avfoundation device index — use |
No audio in recording | Add |
High CPU during recording | Use |
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 InspectorProject 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.tsContributing
See CONTRIBUTING.md for development setup, coding standards, and PR checklist.
License
Available Tools
5 toolsget_recording_statusA
Get the current recording status. Returns whether a recording is active, current session details if recording, and total count of past recordings.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of recordings to return. Default: 20. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fps | No | Frames per second. Range 1–60. Default: 30. Use 15 for smaller files, 60 for smooth demos. | |
| preset | No | FFmpeg encoding speed preset. Faster = lower CPU but larger file. Default: ultrafast (minimal system impact during recording). | |
| quality | No | Video quality. low=small file, medium=balanced (default), high=crisp. Maps to H.264 CRF 35/28/18. | |
| audio_index | No | avfoundation audio device index. Use list_screen_devices to find audio device indices. Omit for no audio. Use -1 to explicitly disable audio. | |
| output_path | No | Output file path. Must end in .mp4. Relative paths resolve to ~/Movies/screen-recordings/. If omitted, auto-generates a timestamped filename. | |
| screen_index | No | avfoundation screen device index. Use list_screen_devices to find available indices. Defaults to primary display (usually index 1). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
5 tool updates
v0.1.0- First observed
get_recording_status - First observed
list_recordings - First observed
list_screen_devices - First observed
start_recording - First observed
stop_recording
TDQS
Scored across 5 tools
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.
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.
Five tools is well-scoped for a screen recorder: no redundant helpers or missing essentials. Each tool earns its place in the workflow.
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
Related MCP Connectors
FFmpeg as a service for AI agents: typed video editing tools, async jobs, downloadable outputs.
- RendobarOAuthcom.rendobar
Transform video, audio and images, and generate media from prompts. FFmpeg, captions, models.
A real timeline video editor for AI agents: journaled edits, FFmpeg/MLT rendering, exports
Screen recording, meeting notes, and voice dictation - all with AI
Related MCP Servers
- AlicenseBqualityDmaintenanceProvides powerful video and audio editing capabilities through FFmpeg, enabling AI assistants to perform professional-grade operations including format conversion, trimming, overlays, transitions, and advanced audio processing.2784MIT
- AlicenseAqualityCmaintenanceMCP server for screen recording on macOS, iOS Simulator, and Android, with key-frame extraction via ffmpeg, enabling AI agents to capture UI motion and transient visual states.121MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI coding agents to capture screen and voice recordings, extract timestamped frames, and receive structured Markdown reports with context for bug fixing and UI feedback.7 npm18MIT
- FlicenseAqualityDmaintenanceEnables local media processing (video/audio) using FFmpeg and FFprobe, allowing frame extraction, audio conversion, and metadata retrieval through natural language.5-