# Openclip

> 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",…

- **Type:** Skill
- **Install:** `agentstack add skill-oak-ridge-ventures-openclip-skill-openclip`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [Oak-Ridge-Ventures](https://agentstack.voostack.com/s/oak-ridge-ventures)
- **Installs:** 0
- **Category:** [Content & Media](https://agentstack.voostack.com/c/content-and-media)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [Oak-Ridge-Ventures](https://github.com/Oak-Ridge-Ventures)
- **Source:** https://github.com/Oak-Ridge-Ventures/openclip-skill/tree/main/skills/openclip

## Install

```sh
agentstack add skill-oak-ridge-ventures-openclip-skill-openclip
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# 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 "`
   - **Cursor** (`.cursor/mcp.json`):
     `{ "mcpServers": { "openclip": { "url": "https://openclip.app/mcp/key", "headers": { "Authorization": "Bearer " } } } }`
   - **Any MCP client:** POST to `https://openclip.app/mcp/key` with header `Authorization: Bearer `.
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: " → `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.

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [Oak-Ridge-Ventures](https://github.com/Oak-Ridge-Ventures)
- **Source:** [Oak-Ridge-Ventures/openclip-skill](https://github.com/Oak-Ridge-Ventures/openclip-skill)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-oak-ridge-ventures-openclip-skill-openclip
- Seller: https://agentstack.voostack.com/s/oak-ridge-ventures
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
