An MCP server that turns an AI agent into a screen-recording product presenter: native screen capture, human-smooth mouse & keyboard, Chrome DevTools control, spotlight effects, and narration.
Demo Director demonstrates strong naming conventions (verb_noun pattern across all 26 tools) and comprehensive parameter schemas with proper types and descriptions. Tool descriptions are detailed and action-oriented, explaining WHAT, WHEN, and HOW. However, output schemas are not explicitly documented in the source code, responses are inferred from handler implementations. Error handling is minimal; most tools lack recovery guidance or actionable error messages. Security considerations (no secrets in params) are well-handled. Composition is excellent: tools are single-responsibility and chain naturally (e.g., chrome_locate → mouse_move → mouse_click). The server is domain-specialized (screen recording + demo automation) with high coherence.
Verify the machine is ready to record a demo: native cursor helper, ffmpeg, Chrome, say voices. Run this first in a new session.
Fade out and remove any highlight overlay.
Attach to an already-running Chrome that has --remote-debugging-port. Optionally pick the tab by URL substring.
Evaluate JavaScript in the connected tab and return the JSON value. Awaits promises.
Keynote-style emphasis on an element: "spotlight" dims the rest of the page around it; "pulse" draws a pulsing outline. Clear with chrome_clear_highlight.
Launch (or attach to) Chrome with a dedicated clean demo profile and DevTools control, optionally opening a URL. Never touches the user's real browser profile.
Output schemas not documented in source code. Tool descriptions explain what is returned (e.g., 'returns the finished file path, duration, and size'), but formal JSON Schema output definitions are absent. LLMs cannot reliably plan downstream tool calls without knowing response structure.
Minimal error handling and recovery guidance. Tools lack actionable error messages. E.g., if chrome_locate fails (selector not found), the response should suggest alternatives or recovery steps, not just a failure code.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Resolve a CSS selector to SCREEN coordinates (center point) so the real cursor can glide to it with mouse_move. Also reports size, visible text, and whether it is in the viewport. Page zoom must be 100%.
Navigate the connected tab and wait for the page to finish loading.
Read the visible text of the current page (for understanding the app before scripting the demo).
Cinematic in-page scroll: eased, per-pixel, at reading pace. Scroll to a CSS selector (lands ~1/3 from the top) or an absolute Y. Use 1200–2500ms on camera.
One-call final cut: render every beat's narration (Voicebox-first) and lay it over the recorded video at its offset. Returns the finished .mp4 plus the rendered duration of every beat.
Click at the current cursor position, or glide-free click at x/y. Supports right and double click.
Press, drag smoothly from one point to another, release.
Glide the real cursor to screen coordinates with a smooth, slightly curved, eased path — like a human presenter. Use 600–1000ms for on-camera moves.
Lay narration segments over a recorded video at given offsets. Requires ffmpeg.
Speak narration live through the speakers while you drive the demo (macOS `say`). Blocks until finished and returns the spoken duration — useful for pacing. NOTE: live audio is not captured in the recording; use render_narration + mux_narration for the final cut.
Hold for N seconds — presenter beats between actions so viewers can absorb what they saw.
Press a key with optional modifiers. Keys: return, tab, space, escape, delete, arrows, home/end, pageup/pagedown, a–z, 0–9. Modifiers: cmd, shift, alt, ctrl.
Whether a recording is in progress, and for how long.
Render narration to an audio file with macOS `say` (or Voicebox if available). Returns the file path and duration.
List displays (id, bounds, main) and the current mouse position.
OS-level momentum scroll at the cursor position. dy > 0 scrolls the page DOWN. For scrolling a web page on camera, prefer chrome_scroll (per-pixel cinematic).
Start recording the screen to a .mov (macOS native screencapture). Optionally restrict to a display number or a pixel region.
Stop the current screen recording and return the finished file path, duration, and size.
Type text into the focused control with human rhythm (jittered inter-key timing, slower after punctuation). cps = characters per second (default 12).
Check the local Voicebox app (natural voice-clone TTS) and list installed voices.
Complex nested parameter objects (e.g., 'area' in start_recording, 'windowSize' in chrome_launch, 'beats' array in compose_final_video) lack inline validation constraints. No min/max for numeric fields, no regex patterns for strings. LLMs may pass invalid nested structures.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) present. Tools like stop_recording, mouse_click, and type_text modify state but lack explicit destructive/write markers. Agents cannot infer safety properties without reading descriptions.
No pagination or result-limiting guidance for tools that could return large datasets (e.g., chrome_page_text defaults to 6000 chars but no explicit cap documented; voicebox_status lists voices with no limit). Descriptions mention defaults but not hard limits.