Skip to content

Releases: TMHSDigital/screencast-mcp

v0.48.0

Choose a tag to compare

@github-actions github-actions released this 01 Nov 02:24

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 in pipeline steps.
  • Input paths are confined like outputs: once the client sends workspace roots or SCREENCAST_ALLOWED_DIRS is set, files to read must sit inside SCREENCAST_HOME, the roots, or those folders (a whisper model and a font file are exempt).
  • A client whose roots/list request fails now gets SCREENCAST_HOME and SCREENCAST_ALLOWED_DIRS only, instead of no confinement.
  • With no confinement configured, replacing an existing file outside SCREENCAST_HOME is refused even with overwrite: true; list its folder in SCREENCAST_ALLOWED_DIRS to allow it.
  • index_recording masks secret-shaped screen text before writing the index, and search_recording matches the masked text, so hit counts cannot confirm a secret. Retention also removes old *.index.json sidecars under SCREENCAST_HOME (#266).

Added

  • screencast-mcp setup (#267): one command for first-run setup. It runs the doctor checks as a checklist, offers winget install Gyan.FFmpeg when 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-run prints the changes, --yes skips prompts, --test records a 3 s GIF.
  • The GitHub Action (#268): comment: true keeps 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, and artifact-url; the CLI gains --command-env NAME (#257).

Fixed

  • redact_region and pipeline style: "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.

  • pipeline recipes: redact, crop, and cursor overrides now run first (after any trim), in source pixels and time. Before, a redact added to social_reel landed 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, and stop_recording calls 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 an encoderNote (#253).

  • narrate and OCR batches pass their data through a temp file instead of the command line, so long scripts no longer fail with ENAMETOOLONG (#254).

  • index_recording rebuilds 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_recording refuses an index of another recording and queries with no letters or digits (#255).

  • pipeline and narrate no longer overwrite an existing .srt without overwrite: true, and the pipeline's sidecar is re-timed through speed and cut steps after the captions (#256).

  • The CLI and Action: evidence.json records status and endReason and the run warns when the recording ended before the command; --max-duration must 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_replay reads only the window it needs, so a long-running buffer stays bounded; the replayBufferSec description now says ddagrab works too (#258).

  • cut_by_transcript remove numbers match the .srt's own cue numbers (0-based and unsorted files included) and every removed piece is reported; step_guide HTML embeds JPEGs within a 10 MB budget, and overwrite removes 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

Choose a tag to compare

@github-actions github-actions released this 28 Oct 05:09

Added

  • start_recording backend: "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_recording encoder: "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. doctor lists 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_recording joins the segments with a stream copy. Sessions gain a paused status, and shutdown finalizes paused sessions (#200).
  • list_video_devices and start_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_recording returns a ready overlay call, and overlay gains shape: "circle" (#200).
  • cursor (#170): record with start_recording cursor: "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 after hideAfterSec idle, with a ripple at each click and an optional spotlight. Positions drive the overlays through a sendcmd script, so a long recording costs no more per frame than a short one. Also a pipeline step that follows earlier trims, speed changes, cuts, crops, and scales.
  • narrate (#175): offline voiceover. Each of lines ({ 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 .srt is written beside the output, and lines that run into the next one or past the end are reported in warnings. The text never leaves the machine; doctor lists the installed voices.
  • A generated tool reference (#202): npm run docs builds the server, reads its live tool list and schemas, and writes a page per tool under docs/tools/, the README and home-page tool tables, mcp-tools.json, docs/llms.txt and docs/llms-full.txt, and the sitemap. The docs test regenerates them and fails on a stale copy; npm run docs:check checks without writing.
  • A Claude Code plugin (#177): /plugin install screencast --marketplace TMHSDigital/screencast-mcp installs the server plus bug-repro, readme-demo, and verify-ui skills. 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, and evidence.json; screencast-mcp call <tool> '<json>' runs any tool. No arguments still starts the MCP server. The composite action in action.yml runs it on windows-latest and uploads the evidence.

Changed

  • mcp-tools.json is 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

Choose a tag to compare

@github-actions github-actions released this 28 Oct 04:18

Added

  • pipeline polish 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-pass normalize and measured denoise, applied to the audio as it reaches the step), burn_subtitles (an .srt/.ass re-timed onto the edited timeline, or transcribe: true), and zoom with follow: "clicks" planned from the event log.
  • pipeline recipes (#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 that dryRun shows; your own steps replace its step of the same op, and steps the input can't support are left out with a note.
  • index_recording and search_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_recording cuts 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 under SCREENCAST_HOME/edits/indexes when that folder is outside the allowed output dirs); a re-run on an unchanged file reuses the OCR. search_recording returns timecoded hits, tolerant of OCR misreads or with regex: 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. Writes guide.md with images and/or one self-contained guide.html. Secrets are boxed out of screenshots and masked in captions; typed text is never logged, so it never appears. A new document-steps prompt drives it.
  • cut_by_transcript (#173): edit a narrated recording by its transcript. Quote the lines to drop (or cue numbers) and/or pass fillers: true to remove um/uh/erm; the cuts run in one pass that keeps audio and video in sync, and a re-timed .srt is written beside the video. dryRun returns the edited text first. Timing is as fine as the transcript; a quote inside a sentence cue is estimated and flagged exact: false.
  • transcribe words: true: one word per cue with whisper's word timestamps, for word-accurate transcript edits (#173).

Changed

  • cut_idle cuts 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_report is a shared helper, also used by step_guide; bug_report output 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

Choose a tag to compare

@github-actions github-actions released this 28 Oct 03:59

Added

  • Instant replay (#197). start_recording { "replayBufferSec": 60 } keeps a rolling buffer of the last N seconds as a ring of 2 s segments under SCREENCAST_HOME/replay, so disk use stays at about the buffer length however long it runs. save_replay writes the last lastSec seconds 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, and reencode: true gives a frame-exact file. With events: true the event log is sliced to match. stop_recording discards the buffer unless save: true. Buffers left by a crash are deleted at startup.
  • bug_report (#198): one call turns a recording (path or sessionId) 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 a report.md (plus report.json) ready for gh issue create --body-file. Before anything is encoded, a whole-clip OCR secret scan boxes API keys, tokens, and password: values out of every output and masks them in the quoted text; without Windows OCR it refuses unless redact: false. A new file-bug-report prompt 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 a pipeline step.
  • 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 a pipeline step, badges are re-timed through earlier trims and speed changes.
  • Markers and chapters (#174). add_marker stamps a labelled moment on a running recording's video clock (timed from its first captured frame), or on any file with at. Markers live in the session record and a <video>.markers.json sidecar, and the review player shows them as timeline ticks. chapters writes 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. pipeline chapters: true carries 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_TOOLSETS still trims it per client.

v0.44.2

Choose a tag to compare

@github-actions github-actions released this 28 Oct 03:30

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_script options instead of the -/vf file form 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-version marker again, which the ecosystem drift check requires (#193).

v0.39.0

Choose a tag to compare

@github-actions github-actions released this 27 Oct 02:20

Full Changelog: v0.38.0...v0.39.0

v0.38.0

Choose a tag to compare

@github-actions github-actions released this 26 Oct 11:47

Full Changelog: v0.37.0...v0.38.0

v0.37.0

Choose a tag to compare

@github-actions github-actions released this 26 Oct 01:09

Full Changelog: v0.36.0...v0.37.0

v0.36.0

Choose a tag to compare

@github-actions github-actions released this 25 Oct 23:01

Full Changelog: v0.35.0...v0.36.0

v0.35.0

Choose a tag to compare

@github-actions github-actions released this 25 Oct 22:35

Full Changelog: v0.34.0...v0.35.0