OpenClip: clipping long video into shorts
The headline OpenClip pipeline: submit a long video, get back ranked "viral moments" with titles, hooks, social copy, and clip URLs. This is the PAID pipeline, it needs an active OpenClip subscription and credits (credits are minutes of processing).
Processing is ASYNC at every step. Always poll, never assume a call finished.
Setup (once)
OpenClip is a remote MCP server at https://openclip.app/mcp. Sign in with your OpenClip
account when the OAuth prompt appears, there is no API key to copy.
- Claude Code:
claude mcp add --transport http openclip https://openclip.app/mcp, then/mcpto authorize. - Claude Desktop / web: Settings, Connectors, "Add custom connector", paste the URL, sign in.
- Cursor (
.cursor/mcp.json):{ "mcpServers": { "openclip": { "url": "https://openclip.app/mcp" } } } - Header-only clients: mint an MCP token at
openclip.app/settings/connectand connect tohttps://openclip.app/mcp/keywithAuthorization: Bearer <token>.
Sanity check: call get_account and confirm credits_remaining > 0.
The loop
- Submit.
submit_video(url)returns ajob_idwithstatus: "queued". Calllist_supported_providersfirst if you are unsure a source URL is supported. For a local file:create_upload(filename, content_type), PUT the bytes, thencomplete_upload(which is what starts this paid pipeline). - Poll.
get_video_status(job_id)untilstatusiscompletedor terminal. Do NOT calllist_clipsbeforecompleted. - List.
list_clips(job_id)returns the viral moments. - Render (optional).
render_clip(moment_id, caption_preset)burns in captions. Also async, see theopenclip-captionsskill.
Reading the status correctly
This is the part agents get wrong. submit_video ALWAYS succeeds when you are authenticated.
It queues the job, it does NOT pre-check your subscription or credits. The gate surfaces later,
in get_video_status, as a status value rather than an error:
pending,downloading,processing- in flight, keep polling.completed- terminal, now calllist_clips.failed- terminal. When it happens almost immediately after submit, this usually means no active subscription. Tell the user to subscribe at openclip.app.pending_credits- the team is out of credits. Tell the user to top up.download_failed(on the nestedvideo.status) - the source URL could not be fetched. Ask the user to check the link.
Do not expect a synchronous "you need to subscribe" error. Read the status and advise.
video.progress is COARSE, it is not a smooth percentage. Roughly 0 when failed, single digits
while downloading, ~10 uploaded, ~20 processing, 100 completed. Use status for control flow,
never progress.
What a moment looks like
Each entry from list_clips:
id- hashid, pass this torender_clip.title,hook,quote,social_copy,platforms,category- the copy to post with.start_time_ms,end_time_ms,duration_ms- times are milliseconds.virality_score- 0 to 10. Rank by this unless the user says otherwise.viral_score_details- sub-scores 0 to 100: hook strength, shareability, rewatchability, surprise, emotional impact. Use these to explain WHY a clip ranked where it did.thumbnail_url, and assetsclip{url, size_bytes, type},clip_watermarked, andrendered_clip{url, size_bytes}oncerender_cliphas succeeded.
Clip URLs are permanent CDN links, not signed or expiring.
Reusable presets
To make repeat runs identical (same tracker model, caption preset, composition, logo
watermark), save a processing agent once with create_agent and pass it to submit_video.
describe_agent_settings documents every nested field and allowed value. update_agent
patches only the fields you send. create_agent_logo_upload plus set_agent_logo attach a
watermark (max 2 MB). get_usage reports the credit balance and recent activity.
Errors
These are MCP tools, not a REST API. A failure comes back as a tool result with isError: true
and a plain-text message. No HTTP status codes, no JSON error envelope.
"Not authenticated. Reconnect your OpenClip token."- reconnect the connector, or re-mint the MCP token for the/mcp/keypath."Job not found."- wrong, expired, or another account'sjob_id. Re-submit if it came from an old session."Viral moment not found."- wrongmoment_id. Re-fetch withlist_clips."Video not yet available. Check get_video_status for progress."- you calledlist_clipstoo early. Keep pollingget_video_status.- Validation messages come back as the message text. Fix the argument and retry.
Rules
- Always poll. Never assume a submit is instantly done.
- Rank by
virality_score, higher is better. - Times are milliseconds.
- Projects and folders are not supported by this API. Do not promise them.
list_videosshows videos already in the account.
Example prompts to actions
- "Clip this: " -
submit_video(url), pollget_video_status, thenlist_clips. - "Top 3 moments from job_..." -
list_clips, sort byvirality_score, take 3. - "Why is that one the best?" - read
viral_score_detailsfor that moment. - "Make shorts from my last upload" -
list_videos, pick it, submit, poll, list.
Related
Burning in styled captions is openclip-captions. The full long-form to multi-platform
workflow is openclip-repurpose. Free trimming and cropping with no subscription is
openclip-video-editing.