Repository navigation
Releases: TMHSDigital/screencast-mcp
Release list
v0.48.0
Security
- Network and device paths are refused in every path argument: a UNC (
\\host\share),//host/share, WebDAV (\\host@SSL@443\...),\\?\UNC\or\\.\path is rejected before anything opens it, because opening one sends the user's NTLM credentials to that host. The check runs once per tool call, before the handler, including paths nested inpipelinesteps. - Input paths are confined like outputs: once the client sends workspace roots or
SCREENCAST_ALLOWED_DIRSis set, files to read must sit insideSCREENCAST_HOME, the roots, or those folders (a whisper model and a font file are exempt). - A client whose
roots/listrequest fails now getsSCREENCAST_HOMEandSCREENCAST_ALLOWED_DIRSonly, instead of no confinement. - With no confinement configured, replacing an existing file outside
SCREENCAST_HOMEis refused even withoverwrite: true; list its folder inSCREENCAST_ALLOWED_DIRSto allow it. index_recordingmasks secret-shaped screen text before writing the index, andsearch_recordingmatches the masked text, so hit counts cannot confirm a secret. Retention also removes old*.index.jsonsidecars underSCREENCAST_HOME(#266).
Added
screencast-mcp setup(#267): one command for first-run setup. It runs thedoctorchecks as a checklist, offerswinget install Gyan.FFmpegwhen FFmpeg 8 is missing, and merges the server into Claude Desktop, Cursor, and VS Code configs (each backed up first) and Claude Code (claude mcp add).--dry-runprints the changes,--yesskips prompts,--testrecords a 3 s GIF.- The GitHub Action (#268):
comment: truekeeps one sticky PR comment per job with the exit code, how the recording ended, OCR'd error lines, and a link to the evidence artifact. The CLI gains--ocr-errors. - The Action gains
max-duration,end-reason,artifact-name, andartifact-url; the CLI gains--command-env NAME(#257).
Fixed
-
redact_regionandpipelinestyle: "blur"failed on FFmpeg 8.1.3 and newer for small or thin regions (a 4x4 box, a 16 px text line): boxblur now requires a radius strictly under half the region's side, and the radius is chosen that way. -
pipelinerecipes:redact,crop, andcursoroverrides now run first (after any trim), in source pixels and time. Before, a redact added tosocial_reellanded after the cut and the 9:16 reframe and missed the secret, and on the other recipes a redact or cursor override failed to plan (#251). -
Overlapping
pause_recording,resume_recording, andstop_recordingcalls on one session now run one at a time: a second resume no longer starts an untracked ffmpeg, a stop during a pause no longer force-kills the segment it is finalizing, and a segment ffprobe cannot read is kept with an estimated length instead of dropped (#252). -
encoder: "auto"skips hardware encoders the frame is too large for (NVENC 4096 px, QSV/AMF 4096x2304), and a hardware encoder that fails at start is retried once with x264, with anencoderNote(#253). -
narrateand OCR batches pass their data through a temp file instead of the command line, so long scripts no longer fail with ENAMETOOLONG (#254). -
index_recordingrebuilds an index made without OCR once OCR is available; sidecars are named after the full file name (demo.mp4.index.json, reading the old name only when it belongs to the same recording);search_recordingrefuses an index of another recording and queries with no letters or digits (#255). -
pipelineandnarrateno longer overwrite an existing.srtwithoutoverwrite: true, and the pipeline's sidecar is re-timed through speed and cut steps after the captions (#256). -
The CLI and Action:
evidence.jsonrecordsstatusandendReasonand the run warns when the recording ended before the command;--max-durationmust be a whole number in range; commands with quotes and&survive cmd.exe; the default artifact name is unique per job and matrix leg; and the Action runs the npm version it was released with instead of@latest(#257). -
The replay buffer's event log rotates, and
save_replayreads only the window it needs, so a long-running buffer stays bounded; thereplayBufferSecdescription now says ddagrab works too (#258). -
cut_by_transcriptremovenumbers match the .srt's own cue numbers (0-based and unsorted files included) and every removed piece is reported;step_guideHTML embeds JPEGs within a 10 MB budget, andoverwriteremoves the other format's files (#259).
Changed
- The bundled Inter fonts are subset (Latin, Greek, Cyrillic, symbols), cutting the npm package from 571 kB to 370 kB; characters outside the subset fall back to a system font as before (#265).
- The README is shorter, with reference material moved to the docs site and CONTRIBUTING.md; the Action is documented as
@v0(#263, #264). ROADMAP.md lists only open work (#262). - CI: Ubuntu legs use a SHA-pinned FFmpeg 8 build, capture smoke tests check ffprobe timestamps instead of wall time (with one retry on hosted runners), every tool is exercised through the MCP layer, and coverage is reported on the Windows leg (#260, #261).
v0.47.0
Added
start_recordingbackend: "ddagrab": GPU screen capture (Desktop Duplication) for one display, region, or window, matched to its DXGI output by geometry. With NVENC, frames go straight from capture to the encoder: a 1080p60 recording took 0.5% CPU against 12.7% for gdigrab + x264, with no dropped frames (#199).start_recordingencoder: "auto" | "x264" | "nvenc" | "qsv" | "amf": hardware H.264 encoding with draft/standard/high mapped to each encoder's constant quality.auto(the default with ddagrab) runs a one-time trial encode and falls back to libx264 on machines without a GPU encoder.doctorlists ddagrab and the encoders that work (#199).pause_recording/resume_recording: leave setup (logging in, loading fixtures) out of a recording. Paused stretches are absent from the final file, the event log, and markers;stop_recordingjoins the segments with a stream copy. Sessions gain apausedstatus, and shutdown finalizes paused sessions (#200).list_video_devicesandstart_recording { webcam: { device, corner, size, shape } }: records a camera beside the screen into<output>.webcam.mp4, aligned frame for frame with the recording (across pauses too);stop_recordingreturns a readyoverlaycall, andoverlaygainsshape: "circle"(#200).cursor(#170): record withstart_recordingcursor: "events"(the OS cursor left out, the event log on), then draw a cursor from the log, smoothed by a critically damped spring timed to arrive on time, scaled, hidden afterhideAfterSecidle, with a ripple at each click and an optionalspotlight. Positions drive the overlays through a sendcmd script, so a long recording costs no more per frame than a short one. Also apipelinestep that follows earlier trims, speed changes, cuts, crops, and scales.narrate(#175): offline voiceover. Each oflines({ t | marker, text }) is spoken by the built-in Windows voices (no download or API key), placed at its second or at a marker, and mixed over the original audio, which is ducked under the voice by default. A matching.srtis written beside the output, and lines that run into the next one or past the end are reported inwarnings. The text never leaves the machine;doctorlists the installed voices.- A generated tool reference (#202):
npm run docsbuilds the server, reads its live tool list and schemas, and writes a page per tool underdocs/tools/, the README and home-page tool tables,mcp-tools.json,docs/llms.txtanddocs/llms-full.txt, and the sitemap. The docs test regenerates them and fails on a stale copy;npm run docs:checkchecks without writing. - A Claude Code plugin (#177):
/plugin install screencast --marketplace TMHSDigital/screencast-mcpinstalls the server plusbug-repro,readme-demo, andverify-uiskills. A test keeps every tool and recipe the skills name in step with the server. - A headless CLI and GitHub Action (#179):
screencast-mcp record -- <command>records the screen while a test command runs, exits with its code, and on failure writes a GIF of the last 30 s, a contact sheet, andevidence.json;screencast-mcp call <tool> '<json>'runs any tool. No arguments still starts the MCP server. The composite action inaction.ymlruns it onwindows-latestand uploads the evidence.
Changed
mcp-tools.jsonis generated and carries each tool's full input schema as the server reports it; the README's per-tool descriptions are each tool's own description, linked to its reference page (#202).- The tools/list size budget test is raised to 99 KB for this release's new tools and options (about 97.6 KB by default).
v0.46.0
Added
pipelinepolish steps (#244):cut_idle(finds frozen, silent stretches and cuts them in the same pass, re-timing chapters, keystroke badges, clicks, and subtitles after it),audio(two-passnormalizeand measureddenoise, applied to the audio as it reaches the step),burn_subtitles(an .srt/.ass re-timed onto the edited timeline, ortranscribe: true), andzoomwithfollow: "clicks"planned from the event log.pipelinerecipes (#244):recipe: "pr_demo"(cut idle, click zoom, GIF under 10 MB),"tutorial"(plus denoise/normalize and captions, 1080p mp4) and"social_reel"(9:16 with big captions). A recipe expands to ordinary steps thatdryRunshows; your ownstepsreplace its step of the same op, and steps the input can't support are left out with a note.index_recordingandsearch_recording(#245): a searchable text timeline per recording, so an agent can find "when did the error dialog appear?" as text instead of sampling frames.index_recordingcuts the video at scene changes (no stretch over 10 s goes unread), OCRs one keyframe per segment, and attaches input events, markers, and transcript cues, writing<video>.index.json(or underSCREENCAST_HOME/edits/indexeswhen that folder is outside the allowed output dirs); a re-run on an unchanged file reuses the OCR.search_recordingreturns timecoded hits, tolerant of OCR misreads or withregex: true, with secrets masked in snippets and thumbnails only when asked. The index keeps the raw screen text, so treat it like the video.step_guide(#172): turn a recording and its event log into a step-by-step how-to. Each click, shortcut, typing burst, and scroll becomes a numbered step with the frame just before it, the click ringed, and a caption from OCR of the text under the click ("Click Save"); markers become section headings. Writesguide.mdwith images and/or one self-containedguide.html. Secrets are boxed out of screenshots and masked in captions; typed text is never logged, so it never appears. A newdocument-stepsprompt drives it.cut_by_transcript(#173): edit a narrated recording by its transcript. Quote the lines to drop (or cue numbers) and/or passfillers: trueto remove um/uh/erm; the cuts run in one pass that keeps audio and video in sync, and a re-timed.srtis written beside the video.dryRunreturns the edited text first. Timing is as fine as the transcript; a quote inside a sentence cue is estimated and flaggedexact: false.transcribewords: true: one word per cue with whisper's word timestamps, for word-accurate transcript edits (#173).
Changed
cut_idlecuts audio in 256-sample chunks instead of whole AAC frames, so long edits keep audio within a few milliseconds of the video (#244).- The event-log step builder behind
bug_reportis a shared helper, also used bystep_guide;bug_reportoutput is unchanged (#172). - The tools/list size budget test is raised to 92 KB for the five new tools and the recipes (about 91 KB by default).
v0.45.0
Added
- Instant replay (#197).
start_recording { "replayBufferSec": 60 }keeps a rolling buffer of the last N seconds as a ring of 2 s segments underSCREENCAST_HOME/replay, so disk use stays at about the buffer length however long it runs.save_replaywrites the lastlastSecseconds to an mp4 without stopping the buffer, so an agent can keep the half minute before a flaky failure after it happens; it is a stream copy that returns in about a second, andreencode: truegives a frame-exact file. Withevents: truethe event log is sliced to match.stop_recordingdiscards the buffer unlesssave: true. Buffers left by a crash are deleted at startup. bug_report(#198): one call turns a recording (path orsessionId) into a paste-ready repro folder: a trimmed clip and a GIF under 10 MB, a timecoded contact sheet, numbered steps rebuilt from the input event log, OCR'd error and dialog text, environment details, and areport.md(plusreport.json) ready forgh issue create --body-file. Before anything is encoded, a whole-clip OCR secret scan boxes API keys, tokens, andpassword:values out of every output and masks them in the quoted text; without Windows OCR it refuses unlessredact: false. A newfile-bug-reportprompt drives the flow.backdrop(#171): frame a recording or screenshot on a gradient, solid color, or wallpaper with padding, rounded corners, and a soft drop shadow, optionally on a 16:9, 9:16, 1:1, or 4:5 canvas, with presets in the project's palette. The clip keeps its own timing. Also apipelinestep.keystroke_overlay(#169): keycast-style badges ("Ctrl + Shift + P", "Double click", "Typing…") burned in from the input event log, one at a time, with repeats merged. It only shows what the log holds: never typed text. As apipelinestep, badges are re-timed through earlier trims and speed changes.- Markers and chapters (#174).
add_markerstamps a labelled moment on a running recording's video clock (timed from its first captured frame), or on any file withat. Markers live in the session record and a<video>.markers.jsonsidecar, and the review player shows them as timeline ticks.chapterswrites chapters into an mp4/mkv/mov copy without re-encoding, from markers, scene changes, transcript sections, or an explicit list, returns YouTube chapter text with any rule it breaks, and can mux an SRT as a soft subtitle track.pipelinechapters: truecarries markers into the result, re-timed through trims and speed changes.
Changed
- The tools/list size budget test is raised from 74 KB to 86 KB for the six new tools (about 84.4 KB by default);
SCREENCAST_TOOLSETSstill trims it per client.
v0.44.2
Fixed
- Long filter graphs (many zoom keyframes, rings, or idle cuts) work with ffmpeg builds older than 7.0, such as Ubuntu's apt ffmpeg: those builds get the legacy
-filter_script/-filter_complex_scriptoptions instead of the-/vf fileform they cannot parse. This had failed the Linux CI legs since 0.40.0, so 0.40.0 to 0.44.1 were never released (#225). - CLAUDE.md carries its
standards-versionmarker again, which the ecosystem drift check requires (#193).