{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_2rwcchqakz4w","handle":"clueso","url":"https://wellknown.network/agents/clueso","links":{"self":"https://wellknown.network/agents/clueso/record.json","html":"https://wellknown.network/agents/clueso","markdown":"https://wellknown.network/agents/clueso/record.md","api":"https://wellknown.network/api/v1/agents/clueso","status":"https://wellknown.network/api/v1/agents/clueso/status","claim":"https://wellknown.network/agents/clueso/claim","claimApi":"https://wellknown.network/api/v1/claims","claimDescriptor":"https://wellknown.network/agents/clueso/claim.json","badge":"https://wellknown.network/agents/clueso/badge.svg","openapi":"https://wellknown.network/openapi.json","history":"https://wellknown.network/api/v1/agents/clueso/history","tools":"https://wellknown.network/api/v1/agents/clueso/tools"},"ard":{"identifier":"urn:air:connect.clueso.io:server:clueso","type":"application/mcp-server-card+json"},"kind":"mcp_server","declared":{"name":"Clueso","summary":"Make videos and docs with your AI agent — describe what you need, every output stays editable.","description":"Make videos and docs with your AI agent — describe what you need, every output stays editable.","publisher":{"name":"io.clueso","url":null},"homepage":"https://help.clueso.io/mcp-setup","repository":"https://github.com/clueso-ai/clueso-mcp","version":"1.0.2","license":null,"protocols":["mcp"],"tags":[],"pricing":null,"endpoints":[{"url":"https://connect.clueso.io/mcp","type":"mcp_streamable_http","auth":null,"probeable":true}],"skills":null,"tools":null,"extra":{"updatedAt":"2026-08-19T12:26:06.099906Z","publishedAt":"2026-08-19T12:26:06.099906Z","registryName":"io.clueso/video"},"attribution":{"kind":"mcp_registry","name":"mcp_registry","repoUrl":"mcp_registry","summary":"mcp_registry","version":"mcp_registry","description":"mcp_registry","homepageUrl":"mcp_registry","publisherName":"mcp_registry"}},"derived":{"capabilities":[{"slug":"media.video-editing","name":"Video Editing","confidence":1,"provenance":"derived"},{"slug":"media.speech-synthesis","name":"Speech Synthesis","confidence":1,"provenance":"derived"},{"slug":"dev.filesystem","name":"Filesystem","confidence":1,"provenance":"derived"},{"slug":"media.music","name":"Music & Audio","confidence":0.962,"provenance":"derived"},{"slug":"automation.workflows","name":"Workflow Automation","confidence":0.877,"provenance":"derived"},{"slug":"media.image-generation","name":"Image Generation","confidence":0.583,"provenance":"derived"},{"slug":"media.speech-recognition","name":"Speech Recognition","confidence":0.583,"provenance":"derived"},{"slug":"infra.desktop","name":"Desktop Control","confidence":0.569,"provenance":"derived"}],"categories":["automation","dev","infra","media"],"language":"en"},"observed":{"status":"live","statusReason":"Responded 5h ago.","lastOkAt":"2026-10-11T18:25:43.557Z","lastProbedAt":"2026-10-11T18:25:43.557Z","statusComputedAt":"2026-10-11T18:27:51.598Z","reliability30d":{"probes":111,"successRate":1,"p50Ms":56,"basis":"service","measures":{"availability":"availability","latency":"response time","tools":"tool surface observed","summary":"Checks reached the service itself."},"checks":{"total":108,"ok":108,"authBoundaryOk":0,"serviceOk":108,"note":"Counted from the observation rows for the window, checks of the server only (HTTP, A2A card, MCP initialize). ok = authBoundaryOk + serviceOk. `probes` is the sum of daily rollups and includes registry checks, so it can differ from `total`."}},"latestObservations":[{"at":"2026-10-11T18:25:43.557Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":10,"error":null,"detail":{"tools":[{"name":"get_design_guide","description":"Clueso's house style for composing video clips — how to think about concept, typography, color, composition, motion, and pacing. Read it before composing or edi"},{"name":"create_project","description":"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)."},{"name":"update_project","description":"Update a project's metadata: rename, change description, move to a different folder, or change aspect ratio.\n\nOnly fields you provide are changed. To move a pro"},{"name":"duplicate_project","description":"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"},{"name":"export_project","description":"Kick off a video export of the project. Returns immediately with an export_id;\nthe export renders in the background and takes ~5 min. Call get_export(export_id,"},{"name":"get_export","description":"Check on a project's video export, waiting for it to finish. Pass exactly one of `export_id` (the one export_project returned) or `project_id` (that project's m"},{"name":"get_recording_activity","description":"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 a"},{"name":"get_embed","description":"Get a project's embeddable video player: `embed_url` (permanent) and `embed_code` (a ready-to-paste <iframe>, the same snippet the editor's Share → Embed copies"},{"name":"create_folder","description":"Create a folder in the workspace, optionally inside another folder, to organize projects.\n\nReturns { folder_id, name, parent_folder_id, already_existed }. If a "},{"name":"find","description":"Find any resource in Clueso by type, optionally filtered by name or exact id. One tool for listing and searching across the workspace.\n\ntype:\n  • projects | fol"},{"name":"switch_workspace","description":"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"},{"name":"get_project","description":"Get a summary of a project: canvas dimensions, per-clip summary (ids, indices, durations, element counts, voiceover_volume), and `audio_tracks` — every music/SF"},{"name":"get_clip","description":"Read one clip: its elements (positions/sizes in canvas pixels), voiceover (text, voice, duration, voiceover_volume), background and transition. Pass `render` to"},{"name":"update_clips","description":"Update one or more clips in a single call — background, transition, duration, title, visibility, position, and (video clips) the footage transform via video_sty"},{"name":"remove_clip","description":"Remove a clip from the project by index. Cannot remove the last remaining clip.\n\nAfter removal, all clips with index > clip_index shift down by 1. When removing"},{"name":"split_clip","description":"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 aft"},{"name":"captions","description":"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, an"},{"name":"duplicate_clip","description":"Clone one clip — within the same project, or **from another project** — into a target project.\n\n- Same project: pass `target_project_id` and `source_clip_id` (o"},{"name":"add_clips","description":"Create new clips on a project. One tool, three sources:\n\n- kind=\"blank\": empty slide clips you'll populate with add_elements / generate_media. Pass `clips: [{ti"},{"name":"get_element_schema","description":"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 f"},{"name":"add_elements","description":"Add many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch.\n\nSEND LESS. Most batches repeat themselves — the"},{"name":"update_elements","description":"Update many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch.\n\nSEND LESS, GET BACK LESS. `defaults` carries"},{"name":"remove_elements","description":"Remove many elements across one or more clips in a single tool call. One entry per element ({clip_index, element_id}).\n\nConcurrency: parallel-safe (conflict dom"},{"name":"reorder_elements","description":"Reorder the elements inside a clip. List position IS the z-index — later entries in `ordered_element_ids` render on top of earlier ones.\n\nYou MUST pass the full"},{"name":"update_groups","description":"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 "},{"name":"remove_from_project","description":"Remove an element, a group or an audio track from a project.\n- target=\"element\": removes an element (requires element_id, or element_ids for several). clip_inde"},{"name":"add_audio","description":"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 sou"},{"name":"update_audio","description":"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"},{"name":"voiceover_batch","description":"Set voiceover text and/or trigger speech generation for any number of clips in a single call.\n\nEach entry chooses its own action:\n- \"set_text\"          — set tr"},{"name":"auto_sync","description":"Run the agentic auto-sync pipeline against a clip with a source recording. Detects natural sync points (UI state changes, narrated steps) and inserts sync-marke"},{"name":"add_sync_point","description":"Insert one sync marker on a clip's transcript.\n\nUse this when:\n- The user is explicit about WHERE the camera should pause / cut (e.g. \"sync the word 'submit' to"},{"name":"upload_file","description":"Upload one or more files to Clueso. Pick a mode by client + where the file lives:\n\n0. **files** — ChatGPT only: files the user attached in the conversation. Cha"},{"name":"check_uploads","description":"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_med"},{"name":"generate_media","description":"Generate an AI image or canvas-code-based animation directly into a clip.\n\n- kind=\"image\": text-to-image. Pass `prompt`. Optional: `animation_setting` (entry/ex"},{"name":"estimate_duration","description":"Estimate voiceover duration for one or many clips at once (~150 words/minute).\nPass an array of voiceover texts — one per clip. Returns durations in the same or"},{"name":"analyze_audio","description":"Analyze an audio file. Modes:\n- transcript: Speech-to-text with word-level timestamps — returns `{language, full_text, words}` where each word is `{word, start_"},{"name":"get_article","description":"Get the article content as markdown. Screenshots appear as <SCREENSHOT {id}> placeholders. Returns the markdown text and a list of screenshot IDs."},{"name":"update_article","description":"Update article text content from markdown. Use <SCREENSHOT {id}> placeholders to position screenshots.\nScreenshots in the markdown are kept. Screenshots removed"},{"name":"add_article_media","description":"Add a screenshot or GIF to the article. Returns a screenshot_id to place in the article via update_article using `<SCREENSHOT screenshot_id>`.\n\n- kind=\"image\": "},{"name":"update_article_media","description":"Update an article image/GIF (screenshot), or inspect its current state.\n- Provide one or more of `zoom_factor`, `crop`, `shapes` to change metadata.\n- Pass `ren"},{"name":"create_clueprint","description":"Create a new clueprint (reusable video template). A clueprint is a structured file directory with design notes, composition rules, and screenshots that can be u"},{"name":"get_clueprint","description":"Fetch clueprint data. Use `include` to control how much you pull back:\n- include=\"metadata\": just the clueprint's name/description/tags/visibility/thumbnail.\n- "},{"name":"update_clueprint","description":"Update a clueprint's metadata and/or file contents in one call.\n\nMetadata fields (`name`, `description`, `tags`, `visibility`, `thumbnail_path`) are applied as "},{"name":"set_voice","description":"Set the voiceover voice for every clip in a project, or only for the clips in `clip_ids`.\n\nUse this to apply a clueprint's voice (read `voiceover.voice.name` an"},{"name":"add_comment","description":"Post a review comment on a project, attributed to \"Clueso AI\".\n\nUse this to leave feedback, suggestions, or notes — either at the project level (no clip_id) or "},{"name":"get_comments","description":"Read the review comments on a project — the other half of `add_comment`, which could post but never read.\n\nComments are how a human reviewer tells you what is w"},{"name":"record_screen","description":"Records the product on a mock (Code record) as a screen-recording clip in a project.\nCreates blank placeholder clips, registers job entities, and sends the job "},{"name":"run_script","description":"Write a JavaScript program that calls this server's other tools. You have the whole language: loops, arithmetic, functions, conditionals, and values carried fro"},{"name":"get_script_job","description":"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`"}],"toolCount":49,"toolsHash":"7db1ee69a0e2591cd200291ba6ca2b63b1283d2d05411e15caa81197b2c01697","serverName":"clueso-connect","capabilities":["experimental","resources","tools"],"serverVersion":"1.0.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-11T11:23:20.430Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":11,"error":null,"detail":{"tools":[{"name":"get_design_guide","description":"Clueso's house style for composing video clips — how to think about concept, typography, color, composition, motion, and pacing. Read it before composing or edi"},{"name":"create_project","description":"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)."},{"name":"update_project","description":"Update a project's metadata: rename, change description, move to a different folder, or change aspect ratio.\n\nOnly fields you provide are changed. To move a pro"},{"name":"duplicate_project","description":"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"},{"name":"export_project","description":"Kick off a video export of the project. Returns immediately with an export_id;\nthe export renders in the background and takes ~5 min. Call get_export(export_id,"},{"name":"get_export","description":"Check on a project's video export, waiting for it to finish. Pass exactly one of `export_id` (the one export_project returned) or `project_id` (that project's m"},{"name":"get_recording_activity","description":"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 a"},{"name":"get_embed","description":"Get a project's embeddable video player: `embed_url` (permanent) and `embed_code` (a ready-to-paste <iframe>, the same snippet the editor's Share → Embed copies"},{"name":"create_folder","description":"Create a folder in the workspace, optionally inside another folder, to organize projects.\n\nReturns { folder_id, name, parent_folder_id, already_existed }. If a "},{"name":"find","description":"Find any resource in Clueso by type, optionally filtered by name or exact id. One tool for listing and searching across the workspace.\n\ntype:\n  • projects | fol"},{"name":"switch_workspace","description":"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"},{"name":"get_project","description":"Get a summary of a project: canvas dimensions, per-clip summary (ids, indices, durations, element counts, voiceover_volume), and `audio_tracks` — every music/SF"},{"name":"get_clip","description":"Read one clip: its elements (positions/sizes in canvas pixels), voiceover (text, voice, duration, voiceover_volume), background and transition. Pass `render` to"},{"name":"update_clips","description":"Update one or more clips in a single call — background, transition, duration, title, visibility, position, and (video clips) the footage transform via video_sty"},{"name":"remove_clip","description":"Remove a clip from the project by index. Cannot remove the last remaining clip.\n\nAfter removal, all clips with index > clip_index shift down by 1. When removing"},{"name":"split_clip","description":"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 aft"},{"name":"captions","description":"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, an"},{"name":"duplicate_clip","description":"Clone one clip — within the same project, or **from another project** — into a target project.\n\n- Same project: pass `target_project_id` and `source_clip_id` (o"},{"name":"add_clips","description":"Create new clips on a project. One tool, three sources:\n\n- kind=\"blank\": empty slide clips you'll populate with add_elements / generate_media. Pass `clips: [{ti"},{"name":"get_element_schema","description":"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 f"},{"name":"add_elements","description":"Add many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch.\n\nSEND LESS. Most batches repeat themselves — the"},{"name":"update_elements","description":"Update many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch.\n\nSEND LESS, GET BACK LESS. `defaults` carries"},{"name":"remove_elements","description":"Remove many elements across one or more clips in a single tool call. One entry per element ({clip_index, element_id}).\n\nConcurrency: parallel-safe (conflict dom"},{"name":"reorder_elements","description":"Reorder the elements inside a clip. List position IS the z-index — later entries in `ordered_element_ids` render on top of earlier ones.\n\nYou MUST pass the full"},{"name":"update_groups","description":"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 "},{"name":"remove_from_project","description":"Remove an element, a group or an audio track from a project.\n- target=\"element\": removes an element (requires element_id, or element_ids for several). clip_inde"},{"name":"add_audio","description":"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 sou"},{"name":"update_audio","description":"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"},{"name":"voiceover_batch","description":"Set voiceover text and/or trigger speech generation for any number of clips in a single call.\n\nEach entry chooses its own action:\n- \"set_text\"          — set tr"},{"name":"auto_sync","description":"Run the agentic auto-sync pipeline against a clip with a source recording. Detects natural sync points (UI state changes, narrated steps) and inserts sync-marke"},{"name":"add_sync_point","description":"Insert one sync marker on a clip's transcript.\n\nUse this when:\n- The user is explicit about WHERE the camera should pause / cut (e.g. \"sync the word 'submit' to"},{"name":"upload_file","description":"Upload one or more files to Clueso. Pick a mode by client + where the file lives:\n\n0. **files** — ChatGPT only: files the user attached in the conversation. Cha"},{"name":"check_uploads","description":"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_med"},{"name":"generate_media","description":"Generate an AI image or canvas-code-based animation directly into a clip.\n\n- kind=\"image\": text-to-image. Pass `prompt`. Optional: `animation_setting` (entry/ex"},{"name":"estimate_duration","description":"Estimate voiceover duration for one or many clips at once (~150 words/minute).\nPass an array of voiceover texts — one per clip. Returns durations in the same or"},{"name":"analyze_audio","description":"Analyze an audio file. Modes:\n- transcript: Speech-to-text with word-level timestamps — returns `{language, full_text, words}` where each word is `{word, start_"},{"name":"get_article","description":"Get the article content as markdown. Screenshots appear as <SCREENSHOT {id}> placeholders. Returns the markdown text and a list of screenshot IDs."},{"name":"update_article","description":"Update article text content from markdown. Use <SCREENSHOT {id}> placeholders to position screenshots.\nScreenshots in the markdown are kept. Screenshots removed"},{"name":"add_article_media","description":"Add a screenshot or GIF to the article. Returns a screenshot_id to place in the article via update_article using `<SCREENSHOT screenshot_id>`.\n\n- kind=\"image\": "},{"name":"update_article_media","description":"Update an article image/GIF (screenshot), or inspect its current state.\n- Provide one or more of `zoom_factor`, `crop`, `shapes` to change metadata.\n- Pass `ren"},{"name":"create_clueprint","description":"Create a new clueprint (reusable video template). A clueprint is a structured file directory with design notes, composition rules, and screenshots that can be u"},{"name":"get_clueprint","description":"Fetch clueprint data. Use `include` to control how much you pull back:\n- include=\"metadata\": just the clueprint's name/description/tags/visibility/thumbnail.\n- "},{"name":"update_clueprint","description":"Update a clueprint's metadata and/or file contents in one call.\n\nMetadata fields (`name`, `description`, `tags`, `visibility`, `thumbnail_path`) are applied as "},{"name":"set_voice","description":"Set the voiceover voice for every clip in a project, or only for the clips in `clip_ids`.\n\nUse this to apply a clueprint's voice (read `voiceover.voice.name` an"},{"name":"add_comment","description":"Post a review comment on a project, attributed to \"Clueso AI\".\n\nUse this to leave feedback, suggestions, or notes — either at the project level (no clip_id) or "},{"name":"get_comments","description":"Read the review comments on a project — the other half of `add_comment`, which could post but never read.\n\nComments are how a human reviewer tells you what is w"},{"name":"record_screen","description":"Records the product on a mock (Code record) as a screen-recording clip in a project.\nCreates blank placeholder clips, registers job entities, and sends the job "},{"name":"run_script","description":"Write a JavaScript program that calls this server's other tools. You have the whole language: loops, arithmetic, functions, conditionals, and values carried fro"},{"name":"get_script_job","description":"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`"}],"toolCount":49,"toolsHash":"7db1ee69a0e2591cd200291ba6ca2b63b1283d2d05411e15caa81197b2c01697","serverName":"clueso-connect","capabilities":["experimental","resources","tools"],"serverVersion":"1.0.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-11T04:25:54.374Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":12,"error":null,"detail":{"tools":[{"name":"get_design_guide","description":"Clueso's house style for composing video clips — how to think about concept, typography, color, composition, motion, and pacing. Read it before composing or edi"},{"name":"create_project","description":"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)."},{"name":"update_project","description":"Update a project's metadata: rename, change description, move to a different folder, or change aspect ratio.\n\nOnly fields you provide are changed. To move a pro"},{"name":"duplicate_project","description":"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"},{"name":"export_project","description":"Kick off a video export of the project. Returns immediately with an export_id;\nthe export renders in the background and takes ~5 min. Call get_export(export_id,"},{"name":"get_export","description":"Check on a project's video export, waiting for it to finish. Pass exactly one of `export_id` (the one export_project returned) or `project_id` (that project's m"},{"name":"get_recording_activity","description":"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 a"},{"name":"get_embed","description":"Get a project's embeddable video player: `embed_url` (permanent) and `embed_code` (a ready-to-paste <iframe>, the same snippet the editor's Share → Embed copies"},{"name":"create_folder","description":"Create a folder in the workspace, optionally inside another folder, to organize projects.\n\nReturns { folder_id, name, parent_folder_id, already_existed }. If a "},{"name":"find","description":"Find any resource in Clueso by type, optionally filtered by name or exact id. One tool for listing and searching across the workspace.\n\ntype:\n  • projects | fol"},{"name":"switch_workspace","description":"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"},{"name":"get_project","description":"Get a summary of a project: canvas dimensions, per-clip summary (ids, indices, durations, element counts, voiceover_volume), and `audio_tracks` — every music/SF"},{"name":"get_clip","description":"Read one clip: its elements (positions/sizes in canvas pixels), voiceover (text, voice, duration, voiceover_volume), background and transition. Pass `render` to"},{"name":"update_clips","description":"Update one or more clips in a single call — background, transition, duration, title, visibility, position, and (video clips) the footage transform via video_sty"},{"name":"remove_clip","description":"Remove a clip from the project by index. Cannot remove the last remaining clip.\n\nAfter removal, all clips with index > clip_index shift down by 1. When removing"},{"name":"split_clip","description":"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 aft"},{"name":"captions","description":"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, an"},{"name":"duplicate_clip","description":"Clone one clip — within the same project, or **from another project** — into a target project.\n\n- Same project: pass `target_project_id` and `source_clip_id` (o"},{"name":"add_clips","description":"Create new clips on a project. One tool, three sources:\n\n- kind=\"blank\": empty slide clips you'll populate with add_elements / generate_media. Pass `clips: [{ti"},{"name":"get_element_schema","description":"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 f"},{"name":"add_elements","description":"Add many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch.\n\nSEND LESS. Most batches repeat themselves — the"},{"name":"update_elements","description":"Update many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch.\n\nSEND LESS, GET BACK LESS. `defaults` carries"},{"name":"remove_elements","description":"Remove many elements across one or more clips in a single tool call. One entry per element ({clip_index, element_id}).\n\nConcurrency: parallel-safe (conflict dom"},{"name":"reorder_elements","description":"Reorder the elements inside a clip. List position IS the z-index — later entries in `ordered_element_ids` render on top of earlier ones.\n\nYou MUST pass the full"},{"name":"update_groups","description":"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 "},{"name":"remove_from_project","description":"Remove an element, a group or an audio track from a project.\n- target=\"element\": removes an element (requires element_id, or element_ids for several). clip_inde"},{"name":"add_audio","description":"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 sou"},{"name":"update_audio","description":"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"},{"name":"voiceover_batch","description":"Set voiceover text and/or trigger speech generation for any number of clips in a single call.\n\nEach entry chooses its own action:\n- \"set_text\"          — set tr"},{"name":"auto_sync","description":"Run the agentic auto-sync pipeline against a clip with a source recording. Detects natural sync points (UI state changes, narrated steps) and inserts sync-marke"},{"name":"add_sync_point","description":"Insert one sync marker on a clip's transcript.\n\nUse this when:\n- The user is explicit about WHERE the camera should pause / cut (e.g. \"sync the word 'submit' to"},{"name":"upload_file","description":"Upload one or more files to Clueso. Pick a mode by client + where the file lives:\n\n0. **files** — ChatGPT only: files the user attached in the conversation. Cha"},{"name":"check_uploads","description":"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_med"},{"name":"generate_media","description":"Generate an AI image or canvas-code-based animation directly into a clip.\n\n- kind=\"image\": text-to-image. Pass `prompt`. Optional: `animation_setting` (entry/ex"},{"name":"estimate_duration","description":"Estimate voiceover duration for one or many clips at once (~150 words/minute).\nPass an array of voiceover texts — one per clip. Returns durations in the same or"},{"name":"analyze_audio","description":"Analyze an audio file. Modes:\n- transcript: Speech-to-text with word-level timestamps — returns `{language, full_text, words}` where each word is `{word, start_"},{"name":"get_article","description":"Get the article content as markdown. Screenshots appear as <SCREENSHOT {id}> placeholders. Returns the markdown text and a list of screenshot IDs."},{"name":"update_article","description":"Update article text content from markdown. Use <SCREENSHOT {id}> placeholders to position screenshots.\nScreenshots in the markdown are kept. Screenshots removed"},{"name":"add_article_media","description":"Add a screenshot or GIF to the article. Returns a screenshot_id to place in the article via update_article using `<SCREENSHOT screenshot_id>`.\n\n- kind=\"image\": "},{"name":"update_article_media","description":"Update an article image/GIF (screenshot), or inspect its current state.\n- Provide one or more of `zoom_factor`, `crop`, `shapes` to change metadata.\n- Pass `ren"},{"name":"create_clueprint","description":"Create a new clueprint (reusable video template). A clueprint is a structured file directory with design notes, composition rules, and screenshots that can be u"},{"name":"get_clueprint","description":"Fetch clueprint data. Use `include` to control how much you pull back:\n- include=\"metadata\": just the clueprint's name/description/tags/visibility/thumbnail.\n- "},{"name":"update_clueprint","description":"Update a clueprint's metadata and/or file contents in one call.\n\nMetadata fields (`name`, `description`, `tags`, `visibility`, `thumbnail_path`) are applied as "},{"name":"set_voice","description":"Set the voiceover voice for every clip in a project, or only for the clips in `clip_ids`.\n\nUse this to apply a clueprint's voice (read `voiceover.voice.name` an"},{"name":"add_comment","description":"Post a review comment on a project, attributed to \"Clueso AI\".\n\nUse this to leave feedback, suggestions, or notes — either at the project level (no clip_id) or "},{"name":"get_comments","description":"Read the review comments on a project — the other half of `add_comment`, which could post but never read.\n\nComments are how a human reviewer tells you what is w"},{"name":"record_screen","description":"Records the product on a mock (Code record) as a screen-recording clip in a project.\nCreates blank placeholder clips, registers job entities, and sends the job "},{"name":"run_script","description":"Write a JavaScript program that calls this server's other tools. You have the whole language: loops, arithmetic, functions, conditionals, and values carried fro"},{"name":"get_script_job","description":"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`"}],"toolCount":49,"toolsHash":"7db1ee69a0e2591cd200291ba6ca2b63b1283d2d05411e15caa81197b2c01697","serverName":"clueso-connect","capabilities":["experimental","resources","tools"],"serverVersion":"1.0.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-10T22:21:42.565Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":11,"error":null,"detail":{"tools":[{"name":"get_design_guide","description":"Clueso's house style for composing video clips — how to think about concept, typography, color, composition, motion, and pacing. Read it before composing or edi"},{"name":"create_project","description":"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)."},{"name":"update_project","description":"Update a project's metadata: rename, change description, move to a different folder, or change aspect ratio.\n\nOnly fields you provide are changed. To move a pro"},{"name":"duplicate_project","description":"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"},{"name":"export_project","description":"Kick off a video export of the project. Returns immediately with an export_id;\nthe export renders in the background and takes ~5 min. Call get_export(export_id,"},{"name":"get_export","description":"Check on a project's video export, waiting for it to finish. Pass exactly one of `export_id` (the one export_project returned) or `project_id` (that project's m"},{"name":"get_recording_activity","description":"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 a"},{"name":"get_embed","description":"Get a project's embeddable video player: `embed_url` (permanent) and `embed_code` (a ready-to-paste <iframe>, the same snippet the editor's Share → Embed copies"},{"name":"create_folder","description":"Create a folder in the workspace, optionally inside another folder, to organize projects.\n\nReturns { folder_id, name, parent_folder_id, already_existed }. If a "},{"name":"find","description":"Find any resource in Clueso by type, optionally filtered by name or exact id. One tool for listing and searching across the workspace.\n\ntype:\n  • projects | fol"},{"name":"switch_workspace","description":"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"},{"name":"get_project","description":"Get a summary of a project: canvas dimensions, per-clip summary (ids, indices, durations, element counts, voiceover_volume), and `audio_tracks` — every music/SF"},{"name":"get_clip","description":"Read one clip: its elements (positions/sizes in canvas pixels), voiceover (text, voice, duration, voiceover_volume), background and transition. Pass `render` to"},{"name":"update_clips","description":"Update one or more clips in a single call — background, transition, duration, title, visibility, position, and (video clips) the footage transform via video_sty"},{"name":"remove_clip","description":"Remove a clip from the project by index. Cannot remove the last remaining clip.\n\nAfter removal, all clips with index > clip_index shift down by 1. When removing"},{"name":"split_clip","description":"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 aft"},{"name":"captions","description":"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, an"},{"name":"duplicate_clip","description":"Clone one clip — within the same project, or **from another project** — into a target project.\n\n- Same project: pass `target_project_id` and `source_clip_id` (o"},{"name":"add_clips","description":"Create new clips on a project. One tool, three sources:\n\n- kind=\"blank\": empty slide clips you'll populate with add_elements / generate_media. Pass `clips: [{ti"},{"name":"get_element_schema","description":"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 f"},{"name":"add_elements","description":"Add many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch.\n\nSEND LESS. Most batches repeat themselves — the"},{"name":"update_elements","description":"Update many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch.\n\nSEND LESS, GET BACK LESS. `defaults` carries"},{"name":"remove_elements","description":"Remove many elements across one or more clips in a single tool call. One entry per element ({clip_index, element_id}).\n\nConcurrency: parallel-safe (conflict dom"},{"name":"reorder_elements","description":"Reorder the elements inside a clip. List position IS the z-index — later entries in `ordered_element_ids` render on top of earlier ones.\n\nYou MUST pass the full"},{"name":"update_groups","description":"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 "},{"name":"remove_from_project","description":"Remove an element, a group or an audio track from a project.\n- target=\"element\": removes an element (requires element_id, or element_ids for several). clip_inde"},{"name":"add_audio","description":"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 sou"},{"name":"update_audio","description":"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"},{"name":"voiceover_batch","description":"Set voiceover text and/or trigger speech generation for any number of clips in a single call.\n\nEach entry chooses its own action:\n- \"set_text\"          — set tr"},{"name":"auto_sync","description":"Run the agentic auto-sync pipeline against a clip with a source recording. Detects natural sync points (UI state changes, narrated steps) and inserts sync-marke"},{"name":"add_sync_point","description":"Insert one sync marker on a clip's transcript.\n\nUse this when:\n- The user is explicit about WHERE the camera should pause / cut (e.g. \"sync the word 'submit' to"},{"name":"upload_file","description":"Upload one or more files to Clueso. Pick a mode by client + where the file lives:\n\n0. **files** — ChatGPT only: files the user attached in the conversation. Cha"},{"name":"check_uploads","description":"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_med"},{"name":"generate_media","description":"Generate an AI image or canvas-code-based animation directly into a clip.\n\n- kind=\"image\": text-to-image. Pass `prompt`. Optional: `animation_setting` (entry/ex"},{"name":"estimate_duration","description":"Estimate voiceover duration for one or many clips at once (~150 words/minute).\nPass an array of voiceover texts — one per clip. Returns durations in the same or"},{"name":"analyze_audio","description":"Analyze an audio file. Modes:\n- transcript: Speech-to-text with word-level timestamps — returns `{language, full_text, words}` where each word is `{word, start_"},{"name":"get_article","description":"Get the article content as markdown. Screenshots appear as <SCREENSHOT {id}> placeholders. Returns the markdown text and a list of screenshot IDs."},{"name":"update_article","description":"Update article text content from markdown. Use <SCREENSHOT {id}> placeholders to position screenshots.\nScreenshots in the markdown are kept. Screenshots removed"},{"name":"add_article_media","description":"Add a screenshot or GIF to the article. Returns a screenshot_id to place in the article via update_article using `<SCREENSHOT screenshot_id>`.\n\n- kind=\"image\": "},{"name":"update_article_media","description":"Update an article image/GIF (screenshot), or inspect its current state.\n- Provide one or more of `zoom_factor`, `crop`, `shapes` to change metadata.\n- Pass `ren"},{"name":"create_clueprint","description":"Create a new clueprint (reusable video template). A clueprint is a structured file directory with design notes, composition rules, and screenshots that can be u"},{"name":"get_clueprint","description":"Fetch clueprint data. Use `include` to control how much you pull back:\n- include=\"metadata\": just the clueprint's name/description/tags/visibility/thumbnail.\n- "},{"name":"update_clueprint","description":"Update a clueprint's metadata and/or file contents in one call.\n\nMetadata fields (`name`, `description`, `tags`, `visibility`, `thumbnail_path`) are applied as "},{"name":"set_voice","description":"Set the voiceover voice for every clip in a project, or only for the clips in `clip_ids`.\n\nUse this to apply a clueprint's voice (read `voiceover.voice.name` an"},{"name":"add_comment","description":"Post a review comment on a project, attributed to \"Clueso AI\".\n\nUse this to leave feedback, suggestions, or notes — either at the project level (no clip_id) or "},{"name":"get_comments","description":"Read the review comments on a project — the other half of `add_comment`, which could post but never read.\n\nComments are how a human reviewer tells you what is w"},{"name":"record_screen","description":"Records the product on a mock (Code record) as a screen-recording clip in a project.\nCreates blank placeholder clips, registers job entities, and sends the job "},{"name":"run_script","description":"Write a JavaScript program that calls this server's other tools. You have the whole language: loops, arithmetic, functions, conditionals, and values carried fro"},{"name":"get_script_job","description":"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`"}],"toolCount":49,"toolsHash":"7db1ee69a0e2591cd200291ba6ca2b63b1283d2d05411e15caa81197b2c01697","serverName":"clueso-connect","capabilities":["experimental","resources","tools"],"serverVersion":"1.0.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-10T15:30:38.007Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":11,"error":null,"detail":{"tools":[{"name":"get_design_guide","description":"Clueso's house style for composing video clips — how to think about concept, typography, color, composition, motion, and pacing. Read it before composing or edi"},{"name":"create_project","description":"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)."},{"name":"update_project","description":"Update a project's metadata: rename, change description, move to a different folder, or change aspect ratio.\n\nOnly fields you provide are changed. To move a pro"},{"name":"duplicate_project","description":"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"},{"name":"export_project","description":"Kick off a video export of the project. Returns immediately with an export_id;\nthe export renders in the background and takes ~5 min. Call get_export(export_id,"},{"name":"get_export","description":"Check on a project's video export, waiting for it to finish. Pass exactly one of `export_id` (the one export_project returned) or `project_id` (that project's m"},{"name":"get_recording_activity","description":"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 a"},{"name":"get_embed","description":"Get a project's embeddable video player: `embed_url` (permanent) and `embed_code` (a ready-to-paste <iframe>, the same snippet the editor's Share → Embed copies"},{"name":"create_folder","description":"Create a folder in the workspace, optionally inside another folder, to organize projects.\n\nReturns { folder_id, name, parent_folder_id, already_existed }. If a "},{"name":"find","description":"Find any resource in Clueso by type, optionally filtered by name or exact id. One tool for listing and searching across the workspace.\n\ntype:\n  • projects | fol"},{"name":"switch_workspace","description":"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"},{"name":"get_project","description":"Get a summary of a project: canvas dimensions, per-clip summary (ids, indices, durations, element counts, voiceover_volume), and `audio_tracks` — every music/SF"},{"name":"get_clip","description":"Read one clip: its elements (positions/sizes in canvas pixels), voiceover (text, voice, duration, voiceover_volume), background and transition. Pass `render` to"},{"name":"update_clips","description":"Update one or more clips in a single call — background, transition, duration, title, visibility, position, and (video clips) the footage transform via video_sty"},{"name":"remove_clip","description":"Remove a clip from the project by index. Cannot remove the last remaining clip.\n\nAfter removal, all clips with index > clip_index shift down by 1. When removing"},{"name":"split_clip","description":"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 aft"},{"name":"captions","description":"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, an"},{"name":"duplicate_clip","description":"Clone one clip — within the same project, or **from another project** — into a target project.\n\n- Same project: pass `target_project_id` and `source_clip_id` (o"},{"name":"add_clips","description":"Create new clips on a project. One tool, three sources:\n\n- kind=\"blank\": empty slide clips you'll populate with add_elements / generate_media. Pass `clips: [{ti"},{"name":"get_element_schema","description":"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 f"},{"name":"add_elements","description":"Add many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch.\n\nSEND LESS. Most batches repeat themselves — the"},{"name":"update_elements","description":"Update many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch.\n\nSEND LESS, GET BACK LESS. `defaults` carries"},{"name":"remove_elements","description":"Remove many elements across one or more clips in a single tool call. One entry per element ({clip_index, element_id}).\n\nConcurrency: parallel-safe (conflict dom"},{"name":"reorder_elements","description":"Reorder the elements inside a clip. List position IS the z-index — later entries in `ordered_element_ids` render on top of earlier ones.\n\nYou MUST pass the full"},{"name":"update_groups","description":"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 "},{"name":"remove_from_project","description":"Remove an element, a group or an audio track from a project.\n- target=\"element\": removes an element (requires element_id, or element_ids for several). clip_inde"},{"name":"add_audio","description":"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 sou"},{"name":"update_audio","description":"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"},{"name":"voiceover_batch","description":"Set voiceover text and/or trigger speech generation for any number of clips in a single call.\n\nEach entry chooses its own action:\n- \"set_text\"          — set tr"},{"name":"auto_sync","description":"Run the agentic auto-sync pipeline against a clip with a source recording. Detects natural sync points (UI state changes, narrated steps) and inserts sync-marke"},{"name":"add_sync_point","description":"Insert one sync marker on a clip's transcript.\n\nUse this when:\n- The user is explicit about WHERE the camera should pause / cut (e.g. \"sync the word 'submit' to"},{"name":"upload_file","description":"Upload one or more files to Clueso. Pick a mode by client + where the file lives:\n\n0. **files** — ChatGPT only: files the user attached in the conversation. Cha"},{"name":"check_uploads","description":"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_med"},{"name":"generate_media","description":"Generate an AI image or canvas-code-based animation directly into a clip.\n\n- kind=\"image\": text-to-image. Pass `prompt`. Optional: `animation_setting` (entry/ex"},{"name":"estimate_duration","description":"Estimate voiceover duration for one or many clips at once (~150 words/minute).\nPass an array of voiceover texts — one per clip. Returns durations in the same or"},{"name":"analyze_audio","description":"Analyze an audio file. Modes:\n- transcript: Speech-to-text with word-level timestamps — returns `{language, full_text, words}` where each word is `{word, start_"},{"name":"get_article","description":"Get the article content as markdown. Screenshots appear as <SCREENSHOT {id}> placeholders. Returns the markdown text and a list of screenshot IDs."},{"name":"update_article","description":"Update article text content from markdown. Use <SCREENSHOT {id}> placeholders to position screenshots.\nScreenshots in the markdown are kept. Screenshots removed"},{"name":"add_article_media","description":"Add a screenshot or GIF to the article. Returns a screenshot_id to place in the article via update_article using `<SCREENSHOT screenshot_id>`.\n\n- kind=\"image\": "},{"name":"update_article_media","description":"Update an article image/GIF (screenshot), or inspect its current state.\n- Provide one or more of `zoom_factor`, `crop`, `shapes` to change metadata.\n- Pass `ren"},{"name":"create_clueprint","description":"Create a new clueprint (reusable video template). A clueprint is a structured file directory with design notes, composition rules, and screenshots that can be u"},{"name":"get_clueprint","description":"Fetch clueprint data. Use `include` to control how much you pull back:\n- include=\"metadata\": just the clueprint's name/description/tags/visibility/thumbnail.\n- "},{"name":"update_clueprint","description":"Update a clueprint's metadata and/or file contents in one call.\n\nMetadata fields (`name`, `description`, `tags`, `visibility`, `thumbnail_path`) are applied as "},{"name":"set_voice","description":"Set the voiceover voice for every clip in a project, or only for the clips in `clip_ids`.\n\nUse this to apply a clueprint's voice (read `voiceover.voice.name` an"},{"name":"add_comment","description":"Post a review comment on a project, attributed to \"Clueso AI\".\n\nUse this to leave feedback, suggestions, or notes — either at the project level (no clip_id) or "},{"name":"get_comments","description":"Read the review comments on a project — the other half of `add_comment`, which could post but never read.\n\nComments are how a human reviewer tells you what is w"},{"name":"record_screen","description":"Records the product on a mock (Code record) as a screen-recording clip in a project.\nCreates blank placeholder clips, registers job entities, and sends the job "},{"name":"run_script","description":"Write a JavaScript program that calls this server's other tools. You have the whole language: loops, arithmetic, functions, conditionals, and values carried fro"},{"name":"get_script_job","description":"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`"}],"toolCount":49,"toolsHash":"7db1ee69a0e2591cd200291ba6ca2b63b1283d2d05411e15caa81197b2c01697","serverName":"clueso-connect","capabilities":["experimental","resources","tools"],"serverVersion":"1.0.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-10T08:33:20.030Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":11,"error":null,"detail":{"tools":[{"name":"get_design_guide","description":"Clueso's house style for composing video clips — how to think about concept, typography, color, composition, motion, and pacing. Read it before composing or edi"},{"name":"create_project","description":"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)."},{"name":"update_project","description":"Update a project's metadata: rename, change description, move to a different folder, or change aspect ratio.\n\nOnly fields you provide are changed. To move a pro"},{"name":"duplicate_project","description":"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"},{"name":"export_project","description":"Kick off a video export of the project. Returns immediately with an export_id;\nthe export renders in the background and takes ~5 min. Call get_export(export_id,"},{"name":"get_export","description":"Check on a project's video export, waiting for it to finish. Pass exactly one of `export_id` (the one export_project returned) or `project_id` (that project's m"},{"name":"get_recording_activity","description":"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 a"},{"name":"get_embed","description":"Get a project's embeddable video player: `embed_url` (permanent) and `embed_code` (a ready-to-paste <iframe>, the same snippet the editor's Share → Embed copies"},{"name":"create_folder","description":"Create a folder in the workspace, optionally inside another folder, to organize projects.\n\nReturns { folder_id, name, parent_folder_id, already_existed }. If a "},{"name":"find","description":"Find any resource in Clueso by type, optionally filtered by name or exact id. One tool for listing and searching across the workspace.\n\ntype:\n  • projects | fol"},{"name":"switch_workspace","description":"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"},{"name":"get_project","description":"Get a summary of a project: canvas dimensions, per-clip summary (ids, indices, durations, element counts, voiceover_volume), and `audio_tracks` — every music/SF"},{"name":"get_clip","description":"Read one clip: its elements (positions/sizes in canvas pixels), voiceover (text, voice, duration, voiceover_volume), background and transition. Pass `render` to"},{"name":"update_clips","description":"Update one or more clips in a single call — background, transition, duration, title, visibility, position, and (video clips) the footage transform via video_sty"},{"name":"remove_clip","description":"Remove a clip from the project by index. Cannot remove the last remaining clip.\n\nAfter removal, all clips with index > clip_index shift down by 1. When removing"},{"name":"split_clip","description":"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 aft"},{"name":"captions","description":"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, an"},{"name":"duplicate_clip","description":"Clone one clip — within the same project, or **from another project** — into a target project.\n\n- Same project: pass `target_project_id` and `source_clip_id` (o"},{"name":"add_clips","description":"Create new clips on a project. One tool, three sources:\n\n- kind=\"blank\": empty slide clips you'll populate with add_elements / generate_media. Pass `clips: [{ti"},{"name":"get_element_schema","description":"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 f"},{"name":"add_elements","description":"Add many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch.\n\nSEND LESS. Most batches repeat themselves — the"},{"name":"update_elements","description":"Update many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch.\n\nSEND LESS, GET BACK LESS. `defaults` carries"},{"name":"remove_elements","description":"Remove many elements across one or more clips in a single tool call. One entry per element ({clip_index, element_id}).\n\nConcurrency: parallel-safe (conflict dom"},{"name":"reorder_elements","description":"Reorder the elements inside a clip. List position IS the z-index — later entries in `ordered_element_ids` render on top of earlier ones.\n\nYou MUST pass the full"},{"name":"update_groups","description":"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 "},{"name":"remove_from_project","description":"Remove an element, a group or an audio track from a project.\n- target=\"element\": removes an element (requires element_id, or element_ids for several). clip_inde"},{"name":"add_audio","description":"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 sou"},{"name":"update_audio","description":"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"},{"name":"voiceover_batch","description":"Set voiceover text and/or trigger speech generation for any number of clips in a single call.\n\nEach entry chooses its own action:\n- \"set_text\"          — set tr"},{"name":"auto_sync","description":"Run the agentic auto-sync pipeline against a clip with a source recording. Detects natural sync points (UI state changes, narrated steps) and inserts sync-marke"},{"name":"add_sync_point","description":"Insert one sync marker on a clip's transcript.\n\nUse this when:\n- The user is explicit about WHERE the camera should pause / cut (e.g. \"sync the word 'submit' to"},{"name":"upload_file","description":"Upload one or more files to Clueso. Pick a mode by client + where the file lives:\n\n0. **files** — ChatGPT only: files the user attached in the conversation. Cha"},{"name":"check_uploads","description":"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_med"},{"name":"generate_media","description":"Generate an AI image or canvas-code-based animation directly into a clip.\n\n- kind=\"image\": text-to-image. Pass `prompt`. Optional: `animation_setting` (entry/ex"},{"name":"estimate_duration","description":"Estimate voiceover duration for one or many clips at once (~150 words/minute).\nPass an array of voiceover texts — one per clip. Returns durations in the same or"},{"name":"analyze_audio","description":"Analyze an audio file. Modes:\n- transcript: Speech-to-text with word-level timestamps — returns `{language, full_text, words}` where each word is `{word, start_"},{"name":"get_article","description":"Get the article content as markdown. Screenshots appear as <SCREENSHOT {id}> placeholders. Returns the markdown text and a list of screenshot IDs."},{"name":"update_article","description":"Update article text content from markdown. Use <SCREENSHOT {id}> placeholders to position screenshots.\nScreenshots in the markdown are kept. Screenshots removed"},{"name":"add_article_media","description":"Add a screenshot or GIF to the article. Returns a screenshot_id to place in the article via update_article using `<SCREENSHOT screenshot_id>`.\n\n- kind=\"image\": "},{"name":"update_article_media","description":"Update an article image/GIF (screenshot), or inspect its current state.\n- Provide one or more of `zoom_factor`, `crop`, `shapes` to change metadata.\n- Pass `ren"},{"name":"create_clueprint","description":"Create a new clueprint (reusable video template). A clueprint is a structured file directory with design notes, composition rules, and screenshots that can be u"},{"name":"get_clueprint","description":"Fetch clueprint data. Use `include` to control how much you pull back:\n- include=\"metadata\": just the clueprint's name/description/tags/visibility/thumbnail.\n- "},{"name":"update_clueprint","description":"Update a clueprint's metadata and/or file contents in one call.\n\nMetadata fields (`name`, `description`, `tags`, `visibility`, `thumbnail_path`) are applied as "},{"name":"set_voice","description":"Set the voiceover voice for every clip in a project, or only for the clips in `clip_ids`.\n\nUse this to apply a clueprint's voice (read `voiceover.voice.name` an"},{"name":"add_comment","description":"Post a review comment on a project, attributed to \"Clueso AI\".\n\nUse this to leave feedback, suggestions, or notes — either at the project level (no clip_id) or "},{"name":"get_comments","description":"Read the review comments on a project — the other half of `add_comment`, which could post but never read.\n\nComments are how a human reviewer tells you what is w"},{"name":"record_screen","description":"Records the product on a mock (Code record) as a screen-recording clip in a project.\nCreates blank placeholder clips, registers job entities, and sends the job "},{"name":"run_script","description":"Write a JavaScript program that calls this server's other tools. You have the whole language: loops, arithmetic, functions, conditionals, and values carried fro"},{"name":"get_script_job","description":"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`"}],"toolCount":49,"toolsHash":"7db1ee69a0e2591cd200291ba6ca2b63b1283d2d05411e15caa81197b2c01697","serverName":"clueso-connect","capabilities":["experimental","resources","tools"],"serverVersion":"1.0.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-10T02:29:17.559Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":13,"error":null,"detail":{"tools":[{"name":"get_design_guide","description":"Clueso's house style for composing video clips — how to think about concept, typography, color, composition, motion, and pacing. Read it before composing or edi"},{"name":"create_project","description":"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)."},{"name":"update_project","description":"Update a project's metadata: rename, change description, move to a different folder, or change aspect ratio.\n\nOnly fields you provide are changed. To move a pro"},{"name":"duplicate_project","description":"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"},{"name":"export_project","description":"Kick off a video export of the project. Returns immediately with an export_id;\nthe export renders in the background and takes ~5 min. Call get_export(export_id,"},{"name":"get_export","description":"Check on a project's video export, waiting for it to finish. Pass exactly one of `export_id` (the one export_project returned) or `project_id` (that project's m"},{"name":"get_recording_activity","description":"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 a"},{"name":"get_embed","description":"Get a project's embeddable video player: `embed_url` (permanent) and `embed_code` (a ready-to-paste <iframe>, the same snippet the editor's Share → Embed copies"},{"name":"create_folder","description":"Create a folder in the workspace, optionally inside another folder, to organize projects.\n\nReturns { folder_id, name, parent_folder_id, already_existed }. If a "},{"name":"find","description":"Find any resource in Clueso by type, optionally filtered by name or exact id. One tool for listing and searching across the workspace.\n\ntype:\n  • projects | fol"},{"name":"switch_workspace","description":"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"},{"name":"get_project","description":"Get a summary of a project: canvas dimensions, per-clip summary (ids, indices, durations, element counts, voiceover_volume), and `audio_tracks` — every music/SF"},{"name":"get_clip","description":"Read one clip: its elements (positions/sizes in canvas pixels), voiceover (text, voice, duration, voiceover_volume), background and transition. Pass `render` to"},{"name":"update_clips","description":"Update one or more clips in a single call — background, transition, duration, title, visibility, position, and (video clips) the footage transform via video_sty"},{"name":"remove_clip","description":"Remove a clip from the project by index. Cannot remove the last remaining clip.\n\nAfter removal, all clips with index > clip_index shift down by 1. When removing"},{"name":"split_clip","description":"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 aft"},{"name":"captions","description":"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, an"},{"name":"duplicate_clip","description":"Clone one clip — within the same project, or **from another project** — into a target project.\n\n- Same project: pass `target_project_id` and `source_clip_id` (o"},{"name":"add_clips","description":"Create new clips on a project. One tool, three sources:\n\n- kind=\"blank\": empty slide clips you'll populate with add_elements / generate_media. Pass `clips: [{ti"},{"name":"get_element_schema","description":"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 f"},{"name":"add_elements","description":"Add many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch.\n\nSEND LESS. Most batches repeat themselves — the"},{"name":"update_elements","description":"Update many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch.\n\nSEND LESS, GET BACK LESS. `defaults` carries"},{"name":"remove_elements","description":"Remove many elements across one or more clips in a single tool call. One entry per element ({clip_index, element_id}).\n\nConcurrency: parallel-safe (conflict dom"},{"name":"reorder_elements","description":"Reorder the elements inside a clip. List position IS the z-index — later entries in `ordered_element_ids` render on top of earlier ones.\n\nYou MUST pass the full"},{"name":"update_groups","description":"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 "},{"name":"remove_from_project","description":"Remove an element, a group or an audio track from a project.\n- target=\"element\": removes an element (requires element_id, or element_ids for several). clip_inde"},{"name":"add_audio","description":"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 sou"},{"name":"update_audio","description":"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"},{"name":"voiceover_batch","description":"Set voiceover text and/or trigger speech generation for any number of clips in a single call.\n\nEach entry chooses its own action:\n- \"set_text\"          — set tr"},{"name":"auto_sync","description":"Run the agentic auto-sync pipeline against a clip with a source recording. Detects natural sync points (UI state changes, narrated steps) and inserts sync-marke"},{"name":"add_sync_point","description":"Insert one sync marker on a clip's transcript.\n\nUse this when:\n- The user is explicit about WHERE the camera should pause / cut (e.g. \"sync the word 'submit' to"},{"name":"upload_file","description":"Upload one or more files to Clueso. Pick a mode by client + where the file lives:\n\n0. **files** — ChatGPT only: files the user attached in the conversation. Cha"},{"name":"check_uploads","description":"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_med"},{"name":"generate_media","description":"Generate an AI image or canvas-code-based animation directly into a clip.\n\n- kind=\"image\": text-to-image. Pass `prompt`. Optional: `animation_setting` (entry/ex"},{"name":"estimate_duration","description":"Estimate voiceover duration for one or many clips at once (~150 words/minute).\nPass an array of voiceover texts — one per clip. Returns durations in the same or"},{"name":"analyze_audio","description":"Analyze an audio file. Modes:\n- transcript: Speech-to-text with word-level timestamps — returns `{language, full_text, words}` where each word is `{word, start_"},{"name":"get_article","description":"Get the article content as markdown. Screenshots appear as <SCREENSHOT {id}> placeholders. Returns the markdown text and a list of screenshot IDs."},{"name":"update_article","description":"Update article text content from markdown. Use <SCREENSHOT {id}> placeholders to position screenshots.\nScreenshots in the markdown are kept. Screenshots removed"},{"name":"add_article_media","description":"Add a screenshot or GIF to the article. Returns a screenshot_id to place in the article via update_article using `<SCREENSHOT screenshot_id>`.\n\n- kind=\"image\": "},{"name":"update_article_media","description":"Update an article image/GIF (screenshot), or inspect its current state.\n- Provide one or more of `zoom_factor`, `crop`, `shapes` to change metadata.\n- Pass `ren"},{"name":"create_clueprint","description":"Create a new clueprint (reusable video template). A clueprint is a structured file directory with design notes, composition rules, and screenshots that can be u"},{"name":"get_clueprint","description":"Fetch clueprint data. Use `include` to control how much you pull back:\n- include=\"metadata\": just the clueprint's name/description/tags/visibility/thumbnail.\n- "},{"name":"update_clueprint","description":"Update a clueprint's metadata and/or file contents in one call.\n\nMetadata fields (`name`, `description`, `tags`, `visibility`, `thumbnail_path`) are applied as "},{"name":"set_voice","description":"Set the voiceover voice for every clip in a project, or only for the clips in `clip_ids`.\n\nUse this to apply a clueprint's voice (read `voiceover.voice.name` an"},{"name":"add_comment","description":"Post a review comment on a project, attributed to \"Clueso AI\".\n\nUse this to leave feedback, suggestions, or notes — either at the project level (no clip_id) or "},{"name":"get_comments","description":"Read the review comments on a project — the other half of `add_comment`, which could post but never read.\n\nComments are how a human reviewer tells you what is w"},{"name":"record_screen","description":"Records the product on a mock (Code record) as a screen-recording clip in a project.\nCreates blank placeholder clips, registers job entities, and sends the job "},{"name":"run_script","description":"Write a JavaScript program that calls this server's other tools. You have the whole language: loops, arithmetic, functions, conditionals, and values carried fro"},{"name":"get_script_job","description":"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`"}],"toolCount":49,"toolsHash":"7db1ee69a0e2591cd200291ba6ca2b63b1283d2d05411e15caa81197b2c01697","serverName":"clueso-connect","capabilities":["experimental","resources","tools"],"serverVersion":"1.0.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T19:28:00.378Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":13,"error":null,"detail":{"tools":[{"name":"get_design_guide","description":"Clueso's house style for composing video clips — how to think about concept, typography, color, composition, motion, and pacing. Read it before composing or edi"},{"name":"create_project","description":"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)."},{"name":"update_project","description":"Update a project's metadata: rename, change description, move to a different folder, or change aspect ratio.\n\nOnly fields you provide are changed. To move a pro"},{"name":"duplicate_project","description":"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"},{"name":"export_project","description":"Kick off a video export of the project. Returns immediately with an export_id;\nthe export renders in the background and takes ~5 min. Call get_export(export_id,"},{"name":"get_export","description":"Check on a project's video export, waiting for it to finish. Pass exactly one of `export_id` (the one export_project returned) or `project_id` (that project's m"},{"name":"get_recording_activity","description":"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 a"},{"name":"get_embed","description":"Get a project's embeddable video player: `embed_url` (permanent) and `embed_code` (a ready-to-paste <iframe>, the same snippet the editor's Share → Embed copies"},{"name":"create_folder","description":"Create a folder in the workspace, optionally inside another folder, to organize projects.\n\nReturns { folder_id, name, parent_folder_id, already_existed }. If a "},{"name":"find","description":"Find any resource in Clueso by type, optionally filtered by name or exact id. One tool for listing and searching across the workspace.\n\ntype:\n  • projects | fol"},{"name":"switch_workspace","description":"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"},{"name":"get_project","description":"Get a summary of a project: canvas dimensions, per-clip summary (ids, indices, durations, element counts, voiceover_volume), and `audio_tracks` — every music/SF"},{"name":"get_clip","description":"Read one clip: its elements (positions/sizes in canvas pixels), voiceover (text, voice, duration, voiceover_volume), background and transition. Pass `render` to"},{"name":"update_clips","description":"Update one or more clips in a single call — background, transition, duration, title, visibility, position, and (video clips) the footage transform via video_sty"},{"name":"remove_clip","description":"Remove a clip from the project by index. Cannot remove the last remaining clip.\n\nAfter removal, all clips with index > clip_index shift down by 1. When removing"},{"name":"split_clip","description":"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 aft"},{"name":"captions","description":"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, an"},{"name":"duplicate_clip","description":"Clone one clip — within the same project, or **from another project** — into a target project.\n\n- Same project: pass `target_project_id` and `source_clip_id` (o"},{"name":"add_clips","description":"Create new clips on a project. One tool, three sources:\n\n- kind=\"blank\": empty slide clips you'll populate with add_elements / generate_media. Pass `clips: [{ti"},{"name":"get_element_schema","description":"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 f"},{"name":"add_elements","description":"Add many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch.\n\nSEND LESS. Most batches repeat themselves — the"},{"name":"update_elements","description":"Update many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch.\n\nSEND LESS, GET BACK LESS. `defaults` carries"},{"name":"remove_elements","description":"Remove many elements across one or more clips in a single tool call. One entry per element ({clip_index, element_id}).\n\nConcurrency: parallel-safe (conflict dom"},{"name":"reorder_elements","description":"Reorder the elements inside a clip. List position IS the z-index — later entries in `ordered_element_ids` render on top of earlier ones.\n\nYou MUST pass the full"},{"name":"update_groups","description":"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 "},{"name":"remove_from_project","description":"Remove an element, a group or an audio track from a project.\n- target=\"element\": removes an element (requires element_id, or element_ids for several). clip_inde"},{"name":"add_audio","description":"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 sou"},{"name":"update_audio","description":"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"},{"name":"voiceover_batch","description":"Set voiceover text and/or trigger speech generation for any number of clips in a single call.\n\nEach entry chooses its own action:\n- \"set_text\"          — set tr"},{"name":"auto_sync","description":"Run the agentic auto-sync pipeline against a clip with a source recording. Detects natural sync points (UI state changes, narrated steps) and inserts sync-marke"},{"name":"add_sync_point","description":"Insert one sync marker on a clip's transcript.\n\nUse this when:\n- The user is explicit about WHERE the camera should pause / cut (e.g. \"sync the word 'submit' to"},{"name":"upload_file","description":"Upload one or more files to Clueso. Pick a mode by client + where the file lives:\n\n0. **files** — ChatGPT only: files the user attached in the conversation. Cha"},{"name":"check_uploads","description":"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_med"},{"name":"generate_media","description":"Generate an AI image or canvas-code-based animation directly into a clip.\n\n- kind=\"image\": text-to-image. Pass `prompt`. Optional: `animation_setting` (entry/ex"},{"name":"estimate_duration","description":"Estimate voiceover duration for one or many clips at once (~150 words/minute).\nPass an array of voiceover texts — one per clip. Returns durations in the same or"},{"name":"analyze_audio","description":"Analyze an audio file. Modes:\n- transcript: Speech-to-text with word-level timestamps — returns `{language, full_text, words}` where each word is `{word, start_"},{"name":"get_article","description":"Get the article content as markdown. Screenshots appear as <SCREENSHOT {id}> placeholders. Returns the markdown text and a list of screenshot IDs."},{"name":"update_article","description":"Update article text content from markdown. Use <SCREENSHOT {id}> placeholders to position screenshots.\nScreenshots in the markdown are kept. Screenshots removed"},{"name":"add_article_media","description":"Add a screenshot or GIF to the article. Returns a screenshot_id to place in the article via update_article using `<SCREENSHOT screenshot_id>`.\n\n- kind=\"image\": "},{"name":"update_article_media","description":"Update an article image/GIF (screenshot), or inspect its current state.\n- Provide one or more of `zoom_factor`, `crop`, `shapes` to change metadata.\n- Pass `ren"},{"name":"create_clueprint","description":"Create a new clueprint (reusable video template). A clueprint is a structured file directory with design notes, composition rules, and screenshots that can be u"},{"name":"get_clueprint","description":"Fetch clueprint data. Use `include` to control how much you pull back:\n- include=\"metadata\": just the clueprint's name/description/tags/visibility/thumbnail.\n- "},{"name":"update_clueprint","description":"Update a clueprint's metadata and/or file contents in one call.\n\nMetadata fields (`name`, `description`, `tags`, `visibility`, `thumbnail_path`) are applied as "},{"name":"set_voice","description":"Set the voiceover voice for every clip in a project, or only for the clips in `clip_ids`.\n\nUse this to apply a clueprint's voice (read `voiceover.voice.name` an"},{"name":"add_comment","description":"Post a review comment on a project, attributed to \"Clueso AI\".\n\nUse this to leave feedback, suggestions, or notes — either at the project level (no clip_id) or "},{"name":"get_comments","description":"Read the review comments on a project — the other half of `add_comment`, which could post but never read.\n\nComments are how a human reviewer tells you what is w"},{"name":"record_screen","description":"Records the product on a mock (Code record) as a screen-recording clip in a project.\nCreates blank placeholder clips, registers job entities, and sends the job "},{"name":"run_script","description":"Write a JavaScript program that calls this server's other tools. You have the whole language: loops, arithmetic, functions, conditionals, and values carried fro"},{"name":"get_script_job","description":"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`"}],"toolCount":49,"toolsHash":"7db1ee69a0e2591cd200291ba6ca2b63b1283d2d05411e15caa81197b2c01697","serverName":"clueso-connect","capabilities":["experimental","resources","tools"],"serverVersion":"1.0.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T13:31:24.165Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":11,"error":null,"detail":{"tools":[{"name":"get_design_guide","description":"Clueso's house style for composing video clips — how to think about concept, typography, color, composition, motion, and pacing. Read it before composing or edi"},{"name":"create_project","description":"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)."},{"name":"update_project","description":"Update a project's metadata: rename, change description, move to a different folder, or change aspect ratio.\n\nOnly fields you provide are changed. To move a pro"},{"name":"duplicate_project","description":"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"},{"name":"export_project","description":"Kick off a video export of the project. Returns immediately with an export_id;\nthe export renders in the background and takes ~5 min. Call get_export(export_id,"},{"name":"get_export","description":"Check on a project's video export, waiting for it to finish. Pass exactly one of `export_id` (the one export_project returned) or `project_id` (that project's m"},{"name":"get_recording_activity","description":"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 a"},{"name":"get_embed","description":"Get a project's embeddable video player: `embed_url` (permanent) and `embed_code` (a ready-to-paste <iframe>, the same snippet the editor's Share → Embed copies"},{"name":"create_folder","description":"Create a folder in the workspace, optionally inside another folder, to organize projects.\n\nReturns { folder_id, name, parent_folder_id, already_existed }. If a "},{"name":"find","description":"Find any resource in Clueso by type, optionally filtered by name or exact id. One tool for listing and searching across the workspace.\n\ntype:\n  • projects | fol"},{"name":"switch_workspace","description":"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"},{"name":"get_project","description":"Get a summary of a project: canvas dimensions, per-clip summary (ids, indices, durations, element counts, voiceover_volume), and `audio_tracks` — every music/SF"},{"name":"get_clip","description":"Read one clip: its elements (positions/sizes in canvas pixels), voiceover (text, voice, duration, voiceover_volume), background and transition. Pass `render` to"},{"name":"update_clips","description":"Update one or more clips in a single call — background, transition, duration, title, visibility, position, and (video clips) the footage transform via video_sty"},{"name":"remove_clip","description":"Remove a clip from the project by index. Cannot remove the last remaining clip.\n\nAfter removal, all clips with index > clip_index shift down by 1. When removing"},{"name":"split_clip","description":"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 aft"},{"name":"captions","description":"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, an"},{"name":"duplicate_clip","description":"Clone one clip — within the same project, or **from another project** — into a target project.\n\n- Same project: pass `target_project_id` and `source_clip_id` (o"},{"name":"add_clips","description":"Create new clips on a project. One tool, three sources:\n\n- kind=\"blank\": empty slide clips you'll populate with add_elements / generate_media. Pass `clips: [{ti"},{"name":"get_element_schema","description":"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 f"},{"name":"add_elements","description":"Add many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch.\n\nSEND LESS. Most batches repeat themselves — the"},{"name":"update_elements","description":"Update many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch.\n\nSEND LESS, GET BACK LESS. `defaults` carries"},{"name":"remove_elements","description":"Remove many elements across one or more clips in a single tool call. One entry per element ({clip_index, element_id}).\n\nConcurrency: parallel-safe (conflict dom"},{"name":"reorder_elements","description":"Reorder the elements inside a clip. List position IS the z-index — later entries in `ordered_element_ids` render on top of earlier ones.\n\nYou MUST pass the full"},{"name":"update_groups","description":"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 "},{"name":"remove_from_project","description":"Remove an element, a group or an audio track from a project.\n- target=\"element\": removes an element (requires element_id, or element_ids for several). clip_inde"},{"name":"add_audio","description":"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 sou"},{"name":"update_audio","description":"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"},{"name":"voiceover_batch","description":"Set voiceover text and/or trigger speech generation for any number of clips in a single call.\n\nEach entry chooses its own action:\n- \"set_text\"          — set tr"},{"name":"auto_sync","description":"Run the agentic auto-sync pipeline against a clip with a source recording. Detects natural sync points (UI state changes, narrated steps) and inserts sync-marke"},{"name":"add_sync_point","description":"Insert one sync marker on a clip's transcript.\n\nUse this when:\n- The user is explicit about WHERE the camera should pause / cut (e.g. \"sync the word 'submit' to"},{"name":"upload_file","description":"Upload one or more files to Clueso. Pick a mode by client + where the file lives:\n\n0. **files** — ChatGPT only: files the user attached in the conversation. Cha"},{"name":"check_uploads","description":"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_med"},{"name":"generate_media","description":"Generate an AI image or canvas-code-based animation directly into a clip.\n\n- kind=\"image\": text-to-image. Pass `prompt`. Optional: `animation_setting` (entry/ex"},{"name":"estimate_duration","description":"Estimate voiceover duration for one or many clips at once (~150 words/minute).\nPass an array of voiceover texts — one per clip. Returns durations in the same or"},{"name":"analyze_audio","description":"Analyze an audio file. Modes:\n- transcript: Speech-to-text with word-level timestamps — returns `{language, full_text, words}` where each word is `{word, start_"},{"name":"get_article","description":"Get the article content as markdown. Screenshots appear as <SCREENSHOT {id}> placeholders. Returns the markdown text and a list of screenshot IDs."},{"name":"update_article","description":"Update article text content from markdown. Use <SCREENSHOT {id}> placeholders to position screenshots.\nScreenshots in the markdown are kept. Screenshots removed"},{"name":"add_article_media","description":"Add a screenshot or GIF to the article. Returns a screenshot_id to place in the article via update_article using `<SCREENSHOT screenshot_id>`.\n\n- kind=\"image\": "},{"name":"update_article_media","description":"Update an article image/GIF (screenshot), or inspect its current state.\n- Provide one or more of `zoom_factor`, `crop`, `shapes` to change metadata.\n- Pass `ren"},{"name":"create_clueprint","description":"Create a new clueprint (reusable video template). A clueprint is a structured file directory with design notes, composition rules, and screenshots that can be u"},{"name":"get_clueprint","description":"Fetch clueprint data. Use `include` to control how much you pull back:\n- include=\"metadata\": just the clueprint's name/description/tags/visibility/thumbnail.\n- "},{"name":"update_clueprint","description":"Update a clueprint's metadata and/or file contents in one call.\n\nMetadata fields (`name`, `description`, `tags`, `visibility`, `thumbnail_path`) are applied as "},{"name":"set_voice","description":"Set the voiceover voice for every clip in a project, or only for the clips in `clip_ids`.\n\nUse this to apply a clueprint's voice (read `voiceover.voice.name` an"},{"name":"add_comment","description":"Post a review comment on a project, attributed to \"Clueso AI\".\n\nUse this to leave feedback, suggestions, or notes — either at the project level (no clip_id) or "},{"name":"get_comments","description":"Read the review comments on a project — the other half of `add_comment`, which could post but never read.\n\nComments are how a human reviewer tells you what is w"},{"name":"record_screen","description":"Records the product on a mock (Code record) as a screen-recording clip in a project.\nCreates blank placeholder clips, registers job entities, and sends the job "},{"name":"run_script","description":"Write a JavaScript program that calls this server's other tools. You have the whole language: loops, arithmetic, functions, conditionals, and values carried fro"},{"name":"get_script_job","description":"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`"}],"toolCount":49,"toolsHash":"7db1ee69a0e2591cd200291ba6ca2b63b1283d2d05411e15caa81197b2c01697","serverName":"clueso-connect","capabilities":["experimental","resources","tools"],"serverVersion":"1.0.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T07:24:25.091Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":14,"error":null,"detail":{"tools":[{"name":"get_design_guide","description":"Clueso's house style for composing video clips — how to think about concept, typography, color, composition, motion, and pacing. Read it before composing or edi"},{"name":"create_project","description":"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)."},{"name":"update_project","description":"Update a project's metadata: rename, change description, move to a different folder, or change aspect ratio.\n\nOnly fields you provide are changed. To move a pro"},{"name":"duplicate_project","description":"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"},{"name":"export_project","description":"Kick off a video export of the project. Returns immediately with an export_id;\nthe export renders in the background and takes ~5 min. Call get_export(export_id,"},{"name":"get_export","description":"Check on a project's video export, waiting for it to finish. Pass exactly one of `export_id` (the one export_project returned) or `project_id` (that project's m"},{"name":"get_recording_activity","description":"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 a"},{"name":"get_embed","description":"Get a project's embeddable video player: `embed_url` (permanent) and `embed_code` (a ready-to-paste <iframe>, the same snippet the editor's Share → Embed copies"},{"name":"create_folder","description":"Create a folder in the workspace, optionally inside another folder, to organize projects.\n\nReturns { folder_id, name, parent_folder_id, already_existed }. If a "},{"name":"find","description":"Find any resource in Clueso by type, optionally filtered by name or exact id. One tool for listing and searching across the workspace.\n\ntype:\n  • projects | fol"},{"name":"switch_workspace","description":"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"},{"name":"get_project","description":"Get a summary of a project: canvas dimensions, per-clip summary (ids, indices, durations, element counts, voiceover_volume), and `audio_tracks` — every music/SF"},{"name":"get_clip","description":"Read one clip: its elements (positions/sizes in canvas pixels), voiceover (text, voice, duration, voiceover_volume), background and transition. Pass `render` to"},{"name":"update_clips","description":"Update one or more clips in a single call — background, transition, duration, title, visibility, position, and (video clips) the footage transform via video_sty"},{"name":"remove_clip","description":"Remove a clip from the project by index. Cannot remove the last remaining clip.\n\nAfter removal, all clips with index > clip_index shift down by 1. When removing"},{"name":"split_clip","description":"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 aft"},{"name":"captions","description":"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, an"},{"name":"duplicate_clip","description":"Clone one clip — within the same project, or **from another project** — into a target project.\n\n- Same project: pass `target_project_id` and `source_clip_id` (o"},{"name":"add_clips","description":"Create new clips on a project. One tool, three sources:\n\n- kind=\"blank\": empty slide clips you'll populate with add_elements / generate_media. Pass `clips: [{ti"},{"name":"get_element_schema","description":"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 f"},{"name":"add_elements","description":"Add many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch.\n\nSEND LESS. Most batches repeat themselves — the"},{"name":"update_elements","description":"Update many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch.\n\nSEND LESS, GET BACK LESS. `defaults` carries"},{"name":"remove_elements","description":"Remove many elements across one or more clips in a single tool call. One entry per element ({clip_index, element_id}).\n\nConcurrency: parallel-safe (conflict dom"},{"name":"reorder_elements","description":"Reorder the elements inside a clip. List position IS the z-index — later entries in `ordered_element_ids` render on top of earlier ones.\n\nYou MUST pass the full"},{"name":"update_groups","description":"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 "},{"name":"remove_from_project","description":"Remove an element, a group or an audio track from a project.\n- target=\"element\": removes an element (requires element_id, or element_ids for several). clip_inde"},{"name":"add_audio","description":"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 sou"},{"name":"update_audio","description":"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"},{"name":"voiceover_batch","description":"Set voiceover text and/or trigger speech generation for any number of clips in a single call.\n\nEach entry chooses its own action:\n- \"set_text\"          — set tr"},{"name":"auto_sync","description":"Run the agentic auto-sync pipeline against a clip with a source recording. Detects natural sync points (UI state changes, narrated steps) and inserts sync-marke"},{"name":"add_sync_point","description":"Insert one sync marker on a clip's transcript.\n\nUse this when:\n- The user is explicit about WHERE the camera should pause / cut (e.g. \"sync the word 'submit' to"},{"name":"upload_file","description":"Upload one or more files to Clueso. Pick a mode by client + where the file lives:\n\n0. **files** — ChatGPT only: files the user attached in the conversation. Cha"},{"name":"check_uploads","description":"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_med"},{"name":"generate_media","description":"Generate an AI image or canvas-code-based animation directly into a clip.\n\n- kind=\"image\": text-to-image. Pass `prompt`. Optional: `animation_setting` (entry/ex"},{"name":"estimate_duration","description":"Estimate voiceover duration for one or many clips at once (~150 words/minute).\nPass an array of voiceover texts — one per clip. Returns durations in the same or"},{"name":"analyze_audio","description":"Analyze an audio file. Modes:\n- transcript: Speech-to-text with word-level timestamps — returns `{language, full_text, words}` where each word is `{word, start_"},{"name":"get_article","description":"Get the article content as markdown. Screenshots appear as <SCREENSHOT {id}> placeholders. Returns the markdown text and a list of screenshot IDs."},{"name":"update_article","description":"Update article text content from markdown. Use <SCREENSHOT {id}> placeholders to position screenshots.\nScreenshots in the markdown are kept. Screenshots removed"},{"name":"add_article_media","description":"Add a screenshot or GIF to the article. Returns a screenshot_id to place in the article via update_article using `<SCREENSHOT screenshot_id>`.\n\n- kind=\"image\": "},{"name":"update_article_media","description":"Update an article image/GIF (screenshot), or inspect its current state.\n- Provide one or more of `zoom_factor`, `crop`, `shapes` to change metadata.\n- Pass `ren"},{"name":"create_clueprint","description":"Create a new clueprint (reusable video template). A clueprint is a structured file directory with design notes, composition rules, and screenshots that can be u"},{"name":"get_clueprint","description":"Fetch clueprint data. Use `include` to control how much you pull back:\n- include=\"metadata\": just the clueprint's name/description/tags/visibility/thumbnail.\n- "},{"name":"update_clueprint","description":"Update a clueprint's metadata and/or file contents in one call.\n\nMetadata fields (`name`, `description`, `tags`, `visibility`, `thumbnail_path`) are applied as "},{"name":"set_voice","description":"Set the voiceover voice for every clip in a project, or only for the clips in `clip_ids`.\n\nUse this to apply a clueprint's voice (read `voiceover.voice.name` an"},{"name":"add_comment","description":"Post a review comment on a project, attributed to \"Clueso AI\".\n\nUse this to leave feedback, suggestions, or notes — either at the project level (no clip_id) or "},{"name":"get_comments","description":"Read the review comments on a project — the other half of `add_comment`, which could post but never read.\n\nComments are how a human reviewer tells you what is w"},{"name":"record_screen","description":"Records the product on a mock (Code record) as a screen-recording clip in a project.\nCreates blank placeholder clips, registers job entities, and sends the job "},{"name":"run_script","description":"Write a JavaScript program that calls this server's other tools. You have the whole language: loops, arithmetic, functions, conditionals, and values carried fro"},{"name":"get_script_job","description":"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`"}],"toolCount":49,"toolsHash":"7db1ee69a0e2591cd200291ba6ca2b63b1283d2d05411e15caa81197b2c01697","serverName":"clueso-connect","capabilities":["experimental","resources","tools"],"serverVersion":"1.0.0","protocolVersion":"2025-06-18"}}],"tools":[{"name":"get_design_guide","description":"Clueso's house style for composing video clips — how to think about concept, typography, color, composition, motion, and pacing. Read it before composing or edi"},{"name":"create_project","description":"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)."},{"name":"update_project","description":"Update a project's metadata: rename, change description, move to a different folder, or change aspect ratio.\n\nOnly fields you provide are changed. To move a pro"},{"name":"duplicate_project","description":"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"},{"name":"export_project","description":"Kick off a video export of the project. Returns immediately with an export_id;\nthe export renders in the background and takes ~5 min. Call get_export(export_id,"},{"name":"get_export","description":"Check on a project's video export, waiting for it to finish. Pass exactly one of `export_id` (the one export_project returned) or `project_id` (that project's m"},{"name":"get_recording_activity","description":"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 a"},{"name":"get_embed","description":"Get a project's embeddable video player: `embed_url` (permanent) and `embed_code` (a ready-to-paste <iframe>, the same snippet the editor's Share → Embed copies"},{"name":"create_folder","description":"Create a folder in the workspace, optionally inside another folder, to organize projects.\n\nReturns { folder_id, name, parent_folder_id, already_existed }. If a "},{"name":"find","description":"Find any resource in Clueso by type, optionally filtered by name or exact id. One tool for listing and searching across the workspace.\n\ntype:\n  • projects | fol"},{"name":"switch_workspace","description":"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"},{"name":"get_project","description":"Get a summary of a project: canvas dimensions, per-clip summary (ids, indices, durations, element counts, voiceover_volume), and `audio_tracks` — every music/SF"},{"name":"get_clip","description":"Read one clip: its elements (positions/sizes in canvas pixels), voiceover (text, voice, duration, voiceover_volume), background and transition. Pass `render` to"},{"name":"update_clips","description":"Update one or more clips in a single call — background, transition, duration, title, visibility, position, and (video clips) the footage transform via video_sty"},{"name":"remove_clip","description":"Remove a clip from the project by index. Cannot remove the last remaining clip.\n\nAfter removal, all clips with index > clip_index shift down by 1. When removing"},{"name":"split_clip","description":"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 aft"},{"name":"captions","description":"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, an"},{"name":"duplicate_clip","description":"Clone one clip — within the same project, or **from another project** — into a target project.\n\n- Same project: pass `target_project_id` and `source_clip_id` (o"},{"name":"add_clips","description":"Create new clips on a project. One tool, three sources:\n\n- kind=\"blank\": empty slide clips you'll populate with add_elements / generate_media. Pass `clips: [{ti"},{"name":"get_element_schema","description":"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 f"},{"name":"add_elements","description":"Add many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch.\n\nSEND LESS. Most batches repeat themselves — the"},{"name":"update_elements","description":"Update many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch.\n\nSEND LESS, GET BACK LESS. `defaults` carries"},{"name":"remove_elements","description":"Remove many elements across one or more clips in a single tool call. One entry per element ({clip_index, element_id}).\n\nConcurrency: parallel-safe (conflict dom"},{"name":"reorder_elements","description":"Reorder the elements inside a clip. List position IS the z-index — later entries in `ordered_element_ids` render on top of earlier ones.\n\nYou MUST pass the full"},{"name":"update_groups","description":"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 "},{"name":"remove_from_project","description":"Remove an element, a group or an audio track from a project.\n- target=\"element\": removes an element (requires element_id, or element_ids for several). clip_inde"},{"name":"add_audio","description":"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 sou"},{"name":"update_audio","description":"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"},{"name":"voiceover_batch","description":"Set voiceover text and/or trigger speech generation for any number of clips in a single call.\n\nEach entry chooses its own action:\n- \"set_text\"          — set tr"},{"name":"auto_sync","description":"Run the agentic auto-sync pipeline against a clip with a source recording. Detects natural sync points (UI state changes, narrated steps) and inserts sync-marke"},{"name":"add_sync_point","description":"Insert one sync marker on a clip's transcript.\n\nUse this when:\n- The user is explicit about WHERE the camera should pause / cut (e.g. \"sync the word 'submit' to"},{"name":"upload_file","description":"Upload one or more files to Clueso. Pick a mode by client + where the file lives:\n\n0. **files** — ChatGPT only: files the user attached in the conversation. Cha"},{"name":"check_uploads","description":"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_med"},{"name":"generate_media","description":"Generate an AI image or canvas-code-based animation directly into a clip.\n\n- kind=\"image\": text-to-image. Pass `prompt`. Optional: `animation_setting` (entry/ex"},{"name":"estimate_duration","description":"Estimate voiceover duration for one or many clips at once (~150 words/minute).\nPass an array of voiceover texts — one per clip. Returns durations in the same or"},{"name":"analyze_audio","description":"Analyze an audio file. Modes:\n- transcript: Speech-to-text with word-level timestamps — returns `{language, full_text, words}` where each word is `{word, start_"},{"name":"get_article","description":"Get the article content as markdown. Screenshots appear as <SCREENSHOT {id}> placeholders. Returns the markdown text and a list of screenshot IDs."},{"name":"update_article","description":"Update article text content from markdown. Use <SCREENSHOT {id}> placeholders to position screenshots.\nScreenshots in the markdown are kept. Screenshots removed"},{"name":"add_article_media","description":"Add a screenshot or GIF to the article. Returns a screenshot_id to place in the article via update_article using `<SCREENSHOT screenshot_id>`.\n\n- kind=\"image\": "},{"name":"update_article_media","description":"Update an article image/GIF (screenshot), or inspect its current state.\n- Provide one or more of `zoom_factor`, `crop`, `shapes` to change metadata.\n- Pass `ren"},{"name":"create_clueprint","description":"Create a new clueprint (reusable video template). A clueprint is a structured file directory with design notes, composition rules, and screenshots that can be u"},{"name":"get_clueprint","description":"Fetch clueprint data. Use `include` to control how much you pull back:\n- include=\"metadata\": just the clueprint's name/description/tags/visibility/thumbnail.\n- "},{"name":"update_clueprint","description":"Update a clueprint's metadata and/or file contents in one call.\n\nMetadata fields (`name`, `description`, `tags`, `visibility`, `thumbnail_path`) are applied as "},{"name":"set_voice","description":"Set the voiceover voice for every clip in a project, or only for the clips in `clip_ids`.\n\nUse this to apply a clueprint's voice (read `voiceover.voice.name` an"},{"name":"add_comment","description":"Post a review comment on a project, attributed to \"Clueso AI\".\n\nUse this to leave feedback, suggestions, or notes — either at the project level (no clip_id) or "},{"name":"get_comments","description":"Read the review comments on a project — the other half of `add_comment`, which could post but never read.\n\nComments are how a human reviewer tells you what is w"},{"name":"record_screen","description":"Records the product on a mock (Code record) as a screen-recording clip in a project.\nCreates blank placeholder clips, registers job entities, and sends the job "},{"name":"run_script","description":"Write a JavaScript program that calls this server's other tools. You have the whole language: loops, arithmetic, functions, conditionals, and values carried fro"},{"name":"get_script_job","description":"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`"}],"package":null,"toolSurface":{"id":"ts_wma2expdvqqy","endpointId":"ep_u8xhxfm9rbh8","hash":"7db1ee69a0e2591cd200291ba6ca2b63b1283d2d05411e15caa81197b2c01697","toolCount":49,"serverName":"clueso-connect","serverVersion":"1.0.0","protocolVersion":"2025-06-18","firstSeenAt":"2026-10-08T17:27:56.130Z","lastSeenAt":"2026-10-11T18:25:43.555Z","observations":12,"toolNames":["get_design_guide","create_project","update_project","duplicate_project","export_project","get_export","get_recording_activity","get_embed","create_folder","find","switch_workspace","get_project","get_clip","update_clips","remove_clip","split_clip","captions","duplicate_clip","add_clips","get_element_schema","add_elements","update_elements","remove_elements","reorder_elements","update_groups","remove_from_project","add_audio","update_audio","voiceover_batch","auto_sync","add_sync_point","upload_file","check_uploads","generate_media","estimate_duration","analyze_audio","get_article","update_article","add_article_media","update_article_media","create_clueprint","get_clueprint","update_clueprint","set_voice","add_comment","get_comments","record_screen","run_script","get_script_job"],"distinctSurfaces":14},"endpointFacts":[{"id":"ep_u8xhxfm9rbh8","url":"https://connect.clueso.io/mcp","type":"mcp_streamable_http","factsCheckedAt":"2026-10-09T07:24:25.117Z","auth":{"observedAt":"2026-10-09T07:24:25.618Z","authRequired":false,"scheme":null,"resourceMetadata":{"url":"https://connect.clueso.io/.well-known/oauth-protected-resource/mcp","resource":"https://connect.clueso.io/mcp","authorizationServers":["https://auth.clueso.io/oauth/2.1"],"scopesSupported":["openid","email","profile"]},"authorizationServer":{"url":"https://auth.clueso.io/.well-known/oauth-authorization-server/oauth/2.1","issuer":"https://auth.clueso.io/oauth/2.1","grantTypesSupported":["authorization_code","refresh_token"],"codeChallengeMethodsSupported":["S256"],"tokenEndpointAuthMethodsSupported":["client_secret_basic","client_secret_post","none"],"dynamicClientRegistration":true,"dpopSigningAlgValuesSupported":[],"clientIdMetadataDocumentSupported":false},"conformance":{"dpop":false,"rfc8414":true,"rfc9728":true,"pkceS256":true,"clientIdMetadataDocument":false,"dynamicClientRegistration":true}},"tls":{"observedAt":"2026-10-09T07:24:25.639Z","protocol":"TLSv1.3","chainValid":true,"chainError":null,"hostMatches":true,"subject":"connect.clueso.io","issuer":{"commonName":"Amazon RSA 2048 M01","organization":"Amazon"},"validFrom":"2026-09-21T00:00:00.000Z","validTo":"2027-04-06T23:59:59.000Z","daysToExpiry":177,"sanCount":2,"fingerprint256":"BE:8A:2C:68:50:61:A6:BA:CF:13:66:70:AD:6E:03:65:00:B0:C7:13:06:C8:A4:FC:41:6F:1F:AA:D9:E6:8E:85"}}]},"verification":{"claimed":false,"claimedAt":null,"proofs":[]},"provenance":{"sources":[{"source":"mcp_registry","key":"io.clueso/video","url":"https://registry.modelcontextprotocol.io/v0/servers/io.clueso%2Fvideo","firstSeenAt":"2026-09-06T00:20:36.798Z","fetchedAt":"2026-10-09T15:22:45.936Z","normalizedAt":"2026-10-09T15:22:45.936Z"}]},"firstSeenAt":"2026-09-06T00:20:36.798Z","updatedAt":"2026-10-11T18:28:38.624Z"}