demo-director
An MCP server that turns AI agents into product presenters, enabling them to record keynote-quality demo videos by controlling screen recording, mouse, Chrome, and narration.
README
🎬 Demo Director
Turn an AI agent into a product presenter. Demo Director is an MCP server that gives Claude (or any MCP client) everything it needs to record a keynote-quality demo video of your app — completely hands-free:
- 📹 Native screen recording — macOS
screencapture, full screen / display / region - 🖱️ Presenter-grade cursor — a native Swift CGEvent driver that glides the real mouse along smooth, eased, slightly-curved paths; human-rhythm typing; momentum scrolling
- 🌐 Chrome direction — DevTools Protocol control with a clean demo profile: navigate, cinematic in-page scrolling, and the killer feature — resolve any CSS selector to screen coordinates so the real cursor glides to real UI
- 💡 Keynote effects — spotlight (dim everything but the feature) and pulse highlights
- 🗣️ Natural voiceover — first-class Voicebox integration:
voice-clone narration generated sentence-by-sentence with drifting seeds, jittered
punctuation-based pauses, soft procedural in-breaths, and −16 LUFS loudness — then
compose_final_videomuxes it into the finished MP4 in one call. Falls back to macOSsaywhen Voicebox isn't running; livesaynarration for real-time pacing - 🧠 A master-presenter skill — a playbook that teaches the agent to understand your app first, write an Apple-style beat sheet, rehearse off camera, then roll
Tell Claude “record a demo of my app” — it reads your codebase, learns what the app does, writes the story, and presents it feature by feature like it's on stage.
Zero npm dependencies. Pure Node 22+ (built-in fetch + WebSocket), one small
Swift file compiled on first run.
macOS only for now. Linux/Windows drivers are welcome — see Contributing.
Quick start
git clone https://github.com/jayadevrana/demo-director
cd demo-director
npm run check # doctor: builds the cursor helper, verifies ffmpeg/Chrome
Requirements:
- macOS, Node ≥ 22, Xcode Command Line Tools (
xcode-select --install) ffmpeg(narration assembly + muxing):brew install ffmpeg- Permissions for your terminal / Claude app in System Settings → Privacy & Security: Screen Recording and Accessibility
- Optional but recommended: the Voicebox app running locally
(server Online, default
http://127.0.0.1:17493, override withVOICEBOX_URL) for natural voice-clone narration — without it, narration falls back to macOSsay
Register with Claude Code
claude mcp add demo-director -- node /absolute/path/to/demo-director/server.js
Or in .mcp.json:
{
"mcpServers": {
"demo-director": {
"command": "node",
"args": ["/absolute/path/to/demo-director/server.js"]
}
}
}
Install the presenter skill
cp -r skills/demo-director ~/.claude/skills/
The skill is what turns raw tools into a performance: product research → beat sheet → rehearsal → recording → final cut.
Try it
Ask Claude:
Record a 60-second demo of my app at http://localhost:3000. Present it like an Apple keynote — feature by feature, with narration.
What happens:
- Claude reads your app's code and explores it in a throwaway Chrome profile.
- It writes a beat sheet — hook, 3–6 feature beats with narration lines, finale (see examples/beat-sheet.example.json).
- It rehearses every selector and action off camera.
start_recording→ for each beat: glide the cursor to the real element, click, type at human speed, scroll at reading pace, spotlight the moment. →stop_recording.compose_final_video— every beat's narration is rendered in your chosen Voicebox voice (humanized: varied takes, pauses, breaths) and muxed over the recording. The deliverable is a finished MP4 with voiceover.
Tools
| Tool | What it does |
|---|---|
check_setup |
Doctor: helper build, ffmpeg, Chrome, permission notes |
start_recording / stop_recording / recording_status |
Native screen capture (full / display / region) |
screen_info |
Displays + current mouse position |
mouse_move |
Smooth eased glide of the real cursor (600–1000 ms looks human) |
mouse_click / mouse_drag |
Clicks (left/right/double) and smooth drags |
scroll |
OS-level momentum scroll at the cursor |
type_text |
Human-rhythm typing (jittered timing, slower after punctuation) |
press_key |
Named keys with cmd/shift/alt/ctrl modifiers |
pause |
Presenter beats between actions |
chrome_launch / chrome_connect |
Chrome with DevTools control + a clean demo profile |
chrome_navigate |
Navigate and wait for load |
chrome_locate |
CSS selector → screen coordinates for real-cursor interaction |
chrome_scroll |
Cinematic eased in-page scrolling to a selector or Y |
chrome_highlight / chrome_clear_highlight |
Spotlight / pulse emphasis |
chrome_eval / chrome_page_text |
Page scripting and reading |
narrate |
Live voiceover via say (blocks — natural pacing) |
voicebox_status |
Voicebox health + installed voice-clone profiles |
render_narration |
Narration to file with exact duration — Voicebox (natural, humanized) or say fallback |
mux_narration |
Lay rendered audio over the video at precise offsets (ffmpeg) |
compose_final_video |
One call: beats in → finished narrated .mp4 out |
How it works
Claude (MCP client)
│ stdio JSON-RPC
▼
server.js ── src/rpc.js minimal MCP implementation, no SDK
├─ src/recorder.js screencapture -v (SIGINT to stop)
├─ src/mouse.js ─▶ native/cursor Swift CGEvent driver (compiled on first use
│ to ~/.demo-director/bin — smooth bezier moves,
│ pixel momentum scroll, unicode typing)
├─ src/chrome.js CDP over built-in WebSocket; dedicated profile in
│ ~/.demo-director/chrome-profile
├─ src/narrate.js say + ffmpeg adelay/amix/loudnorm + compose_final_video
└─ src/voicebox.js Voicebox REST client: per-sentence generation with
drifting seeds, jittered pauses, synthesized breaths,
click-free joins, -16 LUFS master
The trick that makes demos feel human: the agent asks Chrome where an element is on
the physical screen (chrome_locate accounts for window position and browser chrome),
then drives the real macOS cursor to it. Viewers see an actual hand at work, not
DOM events firing invisibly.
Troubleshooting
screencapture exited immediately→ grant Screen Recording to your terminal / Claude app, then restart it.- Cursor doesn't move / clicks ignored → grant Accessibility permission.
chrome_locateclicks land off-target → set Chrome page zoom to 100 % (⌘0) and don't move the window mid-demo; re-chrome_locateafter any scroll.- Node < 22 → upgrade; the server needs the built-in
WebSocketclient. - Recording is black / clicks do nothing mid-shoot → the display went to sleep.
Keep it awake for long takes by driving under
caffeinate -dims …. - Clicks land on the wrong window → the app window must be the frontmost
application, not just visible; a real click hits whatever owns that pixel. Raise
the target window first (
osascript -e 'tell application "Google Chrome" to activate'). - Long recording never saved → fixed:
stop_recordingnow waits up to 3 min forscreencaptureto finalize a multi-minute file before giving up. - Narration missing from the video → by design: live
sayaudio isn't captured. Userender_narration+mux_narrationfor the final cut.
Contributing
PRs welcome — especially:
- Linux driver (
xdotool/ydotool+wf-recorder/ffmpeg x11grab) - Windows driver (SendInput + Windows.Graphics.Capture)
- Webcam picture-in-picture, click-ripple overlays, auto-zoom on click
- Firefox/Safari support (WebDriver BiDi)
License
Author
Built by Jayadev Rana — @bluealgocapital · YouTube · GitHub
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。