creavit-studio-mcp
v1.2.1
Published
MCP server that lets AI coding agents (Claude Code, Codex, Cursor) drive the Creavit Studio screen recording app
Maintainers
Readme
Creavit Studio MCP Server
Lets AI coding agents — Claude Code, Codex, Cursor, or anything else that speaks MCP — drive the Creavit Studio desktop app: open projects, change settings, add zoom ranges, start recordings, export video, and see the canvas to verify the result.
macOS only (Creavit Studio is a macOS app). Requires Node 18+.
Install
Claude Code
claude mcp add creavit-studio -- npx -y creavit-studio-mcpOr, if you have the app repo checked out, .mcp.json in desktop/ already
configures it — just open Claude Code there.
Cursor
~/.cursor/mcp.json (global) or .cursor/mcp.json (per project):
{
"mcpServers": {
"creavit-studio": {
"command": "npx",
"args": ["-y", "creavit-studio-mcp"]
}
}
}Codex CLI
~/.codex/config.toml:
[mcp_servers.creavit-studio]
command = "npx"
args = ["-y", "creavit-studio-mcp"]Verify
npx creavit-studio-mcp --doctorcreavit-studio v1.2.0
✓ 50 MCP tools defined
✓ Offline project reading available (.crvt files readable without the app)
✓ Connected to the app (v3.0.5, pid 61068)
Open windows: 2
Agent-connected renderers: main, editor
✓ 56 bridge commands available
Everything looks good.How it works
Agent (Claude Code / Codex / Cursor)
│ MCP over stdio (JSON-RPC)
▼
creavit-studio-mcp
│ HTTP + bearer token, bound to 127.0.0.1 only
▼
Creavit Studio main process (agent bridge)
│ IPC
▼
Renderer windows (editor / recorder) → the real app stateOn startup the app picks a random port, generates a fresh token, and writes an endpoint descriptor:
~/Library/Application Support/creavit-studio/agent-bridge.json (mode 0600)The MCP server discovers the app through that file. Restarting the app does not require restarting the MCP server — the endpoint is re-read on every request.
The app must be running for most tools. Project inspection tools read .crvt
files directly and work with the app closed.
Tools
App — creavit_app_info, creavit_app_window, creavit_app_mode,
creavit_permissions, creavit_events
Projects — creavit_project_list, creavit_project_summary,
creavit_project_manifest, creavit_project_open, creavit_project_save,
creavit_project_reveal
The first three work with the app closed.
Editor — creavit_editor_state, creavit_editor_get_settings,
creavit_editor_set_settings, creavit_editor_list_zooms,
creavit_editor_add_zoom, creavit_editor_update_zoom,
creavit_editor_remove_zoom, creavit_editor_segments,
creavit_editor_set_segments, creavit_editor_seek,
creavit_editor_playback, creavit_editor_screenshot,
creavit_editor_export, creavit_editor_history
Appearance — creavit_editor_background_get,
creavit_editor_background_set, creavit_editor_camera_get,
creavit_editor_camera_set, creavit_editor_audio
Perspective — creavit_editor_perspectives,
creavit_editor_add_perspective, creavit_editor_update_perspective,
creavit_editor_remove_perspective
Recording — creavit_devices_list, creavit_recording_status,
creavit_recording_start, creavit_recording_stop
Browser walkthrough — creavit_browser_open, creavit_browser_inspect,
creavit_browser_focus, creavit_browser_interact, creavit_browser_scroll,
creavit_browser_close, creavit_record_url_walkthrough
Escape hatches — creavit_capabilities, creavit_call, creavit_ipc,
creavit_eval, creavit_logs
The typed tools cannot cover the whole app. creavit_capabilities lists
every command and editor action the app exposes; creavit_call invokes any
of them; creavit_ipc reaches all ~110 raw IPC channels. New app features
become reachable through these without changing the MCP server.
Typical flow
creavit_app_info is the app running, which windows are open
creavit_project_list see available projects
creavit_project_summary understand the target project
creavit_project_open open it in the editor
creavit_editor_state poll until duration > 0 (loading takes seconds)
creavit_editor_screenshot see the current look
creavit_editor_set_settings change something
creavit_editor_screenshot VERIFY the result
creavit_project_save persistBackground, camera, and mute
Use the typed tools instead of guessing generic setting keys:
creavit_editor_background_set type=solid color=#10131a
creavit_editor_background_set type=gradient gradient={type, direction, colors}
creavit_editor_camera_set settings={visible,size,radius,shadow,mirror,...}
creavit_editor_audio action=mute
creavit_project_savecreavit_editor_audio action=mute changes both preview audio and every clip's
timeline volume, so the saved project also exports without source audio.
Record a URL walkthrough
creavit_record_url_walkthrough is the high-level workflow. By default it opens
the URL in a frameless site-only capture window (16:9, 4:3, 1:1, 9:16,
or another requested ratio) and waits for the DOM, fonts, and images before
recording. It then executes ordered semantic actions with the real macOS mouse,
so the normal Creavit custom-cursor track receives authentic move/click events.
It trims the timeline to durationMs, adds
scroll-highlight zooms, optionally covers the whole video with a perspective
preset, mutes it, and saves it.
When the calling agent has inspected the page, it can pass ordered steps
(scrollPages, dwellMs, zoom, scale, x, y, and optionally
selector/text plus action) to dwell on, hover, click, type, and frame the
important parts instead of using the generic evenly spaced scroll plan.
Example input:
{
"url": "https://example.com",
"cleanWindow": true,
"aspectRatio": "4:3",
"durationMs": 10000,
"steps": [
{ "action": "click", "text": "Features", "dwellMs": 1000 },
{ "action": "scrollTo", "text": "Get Started", "dwellMs": 700 },
{ "action": "click", "text": "Get Started", "dwellMs": 3000 }
],
"controlSystemMouse": true,
"autoZoom": true,
"zoomScale": 1.8,
"perspective": true,
"perspectiveTemplate": "minimal-tilt",
"mute": true
}For hand-directed recordings, use creavit_browser_open,
creavit_recording_start, and creavit_browser_scroll separately, then add
zooms/perspective with the editor tools.
Two things worth knowing:
- Wait for the load. After
creavit_project_open, pollcreavit_editor_stateuntilduration > 0. Settings written before loading finishes get overwritten. padding,radius,shadowSizeare derived values. Reads and writes are transparently redirected tobasePadding/baseRadius/baseShadowSize, andcreavit_editor_set_settingsreturns averifiedblock showing what was actually stored. Check it rather than assuming a write landed.
Security
- Binds to
127.0.0.1only; requests carrying anOriginheader are rejected, so no web page can reach it. - Every request requires a bearer token, regenerated on each app launch.
- The endpoint file is written with
0600permissions. - Arbitrary code execution (
creavit_eval) is off by default. - Page loading and scrolling inside a clean capture window do not require Accessibility permission. Real system mouse move/click automation and external-browser scrolling do require macOS Accessibility permission.
Environment variables
Set on the app, not the MCP server:
| Variable | Effect |
|---|---|
| CREAVIT_AGENT_BRIDGE=0 | Disable the bridge entirely |
| CREAVIT_AGENT_BRIDGE_PORT | Pin a fixed port (default: pick a free one) |
| CREAVIT_AGENT_BRIDGE_EVAL=1 | Enable the creavit_eval tool |
Set on the MCP server:
| Variable | Effect |
|---|---|
| CREAVIT_AGENT_BRIDGE_ENDPOINT | Explicit path to the endpoint descriptor |
Troubleshooting
"Creavit Studio is not running" — start the app. If it is running, check
that the bridge came up: its log line is [AgentBridge] Ready → http://127.0.0.1:<port>.
"The 'editor' window is not open" — editor tools need a project open. Call
creavit_project_open first.
Agent says a tool does not exist — MCP clients cache the tool list at connect time. Restart the agent session after upgrading the server.
Settings do not seem to apply — check the verified field in the
creavit_editor_set_settings response, and make sure the project finished
loading (creavit_editor_state → duration > 0).
Extending
The MCP server is a thin, typed façade. To add a capability:
- Main-process work → add a command in
electron/agentBridge/commands/*.cjs. - Needs renderer state → add an action to the relevant host composable in
composables/agent/, then publish it viaproxy("<action>")inelectron/agentBridge/commands/editorCommands.cjs. - Want a typed MCP tool → add it in
mcp/src/tools/*.mjs. Optional — anything registered on the bridge is already reachable viacreavit_call.
