Ozor Video Library
Manage existing Ozor.ai videos via the MCP: list, inspect, re-export, embed, or send follow-up edits to the video agent. This skill is the "everything except creating from scratch" surface for mcp__ozor__*.
When to use
Use this skill when the user wants to operate on videos that already exist in their Ozor account. Signals:
- "List / show my videos"
- "What's the status of ..."
- "Get the share link / download / embed for ..."
- "Re-export that video at 9:16"
- "Send a follow-up edit: change scene 2 to ..."
- "Show me the plan for that video"
- "Is the job done yet" / "check on the export"
Do NOT use this skill when:
- Creating a new video from text →
ozor-generate - Creating from a document/file →
ozor-document-video - Creating from a URL →
ozor-url-to-video
Required MCP tools
| Task | Tool |
|---|---|
| List recent videos | mcp__ozor__list_videos |
| Get one video's details | mcp__ozor__get_video |
| Check a build job status | mcp__ozor__get_job |
| Block until a job finishes | mcp__ozor__wait_for_job |
| Fetch the plan a video was built from | mcp__ozor__get_plan |
| Edit a plan | mcp__ozor__update_plan |
| Trigger a (new) export | mcp__ozor__export_video |
| Block until export ready | mcp__ozor__wait_for_export |
Get <iframe> for embedding |
mcp__ozor__get_embed_code |
| Send a follow-up edit message to the agent | mcp__ozor__send_message |
| List available voices | mcp__ozor__list_voices |
If the MCP isn't connected, tell the user and stop.
Common workflows
A. List recent videos
mcp__ozor__list_videos({ limit?: 10 })
Present as a table:
| # | Title | Status | Format | Updated | videoId |
|---|-------|--------|--------|---------|---------|
| 1 | ... | exported | 16:9 | 2h ago | abc... |
Offer 2–3 obvious next actions: "Want share links for any of these? An embed code? Re-export one as 9:16?"
B. Get details for a specific video
If the user names a video or gives an ID:
mcp__ozor__get_video({ videoId })
Surface: title, current status (draft / building / exported / failed), format, duration, last update, and any URLs that exist (share, editor, download).
C. "What's the status of my last video?"
list_videos({ limit: 1 })to find the most recent.- If
statusisbuilding, also callget_job(orwait_for_jobif the user wants to block until it's done) to get progress. - If
statusisexported, show the URLs.
D. Get the embed code
mcp__ozor__get_embed_code({ videoId })
If the video hasn't been exported yet, run the export first (workflow F below).
E. Get the share / download URL
If the video is already exported, get_video returns the URLs. If not:
mcp__ozor__export_video({ videoId })
mcp__ozor__wait_for_export({ videoId })
F. Re-export (e.g. user wants a fresh render after edits, or the URL expired)
mcp__ozor__export_video({ videoId })
mcp__ozor__wait_for_export({ videoId }) // -> fresh shareUrl, editorUrl, downloadUrl
mcp__ozor__get_embed_code({ videoId }) // -> fresh iframe
G. Re-render at a different format (e.g. landscape → vertical)
Format changes go through the plan:
mcp__ozor__get_plan({ videoId })— fetch the current planmcp__ozor__update_plan({ planId, format: "9:16" })— apply the changemcp__ozor__generate_from_plan({ planId })is on the create-from-plan path — if the user wants the same project updated, prefersend_messageinstead (workflow H). If they want a new project at the new format, fall through togenerate_from_plan, then export.
Note: generate_from_plan lives in ozor-document-video / ozor-url-to-video because it creates a fresh project. Tell the user when you're about to spin up a new project rather than mutating the existing one.
H. Send a follow-up edit to the agent
For copy/visual/scene tweaks on an existing video without starting over:
mcp__ozor__send_message({
videoId,
message: "<the user's edit, e.g. 'In scene 2, change the headline to X and make the background lighter'>"
})
This typically returns a new jobId. Then:
mcp__ozor__wait_for_job({ videoId, jobId })
mcp__ozor__export_video({ videoId })
mcp__ozor__wait_for_export({ videoId })
Surface the fresh URLs afterwards.
I. Inspect / edit a plan
mcp__ozor__get_plan({ videoId | planId })
Render the scenes as a numbered list to the user. If they want changes:
mcp__ozor__update_plan({ planId, ... })
Then re-fetch to confirm. Plan edits alone don't change the rendered video — they have to be followed by a regeneration (send_message for in-place, generate_from_plan for a new project) and an export.
J. List voices
When the user is choosing or swapping a voice:
mcp__ozor__list_voices()
Present a compact list (name, language, style). If swapping, update_plan({ planId, voice: "<voice id>" }) then regenerate.
Disambiguating "that video" / "my last video"
If the user says "that video" or "my last one" without an ID:
list_videos({ limit: 5 }).- If exactly one matches the description, use it.
- If multiple plausible matches, show the short list and ask which.
Don't silently pick a random video.
Presenting URLs
Always present available URLs labeled:
**Share:** <shareUrl>
**Editor:** <editorUrl>
**Download:** <downloadUrl>
**Embed:** (in a code block)
If a URL doesn't exist yet (e.g. video never exported), don't fabricate one — tell the user what's missing and offer to run the export.
Errors and recovery
videoIdnot found → list recent videos and ask which one they meant.- Job failed → relay the failure message verbatim; offer
send_messagewith a fix or a re-export. - Export failed → retry once; if it fails again, surface the error and recommend opening the editor URL to inspect.
- Plan / video out of sync (plan edited but not regenerated) → tell the user the changes are staged but not rendered, and offer to regenerate.
Rules
- Never invent video IDs, share URLs, or status. Everything comes from the MCP.
- For in-place edits, prefer
send_messageover creating a new project viagenerate_from_plan. The user almost always wants the existing video updated, not a duplicate. - Re-exports are cheap and safe — if the user wants fresh URLs, just rerun export.
- When the user is vague about which video, ask — show a short list, don't guess.
- Surface every URL after every regeneration or re-export. Stale URLs from earlier in the conversation may have expired.