Screencast MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| FFMPEG_PATH | No | Path to the ffmpeg executable. ffmpeg and ffprobe are external dependencies and must be on PATH, or pointed at via the FFMPEG_PATH / FFPROBE_PATH environment variables. The server detects them per call and returns a clear error with an install hint if either is missing. | |
| FFPROBE_PATH | No | Path to the ffprobe executable. ffmpeg and ffprobe are external dependencies and must be on PATH, or pointed at via the FFMPEG_PATH / FFPROBE_PATH environment variables. The server detects them per call and returns a clear error with an install hint if either is missing. | |
| SCREENCAST_HOME | No | Output is written under SCREENCAST_HOME (default <homedir>/.screencast-mcp) into recordings/, frames/, screenshots/, and edits/. | <homedir>/.screencast-mcp |
| SCREENCAST_WHISPER_MODEL | No | Speech to an SRT file, locally, with FFmpeg 8's whisper filter (needs a whisper.cpp model: pass model or set SCREENCAST_WHISPER_MODEL). | |
| SCREENCAST_JOB_TIMEOUT_MS | No | The job timeout scales with the media's length (at least 10 minutes, or 4x the duration); set SCREENCAST_JOB_TIMEOUT_MS to override it. | |
| SCREENCAST_MAX_RECORDING_SEC | No | Set SCREENCAST_MAX_RECORDING_SEC to change the default recording cap (0 disables it). Every recording also has a maxDurationSec cap (default one hour). | 3600 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| start_recordingA | Start a screen recording (Windows gdigrab) as a background ffmpeg process. Returns a session id and output path. Recording is explicit and never auto-starts. Use stop_recording with the id to finalize the file. Audio is video-only by default; set audio.source = 'system' to also capture system (loopback) audio. Microphone capture is not supported. |
| stop_recordingA | Stop a recording by session id. Sends ffmpeg a graceful quit so the file is finalized rather than truncated, then returns the final path and duration. Falls back to terminating the process by pid if the live handle was lost (for example after a server restart). Clients with MCP Apps show the review player for the result. |
| list_sessionsA | List all recording sessions (active and finished) with their status, target, output path, and whether the process is still alive. |
| get_sessionA | Inspect a single recording session by id, including live status and whether its output file exists on disk. |
| read_eventsA | Read the input event log of a recording made with start_recording events: true: mouse clicks, scroll, cursor positions, shortcuts, and typing bursts, each with its video time in seconds and position in video pixels. Filter by time range and type, e.g. types: ['down'] for the clicks, then sample_frames at those times. |
| review_recordingA | Open a recording for a person to review. In clients that support MCP Apps it shows an inline player: scrub the timeline, drag trim handles, and draw redaction boxes, then export a trimmed, redacted copy (their choices run as a pipeline call). Elsewhere it returns the video's details; use contact_sheet or sample_frames to look at it. |
| player_framesA | Preview frames for the review player: JPEGs spread evenly over the video, with their times. Used by the inline player; agents should use sample_frames or contact_sheet instead. |
| screenshotA | Capture a single still frame (PNG) of a target (full screen, a monitor, a window by title, or a region). Returns the image path, plus the image inline so the model can view it directly (disable with returnImage: false). |
| sample_framesA | Sample frames from a video so the agent can actually view what happened: either at a fixed rate (fps) or at explicit timestamps. Writes PNG frames to a folder and returns their paths, plus the first few frames inline so the model can view them directly (disable with returnImages: false). |
| contact_sheetA | Tile timestamped frames of a video into ONE image, so the agent can see a whole recording in a single look: evenly spaced, or at the scene changes. Returns the image path and the sheet inline. poster: true writes a single representative frame instead. |
| screen_diffA | Compare two screenshots or frames: returns an SSIM similarity score, the share of the image that changed, and bounding boxes of the changed areas in b's pixel coordinates, plus b inline with those areas outlined. Use it to check that a UI change happened (and only where expected). |
| wait_for_changeA | Watch part of the screen and return when it changes (mode 'change') or when it has stopped changing (mode 'settle'), instead of guessing a sleep. Reports how long it took, where the screen changed, and the final state as an inline screenshot. |
| find_textA | Read text on screen or in an image/video frame with the OCR engine built into Windows (no install), with each line's and match's bounding box. Find where a label or button is, check what the screen says, or locate secrets (e.g. regex 'sk-|ghp_|api.?key') and get redact_region rectangles for them; for a video, scanEverySec checks the whole clip. Boxes are in the image's pixels; for a live target, add |
| get_media_infoA | Probe a media file with ffprobe and return duration, resolution, frame rate, codecs, container format, and size. |
| trimA | Trim a video to a sub-clip by start + (end or duration). Re-encodes by default, so the cut is frame-exact and the removed content is really gone; set exact: false for a fast stream copy that keeps hidden frames from before start in the file. |
| concatA | Concatenate two or more videos into a single file. Matching inputs are joined by stream copy (fast, lossless). Inputs that differ in codec, size, pixel format, frame rate or audio layout, or that hold frames hidden behind an edit list (a trim with exact: false), are re-encoded with hard cuts instead, so the result is always a valid file; |
| convertB | Convert a video between mp4, gif, and webm. mp4 uses H.264, webm uses VP9, and gif uses a palette filter for quality. Returns the output path. |
| export_gifA | Export a video as an optimized animated GIF or WebP that fits a file-size budget (default: GitHub's 10 MB image limit), for PRs, issues, and READMEs. Steps fps, width, and palette/quality down until it fits and reports the settings used. |
| cropA | Crop a video to a pixel rectangle (x, y, width, height) and re-encode. A rectangle that runs off the source frame is rejected. |
| scaleA | Resize a video to a target width and/or height and re-encode. Provide one side to keep the aspect ratio, or both to set an exact size. |
| speedA | Change playback speed by a factor (>1 faster, <1 slower) and re-encode. Audio is retempo'd to match when the source has an audio track. |
| overlayA | Composite an image or video (logo, watermark, picture-in-picture) onto a base video at a pixel position, optionally scaled and time-limited. A video overlay starts playing at start and holds its last frame if it ends early; the output keeps the base video's audio and length. |
| calloutB | Annotate a video with timed boxes, text labels, and arrows (e.g. 'click here', a box around the bug), each shown between two timestamps. Returns the output path. |
| compressB | Re-encode a video to a smaller file with a CRF quality ladder and an optional width cap. Returns the output path. |
| extract_audioA | Extract the audio track of a media file to its own file (mp3, aac, wav, or copy). Returns the output path. |
| normalize_audioA | Normalize a recording's loudness to a delivery target (EBU R128, two-pass loudnorm) so narration and system audio are neither too quiet nor clipping. Video is copied untouched. Reports the loudness before and after. |
| denoiseA | Reduce steady background noise (fan, hum, hiss) in a recording's audio with an adaptive FFT denoiser. Video is copied untouched. Returns the output path. |
| transcribeA | Transcribe a recording's speech to an SRT subtitle file, locally, with FFmpeg 8's whisper filter (needs a whisper.cpp model file). Returns the SRT path and the text. Pair with burn_subtitles to caption the video. |
| burn_subtitlesA | Burn subtitles (an SRT from transcribe, or any SRT/ASS) permanently into a video, in the bundled font, in a clean or social-media style. Returns the output path. |
| clipA | Extract one or more frame-accurate sub-segments to separate files. Unlike trim (fast stream copy that snaps to a keyframe), clip re-encodes so cuts land exactly on the given times. |
| cut_idleA | Remove dead air: cut stretches where the screen is frozen (and, if there is audio, silent), keeping a short pad at each edge. Agent recordings are full of these pauses. dryRun reports what would be cut first. Returns the output path and the time saved. |
| redact_regionA | Redact declared rectangles in a video so secrets on screen are covered. This covers regions you specify; it is NOT automatic secret detection. The default style is a solid box, which is irreversible (a blur or mosaic can be partially recovered). A region that falls outside the frame is rejected rather than silently doing nothing. |
| list_audio_devicesA | List the DirectShow audio devices ffmpeg can see on this machine, and flag a likely system-audio loopback device. Use the returned name as the |
| xfade_transitionA | Crossfade two videos into one with an xfade transition. Both clips are auto-normalized to a common resolution, fps, and audio rate first, so they need not match. Offsets follow each clip's video length; audio is crossfaded, with silence standing in for a clip that has no track. |
| assemble_highlightsA | Stitch two or more clips into a single video, with hard cuts or an xfade transition between each. Clips are auto-normalized to a common resolution, fps, and audio rate, so they need not match. |
| title_cardA | Generate a standalone title card: centered text on a solid background, with a silent audio track so it composes with audio-bearing clips (use assemble_highlights to stitch it in). Text is rendered with a bundled font, so no system font is required. |
| music_bedA | Lay a music track under a video: the music is looped/trimmed to the video length, faded in and out, and leveled. When the video already has audio the two are mixed, optionally ducking the music under the original. The video stream is copied; only audio is re-encoded. |
| reframeA | Re-aspect a video to a target ratio (16:9, 9:16, 1:1, 4:5). 'pad' letterboxes so nothing is lost; 'crop' fills the frame and trims the overflow. Returns the output path. |
| zoomA | Smooth animated zoom-and-pan, Screen Studio style: zoom into where the action is and back out. Give keyframes (rectangles by time), or let it plan them from the clicks in the recording's input event log or from where the screen changes. highlightClicks rings each click. dryRun returns the plan so it can be adjusted. Returns the output path. |
| pipelineA | Run several edits as one ffmpeg process: one re-encode and no intermediate files, instead of a tool call and a re-encode per edit. Steps use the same options as the standalone tools (trim, crop, scale, speed, redact, callout, reframe, zoom) and may end with export_preset or export_gif. The same steps can be saved and re-run on another recording. dryRun returns the plan. |
| export_presetA | Encode a platform-ready file for youtube, instagram_reel, tiktok, x, square, steam_trailer, or vertical_reel. Reframes to the platform aspect, caps fps, and encodes H.264 at the platform bitrate with faststart. Returns the output path. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| bug-repro-clip | Record a target, find the bug moment, redact secrets, trim, annotate, and export a GIF for an issue. |
| demo-gif | Record a feature walkthrough and export a GIF small enough for a README or PR. |
| verify-ui-change | Screenshot before, make the change, wait for the screen to settle, diff, and check the text. |
| review-recording | Summarize what happens in a recording, with timestamps, using a contact sheet and scene frames. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| review-player | Interactive player: scrub, trim, and draw redaction boxes on a recording. |
| sessions | Every recording session (active and finished), newest first. |
TDQS
Scored across 41 tools
Many tools overlap: pipeline is a superset of trim/crop/scale/speed/redact/callout/reframe/zoom; convert, export_preset, export_gif and compress all produce encoded outputs; concat, assemble_highlights and xfade_transition all join clips; trim and clip both extract sub-segments. Descriptions do clarify the distinctions, but with 41 tools the agent has several plausible choices for the same task.
All names are lowercase snake_case, which is good, but the convention mixes bare verbs (trim, crop, scale, speed, concat, convert), verb_noun (start_recording, export_preset, list_sessions), and noun phrases (title_card, music_bed, player_frames). It remains readable but not a predictable pattern.
41 tools is heavy for a screencast server. The surface is genuinely broad, but the pipeline tool already composes many individual edits, so a significant portion of the count is redundant convenience wrappers rather than separate user needs.
The lifecycle is well covered: recording (start/stop/list/get/read_events), inspection (media info, OCR, frames, diff), editing (trim, crop, scale, overlays, callouts, reframe, zoom, redaction), audio (extract, normalize, denoise, music bed), and export (presets, gif, convert). Minor gaps like session deletion and pause/resume recording are workable around.