Video editing from your agent via the OpenClip MCP server. Use when the user wants to repurpose/clip a long video or URL into shorts/viral moments, transcrib...
---
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.
1. 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 `/mcp` and authorize in the browser.
- **Cursor** (`.cursor/mcp.json`):
`{ "mcpServers": { "openclip": { "url": "https://openclip.app/mcp" } } }`, Cursor runs OAuth.
2. **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/key`** endpoint 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/key` with header `Authorization: Bearer <token>`.
3. Sanity check: call `get_account`. Confirm `credits_remaining > 0`.
(Self-hosting/dev only: run the local stdio server with `php artisan mcp:start openclip`.)
## The loop (processing is ASYNC, always poll)
1. **Submit**: `submit_video(url)` → returns a `job_id` with `status:"queued"`. This ALWAYS
succeeds (queues the job) when authenticated, it does NOT pre-check subscription or credits.
2. **Poll status**: `get_video_status(job_id)` until `status` is `completed` (or `failed`).
Do NOT call list_clips before completion. Read `status` for the real state:
- `failed` (often almost immediately after submit) usually means **no active subscription** -
advise the user to subscribe at openclip.app.
- `pending_credits` means the team is **out of credits**, advise the user to top up.
- `download_failed` means the source URL couldn't be fetched, ask the user to check the link.
3. **List clips**: `list_clips(job_id)` → viral moments with `virality_score` (0-10),
title/hook, start/end (ms), and `clip` / `rendered_clip` URLs.
4. **(Optional) Render captioned**: `render_clip(moment_id, caption_preset)`. Async too, poll
`list_clips` and watch the moment's `rendered_clip` for 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:
1. Get a file in: for a local file call `create_upload(filename, content_type)`, PUT the
bytes to the returned `upload_url`, and use the returned `id` as `file`/`video`.
**Do NOT call `complete_upload` for free tools** - that starts the paid clipping
pipeline; free tools read the uploaded file directly. (Videos already in
`list_videos` work as inputs too.)
2. Call the tool. It returns a `tool_job` hashid with `status: "queued"`.
3. Poll `get_tool_job_status(tool_job)` every 5-10s: `queued`/`processing` are in-flight,
`completed`/`failed` terminal. On `completed` it returns permanent CDN `outputs` URLs
(e.g. json/srt/vtt for transcribe, a zip of frames for extract_thumbnails). On
`failed` it returns `error`.
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_status` in a loop.
- Pick clips by `virality_score` (higher = better) unless the user says otherwise.
- Times are milliseconds. `clip.url` is a permanent CDN URL (not signed/expiring).
- `submit_video` queues regardless of subscription/credit state; the gate surfaces LATER in
`get_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. `/mcp` in
Claude Code); for the manual `/mcp/key` path, re-generate the MCP token on the connect page and
re-add the server with the new Bearer token. (A token missing the `mcp:use` scope/ability is
rejected at the transport before any tool runs, same fix: reconnect / re-mint.)
- **`"Job not found."`** (`get_video_status`, `list_clips`), the `job_id` is 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`), the `moment_id` is wrong or belongs to
another account → re-fetch moments with `list_clips` and 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 polling
`get_video_status` and only call `list_clips` once `status` is `completed`.
- **Validation messages** (e.g. a bad/missing `url`, an unknown `caption_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_status` `status`
values (`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: <url>" → `submit_video(url)`, poll `get_video_status`, then `list_clips`.
- "Give me the top 3 moments from job_…" → `list_clips`, sort by `virality_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)`, poll
`get_tool_job_status` (NO `complete_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={...})`, poll `get_ugc_job_status`.
See `reference.md` for status values, preset keys, operation params, and field shapes.
don't have the plugin yet? install it then click "run inline in claude" again.
restructured the original into implexa's six-component format, extracted implicit decision points (subscription failures, rate limits, old job ids), documented oauth and bearer token setup with env guidance, added edge cases (token expiry, polling before completion, upload gotcha), expanded output contract with specific file formats and cdn behavior, and clarified outcome signals for each workflow.
OpenClip is a video editing MCP server that turns long videos into short, captioned, ranked clips. Use it when the user wants to repurpose a long video into viral shorts, transcribe video/audio, convert/compress/trim/crop/resize/mute media, extract thumbnails, edit images, remove backgrounds, or generate UGC-style ad clips from a brief. The service exposes 28 tools across five groups (clipping pipeline, uploads, free media utilities, UGC generation, account/presets). All processing is async. Paid features (video clipping) require an active subscription and credits; free features (transcribe, edit_video, convert_media, extract_thumbnails, edit_image, remove_background) need only an OpenClip account.
External connection: OpenClip MCP server
https://openclip.app/mcpclaude mcp add --transport http openclip https://openclip.app/mcp; Cursor: add to .cursor/mcp.json with "url": "https://openclip.app/mcp"). Sign in with OpenClip account.openclip.app/settings/connect ("Generate MCP token", shown once). Connect to /mcp/key endpoint with Authorization: Bearer <token> header (Claude Code: claude mcp add --transport http openclip https://openclip.app/mcp/key --header "Authorization: Bearer <token>"; Cursor: add to .cursor/mcp.json with URL and headers; any MCP client: POST to https://openclip.app/mcp/key with Bearer header).get_account and confirm credits_remaining > 0.Required inputs (vary by operation)
url param) or video ID from list_videos.create_upload to stage) or existing video ID.brief_name preset.moment_id from list_clips output and optional caption_preset key (fetch with list_caption_presets).Rate limits and quotas
Scenario A: Clip a long video into viral shorts (paid pipeline)
Call submit_video(url) with the video URL. Returns job_id with status: "queued". This succeeds when authenticated but does NOT pre-check subscription or credits; the gate surfaces later.
job_id (string, hashid format), status: "queued".Poll get_video_status(job_id) every 5-10 seconds until status is completed (or failed).
job_id from step 1.status (one of: queued, downloading, processing, completed, failed, pending_credits), plus metadata (job creation time, progress %).Once status: "completed", call list_clips(job_id) to retrieve all detected viral moments.
job_id from step 1.moment_id, virality_score (0-10), title, hook, start_ms, end_ms, clip (raw URL), rendered_clip (if already captioned, else null).(Optional) For each moment you want to publish with captions, call render_clip(moment_id, caption_preset). Presets can be fetched with list_caption_presets (e.g., "beast", "minimal", "hype").
moment_id from step 3, caption_preset (string key).moment_id, job_id (a render job ID, distinct from the video job), status: "queued".Poll list_clips(job_id) every 5-10 seconds, watching each rendered moment's rendered_clip field for a final CDN URL (appears when the render completes).
job_id from step 1.rendered_clip URLs once render jobs finish.Scenario B: Free media utility (transcribe, convert, compress, edit, remove background)
If the file is local, stage it: call create_upload(filename, content_type). Returns upload_url and id.
filename (string, e.g., "my_video.mp4"), content_type (MIME type, e.g., "video/mp4").upload_url (signed PUT URL, valid for 15 minutes), id (file ID to use in next step).PUT the file bytes to the upload_url (HTTP PUT, raw binary body).
upload_url from step 1, file bytes.Call the appropriate free tool with the id from step 1 (or a video ID from list_videos if file is already in the system):
transcribe(video) → returns tool_job hashid, status: "queued".convert_media(file, to="mp4"|"gif"|"webm"|"mov"|"mkv"|"mp3"|"aac"|"wav"|"flac") → returns tool_job, status: "queued".edit_video(video, operation="crop"|"trim"|"rotate"|"resize"|"compress"|"mute", <operation-specific params>) → returns tool_job, status: "queued".extract_thumbnails(video, count=<int>) → returns tool_job, status: "queued".edit_image(file, operation="compress"|"resize"|"crop", <operation-specific params>) → returns tool_job, status: "queued".remove_background(file) → returns tool_job, status: "queued". Output is a transparent PNG.tool_job (hashid), status: "queued".Poll get_tool_job_status(tool_job) every 5-10 seconds until status is completed (or failed).
tool_job from step 3.status (one of: queued, processing, completed, failed), and on completed: outputs (array of CDN URLs for results, e.g., JSON/SRT/VTT for transcripts, a ZIP of frame images, a converted media file). On failed: error (string explaining the failure).Download or use the permanent CDN outputs URLs. Do NOT call complete_upload for free tools (that triggers the paid pipeline; free tools read the staged file directly).
Scenario C: Generate a UGC-style ad clip
Call generate_ugc(brief={...}) with a creative brief (structured object with fields like character, context, tone, or a server-side brief_name preset).
brief (object or preset name string), and optional metadata fields.ugc_job (hashid), status: "queued".Poll get_ugc_job_status(ugc_job) every 10-15 seconds until status is completed (or failed). UGC renders are heavy; expect 1-3 minutes.
ugc_job from step 1.status (one of: queued, rendering, completed, failed). On completed: video_url (CDN URL to the rendered vertical clip, 7-12s), result_meta (object with duration, dimensions, etc.). On failed: error (string).Use the video_url directly (it's a permanent CDN link).
Scenario D: Manage reusable processing agents (presets)
Call create_agent(name, settings={...}) with a name and processing settings (tracker model, caption preset, logo, composition). Returns agent_id.
name (string), settings (nested object; see describe_agent_settings for allowed fields).agent_id, agent metadata.Attach a logo watermark (optional): call create_agent_logo_upload(agent_id) to get a signed upload URL, PUT the logo bytes (PNG/JPG, max 2 MB), then call set_agent_logo(agent_id, logo_id).
agent_id, logo file bytes, logo file ID.In future submit_video calls, pass agent_id to apply the same preset settings automatically.
To update settings, call update_agent(agent_id, settings={...}) (patches only the fields you send).
Call describe_agent_settings to see every nested field and allowed value; call get_usage to check credit balance and recent activity.
If the user submits a video for clipping and get_video_status returns status: "failed"
If get_video_status returns status: "pending_credits"
If get_video_status returns status: "download_failed"
If a free media utility call returns isError: true with a rate-limit message
If list_clips is called before get_video_status reports completed
get_video_status first; only call list_clips after completion.If any tool call returns "Not authenticated. Reconnect your OpenClip token."
/mcp in Claude Code).If any tool call returns "Job not found." or "Viral moment not found." or "Video not yet available. Check get_video_status for progress."
If a tool call returns a validation error (bad URL, unknown preset, missing required param)
If the user does NOT want the top viral moment by score
If the user asks for projects, folders, or organizing clips into collections
Clipping pipeline success
moment_id (string), virality_score (0-10, float), title (string), hook (string), start_ms (int), end_ms (int), clip (CDN URL, string, playable immediately), rendered_clip (CDN URL with captions, string, null if not yet rendered). All CDN URLs are permanent and not signed/expiring.list_clips API call; download clips from the URLs or display them inline.Free media utility success
outputs array containing CDN URLs.outputs field of get_tool_job_status response.UGC generation success
video_url, string) pointing to a vertical MP4, 7-12 seconds, plus result_meta object (duration in seconds, dimensions, codec info).get_ugc_job_status response.Video clipping
virality_score) is recommended. User can click/download any clip URL immediately. If rendered with captions, the rendered_clip URL displays the final captioned version.Free media utility (transcribe, convert, compress, edit, remove background)
UGC generation
Auth/connection
get_account call succeeds and returns the user's account info, including credits_remaining (minutes). If a tool call fails with auth error, reconnecting surfaces a successful auth and tools work again.Polling/async completion
outputs, video_url, or rendered_clip URLs appear in the response, or error text explains what went wrong.