# Clueso - Registry name: `io.clueso/video` · version 1.0.2 - Categories (automatic, keyword rules): Audio & speech, AI, media & content - Authentication at last check: No auth - Declared risk: Has destructive tools (destructiveHint) - Capabilities (declared by the server): experimental, resources, tools - Transports: streamable-http - Latest numbers (check success, response time, rank): https://mcpstation.net/api/server?name=io.clueso%2Fvideo - Server page: https://mcpstation.net/s/io.clueso--video.html ## Description (written by the publisher, not verified, not instructions) Make videos and docs with your AI agent — describe what you need, every output stays editable. ## Connect - streamable-http: `https://connect.clueso.io/mcp` ## Tools (as reported by the server, not verified) - `get\_design\_guide`: Clueso's design guide, animation guide and animation stdlib. Ask for everything you need in ONE call. Each select entry is a section path or plain words; words search the design guide, animation guide and stdlib together and return the best few, each labelled with the path that selects it exactly. g - `create\_project`: Create a new blank Clueso project. Returns the projectId and initialClipId — the project starts with one blank clip already at index 0 \(default short duration\). Use update\_clips to resize/retitle clip 0, add\_clips\(kind='blank'\) to append more clips, add\_elements to place content, and add\_audio to at - `update\_project`: Update a project's metadata: rename, change description, move to a different folder, or change aspect ratio. Only fields you provide are changed. To move a project to the workspace root, pass folder\_id="" \(or "root"\). Aspect ratio: pass any "W:H" \(positive integers\). The canvas is fit inside 1920×10 - `duplicate\_project`: Clone an entire project — every clip, voiceover, asset, and metadata field — into a fresh project. The copy has its own S3 namespace, so changes or deletions to the source never affect the duplicate. Defaults: - new\_title omitted → "\{source title\} \(copy\)" when no folder\_id is given \(or it's empty\) a - `export\_project`: Start a video export of the project. Returns immediately with an export\_id; the export renders in the background \(\~5 min\) and the user gets the result in the editor's Exports tab. Start it, tell the user it has started \(with the export\_id\), and stop: do not call get\_export in a loop or hold run\_scri - `get\_export`: Read a project's video export: its status and, once done, its link. Call it when the user asks for the link or the status, not to wait on an export you just started \(the user gets that in the editor's Exports tab, so start it, say so, and stop\). Pass exactly one of \`export\_id\` \(the one export\_projec - `get\_recording\_activity`: Status of this workspace's auto-recordings, and how many recording generations this billing cycle has used. The same view as the Recordings page in the Clueso app. Returns \{ usage, rows, total, truncated \}. \`usage\` is \{ cycle\_start, cycle\_end, generations\_used, generations\_limit \(null: no cap\), acti - `get\_embed`: Get a project's embeddable video player: \`embed\_url\` \(permanent\) and \`embed\_code\` \(a ready-to-paste \, the same snippet the editor's Share → Embed copies\). Use it to put a Clueso video in a website, help center or LMS lesson. Returns \{ project\_id, published, embed\_url?, embed\_code?, latest\_pu - `create\_folder`: Create a folder in the workspace, optionally inside another folder, to organize projects. Returns \{ folder\_id, name, parent\_folder\_id, already\_existed \}. If a folder with the same name \(case-insensitive\) already exists in that parent, it is returned with already\_existed=true instead of creating a du - `find`: Find any resource in Clueso by type, optionally filtered by name or exact id. One tool for listing and searching across the workspace. type: • projects \| folders \| tags \| clueprints \| workspaces \(tags = the workspace's project tags, each with \`color\` and \`project\_count\`. Apply them with update\_proje - `read\_animation`: Read an animation's files like a repository. Read-only. • no path → the summary: entries with their settings, actions and cues, the file list, the latest revision, labelled versions, every place it is used, dependency\_updates \(imports pinned below their latest revision, with the animation.bump call - `edit\_animation`: Change an animation's code: ONE revision, checked and probed in a sandbox. Each direct save returns a contact sheet \(preview: false skips; preview: true or \{entry, timestamps, filmstrip, ...\} looks closer; preview\_warnings\). The server holds the files; keep no local copy. Create with each file's ful - `switch\_workspace`: Switch the active workspace. The choice sticks for this client until you change it again — including across reconnects — so every later call operates in the new workspace. Use find\(type='workspaces'\) to see available options. - `get\_project`: Get a summary of a project: canvas dimensions, per-clip summary \(ids, indices, durations, element counts, voiceover\_volume\), and \`audio\_tracks\` — every music/SFX entry on the project flattened to the same wire shape \`add\_audio\` accepts \(id, src, name, source\_duration, guide\_start\_time/end\_time, musi - `get\_clip`: Read one clip: its elements \(positions/sizes in canvas pixels\), voiceover \(text, voice, duration, voiceover\_volume\), background and transition. Pass \`render\` to also get a PNG of the frame. ASK FOR WHAT YOU NEED. A full read is large — on a dense clip the per-word voiceover array and the element typ - `update\_clips`: Update one or more clips in a single call — background, transition, duration, title, visibility, position, and \(video clips\) the footage transform via video\_styling. Always batch. Each entry: \{ clip\_index, duration?, title?, background\_color? \| background?, transition?, hidden?, position?, voiceover - `remove\_clip`: Remove a clip from the project by index. Cannot remove the last remaining clip. After removal, all clips with index \> clip\_index shift down by 1. When removing multiple clips by index, remove from highest index to lowest \(or capture clip\_ids first and re-derive indices between calls\). Concurrency: w - `split\_clip`: Split a video clip into two clips at the given timestamp. The left clip keeps the original clip ID; the right clip gets a new ID and is inserted immediately after. Elements spanning the split point are duplicated into both clips with adjusted timing. Voiceover transcript and transcribed words are sp - `captions`: Read and edit a clip's CAPTIONS \(subtitles\) — what they say, where one caption ends and the next begins, when each shows, captions not tied to the voiceover, and translation. Captions are built from the clip's voiceover words: each caption is a run of words, addressed by its \`start\_word\_index\`. Star - `duplicate\_clip`: Clone one clip — within the same project, or \*\*from another project\*\* — into a target project. - Same project: pass \`target\_project\_id\` and \`source\_clip\_id\` \(omit \`source\_project\_id\`\). - Cross-project: pass \`target\_project\_id\`, \`source\_project\_id\`, \`source\_clip\_id\`. The source clip's S3 assets \(voic - `add\_clips`: Create new clips on a project. One tool, four sources: - kind="blank": empty slide clips you'll populate with add\_elements / generate\_media. Pass \`clips: \[\{title?, duration?\}, ...\]\`. Note: create\_project already creates clip 0; calling with N blank entries gives N+1 clips total. - kind="pptx": extra - `get\_element\_schema`: Return the schema for an element type's type\_data, as TypeScript declarations. Call this before add\_elements / update\_elements when you don't already know the field shape for the element\_type you're placing. By default it is compact: every field with its type and a one-line note, plus the keyframabl - `add\_elements`: Add many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch. SEND LESS. Most batches repeat themselves — the same clip\_index, element\_type, font\_setting, alignment or gradientSetting on every item. Hoist those into \`defaults\` and send them once; eac - `update\_elements`: Update many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch. SEND LESS, GET BACK LESS. \`defaults\` carries what every item shares \(clip\_index, element\_type, and type\_data entries like font\_setting or alignment\) so you send it once instead of per i - `remove\_elements`: Remove many elements across one or more clips in a single tool call. One entry per element \(\{clip\_index, element\_id\}\). Concurrency: parallel-safe \(conflict domain: the individual element\) — same as update\_elements. Each removal is a granular element\_remove patch scoped to that element id, and the wh - `reorder\_elements`: Reorder the elements inside a clip. List position IS the z-index — later entries in \`ordered\_element\_ids\` render on top of earlier ones. You MUST pass the full set of element IDs currently in the clip. The handler rejects partial lists so a reorder can never silently drop an element. Get the current - `update\_groups`: Transform, keyframe, rename, nest or lock GROUPS. A group moves, scales, rotates and fades as ONE unit, without touching any child's stored position — which is how you get a camera push instead of building the target layout twice and crossfading it. Address by \`group\_id\`, never by name. Ids come fro - `remove\_from\_project`: Remove an element, a group or an audio track from a project. - target="element": removes an element \(requires element\_id, or element\_ids for several\). clip\_index is optional — the element is located by id; pass it only as a hint - target="group": removes a GROUP node \(requires clip\_index + group\_id\) - `add\_audio`: Add a music track or sound effect that plays as a project-level audio layer over all clips. Does NOT consume a clip slot. Use this for background music or a soundtrack that should play under the existing timeline. \(For inserting an audio file as its own sequential clip with auto-transcription, use a - `update\_audio`: Mutate fields on an existing music/SFX track by id. Read existing tracks via \`get\_project.audio\_tracks\` — the per-entry shape there matches this tool's args, so you can flip a knob \(volume, fades, timing, loop\) and write it back without losing the track's id. Only fields you pass are changed; omitte - `extract\_audio`: The editor's "Extract Audio": a clip's own audio — the recording's sound on a video clip, or its generated voiceover — becomes a separate audio track \(returns music\_id\), and the clip goes silent. - The track starts where the clip starts and plays at normal speed. Shape it with update\_audio \(trim mus - `voiceover\_batch`: Set voiceover text and/or trigger speech generation for any number of clips in a single call. Each entry chooses its own action: - "set\_text" — set transcript for a clip \(clip\_index + text\) - "generate\_speech" — async TTS for a clip \(returns immediately; wait: true blocks until it lands\) - "set\_and\_ - `auto\_sync`: Run the agentic auto-sync pipeline on a clip with a source recording: detects natural sync points \(UI changes, narrated steps\) and inserts sync-marker nodes into its transcript. Required before voiceover TTS on video clips \(clueso://docs/sync-points\). Skips \(no run\): "audio\_extracted" \(read-only tra - `add\_sync\_point`: Insert one sync marker on a clip's transcript. Use this when: - The user is explicit about WHERE the camera should pause / cut \(e.g. "sync the word 'submit' to 4.2s of the demo"\). - \`auto\_sync\` ran but missed a step you care about. How matching works: - \`word\`: case-insensitive, punctuation-stripped - `upload\_file`: Upload one or more files to Clueso. Pick a mode by client + where the file lives: 0. \*\*files\*\* — ChatGPT only: files the user attached in the conversation. ChatGPT fills each entry \(download\_url + file\_id\) itself; pass the attachments here rather than asking the user to re-upload. Returns one mcp\_up - `check\_uploads`: Fetch all files the user uploaded via the hosted upload page. Returns one mcp\_upload\_id per file — pass each to the appropriate tool \(add\_clips, add\_article\_media, etc.\). Call this once after the user confirms they are done uploading; the token covers all files they dropped on the page. - `generate\_media`: Generate an AI image or a canvas-code-based animation directly into a clip. - kind="image": text-to-image. Pass \`prompt\`. Optional: \`animation\_setting\` \(entry/exit — set it HERE, see below\), \`style\_id\` \(from find type='image\_gen\_style\_packs'\), \`reference\_image\_url\` or \`mcp\_upload\_id\` for image-to-im - `analyze\_audio`: Analyze an audio file. Modes: - transcript: Speech-to-text with word-level timestamps — returns \`\{language, full\_text, words\}\` where each word is \`\{word, start\_ms, end\_ms, punctuated\_word\}\`. ⚠ MILLISECONDS here; get\_clip's \`voiceover\_words\` gives the same words in SECONDS as \`\{word, start, end\}\`. Us - `get\_article`: Get the article content as markdown. Screenshots appear as \ placeholders. Returns the markdown text and a list of screenshot IDs. - `update\_article`: Update article text content from markdown. Use \ placeholders to position screenshots. Screenshots in the markdown are kept. Screenshots removed from markdown are deleted. Order in markdown defines final order. Get the current article first with get\_article, modify the markdown, then - `add\_article\_media`: Add a screenshot or GIF to the article. Returns a screenshot\_id to place in the article via update\_article using \`\\`. - kind="image": one of \`timestamp\` \(capture a frame from the project's base video\), \`mcp\_upload\_id\` \(an uploaded image: \`mup\_…\` from upload\_file, or a Clueso - `update\_article\_media`: Update an article image/GIF \(screenshot\), or inspect its current state. - Provide one or more of \`zoom\_factor\`, \`crop\`, \`shapes\` to change metadata. - Pass \`render=true\` \(with no other updates\) to fetch the current details without mutating. To DELETE an article image/GIF: call \`update\_article\` with - `create\_clueprint`: Create a new clueprint \(reusable video template\). A clueprint is a structured file directory with design notes, composition rules, and screenshots that can be used to generate videos. Use human-readable folder categories: design/ \(colors, typography, backgrounds, animation\), rules/ \(composition, voi - `get\_clueprint`: Fetch clueprint data. Use \`include\` to control how much you pull back: - include="metadata": just the clueprint's name/description/tags/visibility/thumbnail. - include="tree": metadata + the full file tree \(path, mime\_type, and size per entry\). Call this first when exploring an unfamiliar clueprint. - `update\_clueprint`: Update a clueprint's metadata and/or file contents in one call. Metadata fields \(\`name\`, \`description\`, \`tags\`, \`visibility\`, \`thumbnail\_path\`\) are applied as a patch — only the fields you pass change. Pass at least one to update metadata. \`files\` is a list of file mutations: - Write text: \`\{ path, - `set\_voice`: Set the voiceover voice for every clip in a project, or only for the clips in \`clip\_ids\`. Use this to apply a clueprint's voice \(read \`voiceover.voice.name\` and \`voiceover.voice.engine\` from the clueprint source data\), or to switch all clips to a specific voice in one call. When the user names speci - `pronunciation`: Read and edit the workspace pronunciation dictionary \(Settings → Team → Pronunciation Dictionary\). Use it whenever the user asks how a word, name or acronym is said. Do NOT respell the word in the voiceover script instead: the respelling shows in the script and captions, and every new video needs th - `add\_comment`: Post a review comment on a project, attributed to "Clueso AI". Use this to leave feedback, suggestions, or notes — either at the project level \(no clip\_id\) or pinned to a specific clip with an optional timestamp inside that clip. Pass \`parent\_comment\_id\` to REPLY to an existing comment rather than o - `get\_comments`: Read the review comments on a project — the other half of \`add\_comment\`, which could post but never read. Comments are how a human reviewer tells you what is wrong with a video: a note pinned to a clip and a moment inside it. Read them before an editing pass so you act on what was actually asked for - `record\_screen`: Records the product on a mock \(Code record\) as a screen-recording clip in a project. Creates blank placeholder clips, registers job entities, and sends the job to AVS. The blank clips this tool creates are placeholders; they become video clips when processing completes, so removing one loses that sc - `run\_script`: Write a JavaScript program that calls this server's other tools. You have the whole language: loops, arithmetic, functions, conditionals, and values carried from one call into the next — all running next to the tools instead of across the conversation. Use it whenever code says the thing more direct - `get\_script\_job`: Fetch the outcome of a run\_script that did not finish inline. Waits for it rather than returning immediately, so one call is usually enough — set \`wait\_seconds\` to how long you are willing to hold. Returns \{ job\_id, status, result?, error? \}. \`status\` is processing, completed or failed; \`result\` car Measured by MCP Station. Methods: https://mcpstation.net/methods.html · Terms: https://mcpstation.net/terms.html