ozor-video-library — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited ozor-video-library (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
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__*.
Use this skill when the user wants to operate on videos that already exist in their Ozor account. Signals:
Do NOT use this skill when:
ozor-generateozor-document-videoozor-url-to-video| 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.
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?"
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).
list_videos({ limit: 1 }) to find the most recent.status is building, also call get_job (or wait_for_job if the user wants to block until it's done) to get progress.status is exported, show the URLs.mcp__ozor__get_embed_code({ videoId })If the video hasn't been exported yet, run the export first (workflow F below).
If the video is already exported, get_video returns the URLs. If not:
mcp__ozor__export_video({ videoId })
mcp__ozor__wait_for_export({ videoId })mcp__ozor__export_video({ videoId })
mcp__ozor__wait_for_export({ videoId }) // -> fresh shareUrl, editorUrl, downloadUrl
mcp__ozor__get_embed_code({ videoId }) // -> fresh iframeFormat 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, prefer send_message instead (workflow H). If they want a new project at the new format, fall through to generate_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.
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.
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.
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.
If the user says "that video" or "my last one" without an ID:
list_videos({ limit: 5 }).Don't silently pick a random video.
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.
send_message with a fix or a re-export.generate_from_plan. The user almost always wants the existing video updated, not a duplicate.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.