# Screencast MCP (npm · @tmhs/screencast-mcp)

Let AI agents record the Windows screen, watch it as frames, and edit it with ffmpeg

- Trust score: 83/100 (high trust)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- npm · `@tmhs/screencast-mcp`: 83/100 (this document), [markdown](https://verifymcp.io/servers/tmhsdigital-screencast-mcp/tmhs-screencast-mcp.md), [page](https://verifymcp.io/servers/tmhsdigital-screencast-mcp/tmhs-screencast-mcp)

## Channel facts

- Registry: `npm`
- Package: `@tmhs/screencast-mcp`
- Version: `0.48.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 98/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - 30 of 92 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 87/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to TMHSDigital/screencast-mcp).
  - License check failed: the license (CC-BY-NC-ND-4.0) isn't a recognized OSI-approved license.
  - Actively maintained (last published 4 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 76/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 10072 tokens (~170/item across 59 items; 57 tools + 2 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 34/100
  - Stability check failed: the tool surface changed between 0.35.0 and 0.48.0: 1 tool removals, 0 breaking changes, 17 additions.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 99% of tool parameters carry a description.
  - Structured output schemas are declared (98% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 59 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.
  - Supports UI / widget rendering.

## Install

### How do I install the Screencast MCP server?

Screencast MCP runs locally as an npm package, launched with npx -y @tmhs/screencast-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add tmhsdigital-screencast-mcp -- npx -y @tmhs/screencast-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "tmhsdigital-screencast-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@tmhs/screencast-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "tmhsdigital-screencast-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@tmhs/screencast-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add tmhsdigital-screencast-mcp -- npx -y @tmhs/screencast-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "tmhsdigital-screencast-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@tmhs/screencast-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add tmhsdigital-screencast-mcp --command npx --arg -y --arg @tmhs/screencast-mcp
```

### Hermes

```yaml
mcp_servers:
  tmhsdigital-screencast-mcp:
    command: "npx"
    args: ["-y", "@tmhs/screencast-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "tmhsdigital-screencast-mcp": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "@tmhs/screencast-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add tmhsdigital-screencast-mcp -t stdio -c npx -a -y @tmhs/screencast-mcp
```

### Other

```json
{
  "mcpServers": {
    "tmhsdigital-screencast-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@tmhs/screencast-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-04 (score 83, +1)

No change was recorded against any check on this day. Stability & Change Management went from 28 to 31.

### 2026-11-02 (score 82, +1)

No change was recorded against any check on this day. Stability & Change Management went from 21 to 24.

### 2026-11-01 (score 81, 0)

- [security regression] Stability: fail → unverified
- [security regression] Tool safety: pass → unverified
- [functional regression] Capabilities: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Schema quality: 100 → unverified
- [functional] Package version: 0.47.0 → 0.48.0

### 2026-10-31 (score 81, +1)

No change was recorded against any check on this day. Stability & Change Management went from 14 to 18.

### 2026-10-29 (score 80, +26)

- [security improvement] Malware scan: unverified → pass
- [security improvement] Known CVEs: unverified → pass
- [functional improvement] Dependency health: unverified → 0.86

### 2026-10-28 (score 54, −9)

- [security regression] Known CVEs: pass → unverified
- [security regression] Stability: 0.07 → fail
- [functional regression] Dependency health: 0.85 → unverified
- [functional improvement] Schema quality: 197 → 170
- [functional improvement] Schema quality: 197 → 174
- [functional] First check of Tool coverage: 98
- [functional] Schema quality: excellent → good
- [functional] Destructive annotations: All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
- [functional] Package version: 0.39.0 → 0.47.0
- [functional] Package version: 0.39.0 → 0.46.0

### 2026-10-27 (score 63, 0)

- [functional] Package version: 0.38.0 → 0.39.0

### 2026-10-26 (score 63, −14)

- [security regression] Malware scan: pass → unverified
- [security regression] Stability: 0.00 → unverified
- [security regression] Known CVEs: pass → unverified
- [security regression] Tool safety: pass → unverified
- [functional regression] Capabilities: pass → unverified
- [functional regression] Dependency health: 0.85 → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Schema quality: 100 → unverified
- [functional] Package version: 0.35.0 → 0.38.0
- [functional] Package version: 0.35.0 → 0.37.0
- [functional] Package version: 0.35.0 → 0.36.0

## MCP tools (57)

### `start_recording` (~511 tokens)

Start Recording

Start a background screen recording. Returns a session id; finalize it with stop_recording. Never auto-starts.

Input parameters:

- `audio` (object): Audio (default none). No microphone capture.
- `backend` (string): gdigrab (default): the screen rectangle. wgc (window: targets, FFmpeg 8+): the window's own surface, even when covered or moved; client area only, no audio. ddagrab: one display on the GPU, low CPU.
- `cursor` (string): events: leave the OS cursor out and log it (implies events) for the cursor tool to redraw.
- `encoder` (string): auto = first working GPU encoder, else x264 (default with ddagrab; else x264).
- `events` (boolean): Also log clicks, scroll, cursor, and typing (video-timed, video pixels) for read_events (default false; ~1 s slower start).
- `exactTitle` (boolean): window: targets match the whole title only, never a substring (default false).
- `fps` (integer): Frames per second (default 30).
- `keys` (string): With events: masked (default) logs typing only as 0.5 s-grid bursts, never keys; shortcuts also names Ctrl/Alt/Win chords. Typed text is never logged.
- `maxDurationSec` (integer): Auto-stop after this many seconds (default 3600 or SCREENCAST_MAX_RECORDING_SEC; max 7 days; 0 = no cap).
- `output` (string): Output .mp4 path (default under SCREENCAST_HOME/recordings).
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `quality` (string): Encoder preset (default standard).
- `replayBufferSec` (integer): Instant replay: keep only the last N s (bounded disk) for save_replay. gdigrab or ddagrab, not wgc.
- `target` (string, required): full | monitor:<i> (0 = primary) | window:<title> (or window:exe=<app.exe> / window:hwnd=<n>) | region:<x>,<y>,<w>,<h>. With gdigrab a window's rectangle is resolved once at start (visible, on top);…
- `webcam` (object): Also record a camera to <output>.webcam.mp4, aligned for overlay.

Output parameters:

- `backend` (string)
- `outputPath` (string)
- `sessionId` (string)
- `status` (string)

### `stop_recording` (~61 tokens)

Stop Recording

Stop a recording gracefully so the file is finalized; returns the path and duration.

Input parameters:

- `save` (boolean): Replay buffer: write it all to outputPath first (default: discard).
- `sessionId` (string, required): Session id returned by start_recording.

Output parameters:

- `durationSec` (number|null)
- `outputPath` (string)
- `sessionId` (string)
- `status` (string)

### `pause_recording` (~48 tokens)

Pause Recording

Pause a recording; until resume_recording nothing is captured, and the gap is left out of the file, events, and markers.

Input parameters:

- `sessionId` (string, required): From start_recording.

Output parameters:

- `recordedSec` (number)
- `sessionId` (string)
- `status` (string)

### `resume_recording` (~31 tokens)

Resume Recording

Resume a paused recording (same target and settings).

Input parameters:

- `sessionId` (string, required): From start_recording.

Output parameters:

- `recordedSec` (number)
- `sessionId` (string)
- `status` (string)

### `save_replay` (~141 tokens)

Save Replay

Save the last N seconds of a replay buffer (start_recording replayBufferSec) to an mp4; the buffer keeps running.

Input parameters:

- `lastSec` (number): Seconds back from now (default and max: the buffer length).
- `output` (string): Output .mp4 path (default under SCREENCAST_HOME/recordings).
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `reencode` (boolean): Frame-exact re-encode. Default: instant stream copy that may hide up to 2 s of earlier frames.
- `sessionId` (string, required): Session id of a replay buffer.

Output parameters:

- `durationSec` (number)
- `outputPath` (string)
- `sessionId` (string)

### `list_sessions` (~34 tokens)

List Sessions

List all recording sessions (active and finished) with their status, target, output path, and whether the process is still alive.

Output parameters:

- `count` (integer)
- `sessions` (array)

### `get_session` (~43 tokens)

Get Session

Inspect a single recording session by id, including live status and whether its output file exists on disk.

Input parameters:

- `sessionId` (string, required): Session id returned by start_recording.

Output parameters:

- `alive` (boolean)
- `fileExists` (boolean)
- `id` (string)
- `outputPath` (string)
- `status` (string)

### `read_events` (~182 tokens)

Read Input Events

Read the input events (clicks, scroll, cursor, shortcuts, typing bursts) of a recording made with events: true, in video seconds and pixels; e.g. types: ['down'], then sample_frames there.

Input parameters:

- `from` (number): Earliest video second.
- `inFrameOnly` (boolean): Drop events whose cursor was outside the recorded area.
- `input` (string): Or a recording path, or its .events.jsonl.
- `limit` (integer): Most events to return (default 200).
- `sessionId` (string): Session id of a recording started with events: true.
- `to` (number): Latest video second.
- `types` (array): down/up (mouse buttons; clicks are down), move (sampled cursor), wheel, key (shortcut), typing (burst), gap (events may be missing).

Output parameters:

- `eventsPath` (string)
- `matched` (integer)
- `returned` (integer)
- `summary` (object)
- `total` (integer)

### `add_marker` (~100 tokens)

Add Marker

Mark a labelled moment on a recording, live or at a second. Kept in the session and a sidecar; chapters and pipeline turn markers into chapters.

Input parameters:

- `at` (number): Video second (default: now, while recording).
- `input` (string): Or a video path (needs at).
- `label` (string, required): e.g. "bug appears".
- `sessionId` (string): Recording to mark (a stopped one needs at).

Output parameters:

- `count` (integer)
- `markersPath` (string)

### `review_recording` (~69 tokens)

Review Recording

Open a recording for a person to review: in MCP Apps clients an inline player to scrub, trim, and redact, then export; elsewhere just the video's details.

Input parameters:

- `input` (string): Path to the video.
- `sessionId` (string): Or the session id of a stopped recording.

Output parameters:

- `durationSec` (number|null)
- `fps` (number|null)
- `hasAudio` (boolean)
- `height` (number|null)
- `input` (string)
- `width` (number|null)

### `screenshot` (~246 tokens)

Take Screenshot

Capture one PNG of the screen, a monitor, a window, or a region, returned inline and by path.

Input parameters:

- `backend` (string): gdigrab (default, ~0.2 s): what is visible. wgc (window:, FFmpeg 8+, ~1-2 s): the window even if covered.
- `exactTitle` (boolean): window: targets match the whole title only, never a substring (default false).
- `maxImageWidth` (integer): Max inline image width (default 1280).
- `output` (string): Optional output .png path. Defaults to a file under SCREENCAST_HOME/screenshots.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `returnImage` (boolean): Return the image inline (default true; the PNG on disk stays full size).
- `target` (string, required): full | monitor:<i> (0 = primary) | window:<title> (or window:exe=<app.exe> / window:hwnd=<n>) | region:<x>,<y>,<w>,<h>. Titles match exactly, else as a substring; topmost wins.

Output parameters:

- `backend` (string)
- `inlineImages` (integer)
- `outputPath` (string)
- `target` (string)

### `sample_frames` (~278 tokens)

Sample Frames

Sample PNG frames from a video (by fps, timestamps, or scene changes) and return the first few inline so the model can see what happened.

Input parameters:

- `dedupe` (boolean): Mode fps: drop near-duplicate frames (default false).
- `fps` (number): Frames per second (mode fps).
- `input` (string, required): Path to the source video file.
- `maxFrames` (integer): Frame cap (default 100); fps is lowered to fit while still spanning the video.
- `maxImageWidth` (integer): Max inline image width (default 1280).
- `maxInlineImages` (integer): Frames to embed inline (default 8); all are listed by path.
- `mode` (string): scenes: only frames where the screen changed (strongest first), usually the cheapest review. Default: fps or timestamps, whichever is given.
- `outputDir` (string): Optional folder for the frames (a relative path resolves under SCREENCAST_HOME/frames). Defaults to SCREENCAST_HOME/frames/<id>.
- `returnImages` (boolean): Return the first maxInlineImages frames inline (default true).
- `sceneThreshold` (number): Mode scenes: change needed to count, 0-1 (default 0.1).
- `timestamps` (array): Seconds to grab a frame at (mode timestamps).

Output parameters:

- `frameCount` (integer)
- `frameDir` (string)
- `frames` (array)
- `mode` (string)

### `contact_sheet` (~224 tokens)

Contact Sheet

Tile timestamped frames of a video into one image to see a whole recording at a glance (the cheapest first look).

Input parameters:

- `columns` (integer): Tiles per row (default: roughly square).
- `count` (integer): Frames to tile (default 12).
- `input` (string, required): Path to the source video.
- `maxImageWidth` (integer): Max inline image width (default 1280).
- `mode` (string): even (default) or scenes (strongest changes; static stretches take no tiles).
- `output` (string): Optional output .png path. Defaults under SCREENCAST_HOME/frames.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `poster` (boolean): Write one representative poster frame instead of a sheet.
- `returnImage` (boolean): Return the sheet inline (default true).
- `sceneThreshold` (number): Mode scenes: change needed, 0-1 (default 0.1).
- `tileWidth` (integer): Tile width in px (default 320).

Output parameters:

- `inlineImages` (integer)
- `outputPath` (string)

### `screen_diff` (~118 tokens)

Screen Diff

Compare two screenshots or frames: SSIM score, changed share, and changed boxes in b's pixels, to check a UI change happened only where expected.

Input parameters:

- `a` (string, required): Before image (or video: first frame).
- `b` (string, required): After image (or video); scaled to a's size.
- `pixelThreshold` (number): Mean 0-255 difference for a ~32x32 cell to count as changed (default 12).
- `returnImage` (boolean): Return b inline with changes outlined (default true).

Output parameters:

- `changedFraction` (number)
- `identical` (boolean)
- `meanDiff` (number)
- `regions` (array)
- `ssim` (number|null)

### `wait_for_change` (~269 tokens)

Wait for Screen Change

Wait until part of the screen changes or settles, instead of guessing a sleep. Returns the elapsed time, changed regions (screenshot pixels; add `origin` for desktop), and the final state.

Input parameters:

- `exactTitle` (boolean): window: targets match the whole title only (default false).
- `intervalMs` (integer): Pause between checks in ms (default 250).
- `keep` (boolean): Keep the final screenshot on disk and return its path (default false).
- `mode` (string): change (default): return once it differs from the start. settle: once it has been still for settleSec.
- `pixelThreshold` (number): Mean 0-255 difference for a ~32x32 cell to count as changed (default 12).
- `returnImage` (boolean): Return the final state inline (default true).
- `settleSec` (number): Mode settle: seconds of stillness (default 1).
- `target` (string, required): What to watch: full | monitor:<i> | window:<title> (or exe=/hwnd=) | region:<x>,<y>,<w>,<h>.
- `timeoutSec` (number): Give up after this many seconds (default 30; a timeout is a result, not an error).

Output parameters:

- `elapsedSec` (number)
- `mode` (string)
- `origin` (object)
- `outcome` (string)
- `regions` (array)

### `find_text` (~374 tokens)

Find Text (OCR)

OCR (built into Windows) on the screen, an image, or video frames, with line and match boxes in image pixels (add `origin` for desktop coordinates). Locate UI text or secrets (e.g. regex 'sk-|ghp_|api.?key') to redact. Best-effort: review results.

Input parameters:

- `backend` (string): Live target: gdigrab (default) = what is visible; wgc (window:, FFmpeg 8+) = the window even if covered.
- `exactTitle` (boolean): window: targets match the whole title only (default false).
- `input` (string): Image or video file to read instead of a live target.
- `keep` (boolean): Live target: keep the capture and return its path (default false: deleted after reading).
- `maxFrames` (integer): scanEverySec frame cap (default 30; ~1 s each).
- `query` (string): Text to find (case-insensitive, tolerates OCR misreads like I/l, O/0, _/-). Omit to return all text.
- `redact` (boolean): Also return padded match rectangles ready for redact_region's regions.
- `regex` (boolean): Treat query as a regular expression (case-insensitive).
- `returnImage` (boolean): Return the image with matches outlined (default: true with a query).
- `scanEverySec` (number): Video input: scan a frame every N s across the clip (e.g. for secrets before sharing); matches and redactRegions get times. Widens to stay within maxFrames.
- `target` (string): Live screen target (full | monitor:<i> | window:... | region:...), or pass input.
- `timestamp` (number): Video input: second to read (default 0).

Output parameters:

- `imageSize` (object)

### `index_recording` (~137 tokens)

Index Recording

Build a recording's text timeline (<video>.index.json: OCR per scene, events, markers, transcript) for search_recording.

Input parameters:

- `force` (boolean): Re-OCR despite a matching cached index.
- `input` (string): Recording path.
- `maxFrames` (integer): Keyframes to OCR (default 120).
- `sceneThreshold` (number): Change starting a segment (default 0.03).
- `sessionId` (string): Or a stopped session id.
- `transcript` (string): An .srt, or 'whisper' to transcribe. Default: <video>.srt if any.

Output parameters:

- `indexPath` (string)
- `segments` (number)

### `search_recording` (~118 tokens)

Search Recording

Search an index_recording timeline (screen text, events, markers, transcript): timecoded hits, best first, secrets masked. No frames unless asked.

Input parameters:

- `images` (integer): Thumbnails of the top N hits (default 0).
- `input` (string): Recording path.
- `limit` (integer): Max hits (default 10).
- `query` (string, required): Text; tolerates OCR misreads.
- `regex` (boolean): query is a regex.
- `sessionId` (string): Or a stopped session id.

Output parameters:

- `hits` (array)
- `total` (number)

### `get_media_info` (~47 tokens)

Get Media Info

Probe a media file with ffprobe and return duration, resolution, frame rate, codecs, container format, and size.

Input parameters:

- `input` (string, required): Path to the media file to probe.

Output parameters:

- `audioCodec` (string|null)
- `durationSec` (number|null)
- `fps` (number|null)
- `height` (number|null)
- `input` (string)
- `videoCodec` (string|null)
- `width` (number|null)

### `trim` (~180 tokens)

Trim Video

Cut a video down to one sub-clip by start + (end or duration). For several segments use clip; to combine with other edits use pipeline.

Input parameters:

- `duration` (number): Clip length in seconds. Use end OR duration.
- `end` (number): End time in seconds. Use end OR duration.
- `exact` (boolean): Re-encode for a frame-exact cut with the removed content really gone (default true). false = fast stream copy that snaps to a keyframe and keeps hidden earlier frames; never use it to remove secrets.
- `input` (string, required): Path to the source video.
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `start` (number, required): Start time in seconds.

Output parameters:

- `outputPath` (string): Path of the file written.

### `concat` (~96 tokens)

Concatenate Videos

Join videos end to end with hard cuts: stream copy when they match, else a re-encode (`mode` says which). For transitions use xfade_transition or assemble_highlights.

Input parameters:

- `inputs` (array, required): Video paths to join, in order.
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).

Output parameters:

- `outputPath` (string): Path of the file written.

### `convert` (~150 tokens)

Convert Format

Convert media to mp4, webm, or gif. For a size-bounded GIF/WebP prefer export_gif; for a smaller mp4, compress or export_preset.

Input parameters:

- `format` (string, required): mp4 (H.264), webm (VP9), or gif (palette).
- `fps` (number): gif only: fps (default 12).
- `input` (string, required): Path to the source media.
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `width` (number): gif only: width in px (default 720).

Output parameters:

- `outputPath` (string): Path of the file written.

### `export_gif` (~194 tokens)

Export GIF or WebP

Export an animated GIF or WebP that fits a size budget (for PRs, issues, READMEs), stepping fps, width, and quality down until it fits.

Input parameters:

- `duration` (number): Seconds to export (default: to the end).
- `format` (string): gif (default) or webp (usually much smaller).
- `fps` (number): Starting frame rate (default 12).
- `input` (string, required): Path to the source video.
- `maxBytes` (integer): Size budget in bytes (default 10000000, under GitHub's 10 MB image limit).
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `start` (number): Start second.
- `width` (integer): Starting width in px (default 960).

Output parameters:

- `outputPath` (string): Path of the file written.

### `crop` (~101 tokens)

Crop Video

Crop a video to a pixel rectangle; one running off the frame is rejected.

Input parameters:

- `height` (integer, required)
- `input` (string, required): Path to the source video.
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `width` (integer, required)
- `x` (integer, required)
- `y` (integer, required)

Output parameters:

- `outputPath` (string): Path of the file written.

### `scale` (~133 tokens)

Scale Video

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.

Input parameters:

- `height` (integer): Target height in px. Omit to derive from width (keeps aspect).
- `input` (string, required): Path to the source video.
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `width` (integer): Target width in px. Omit to derive from height (keeps aspect).

Output parameters:

- `outputPath` (string): Path of the file written.

### `speed` (~119 tokens)

Change Speed

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.

Input parameters:

- `factor` (number, required): Speed multiplier: >1 is faster, <1 is slower (e.g. 2 = double speed).
- `input` (string, required): Path to the source video.
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).

Output parameters:

- `outputPath` (string): Path of the file written.

### `overlay` (~191 tokens)

Overlay Image or Video

Composite an image or video (logo, watermark, picture-in-picture) onto a video at a pixel position, optionally scaled and time-limited; keeps the base's audio and length.

Input parameters:

- `end` (number): Hide after this second.
- `height` (integer): Scale to this height.
- `input` (string, required): Path to the base video.
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits.
- `overlay` (string, required): Overlay image or video path.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `shape` (string): circle: centre square masked round (webcam).
- `start` (number): Show from this second.
- `width` (integer): Scale to this width (other side keeps aspect).
- `x` (integer, required): Left, px.
- `y` (integer, required): Top, px.

Output parameters:

- `outputPath` (string): Path of the file written.

### `callout` (~199 tokens)

Add Callouts

Annotate a video with timed boxes, text labels, and arrows. Fallback fonts used are listed in fallbackFonts; characters no font covers are reported in warnings.

Input parameters:

- `fontFile` (string): Font: a .ttf/.otf/.ttc path or a C:\Windows\Fonts file name. Default: bundled Inter, with a covering system font for scripts it lacks (CJK, emoji, Arabic, ...).
- `input` (string, required): Path to the source video.
- `items` (array, required): Boxes, text labels, and arrows, drawn in order (later on top), in video pixels. Each shows from..to seconds (default: whole video); color is a name, #RRGGBB, or name@alpha.
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).

Output parameters:

- `outputPath` (string): Path of the file written.

### `keystroke_overlay` (~301 tokens)

Keystroke Overlay

Burn keycast-style badges for shortcuts, clicks, and typing from the recording's input event log (start_recording events: true). Never shows typed text: the log has none.

Input parameters:

- `clicks` (boolean): Show clicks (default true).
- `color` (string): Text color (default white).
- `dryRun` (boolean): Return the planned badges; write nothing.
- `events` (string): Event log (default: the input's .events.jsonl).
- `fontFile` (string): Font: a .ttf/.otf/.ttc path or a C:\Windows\Fonts file name. Default: bundled Inter, with a covering system font for scripts it lacks (CJK, emoji, Arabic, ...).
- `input` (string, required): Path to the recording.
- `keys` (string): shortcuts (default): the chord (Ctrl + S); masked: modifiers only (Ctrl + …).
- `lingerSec` (number): Seconds a badge stays up (default 1.2).
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `position` (string): Default bottom (centred).
- `size` (number): Font px (default 4.5% of the frame height).
- `typing` (boolean): Show typing as "Typing…" (default true).

Output parameters:

- `badges` (integer)

### `cursor` (~228 tokens)

Re-rendered Cursor

Draw a smoothed, scaled cursor that hides when idle from the event log of a start_recording cursor: "events" recording (no OS cursor in the video), with click ripples and an optional spotlight.

Input parameters:

- `clicks` (boolean): Ripple on clicks (default true).
- `dryRun` (boolean): Return the plan; write nothing.
- `events` (string): Event log (default: the input's .events.jsonl).
- `hideAfterSec` (number): Hide when the mouse rests this long; 0 = never (default 2).
- `input` (string, required): Path to the recording.
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `size` (number): Times a typical cursor's size (default 1.5).
- `smoothing` (number): 0 = as logged, 1 = floaty (default 0.5).
- `spotlight` (boolean): Dim all but the area around the cursor.

Output parameters:

- `segments` (integer)

### `backdrop` (~281 tokens)

Add Backdrop

Frame a video or screenshot on a gradient, color, or wallpaper with padding, rounded corners, and a drop shadow, optionally on a 16:9/1:1/9:16/4:5 canvas.

Input parameters:

- `aspect` (string): Output on this aspect's canvas (1920x1080, ...), content scaled to fit.
- `colors` (array): Instead: 1 color = solid, 2-4 = diagonal gradient.
- `image` (string): Instead: a wallpaper image, scaled to cover.
- `input` (string, required): Path to the source video or image (png/jpg).
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits (screenshots for an image).
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `padding` (integer): px around the content (default 6% of the longer side).
- `preset` (string): Gradient: desktop (default, dark slate), rec (red), amber, light.
- `radius` (integer): Corner radius px (default ~1.2% of the longer side; 0 = square).
- `shadow` (integer): Shadow blur px (default ~2.5%; 0 = none).
- `shadowOpacity` (number): Default 0.5.

Output parameters:

- `height` (integer)
- `outputPath` (string)
- `width` (integer)

### `compress` (~121 tokens)

Compress Video

Re-encode a video smaller (H.264 CRF ladder, optional width cap). For a platform target use export_preset.

Input parameters:

- `input` (string, required): Path to the source video.
- `level` (string): CRF 23 / 28 / 32 (default medium).
- `maxWidth` (integer): Width cap in px (only downscales).
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).

Output parameters:

- `outputPath` (string): Path of the file written.

### `extract_audio` (~107 tokens)

Extract Audio

Extract the audio track of a media file to its own file (mp3, aac, wav, or copy). Returns the output path.

Input parameters:

- `format` (string, required): Audio output codec. copy keeps the source codec without re-encoding.
- `input` (string, required): Path to the source media.
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).

Output parameters:

- `outputPath` (string): Path of the file written.

### `normalize_audio` (~115 tokens)

Normalize Loudness

Normalize loudness to a delivery target (two-pass EBU R128 loudnorm); video is copied. Reports loudness before and after.

Input parameters:

- `input` (string, required): Path to the source video or audio file.
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `target`: youtube (-14 LUFS, default), podcast (-16), broadcast (-23), or a LUFS number.

Output parameters:

- `outputPath` (string): Path of the file written.

### `denoise` (~127 tokens)

Denoise Audio

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.

Input parameters:

- `input` (string, required): Path to the source video or audio file.
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `strength` (string): How hard to reduce noise: light (6 dB), medium (12 dB, default), strong (20 dB).

Output parameters:

- `outputPath` (string): Path of the file written.

### `transcribe` (~187 tokens)

Transcribe Speech

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.

Input parameters:

- `input` (string, required): Path to the video or audio to transcribe.
- `language` (string): Spoken language code, e.g. 'en', or 'auto' (default).
- `model` (string): Path to a whisper.cpp model file (ggml-*.bin). Defaults to SCREENCAST_WHISPER_MODEL.
- `output` (string): Optional output .srt path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `words` (boolean): One word per cue, for word timing (cut_by_transcript).

Output parameters:

- `cues` (integer)
- `srtPath` (string)
- `text` (string)

### `burn_subtitles` (~143 tokens)

Burn In Subtitles

Burn SRT/ASS subtitles (e.g. from transcribe) into a video in the bundled font.

Input parameters:

- `input` (string, required): Path to the source video.
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `style` (string): clean (default for .srt): outlined line. social: big bold text on a dark box. .ass keeps its own styling unless set.
- `subtitles` (string, required): Path to an .srt (e.g. from transcribe) or .ass subtitle file.

Output parameters:

- `outputPath` (string): Path of the file written.

### `chapters` (~260 tokens)

Chapters

Write chapters (markers, scene changes, transcript, or a list) into an mp4/mkv/mov copy without re-encoding; returns YouTube chapter text. Can mux an SRT as soft subtitles.

Input parameters:

- `chapters` (array): Or explicit { start, title } chapters.
- `from` (string): markers (default; add_marker, else the file's chapters), scenes (screen changes), or transcript (SRT sections).
- `input` (string): Path to the video.
- `minChapterSec` (number): Shortest chapter (default 1; scenes 10, transcript 30).
- `output` (string): Optional .mp4/.mkv/.mov path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing output file.
- `sessionId` (string): Or a stopped recording's id.
- `subtitleLanguage` (string): ISO 639-2, e.g. "eng".
- `subtitles` (string): Also mux this .srt/.vtt/.ass as a soft subtitle track.
- `textOnly` (boolean): Return chapters and YouTube text only; write no file.
- `transcript` (string): The .srt for from: transcript.

Output parameters:

- `chapters` (array)
- `youtube` (string)

### `clip` (~111 tokens)

Extract Clips

Extract several frame-exact segments, each to its own file. For one segment, trim does the same.

Input parameters:

- `input` (string, required): Path to the source video.
- `output` (string): Optional output path. Only honored for a single segment; multi-segment output lands under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `segments` (array, required): {start, end} segments in seconds; each becomes its own file.

Output parameters:

- `count` (integer)
- `outputs` (array)

### `cut_idle` (~159 tokens)

Cut Idle Stretches

Remove dead air: cut stretches where the screen is frozen (and silent), keeping a short pad. Returns the time saved.

Input parameters:

- `dryRun` (boolean): Only report what would be cut.
- `input` (string, required): Path to the source video.
- `keepSec` (number): Seconds kept at each edge of a cut (default 0.4).
- `minIdleSec` (number): Only cut still stretches at least this long (default 2).
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `useAudio` (boolean): Require silent audio too (default true when there is audio).

### `cut_by_transcript` (~167 tokens)

Cut By Transcript

Edit a video by its transcript: cut quoted text, cue numbers, or fillers. Also writes the re-timed .srt.

Input parameters:

- `dryRun` (boolean): Only report the cuts.
- `fillers` (boolean): Also cut fillers (um, uh...) that have their own cue.
- `input` (string, required): Path to the source video.
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `remove` (array): Cue numbers as the .srt numbers them, or transcript text quoted exactly (must occur once).
- `srt` (string, required): Its .srt (transcribe; words: true for word timing).

Output parameters:

- `cuts` (array)
- `removedSec` (number)

### `redact_region` (~170 tokens)

Redact Regions

Cover given rectangles in a video (e.g. secrets on screen). Not automatic detection: find them with find_text redact: true. Off-frame regions are rejected.

Input parameters:

- `color` (string): Box fill color (default black).
- `input` (string, required): Path to the source video.
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `pad` (integer): Grow each region by this many px (default 0).
- `regions` (array, required): Pixel rectangles (x, y, width, height), each optionally limited to start..end seconds.
- `style` (string): box (default): irreversible fill; blur/pixelate are partially recoverable.

Output parameters:

- `outputPath` (string): Path of the file written.

### `list_audio_devices` (~38 tokens)

List Audio Devices

List DirectShow audio devices and flag a likely loopback (Stereo Mix or a virtual-audio driver), for start_recording's audio.device.

Output parameters:

- `devices` (array)
- `loopbackDevice` (string|null)
- `note` (string)

### `list_video_devices` (~21 tokens)

List Video Devices

List DirectShow cameras for start_recording's webcam.device.

Output parameters:

- `devices` (array)

### `list_targets` (~122 tokens)

List Capture Targets

List the desktop, monitors, and visible windows (topmost first, with capturability per backend). Each entry has a `target` string to pass as-is to capture tools; use it instead of guessing a title.

Input parameters:

- `capturableOnly` (boolean): Leave out windows neither backend can capture (minimized, off screen). Default false.
- `exe` (string): Only list windows of this executable, e.g. 'Code.exe' or 'code'.
- `titleContains` (string): Only list windows whose title contains this text (case-insensitive).

Output parameters:

- `full` (object)
- `monitors` (array)
- `note` (string)
- `wgcAvailable` (boolean)
- `windows` (array)

### `doctor` (~66 tokens)

Check Setup

Check the setup: ffmpeg/ffprobe (FFmpeg 8+?), optional filters, capture devices, Windows OCR, settings, and enabled toolsets; `problems` says what is missing and how to fix it. Call on first use or when a tool reports a missing feature.

Output parameters:

- `devices` (object)
- `env` (object)
- `ffmpeg` (object)
- `ffprobe` (object)
- `filters` (object)
- `ocr` (object)
- `ok` (boolean)
- `problems` (array)
- `server` (object)
- `storage` (object)
- `wgc` (object)

### `xfade_transition` (~144 tokens)

Crossfade Transition

Join two videos with an xfade transition (audio crossfaded); they need not match in size, fps, or audio. For more clips use assemble_highlights.

Input parameters:

- `duration` (number): Transition length in seconds (default 1).
- `inputA` (string, required): Outgoing video.
- `inputB` (string, required): Incoming video.
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `transition` (string): xfade name (default fade): fade, wipeleft, slideup, circleopen, dissolve, ...

Output parameters:

- `outputPath` (string): Path of the file written.

### `assemble_highlights` (~171 tokens)

Assemble Highlights

Stitch clips (including title cards) into one video with cuts or xfade transitions; they need not match in size, fps, or audio.

Input parameters:

- `clips` (array, required): Clip paths, in order.
- `duration` (number): Transition seconds (default 1).
- `fps` (integer): Common output fps (default 30).
- `height` (integer): Common output height (default 1080).
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `transition` (string): cut (default) or an xfade name (fade, wipeleft, slideup, ...).
- `width` (integer): Common output width (default 1920).

Output parameters:

- `outputPath` (string): Path of the file written.

### `title_card` (~264 tokens)

Title Card

Generate a title card clip (centered text on a solid background, silent audio track) to stitch in with assemble_highlights. Uncoverable characters are reported in warnings.

Input parameters:

- `bg` (string): Background color (default black).
- `bold` (boolean): Use the bold weight (default true).
- `duration` (number): Card length in seconds (default 3).
- `fontColor` (string): Text color (default white).
- `fontFile` (string): Font: a .ttf/.otf/.ttc path or a C:\Windows\Fonts file name. Default: bundled Inter, with a covering system font for scripts it lacks (CJK, emoji, Arabic, ...).
- `fontSize` (integer): Text size in px (default 96).
- `fps` (integer): Card fps (default 30).
- `height` (integer): Card height (default 1080).
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `text` (string, required): Title text. Multiple lines are allowed (use \n).
- `width` (integer): Card width (default 1920).

Output parameters:

- `outputPath` (string): Path of the file written.

### `music_bed` (~174 tokens)

Add Music Bed

Lay music under a video: looped or trimmed to length, faded, leveled, and mixed with any existing audio. Video is stream-copied.

Input parameters:

- `duck` (boolean): Duck the music under the original audio (default false).
- `fadeIn` (number): Fade-in seconds (default 1).
- `fadeOut` (number): Fade-out seconds (default 2).
- `music` (string, required): Music audio file.
- `musicVolume` (number): 0..1 (default 0.25 over existing audio, 0.8 alone).
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `video` (string, required): Path to the video.

Output parameters:

- `outputPath` (string): Path of the file written.

### `narrate` (~130 tokens)

Narrate

Offline voiceover with the built-in Windows voices: speaks each line at its time or marker over the audio, plus an SRT.

Input parameters:

- `duck` (boolean): Duck the original audio (default true).
- `lines` (array, required)
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `rate` (number): Default 1.
- `video` (string, required): Path to the video.
- `voice` (string): Voice name or part (doctor lists them).

Output parameters:

- `outputPath` (string): Path of the file written.

### `reframe` (~123 tokens)

Reframe Aspect Ratio

Re-aspect a video to 16:9, 9:16, 1:1, or 4:5 by padding or cropping.

Input parameters:

- `aspect` (string, required): Target aspect ratio.
- `fit` (string): pad (default): letterbox, nothing lost. crop: fill and center-crop.
- `input` (string, required): Path to the source video.
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).

Output parameters:

- `outputPath` (string): Path of the file written.

### `zoom` (~322 tokens)

Zoom and Pan

Smooth animated zoom-and-pan into the action and back out, from keyframes or planned from logged clicks or screen changes.

Input parameters:

- `dryRun` (boolean): Return the planned keyframes only (editable, pass back).
- `events` (string): Events log (default: the input's .events.jsonl); must match the input's timing and size, so use the original recording.
- `follow` (string): Without keyframes: clicks (from the events log of start_recording events: true) or changes (where the screen changed). auto (default): clicks if logged, else changes.
- `highlightClicks` (boolean): Ring each logged click (default false).
- `highlightColor` (string): Ring color (default #FF4545).
- `holdSec` (number): Auto mode: stay zoomed this long after activity (default 2).
- `input` (string, required): Path to the source video.
- `keyframes` (array): Views reached by time t: a source rectangle (x, y, width, height), or { t, full: true } to zoom out. Omit to plan them (see follow).
- `maxZoom` (number): Auto mode: the furthest it zooms in (default 2.5).
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `transitionSec` (number): How long each zoom/pan eases (default 0.6).

Output parameters:

- `keyframes` (array)

### `pipeline` (~354 tokens)

Edit Pipeline

Run several edits (trim, crop, scale, speed, cut_idle, redact, callout, keystroke_overlay, cursor, reframe, zoom, backdrop, audio, burn_subtitles, then optionally export_preset or export_gif) in one ffmpeg pass: one re-encode, no intermediate files. Prefer it over chaining edit tools; a recipe does the usual polish in one call.

Input parameters:

- `chapters` (boolean): Keep the input's markers as chapters, re-timed through trims and speed.
- `dryRun` (boolean): Return the plan (ffmpeg command, output size) without running it.
- `input` (string, required): Path to the source video.
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `quality` (string): Encoder preset for an mp4 result (default standard).
- `recipe` (string): Polish preset expanded to steps (see dryRun): pr_demo = cut_idle, click zoom, GIF <=10 MB; tutorial = + audio, captions, 1080p mp4; social_reel = 9:16, big captions. Given steps replace its same-op s…
- `steps` (array): Edits in order, each { op, ...its tool's options }; export_preset/export_gif only last. Times and pixels are relative to the video as it is at that step (after earlier trims, speed, crops). zoom foll…

Output parameters:

- `processes` (integer)
- `steps` (array)

### `export_preset` (~163 tokens)

Export for Platform

Encode a platform-ready H.264 file (aspect, fps, bitrate, faststart) for a named platform.

Input parameters:

- `fit` (string): Fit to the platform aspect: pad (default) or crop.
- `input` (string, required): Path to the source video.
- `output` (string): Optional output path. Defaults under SCREENCAST_HOME/edits.
- `overwrite` (boolean): Allow replacing an existing file at the output path (default false).
- `platform` (string, required): Sets aspect, size, fps, bitrate. steam_trailer: 1080p 5.5 Mbps CBR, -14 LUFS. vertical_reel: 1080x1920 over a blurred copy of itself, -14 LUFS (ignores fit).

Output parameters:

- `outputPath` (string): Path of the file written.

### `bug_report` (~332 tokens)

Bug Report Package

Package a recording as a paste-ready repro folder: secret-scanned, redacted clip and GIF, contact sheet, steps from the event log, OCR'd errors, environment, report.md for gh issue create --body-file.

Input parameters:

- `actual` (string): What happened.
- `clipSec` (number): Clip length without start (default 30).
- `end` (number): Clip end s (default: recording end).
- `errorPattern` (string): Error-line regex.
- `expected` (string): What should happen.
- `gif` (boolean): Also export a GIF (default true).
- `input` (string): Recording path (uses its .events.jsonl).
- `maxBytes` (integer): GIF size budget (default 10000000).
- `maxFrames` (integer): Scan frame cap (default 30).
- `outputDir` (string): Package folder (default: a new one in SCREENCAST_HOME/edits).
- `overwrite` (boolean): Replace a report already in outputDir.
- `redact` (boolean): Box out OCR-found secrets in every output (default true; needs Windows OCR).
- `regions` (array): Extra boxes (video px; start/end on the clip clock).
- `scanEverySec` (number): OCR every N s (default 1).
- `secretPattern` (string): Secret regex (default: API keys, tokens, password: values).
- `sessionId` (string): Or a stopped session's id.
- `start` (number): Clip start s (default: end - clipSec).
- `title` (string): Issue title.

Output parameters:

- `clipPath` (string)
- `jsonPath` (string)
- `outputDir` (string)
- `reportPath` (string)

### `step_guide` (~160 tokens)

Step-by-Step Guide

Turn a recording's event log into a numbered how-to: a ringed screenshot and caption per step, marker headings; Markdown and/or one HTML file. Never includes typed text.

Input parameters:

- `format` (string): md + images/, self-contained html, or both (default).
- `input` (string): Recording path (uses its .events.jsonl).
- `ocr` (boolean): OCR shots for captions and secret boxes (default true; needs Windows OCR).
- `outputDir` (string): Guide folder (default: new in SCREENCAST_HOME/edits).
- `overwrite` (boolean): Replace a guide already in outputDir.
- `sessionId` (string): Or a stopped session's id.
- `title` (string): Guide title.

Output parameters:

- `outputDir` (string)

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/tmhsdigital-screencast-mcp/tmhs-screencast-mcp#diagnostics

## Score history

- 2026-11-05: 83
- 2026-11-04: 83
- 2026-11-03: 82
- 2026-11-02: 82
- 2026-11-01: 81
- 2026-10-31: 81
- 2026-10-30: 80
- 2026-10-29: 80
- 2026-10-28: 54
- 2026-10-27: 63
- 2026-10-26: 63
- 2026-10-25: 77

## Common questions

### What is the Screencast MCP server?

Screencast MCP is listed in the public MCP registry as io.github.TMHSDigital/screencast-mcp. Let AI agents record the Windows screen, watch it as frames, and edit it with ffmpeg. This page covers its npm package (@tmhs/screencast-mcp).

### Is the Screencast MCP server safe to use?

Screencast MCP scores 83 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Screencast MCP server expose?

Screencast MCP exposes 57 tools: start_recording, stop_recording, pause_recording, resume_recording, save_replay, and 52 more. Their descriptions and schemas cost roughly 9,455 tokens of context every time the server is loaded.

### Is the Screencast MCP server still maintained?

Screencast MCP is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the Screencast MCP server under?

Screencast MCP declares the CC-BY-NC-ND-4.0 licence, which is not on the OSI-approved list. Read the terms before using it at work, and note this covers the source only, not the cost of any service it calls.

## Links

- npm package: https://www.npmjs.com/package/@tmhs/screencast-mcp
- Socket report: https://socket.dev/npm/package/@tmhs/screencast-mcp
- Repository: https://github.com/TMHSDigital/screencast-mcp
- Website: https://tmhsdigital.github.io/screencast-mcp/
- Changelog RSS feed: https://verifymcp.io/servers/tmhsdigital-screencast-mcp/tmhs-screencast-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/tmhsdigital-screencast-mcp/tmhs-screencast-mcp.json
- HTML version of this page: https://verifymcp.io/servers/tmhsdigital-screencast-mcp/tmhs-screencast-mcp
