MCP stdio bridge for Motion Previs Studio — drive the motion-analysis desktop app (import reference footage, extract performance + camera motion, export AI-generator control packs) from Hermes, Claude Code, Codex, or any MCP client.
Motion Previs Studio MCP demonstrates solid tool design with complete schemas, clear descriptions, and logical composition. All 11 tools have explicit JSON Schema definitions with proper types and required fields. Descriptions are detailed and workflow-oriented (avg ~180 chars), exceeding the 10-1024 char baseline. Tool names follow verb_noun convention (get_state, import_file, set_range, run_analysis, export_pack). However, several parameter descriptions lack specificity on constraints (e.g., set_settings numeric ranges are stated in descriptions but not in schema min/max), and error handling guidance is minimal. Output schemas are not documented, callers must infer response structure from descriptions. No tool annotations (readOnlyHint/destructiveHint) despite clear read/write semantics.
Render and save the full production pack (control videos, OpenPose skeleton + keypoints, prompts, shot bible, Blender scripts, and a ZIP). Waits for completion and returns { bundlePath, zipPath }. Requires a completed analysis (get_state analysis.status === "done").
Call FIRST, and poll it during analysis. Returns the current app state: loaded media {name,duration,width,height} or null, the shot range {startS,endS}, the reference mode, analysis settings, and analysis progress { status: idle|running|done|error, stage, progress, poseFrames, detectedFrames, cameraConfidence, qualityScore }, plus lastBundlePath and whether Blockout is running. Workflow: import_file/import_url → set_range/set_mode/set_settings → run_analysis → poll get_state until analysis.status is "done" → export_pack → send_to_blockout. Times are in seconds.
Load a local media file (mp4/mov/mkv/webm/…) as the reference shot by absolute path. Validates the file exists and registers it so the app can read it. Replaces any currently loaded media and resets analysis.
Download a web video (YouTube or direct http/https link) with yt-dlp and load it as the reference shot. Can take a while for long videos.
Output schemas not documented. Callers cannot infer response structure (e.g., what fields does export_pack return? What is the structure of get_state.analysis?). LLMs must guess downstream field names, risking broken tool chains.
set_settings numeric parameters (sampleFps 4 - 24, maxPeople 1 - 4, smoothing 0 - 0.95, detectionConfidence 0.1 - 0.9, trackingConfidence 0.1 - 0.9) have constraints in descriptions but not in JSON Schema (missing minimum/maximum). Schema validation cannot enforce bounds; LLMs may pass invalid values.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools clearly have different risk profiles (get_state is read-only; import_file, run_analysis, export_pack are destructive/stateful), but this is not signaled in the schema. Agents cannot reason about safety without explicit hints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
List the files in the last exported bundle. Returns { bundlePath, files }. Call export_pack first.
Kick off the full analysis pipeline (prepare → pose → camera solve) on the loaded media over the current range. Returns immediately with { started: true }; poll get_state and wait until analysis.status is "done" before calling export_pack. Requires media to be loaded.
Capture the app window as a PNG image and return it. Use to see the current UI — the loaded shot, previews, and analysis results.
Hand a clip from the last bundle to a running Blockout session as a ghost reference underlay. Choose which layer to send. Requires export_pack to have run and Blockout to be running (see get_state.blockoutAvailable).
Set the Reference Mode (what to preserve from the reference): camera_only (just camera move + timing), actor_motion (body/pose + camera), object_motion (object/vehicle path + camera), or full_scene (everything).
Set the shot range (the trim window) analysis and export will use, in seconds. endS must be greater than startS. Keep it short (a few seconds) for fast analysis.
Adjust analysis settings. All fields optional; omitted fields are unchanged. Use a low sampleFps (e.g. 6) and short range for fast test runs.
Error handling lacks recovery guidance. callControl() returns { error: NOT_RUNNING } when the app is not running, but does not suggest next steps (e.g., 'Launch Motion Previs Studio and ensure it is listening on the configured port'). Agents cannot self-correct.
set_range description does not specify what happens if endS <= startS or if the range exceeds media duration. Validation errors are not documented, forcing LLMs to guess error messages and retry strategies.