Screencast MCP
NPM · @TMHS/SCREENCAST-MCP
Let AI agents record the Windows screen, watch it as frames, and edit it with ffmpeg
Available components
Last scanned (23 hours ago)
Scores higher than 76% of npm servers
Category Design and Media
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. How we score → Why this is hard to score →
Supply Chain Security98
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 30 of 92 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency87
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to TMHSDigital/screencast-mcp). View diagnostics → Pass
- License check failed: the license (CC-BY-NC-ND-4.0) isn't a recognized OSI-approved license. See how to fix → Fail
- Actively maintained (last published 3 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability76
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (good).Pass
- 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. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management31
- Stability check failed: the tool surface changed between 0.35.0 and 0.48.0: 1 tool removals, 0 breaking changes, 17 additions. See how to fix → Fail
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 99% of tool parameters carry a description.Partial
- Structured output schemas are declared (98% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 59 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
- Supports UI / widget rendering.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 4 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 28 to 31.
- 2 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 21 to 24.
- 1 Nov 26 0
- Stability: fail → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Schema quality: 100 → unverified ▼ functional
- Package version: 0.47.0 → 0.48.0 functional
- 31 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 14 to 18.
- 29 Oct 26 +26
- Malware scan: unverified → pass ▲ security
- Known CVEs: unverified → pass ▲ security
- Dependency health: unverified → 0.86 ▲ functional
- 28 Oct 26 −9
- Known CVEs: pass → unverified ▼ security
- Stability: 0.07 → fail ▼ security
- Dependency health: 0.85 → unverified ▼ functional
- Schema quality: 197 → 170 ▲ functional
- 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 functional
- 27 Oct 26 0
- Package version: 0.38.0 → 0.39.0 functional
- 26 Oct 26 −14
- Malware scan: pass → unverified ▼ security
- Stability: 0.00 → unverified ▼ security
- Known CVEs: pass → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Capabilities: pass → unverified ▼ functional
- Dependency health: 0.85 → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- 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 functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 4 Nov 2026 · Analysed npm/@tmhs/screencast-mcp@0.48.0
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | npm |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | TMHSDigital/screencast-mcp |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/TMHSDigital/screencast-mcp/.github/workflows/publish.yml@refs/tags/v0.48.0 |
| Rekor log index | 3617872362 |
| Predicate type | SLSA build provenance https://slsa.dev/provenance/v1 |
| Subject digest | sha512:6dcf4949d551aa0804285875a89a447a1a407f53c701ca7690dfa8b4d8e98808c61889b4c24bba9a930cc09eb4307b199b2ac1131544bb6809f5f73c8 |
Background: How many MCP packages publish verified provenance →
Dependencies 92 packages
| Packages resolved | 92 |
|---|---|
| Stale | 30 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
add_marker Add Marker ~100
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.
| Name | Type | Req | Description |
|---|---|---|---|
| at | number | – | Video second (default: now, while recording). |
| input | string | – | Or a video path (needs at). |
| label | string | yes | e.g. "bug appears". |
| sessionId | string | – | Recording to mark (a stopped one needs at). |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | – |
| markersPath | string | yes | – |
No examples provided.
assemble_highlights Assemble Highlights ~171
Stitch clips (including title cards) into one video with cuts or xfade transitions; they need not match in size, fps, or audio.
| Name | Type | Req | Description |
|---|---|---|---|
| clips | array | yes | 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). |
| Name | Type | Req | Description |
|---|---|---|---|
| outputPath | string | yes | Path of the file written. |
No examples provided.
backdrop Add Backdrop ~281
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | yes | 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. |
| Name | Type | Req | Description |
|---|---|---|---|
| height | integer | yes | – |
| outputPath | string | yes | – |
| width | integer | yes | – |
No examples provided.
bug_report Bug Report Package ~332
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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. |
| Name | Type | Req | Description |
|---|---|---|---|
| clipPath | string | yes | – |
| jsonPath | string | yes | – |
| outputDir | string | yes | – |
| reportPath | string | yes | – |
No examples provided.
burn_subtitles Burn In Subtitles ~143
Burn SRT/ASS subtitles (e.g. from transcribe) into a video in the bundled font.
| Name | Type | Req | Description |
|---|---|---|---|
| input | string | yes | 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 | yes | Path to an .srt (e.g. from transcribe) or .ass subtitle file. |
| Name | Type | Req | Description |
|---|---|---|---|
| outputPath | string | yes | Path of the file written. |
No examples provided.
callout Add Callouts ~199
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | yes | Path to the source video. |
| items | array | yes | 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). |
| Name | Type | Req | Description |
|---|---|---|---|
| outputPath | string | yes | Path of the file written. |
No examples provided.
chapters Chapters ~260
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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. |
| Name | Type | Req | Description |
|---|---|---|---|
| chapters | array | yes | – |
| youtube | string | yes | – |
No examples provided.
clip Extract Clips ~111
Extract several frame-exact segments, each to its own file. For one segment, trim does the same.
| Name | Type | Req | Description |
|---|---|---|---|
| input | string | yes | 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 | yes | {start, end} segments in seconds; each becomes its own file. |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | – |
| outputs | array | yes | – |
No examples provided.
compress Compress Video ~121
Re-encode a video smaller (H.264 CRF ladder, optional width cap). For a platform target use export_preset.
| Name | Type | Req | Description |
|---|---|---|---|
| input | string | yes | 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). |
| Name | Type | Req | Description |
|---|---|---|---|
| outputPath | string | yes | Path of the file written. |
No examples provided.
concat Concatenate Videos ~96
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.
| Name | Type | Req | Description |
|---|---|---|---|
| inputs | array | yes | 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). |
| Name | Type | Req | Description |
|---|---|---|---|
| outputPath | string | yes | Path of the file written. |
No examples provided.
contact_sheet Contact Sheet ~224
Tile timestamped frames of a video into one image to see a whole recording at a glance (the cheapest first look).
| Name | Type | Req | Description |
|---|---|---|---|
| columns | integer | – | Tiles per row (default: roughly square). |
| count | integer | – | Frames to tile (default 12). |
| input | string | yes | 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). |
| Name | Type | Req | Description |
|---|---|---|---|
| inlineImages | integer | yes | – |
| outputPath | string | yes | – |
No examples provided.
convert Convert Format ~150
Convert media to mp4, webm, or gif. For a size-bounded GIF/WebP prefer export_gif; for a smaller mp4, compress or export_preset.
| Name | Type | Req | Description |
|---|---|---|---|
| format | string | yes | mp4 (H.264), webm (VP9), or gif (palette). |
| fps | number | – | gif only: fps (default 12). |
| input | string | yes | 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). |
| Name | Type | Req | Description |
|---|---|---|---|
| outputPath | string | yes | Path of the file written. |
No examples provided.
crop Crop Video ~101
Crop a video to a pixel rectangle; one running off the frame is rejected.
| Name | Type | Req | Description |
|---|---|---|---|
| height | integer | yes | – |
| input | string | yes | 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 | yes | – |
| x | integer | yes | – |
| y | integer | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| outputPath | string | yes | Path of the file written. |
No examples provided.
cursor Re-rendered Cursor ~228
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | yes | 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. |
| Name | Type | Req | Description |
|---|---|---|---|
| segments | integer | yes | – |
No examples provided.
cut_by_transcript Cut By Transcript ~167
Edit a video by its transcript: cut quoted text, cue numbers, or fillers. Also writes the re-timed .srt.
| Name | Type | Req | Description |
|---|---|---|---|
| dryRun | boolean | – | Only report the cuts. |
| fillers | boolean | – | Also cut fillers (um, uh...) that have their own cue. |
| input | string | yes | 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 | yes | Its .srt (transcribe; words: true for word timing). |
| Name | Type | Req | Description |
|---|---|---|---|
| cuts | array | yes | – |
| removedSec | number | yes | – |
No examples provided.
cut_idle Cut Idle Stretches ~159
Remove dead air: cut stretches where the screen is frozen (and silent), keeping a short pad. Returns the time saved.
| Name | Type | Req | Description |
|---|---|---|---|
| dryRun | boolean | – | Only report what would be cut. |
| input | string | yes | 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). |
No output schema declared.
No examples provided.
denoise Denoise Audio ~127
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.
| Name | Type | Req | Description |
|---|---|---|---|
| input | string | yes | 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). |
| Name | Type | Req | Description |
|---|---|---|---|
| outputPath | string | yes | Path of the file written. |
No examples provided.
doctor Check Setup ~66
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.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| devices | object | yes | – |
| env | object | yes | – |
| ffmpeg | object | yes | – |
| ffprobe | object | yes | – |
| filters | object | yes | – |
| ocr | object | yes | – |
| ok | boolean | yes | – |
| problems | array | yes | – |
| server | object | yes | – |
| storage | object | yes | – |
| wgc | object | yes | – |
No examples provided.
export_gif Export GIF or WebP ~194
Export an animated GIF or WebP that fits a size budget (for PRs, issues, READMEs), stepping fps, width, and quality down until it fits.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | yes | 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). |
| Name | Type | Req | Description |
|---|---|---|---|
| outputPath | string | yes | Path of the file written. |
No examples provided.
export_preset Export for Platform ~163
Encode a platform-ready H.264 file (aspect, fps, bitrate, faststart) for a named platform.
| Name | Type | Req | Description |
|---|---|---|---|
| fit | string | – | Fit to the platform aspect: pad (default) or crop. |
| input | string | yes | 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 | yes | 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). |
| Name | Type | Req | Description |
|---|---|---|---|
| outputPath | string | yes | Path of the file written. |
No examples provided.
extract_audio Extract Audio ~107
Extract the audio track of a media file to its own file (mp3, aac, wav, or copy). Returns the output path.
| Name | Type | Req | Description |
|---|---|---|---|
| format | string | yes | Audio output codec. copy keeps the source codec without re-encoding. |
| input | string | yes | 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). |
| Name | Type | Req | Description |
|---|---|---|---|
| outputPath | string | yes | Path of the file written. |
No examples provided.
find_text Find Text (OCR) ~374
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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). |
| Name | Type | Req | Description |
|---|---|---|---|
| imageSize | object | yes | – |
No examples provided.
get_media_info Get Media Info ~47
Probe a media file with ffprobe and return duration, resolution, frame rate, codecs, container format, and size.
| Name | Type | Req | Description |
|---|---|---|---|
| input | string | yes | Path to the media file to probe. |
| Name | Type | Req | Description |
|---|---|---|---|
| audioCodec | string|null | yes | – |
| durationSec | number|null | yes | – |
| fps | number|null | yes | – |
| height | number|null | yes | – |
| input | string | yes | – |
| videoCodec | string|null | yes | – |
| width | number|null | yes | – |
No examples provided.
get_session Get Session ~43
Inspect a single recording session by id, including live status and whether its output file exists on disk.
| Name | Type | Req | Description |
|---|---|---|---|
| sessionId | string | yes | Session id returned by start_recording. |
| Name | Type | Req | Description |
|---|---|---|---|
| alive | boolean | yes | – |
| fileExists | boolean | yes | – |
| id | string | yes | – |
| outputPath | string | yes | – |
| status | string | yes | – |
No examples provided.
index_recording Index Recording ~137
Build a recording's text timeline (<video>.index.json: OCR per scene, events, markers, transcript) for search_recording.
| Name | Type | Req | Description |
|---|---|---|---|
| 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. |
| Name | Type | Req | Description |
|---|---|---|---|
| indexPath | string | yes | – |
| segments | number | yes | – |
No examples provided.
keystroke_overlay Keystroke Overlay ~301
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | yes | 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). |
| Name | Type | Req | Description |
|---|---|---|---|
| badges | integer | yes | – |
No examples provided.
list_audio_devices List Audio Devices ~38
List DirectShow audio devices and flag a likely loopback (Stereo Mix or a virtual-audio driver), for start_recording's audio.device.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| devices | array | yes | – |
| loopbackDevice | string|null | yes | – |
| note | string | yes | – |
No examples provided.
list_sessions List Sessions ~34
List all recording sessions (active and finished) with their status, target, output path, and whether the process is still alive.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | – |
| sessions | array | yes | – |
No examples provided.
list_targets List Capture Targets ~122
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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). |
| Name | Type | Req | Description |
|---|---|---|---|
| full | object | yes | – |
| monitors | array | yes | – |
| note | string | yes | – |
| wgcAvailable | boolean | yes | – |
| windows | array | yes | – |
No examples provided.
list_video_devices List Video Devices ~21
List DirectShow cameras for start_recording's webcam.device.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| devices | array | yes | – |
No examples provided.
music_bed Add Music Bed ~174
Lay music under a video: looped or trimmed to length, faded, leveled, and mixed with any existing audio. Video is stream-copied.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | yes | 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 | yes | Path to the video. |
| Name | Type | Req | Description |
|---|---|---|---|
| outputPath | string | yes | Path of the file written. |
No examples provided.
narrate Narrate ~130
Offline voiceover with the built-in Windows voices: speaks each line at its time or marker over the audio, plus an SRT.
| Name | Type | Req | Description |
|---|---|---|---|
| duck | boolean | – | Duck the original audio (default true). |
| lines | array | yes | – |
| 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 | yes | Path to the video. |
| voice | string | – | Voice name or part (doctor lists them). |
| Name | Type | Req | Description |
|---|---|---|---|
| outputPath | string | yes | Path of the file written. |
No examples provided.
normalize_audio Normalize Loudness ~115
Normalize loudness to a delivery target (two-pass EBU R128 loudnorm); video is copied. Reports loudness before and after.
| Name | Type | Req | Description |
|---|---|---|---|
| input | string | yes | 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. |
| Name | Type | Req | Description |
|---|---|---|---|
| outputPath | string | yes | Path of the file written. |
No examples provided.
overlay Overlay Image or Video ~191
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.
| Name | Type | Req | Description |
|---|---|---|---|
| end | number | – | Hide after this second. |
| height | integer | – | Scale to this height. |
| input | string | yes | Path to the base video. |
| output | string | – | Optional output path. Defaults under SCREENCAST_HOME/edits. |
| overlay | string | yes | 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 | yes | Left, px. |
| y | integer | yes | Top, px. |
| Name | Type | Req | Description |
|---|---|---|---|
| outputPath | string | yes | Path of the file written. |
No examples provided.
pause_recording Pause Recording ~48
Pause a recording; until resume_recording nothing is captured, and the gap is left out of the file, events, and markers.
| Name | Type | Req | Description |
|---|---|---|---|
| sessionId | string | yes | From start_recording. |
| Name | Type | Req | Description |
|---|---|---|---|
| recordedSec | number | yes | – |
| sessionId | string | yes | – |
| status | string | yes | – |
No examples provided.
pipeline Edit Pipeline ~354
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | yes | 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… |
| Name | Type | Req | Description |
|---|---|---|---|
| processes | integer | yes | – |
| steps | array | yes | – |
No examples provided.
read_events Read Input Events ~182
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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). |
| Name | Type | Req | Description |
|---|---|---|---|
| eventsPath | string | yes | – |
| matched | integer | yes | – |
| returned | integer | yes | – |
| summary | object | yes | – |
| total | integer | yes | – |
No examples provided.
redact_region Redact Regions ~170
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.
| Name | Type | Req | Description |
|---|---|---|---|
| color | string | – | Box fill color (default black). |
| input | string | yes | 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 | yes | Pixel rectangles (x, y, width, height), each optionally limited to start..end seconds. |
| style | string | – | box (default): irreversible fill; blur/pixelate are partially recoverable. |
| Name | Type | Req | Description |
|---|---|---|---|
| outputPath | string | yes | Path of the file written. |
No examples provided.
reframe Reframe Aspect Ratio ~123
Re-aspect a video to 16:9, 9:16, 1:1, or 4:5 by padding or cropping.
| Name | Type | Req | Description |
|---|---|---|---|
| aspect | string | yes | Target aspect ratio. |
| fit | string | – | pad (default): letterbox, nothing lost. crop: fill and center-crop. |
| input | string | yes | 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). |
| Name | Type | Req | Description |
|---|---|---|---|
| outputPath | string | yes | Path of the file written. |
No examples provided.
resume_recording Resume Recording ~31
Resume a paused recording (same target and settings).
| Name | Type | Req | Description |
|---|---|---|---|
| sessionId | string | yes | From start_recording. |
| Name | Type | Req | Description |
|---|---|---|---|
| recordedSec | number | yes | – |
| sessionId | string | yes | – |
| status | string | yes | – |
No examples provided.
review_recording Review Recording ~69
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.
| Name | Type | Req | Description |
|---|---|---|---|
| input | string | – | Path to the video. |
| sessionId | string | – | Or the session id of a stopped recording. |
| Name | Type | Req | Description |
|---|---|---|---|
| durationSec | number|null | yes | – |
| fps | number|null | yes | – |
| hasAudio | boolean | yes | – |
| height | number|null | yes | – |
| input | string | yes | – |
| width | number|null | yes | – |
No examples provided.
sample_frames Sample Frames ~278
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.
| Name | Type | Req | Description |
|---|---|---|---|
| dedupe | boolean | – | Mode fps: drop near-duplicate frames (default false). |
| fps | number | – | Frames per second (mode fps). |
| input | string | yes | 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). |
| Name | Type | Req | Description |
|---|---|---|---|
| frameCount | integer | yes | – |
| frameDir | string | yes | – |
| frames | array | yes | – |
| mode | string | yes | – |
No examples provided.
save_replay Save Replay ~141
Save the last N seconds of a replay buffer (start_recording replayBufferSec) to an mp4; the buffer keeps running.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | yes | Session id of a replay buffer. |
| Name | Type | Req | Description |
|---|---|---|---|
| durationSec | number | yes | – |
| outputPath | string | yes | – |
| sessionId | string | yes | – |
No examples provided.
scale Scale Video ~133
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.
| Name | Type | Req | Description |
|---|---|---|---|
| height | integer | – | Target height in px. Omit to derive from width (keeps aspect). |
| input | string | yes | 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). |
| Name | Type | Req | Description |
|---|---|---|---|
| outputPath | string | yes | Path of the file written. |
No examples provided.
screen_diff Screen Diff ~118
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.
| Name | Type | Req | Description |
|---|---|---|---|
| a | string | yes | Before image (or video: first frame). |
| b | string | yes | 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). |
| Name | Type | Req | Description |
|---|---|---|---|
| changedFraction | number | yes | – |
| identical | boolean | yes | – |
| meanDiff | number | yes | – |
| regions | array | yes | – |
| ssim | number|null | yes | – |
No examples provided.
screenshot Take Screenshot ~246
Capture one PNG of the screen, a monitor, a window, or a region, returned inline and by path.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | yes | 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. |
| Name | Type | Req | Description |
|---|---|---|---|
| backend | string | yes | – |
| inlineImages | integer | yes | – |
| outputPath | string | yes | – |
| target | string | yes | – |
No examples provided.
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.
npm · @tmhs/screencast-mcp
claude mcp add tmhsdigital-screencast-mcp -- npx -y @tmhs/screencast-mcp
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 4 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 4 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.