name: openclip description: Turn long videos into short, captioned viral clips from your agent via the OpenClip MCP server. Also FREE with just an account (no subscription): transcribe a video, convert/compress/trim/crop/resize/mute a video, extract thumbnails, edit an image, remove an image background. Plus generate a short UGC-style ad clip from a brief. Triggers include "clip this video", "make shorts", "repurpose this", "find viral moments", "transcribe this", "convert to mp4/gif/mp3", "compress this video", "remove the background", "make a UGC ad", "openclip".
OpenClip: video editing from your agent
OpenClip is a video editing MCP server. Its headline pipeline turns a long video into short, captioned, ranked clips, and around that it exposes 28 tools in five groups, identical in every client:
- Clipping pipeline:
submit_video,get_video_status,list_clips,render_clip,get_render_status,list_caption_presets,get_transcript,list_supported_providers,list_videos. - Uploads:
create_upload,complete_upload(see the gotcha below: complete_upload starts the PAID pipeline; free tools skip it). - Free media utilities (account only, NO subscription):
transcribe,edit_video,convert_media,extract_thumbnails,edit_image,remove_background,get_tool_job_status. - UGC generation:
generate_ugc,get_ugc_job_status. - Account & presets:
get_account,get_usage,list_agents,create_agent,update_agent,describe_agent_settings,create_agent_logo_upload,set_agent_logo.
Setup (once)
The remote server supports OAuth one-click as the primary path: paste the server URL
(https://openclip.app/mcp) into your client and sign in with your OpenClip account, no
token to copy.
- Add the remote server to your agent (server URL:
https://openclip.app/mcp):- Claude Desktop: Settings → Connectors → Add custom connector → paste
https://openclip.app/mcp→ Connect → sign in. - Claude Code:
claude mcp add --transport http openclip https://openclip.app/mcp, then run/mcpand authorize in the browser. - Cursor (
.cursor/mcp.json):{ "mcpServers": { "openclip": { "url": "https://openclip.app/mcp" } } }, Cursor runs OAuth.
- Claude Desktop: Settings → Connectors → Add custom connector → paste
- Manual Bearer token (alternative, for header-only / programmatic clients): generate an
MCP token at openclip.app/settings/connect ("Generate MCP token", shown once) and
connect to the
/mcp/keyendpoint with it as a Bearer header:- Claude Code:
claude mcp add --transport http openclip https://openclip.app/mcp/key --header "Authorization: Bearer <token>" - Cursor (
.cursor/mcp.json):{ "mcpServers": { "openclip": { "url": "https://openclip.app/mcp/key", "headers": { "Authorization": "Bearer <token>" } } } } - Any MCP client: POST to
https://openclip.app/mcp/keywith headerAuthorization: Bearer <token>.
- Claude Code:
- Sanity check: call
get_account. Confirmcredits_remaining > 0.
(Self-hosting/dev only: run the local stdio server with php artisan mcp:start openclip.)
The loop (processing is ASYNC, always poll)
- Submit:
submit_video(url)→ returns ajob_idwithstatus:"queued". This ALWAYS succeeds (queues the job) when authenticated, it does NOT pre-check subscription or credits. - Poll status:
get_video_status(job_id)untilstatusiscompleted(orfailed). Do NOT call list_clips before completion. Readstatusfor the real state:failed(often almost immediately after submit) usually means no active subscription - advise the user to subscribe at openclip.app.pending_creditsmeans the team is out of credits, advise the user to top up.download_failedmeans the source URL couldn't be fetched, ask the user to check the link.
- List clips:
list_clips(job_id)→ viral moments withvirality_score(0-10), title/hook, start/end (ms), andclip/rendered_clipURLs. - (Optional) Render captioned:
render_clip(moment_id, caption_preset). Async too, polllist_clipsand watch the moment'srendered_clipfor the finished URL. Preset keys:list_caption_presets.
Free media utilities (no subscription needed)
transcribe, edit_video, convert_media, extract_thumbnails, edit_image, and
remove_background are FREE: they only need an account, not a subscription or credits.
All follow the same async pattern:
- Get a file in: for a local file call
create_upload(filename, content_type), PUT the bytes to the returnedupload_url, and use the returnedidasfile/video. Do NOT callcomplete_uploadfor free tools - that starts the paid clipping pipeline; free tools read the uploaded file directly. (Videos already inlist_videoswork as inputs too.) - Call the tool. It returns a
tool_jobhashid withstatus: "queued". - Poll
get_tool_job_status(tool_job)every 5-10s:queued/processingare in-flight,completed/failedterminal. Oncompletedit returns permanent CDNoutputsURLs (e.g. json/srt/vtt for transcribe, a zip of frames for extract_thumbnails). Onfailedit returnserror.
Operation cheat sheet (full params in reference.md): edit_video does one operation
of crop, trim, rotate, resize, compress, or mute; convert_media targets mp4/webm/mov/mkv,
gif, or mp3/aac/wav/flac; edit_image does compress, resize, or crop; remove_background
returns a transparent PNG. Free usage is rate-limited per day with per-file size caps; the
error text explains how to lift a limit.
Note the transcript split: transcribe is the free tool for uploaded files;
get_transcript reads the time-coded transcript of a video that went through the paid
clipping pipeline (supports start_ms/end_ms windows at sentence or word level).
UGC generation
generate_ugc renders a short (~7-12s) vertical UGC-style clip from a creative brief
(NOT a prose prompt: structured fields like character, or a server-side brief_name
preset). Free accounts get ONE generation per day; paid accounts are metered in credits by
the seconds rendered. It returns a ugc_job hashid; poll get_ugc_job_status every
10-15s (queued/rendering in-flight, completed returns video_url + result_meta,
failed returns error). Renders are heavy: expect a couple of minutes.
Reusable presets (agents)
To make repeat workflows 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 +
set_agent_logo attach a watermark (max 2 MB). get_usage reports the credit balance
(credits are MINUTES of processing) and recent activity.
Rules & gotchas
- Always poll; never assume a submit is instantly done. Poll
get_video_statusin a loop. - Pick clips by
virality_score(higher = better) unless the user says otherwise. - Times are milliseconds.
clip.urlis a permanent CDN URL (not signed/expiring). submit_videoqueues regardless of subscription/credit state; the gate surfaces LATER inget_video_status(failed= no subscription,pending_credits= out of credits). Read the status and advise the user accordingly, do NOT expect a synchronous "subscribe" error.- Projects/folders are not supported by this API, don't promise them.
Error handling
These are MCP tools, not a REST/HTTP API. A failed tool call returns a normal tool result
with isError: true and a short plain-text message (no HTTP 401/402/403/422 status, no JSON
error envelope). Read the message text and act on it:
"Not authenticated. Reconnect your OpenClip token.", the connection isn't carrying a valid identity → reconnect. For the OAuth path, re-run the connector sign-in (e.g./mcpin Claude Code); for the manual/mcp/keypath, re-generate the MCP token on the connect page and re-add the server with the new Bearer token. (A token missing themcp:usescope/ability is rejected at the transport before any tool runs, same fix: reconnect / re-mint.)"Job not found."(get_video_status,list_clips), thejob_idis wrong, from a different account, or expired → re-check the id you passed; if it was from an earlier session, re-submit the video."Viral moment not found."(render_clip), themoment_idis wrong or belongs to another account → re-fetch moments withlist_clipsand use an id from that response."Video not yet available. Check get_video_status for progress."(list_clips), the job hasn't produced a video record yet (still queued/downloading) → keep pollingget_video_statusand only calllist_clipsoncestatusiscompleted.- Validation messages (e.g. a bad/missing
url, an unknowncaption_preset), the validation error text is returned as the tool message → fix the offending argument and retry. - Subscription / credits are NOT errors here, they appear as
get_video_statusstatusvalues (failed= no subscription → subscribe;pending_credits= out of credits → top up), not as a tool error. See "The loop" above.
Example prompts → actions
- "Clip this: " →
submit_video(url), pollget_video_status, thenlist_clips. - "Give me the top 3 moments from job_…" →
list_clips, sort byvirality_score, take 3. - "Render moment m_… with the Beast captions" →
render_clip(m_…, caption_preset="beast"), poll. - "Transcribe this recording" →
create_upload, PUT bytes,transcribe(video), pollget_tool_job_status(NOcomplete_upload). - "Convert this to a gif" / "compress this video" →
create_upload, PUT bytes,convert_media(file, to="gif")/edit_video(file, operation="compress"), poll. - "Remove the background from this image" →
create_upload, PUT bytes,remove_background(file), poll, return the transparent PNG. - "Make a UGC ad for my app" →
generate_ugc(brief={...}), pollget_ugc_job_status.
See reference.md for status values, preset keys, operation params, and field shapes.