ozor-document-video — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited ozor-document-video (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.
End-to-end document-to-video on Ozor.ai. Takes a real file (PDF, PPTX, DOCX, etc.), analyzes it on Ozor's side to produce a structured plan, lets the user approve/edit the plan, then generates and exports a finished video — preserving slide visuals along the way.
Use this skill when the input is a document/file. Signals:
Do NOT use this skill when:
ozor-generateozor-url-to-videoozor-doc-to-video (prompt-only skill)ozor-video-librarymcp__ozor__analyze_document — analyzes the doc, returns a planId plus the structured planmcp__ozor__prepare_document_upload — gets a curl-uploadable URL for local files with no public URL (the common path)mcp__ozor__get_plan — fetches the latest plan statemcp__ozor__update_plan — applies user edits to the plan before generationmcp__ozor__generate_from_plan — kicks off the video build from the approved plan, returns projectIdmcp__ozor__export_video — starts the render (use the projectId as videoId)mcp__ozor__wait_for_export — blocks until the render is readymcp__ozor__get_embed_code — returns the <iframe> HTMLIf the Ozor MCP isn't connected, tell the user and stop. Do not extract content yourself and fall back to generate_video with a hand-written script — that loses the slide visuals and overflows the 2000-char prompt limit. The plan-based flow is mandatory for documents.
Pick the best source, in priority order:
url directly to analyze_document. No size limit, no token cost. Best whenever available.mcp__ozor__prepare_document_upload, then run the returned curl command to push the bytes directly to Ozor's storage. Bytes never traverse a tool call, so files up to ~50 MB work. Use this for any multi-MB PDF/PPTX/DOCX the user has uploaded into the conversation.If prepare_document_upload isn't in the tool list, uploads are disabled on this server — fall back to a URL or small base64.
Once Ozor has the file, call:
mcp__ozor__analyze_document({
url | uploadId | fileBase64+fileName,
...optional hints: targetDuration, format (16:9 / 9:16), audience, tone
})This returns { planId, plan }. The plan contains the proposed scenes, narration, visual notes, and which slides/pages map to which scenes.
This is the critical step. Do NOT skip to generation. Show the user a concise rendering of the plan:
📋 Ozor plan for "<document name>"
**Format:** 16:9 (or 9:16)
**Estimated duration:** ~X seconds
**Scenes:** N
(1) <scene title> — <one-line narration / visual>
(2) <scene title> — <one-line narration / visual>
...
Want me to generate this as-is, or change anything? You can:
- Edit a scene ("change scene 2 to ...")
- Reorder / drop / add scenes
- Change tone, length, or format
- Approve and generateThen wait for the user to approve or request edits. Do not call generate_from_plan on your own initiative — the plan is the user's checkpoint for cost and creative control.
If the user requests changes, call mcp__ozor__update_plan({ planId, ... }) with the edits. Re-fetch with get_plan and re-show the updated plan. Loop until the user approves.
When the user approves:
mcp__ozor__generate_from_plan({ planId })This returns { projectId }. Use projectId as videoId for every subsequent call.
If the response includes a jobId, wait on it with wait_for_job({ videoId: projectId, jobId }). Otherwise proceed to export.
mcp__ozor__export_video({ videoId: projectId })
mcp__ozor__wait_for_export({ videoId: projectId })Returns shareUrl, editorUrl, downloadUrl.
mcp__ozor__get_embed_code({ videoId: projectId })🎬 Video ready from "<document name>"
**Share:** <shareUrl>
**Editor:** <editorUrl>
**Download:** <downloadUrl>
**Embed:**<iframe ...></iframe>
Want a 9:16 social cut from the same plan? I can regenerate.analyze_documentPass any of these if the user mentioned them or they're obvious from the document:
targetDuration — e.g. "60s", "90s". Default ~60s for proposals/decks, ~30s for one-pagers.format — "16:9" (default) or "9:16" for social.audience — investors, customers, developers, internal team, ...tone — confident, warm, technical, energetic, ...focus — optional, a one-line note like "lean into the metrics on slide 4" or "skip the team slide".| Document | Default duration | Format | Tone | Focus |
|---|---|---|---|---|
| Pitch deck | 60–90s | 16:9 | Confident | Problem → solution → traction → CTA |
| Proposal (DOCX) | 60s | 16:9 | Professional | Outcomes + price + next step |
| Whitepaper / report | 60–90s | 16:9 | Authoritative | 3 key findings, link to full doc in CTA |
| Sales one-pager | 30–45s | 16:9 | Punchy | Hook → 3 benefits → CTA |
| Release notes | 30–45s | 16:9 | Energetic | One scene per feature |
| Training / SOP | 90s+ | 16:9 | Calm, clear | Numbered steps, split into a series if > 7 scenes |
When in doubt, propose a default in your initial call and let the user override after seeing the plan.
If the rendered video needs changes:
update_plan + regenerate (this re-runs from the plan, no need to re-analyze the doc)analyze_document again with stronger hintsprepare_document_upload instead of base64.update_plan with corrections rather than restarting.update_plan, retry.wait_for_export again; it resumes.generate_video with hand-written prose extracted from the document. The whole point of this skill is that Ozor sees the slides directly.generate_from_plan. Generation is the expensive step; the plan is the checkpoint.analyze_document does that and preserves visuals. Your job is to orchestrate the MCP and curate the plan, not to rewrite the content.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.