> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to the OpusClip MCP server

The OpusClip MCP connector routes your AI agent's tool calls to OpusClip's own MCP server through Scalekit. Each user signs in to OpusClip once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 30 tools.

**Authentication:** OAuth2.1/DCR
**Categories:** Media, AI, Marketing
**Tools:** 30: 16 read, 6 write, 8 destructive
**Users sign in with:** OAuth
**OAuth app:** Your own OpusClip MCP server app
**Built by:** Vendor MCP
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=OPUSCLIPMCP)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the OpusClip MCP connection

   In **AgentKit > Connections**, create an OpusClip MCP connection and copy its redirect URI. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### Register an OAuth app

   OpusClip MCP server connections use your own OAuth app. Register one with OpusClip MCP server and add the redirect URI you copied.

   Then enter the app's Client ID and Client Secret on the OpusClip MCP connection.

5. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   import { ScalekitClient } from '@scalekit-sdk/node'
   import 'dotenv/config'
   import { createInterface } from 'node:readline/promises'

   const scalekit = new ScalekitClient(
     process.env.SCALEKIT_ENVIRONMENT_URL,
     process.env.SCALEKIT_CLIENT_ID,
     process.env.SCALEKIT_CLIENT_SECRET,
   )
   const actions = scalekit.actions

   const connector = 'opusclipmcp'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize OpusClip MCP:', link)
   const rl = createInterface({ input: process.stdin, output: process.stdout })
   await rl.question('Press Enter after authorizing...')
   rl.close()

   // Make your first call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'opusclipmcp_opusclip_whoami',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "opusclipmcp"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize OpusClip MCP:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="opusclipmcp_opusclip_whoami",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user signs in once. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'opusclipmcp_opusclip_apply_editing_script',
  toolInput: {},
  connector: 'opusclipmcp',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="opusclipmcp_opusclip_apply_editing_script",
    tool_input={},
    connection_name="opusclipmcp",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `opusclipmcp_opusclip_apply_editing_script`

Apply Editing Script · Read-only

Deprecated -- this tool no longer applies an editing script and does not re-render the clip; it is kept only to point you at its replacement. Clip edits now run through `opusclip_edit_clip`: pass the same projectId and clipId plus the ops you want -- that tool's own description carries the vocabulary. It applies the edit server-side and re-renders, so there is no editing script to fetch, mutate, or post back.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `opusclipmcp_opusclip_describe_clip`

Get Clip Details · Read-only

Returns a single clip's detail: transcript, keywords, layout/aspect, score, preview URL, and render_pending -- whether a re-render is still in flight. Poll render_pending after any edit or censor job to know when the new render is ready. Preview-only by design; for the HD file use export_clip.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `clipId` (`string`, required): The clip ID within the project.
- `projectId` (`string`, required): The clip project ID.

Example input: `{"clipId":"<clipId>","projectId":"<projectId>"}`

### `opusclipmcp_opusclip_export_collection`

Export Collection · Read-only

Returns the HD download (export) URL for every clip in a collection. list_clips/describe_clip expose preview_url only, mirroring the web app where HD appears behind an explicit export -- HD URLs come only from this tool or export_clip (single clip). Read-only; nothing is written.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `collectionId` (`string`, required): Collection ID to export.

Example input: `{"collectionId":"<collectionId>"}`

### `opusclipmcp_opusclip_get_editing_script`

Get Editing Script · Read-only

Deprecated -- this tool no longer returns an editing script; it is kept only to point you at its replacement. Clip edits now run through `opusclip_edit_clip`: pass the same projectId and clipId plus the ops you want -- that tool's own description carries the vocabulary. It applies the edit server-side and re-renders, so there is no editing script to fetch, mutate, or post back.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `opusclipmcp_opusclip_get_social_copy_job`

Get Social Copy Job · Read-only

Returns the current status (and generated copy, if any) for a previously created social-copy job. Use to poll until the job concludes.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `jobId` (`string`, required): The copy job ID.

Example input: `{"jobId":"<jobId>"}`

### `opusclipmcp_opusclip_get_transcript`

Get Clip Transcript · Read-only

Returns the source-video transcript for a clip project: paragraph-level text with per-word timing (ms). Use for transcript review, search, or as input to other tools. NOT the same as per-clip captions: this is the source video, not any one clip, and editing it here is not possible. The `paragraphs` field is omitted when the project has no transcript yet (still processing or transcription failed). For range-limited API callers, paragraphs are filtered to the billed range.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `projectId` (`string`, required): The clip project ID.

Example input: `{"projectId":"<projectId>"}`

### `opusclipmcp_opusclip_get_usage`

Get API Usage · Read-only

Returns the calling organization's current API cap usage so the agent can check headroom BEFORE submitting work: monthly { used, limit, remaining, reset_at } (credits; ~1 credit per minute of source video) and concurrent { used, limit } (in-flight API projects). When the workspace is exempt from caps (Enterprise OpenApi pack or caps disabled) it returns { uncapped: true } with no numbers. Same numbers the X-RateLimit-* response headers carry. Use this to decide whether a batch fits under the cap instead of waiting for the 403.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `opusclipmcp_opusclip_list_brand_templates`

List Brand Templates · Read-only

Lists the brand templates owned by the calling OpusClip organization. Used to populate template pickers before creating new clip projects.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `opusclipmcp_opusclip_list_clips`

List Clips · Read-only

Lists a project's clips with rank, score, title, description, hashtags, duration, and preview/thumbnail URLs. Judge sub-scores (hook/coherence/connection/trend) are included when the clip has been scored. preview_url is the watchable artifact; HD download URLs are not listed here -- use export_clip (one clip) or export_collection (many). The response also carries the project's `stage`: an empty list with a stage still in progress means the clips are not ready yet, so poll this tool again rather than concluding the project produced nothing. For a collection's clips, use list_clips_in_collection.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `projectId` (`string`, required): List clips for this clip project.

Example input: `{"projectId":"<projectId>"}`

### `opusclipmcp_opusclip_list_clips_in_collection`

List Clips in Collection · Read-only

Lists the clips in a collection with rank, score, title, description, hashtags, duration, and preview/thumbnail URLs -- same shape as list_clips (preview_url to watch; HD downloads via export_clip or export_collection). Use list_collections to find a collection ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `collectionId` (`string`, required): The collection ID (from list_collections).

Example input: `{"collectionId":"<collectionId>"}`

### `opusclipmcp_opusclip_list_collections`

List Collections · Read-only

Lists the calling organization's clip collections (curated groupings of clips across projects).

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `opusclipmcp_opusclip_list_projects`

List Clip Projects · Read-only

Lists the calling organization's clip projects in reverse-chronological order. Use this to find a project ID for follow-up tools like list_clips.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `page` (`integer`, optional): Zero-based page index. Default: `0`.
- `pageSize` (`integer`, optional): Results per page (1-100). Defaults to 20. Default: `20`.

Example input: `{}`

### `opusclipmcp_opusclip_list_scheduled_posts`

List Scheduled Posts · Read-only

Lists social posts for the calling organization and returns the schedule_id that opusclip_unschedule_publish requires. Two query modes -- pass projectId to list every post for one project, or pass startAt/endAt (ISO 8601 UTC) to list posts in a date window without needing a projectId first. Pass one mode or the other; with neither, the call is rejected. Note that schedule_id is null for immediate posts that were never scheduled.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `endAt` (`string`, optional): End of the date window, ISO 8601 UTC (e.g. 2026-04-01T00:00:00Z). Use together with startAt as an alternative to projectId -- provide one query mode or the other, not both.
- `projectId` (`string`, optional): List every post for this clip project. Filter by clipId client-side. Use this alone, or omit it and provide startAt and endAt instead -- the call is rejected if neither mode is provided.
- `startAt` (`string`, optional): Start of the date window, ISO 8601 UTC (e.g. 2026-03-25T00:00:00Z). Use together with endAt as an alternative to projectId -- provide one query mode or the other, not both.

Example input: `{}`

### `opusclipmcp_opusclip_list_social_accounts`

List Social Accounts · Read-only

Lists the social accounts (TikTok, YouTube, Instagram, etc.) the calling org has connected for posting. Use to find a postAccountId before generate-copy / post / schedule.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `opusclipmcp_opusclip_preview_clips`

Preview Clips · Read-only

Renders a visual, in-chat preview of a project's clips (playable videos with rank, score, duration, and hashtags) on hosts that support MCP Apps, and returns the same clip data as JSON. Shows the top-ranked clips (6 by default) as a card grid so a large project does not flood the chat; pass limit to show more or fewer (e.g. limit 3 for the top three, or the project total to show all), or clipId to spotlight a single clip as one card. Use after clip generation finishes, or to spotlight one clip, so the user can review results without leaving the conversation.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `projectId` (`string`, required): Preview clips for this clip project.
- `clipId` (`string`, optional): Optional: preview only this one clip (single card) instead of the whole project.
- `limit` (`integer`, optional): Optional: max clips to show, highest-ranked first (default 6). Raise it (or pass the project total) to show more; ignored when clipId is set. Default: `6`.

Example input: `{"projectId":"<projectId>"}`

### `opusclipmcp_opusclip_whoami`

Get Session Identity · Read-only

Returns the session's current OpusClip org (the one the user picked on the consent screen at connect time, or the default), the user's org count, and API-access status. The org context is fixed for the life of the connection: to act on a different organization, the user must disconnect and reconnect the OpusClip connector, then pick that organization on the consent screen. MCP-only: the CLI authenticates with a single-org API key.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `opusclipmcp_opusclip_add_clip_to_collection`

Add Clip to Collection · Write

Adds a clip (projectId + clipId) to a collection. Calling twice for the same clip+collection returns an error per the underlying service.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `clipId` (`string`, required): The clip ID within the project.
- `collectionId` (`string`, required): Target collection ID.
- `projectId` (`string`, required): The clip project ID.

Example input: `{"clipId":"<clipId>","collectionId":"<collectionId>","projectId":"<projectId>"}`

### `opusclipmcp_opusclip_analyze_video`

Analyze Video · Write

Runs visual analysis over a time range of the source video and returns, per keyframe, what the frame contains: face and people boxes, screen regions, panel and document layout, whether the speaker is active, and any tracked subjects. Positions are center-percentage boxes, not pixels. This does NOT reframe or change the clip and does NOT return a crop -- the crop is chosen downstream from this evidence plus the render preference. Analysis is asynchronous and has two modes. START: pass projectId, clipId, startMs and endMs (all four) to begin one; it returns a task_id. POLL: pass taskId ALONE -- set to that task_id value -- and nothing else, repeatedly, until status is 'completed'. Status is one of 'running', 'completed', 'failed' or 'unknown'. Then read `segments`. Segments are absent while pending; that is not an empty result.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `clipId` (`string`, optional): START mode: the clip supplying context (genre, render preference). The range below is measured against the source video, not this clip.
- `endMs` (`number`, optional): START mode: end of the range to analyze, in ms from the start of the SOURCE VIDEO (not from the start of the clip).
- `projectId` (`string`, optional): START mode: the clip project ID. Not needed to poll.
- `startMs` (`number`, optional): START mode: start of the range to analyze, in ms from the start of the SOURCE VIDEO (not from the start of the clip).
- `taskId` (`string`, optional): POLL mode: the task_id from a previous call. Send it ALONE -- polling needs no projectId and starts no new analysis; every other field is ignored.

Example input: `{}`

### `opusclipmcp_opusclip_create_collection`

Create Collection · Write

Creates a new empty clip collection in the calling organization. Use add_clip_to_collection to populate it.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): Display name for the collection.

Example input: `{"name":"<name>"}`

### `opusclipmcp_opusclip_create_social_copy_job`

Create Social Copy · Write

Kicks off an AI copy-generation job for a clip + social account. Poll opusclip_get_social_copy_job with the returned job_id until status settles, then use the copy in create_post_task or schedule_publish.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `clipId` (`string`, required): The clip ID within the project.
- `postAccountId` (`string`, required): Target social account ID (from list_social_accounts).
- `projectId` (`string`, required): The clip project ID.
- `forceRegenerate` (`boolean`, optional): Re-run even if a copy already exists for this clip+account.
- `prompt` (`string`, optional): Optional tone/style prompt for the copy generator.
- `subAccountId` (`string`, optional): Optional sub-account ID.

Example input: `{"clipId":"<clipId>","postAccountId":"<postAccountId>","projectId":"<projectId>"}`

### `opusclipmcp_opusclip_create_upload_link`

Create Upload Link · Write

Returns a Google Cloud Storage signed URL the caller's client can use to upload a local video. After upload, pass the returned upload_id as videoUrl to opusclip_submit_project. Includes resumable-upload instructions and storage quota.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `extension` (`string`, optional): Video file extension. Defaults to mp4. One of: `mkv`, `mov`, `mp4`. Default: `mp4`.
- `fileName` (`string`, optional): Optional original filename for logging/dedup. Server generates the storage path.
- `sizeMb` (`integer`, optional): Approximate file size in MB (storage quota check). Defaults to 1000. Default: `1000`.

Example input: `{}`

### `opusclipmcp_opusclip_duplicate_clip`

Duplicate Clip · Write

Duplicates a clip within its project, creating an independent copy titled "<title> (Copy)" that can be edited or exported without touching the original. Returns the new clip in the same shape as list_clips. NOT idempotent -- each call creates another copy.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `clipId` (`string`, required): The clip ID within the project.
- `projectId` (`string`, required): The clip project ID.

Example input: `{"clipId":"<clipId>","projectId":"<projectId>"}`

### `opusclipmcp_opusclip_create_censor_job`

Create Censor Job · Destructive

Runs OpusClip's profanity censor on a clip's caption track, replacing matched words with asterisks (and optionally a beep). Triggers a re-render so the new captions appear in the rendered clip. Returns render_pending: true -- the re-render is queued asynchronously, so the new render does NOT exist yet at this point. Do NOT read preview_url or call export_clip immediately; poll list_clips (or describe) for the clip and wait for render_pending to become false before watching, downloading, or sharing the artifact, otherwise you will fetch the OLD render.

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `clipId` (`string`, required): The clip ID within the project.
- `projectId` (`string`, required): The clip project ID.
- `beepSound` (`boolean`, optional): Use a beep sound on censored words. Defaults to false (silent). Default: `false`.

Example input: `{"clipId":"<clipId>","projectId":"<projectId>"}`

### `opusclipmcp_opusclip_create_post_task`

Create Social Post · Destructive

Requests publishing a clip to a connected social account now. This tool does NOT post directly: it returns an approval_url, and the post goes out only after the user reviews and confirms it in the OpusClip app. Use schedule_publish for a future-dated post.

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `clipId` (`string`, required): The clip ID within the project.
- `postAccountId` (`string`, required): Target social account ID.
- `projectId` (`string`, required): The clip project ID.
- `title` (`string`, required): Primary caption text. Populates the visible post body on every platform (Facebook, X, Instagram, TikTok, LinkedIn); on YouTube/Dailymotion it is the video title. Required.
- `description` (`string`, optional): Optional override for the post body/caption. Defaults to `title` when omitted.
- `mediaType` (`string`, optional): Platform-specific media type override (e.g. 'reel', 'short').
- `privacy` (`string`, optional): Platform-specific privacy value (e.g. 'public', 'unlisted').
- `subAccountId` (`string`, optional): Optional sub-account ID.

Example input: `{"clipId":"<clipId>","postAccountId":"<postAccountId>","projectId":"<projectId>","title":"<title>"}`

### `opusclipmcp_opusclip_edit_clip`

Edit Clip · Destructive

Edits a clip with one or more semantic ops in a single call (executed in order, ONE preview re-render at the end), saves the result onto the clip, and supports undo. Ops: 'set_captions' / 'set_emoji' / 'set_keyword_highlight' (pass enabled true|false), 'remove_filler_words' (hard-cuts um/uh/like), 'remove_pauses' (hard-cuts silences at or above minPauseSec, default 0.5s), 'trim_section' / 'split_section' / 'drop_section' / 'reorder_sections' (structural edits), 'delete_phrase' / 'replace_phrase', 'set_style', 'add_text_overlay' / 'set_text_overlay' / 'remove_text_overlay', 'remove_emoji' / 'move_emoji', and 'undo'. Batch related edits into ONE call. Pass dryRun: true to preview without saving/rendering.

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `clipId` (`string`, required): Clip to edit.
- `ops` (`array`, required): Edits to apply, in order.
- `projectId` (`string`, required): Project owning the clip.
- `dryRun` (`boolean`, optional): Preview only: run the ops and report what would change, saving and rendering nothing.

Example input: `{"clipId":"<clipId>","ops":[],"projectId":"<projectId>"}`

### `opusclipmcp_opusclip_export_clip`

Export Clip · Destructive

The explicit export step for ONE clip: returns a download URL for the chosen target, starting the render on demand when that target has no artifact yet (clips are preview-only until exported). target: 'hd' (default, the HD .mp4), '4k' (a 4K .mp4 -- needs a paid plan and a 4K source), or 'xml' (an Adobe Premiere project file -- needs an entitled plan). status 'ready' means export_url is the fresh artifact -- download it; 'rendering' means a render is in flight, already running or just started by this call -- wait a few seconds and call again to poll until 'ready' (calling again never starts a second render); 'unavailable' means the artifact cannot be produced (the org is not entitled to this target, or the source cannot make it) -- a final answer, do not poll. For many clips at once, use export_collection.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `clipId` (`string`, required): The clip ID within the project.
- `projectId` (`string`, required): The clip project ID.
- `target` (`string`, optional): Which export product to hand out (default 'hd'): 'hd' = HD video, '4k' = 4K video (paid plan + 4K source), 'xml' = Adobe Premiere project file (entitled plan). Entitlement is enforced server-side regardless of this value. One of: `hd`, `4k`, `xml`. Default: `hd`.

Example input: `{"clipId":"<clipId>","projectId":"<projectId>"}`

### `opusclipmcp_opusclip_schedule_publish`

Schedule Publish · Destructive

Requests scheduling a clip to publish at a specific time. publishAt is ISO 8601 UTC, e.g. '2026-03-25T14:00:00Z'. This tool does NOT create the schedule directly: it returns an approval_url, and the schedule is created only after the user reviews and confirms it in the OpusClip app. Cancel an existing schedule with opusclip_unschedule_publish.

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `clipId` (`string`, required): The clip ID within the project.
- `postAccountId` (`string`, required): Target social account ID.
- `projectId` (`string`, required): The clip project ID.
- `publishAt` (`string`, required): ISO 8601 UTC timestamp (e.g. 2026-03-25T14:00:00Z).
- `title` (`string`, required): Primary caption text. Populates the visible post body on every platform (Facebook, X, Instagram, TikTok, LinkedIn); on YouTube/Dailymotion it is the video title. Required.
- `description` (`string`, optional): Optional override for the post body/caption. Defaults to `title` when omitted.
- `mediaType` (`string`, optional): Platform-specific media type override (e.g. 'reel', 'short').
- `privacy` (`string`, optional): Platform-specific privacy value (e.g. 'public', 'unlisted').
- `subAccountId` (`string`, optional): Optional sub-account ID.

Example input: `{"clipId":"<clipId>","postAccountId":"<postAccountId>","projectId":"<projectId>","publishAt":"<publishAt>","title":"<title>"}`

### `opusclipmcp_opusclip_share_project`

Share Clip Project · Destructive

Requests making a clip project publicly visible so its clips can be shared via the OpusClip share URL. This tool does NOT commit the action: it returns an approval_url, and the project becomes public only after the user reviews and confirms in the OpusClip app. SCOPE: project-level only. If the user asked to share a collection or a subset of clips, do NOT call this -- there is no collection-scoped share today. Use `opusclip_export_collection` (per-clip download URLs) for collection-scoped intent instead.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `projectId` (`string`, required): The clip project ID to make public.

Example input: `{"projectId":"<projectId>"}`

### `opusclipmcp_opusclip_submit_project`

Submit Clip Project · Destructive

Submits a long-form video URL to OpusClip. Three submit modes, chosen by which params are set: (1) AI clipping (default, no skip flags) -- cuts the source into short, curated, ranked clips. (2) no-clip / full-video reframe -- set skipSlicing:true to keep the FULL video as ONE output (reframe + captions, no cutting into clips); use this for asks like "don't cut it into clips", "reframe the whole video", or "convert horizontal to vertical without clipping" (see skipSlicing). (3) no-curation passthrough -- set skipCurate:true to skip curation entirely; this also returns ONE full-length output rather than multiple clips, and it is NOT ranked or scored, so do not choose it when the user wants several clips (see skipCurate). Returns a project ID the agent can poll via list_clips until processing finishes. Mirrors the CLI's `submit` command. Charges against the org's API/MCP quota.

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `videoUrl` (`string`, required): Public URL of the long-form video. Supported sources: YouTube, Google Drive, Vimeo, Zoom, Rumble, Twitch, Facebook, LinkedIn, X, Dropbox, Riverside, Loom, Frame.io, StreamYard, or any public S3 mp4 (up to 10GB).
- `aspectRatio` (`string`, optional): Optional output aspect ratio: 'portrait' (9:16), 'square' (1:1), 'landscape' (16:9), or 'four_five' (4:5). Defaults to portrait. One of: `portrait`, `square`, `landscape`, `four_five`. Default: `portrait`.
- `brandTemplateId` (`string`, optional): Optional brand template ID (from list_brand_templates).
- `clipDurationsSec` (`array`, optional): Optional clip duration buckets in seconds, e.g. [[0,30],[30,60]]. Each inner pair is [minSec, maxSec]. Omit to let OpusClip choose.
- `customPrompt` (`string`, optional): Optional free-text prompt steering curation, mirroring the CLI submit --prompt.
- `enableAutoHook` (`boolean`, optional): Optional flag to add an AI-generated hook to the start of each clip. Applies only to a clipping run -- not compatible with skipSlicing or skipCurate. Omit to inherit the brand template / org default.
- `enableCaption` (`boolean`, optional): Optional flag to turn captions on or off. Omit to inherit the brand template default.
- `genre` (`string`, optional): Optional curation genre/topic hint, mirroring the CLI submit --genre. Omit to let OpusClip choose.
- `model` (`string`, optional): Optional AI clipping model, mirroring the CLI submit --model. Omit to let OpusClip choose.
- `rangeEnd` (`number`, optional): Optional end of the source-video range to use, in seconds. Must be >= rangeStart. Pair with rangeStart to limit processing to a slice of the video instead of the whole thing. Applies to the default clipping mode, where it bounds which part of the source clips are drawn from. NOT honored in no-clip mode: combined with skipSlicing the render currently ignores the range and outputs the full source, so do not use the pair to ask for one segment of a no-clip render. Omit to use the whole video.
- `rangeStart` (`number`, optional): Optional start of the source-video range to use, in seconds. Pair with rangeEnd to limit processing to a slice of the video instead of the whole thing. Applies to the default clipping mode, where it bounds which part of the source clips are drawn from. NOT honored in no-clip mode: combined with skipSlicing the render currently ignores the range and outputs the full source, so do not use the pair to ask for one segment of a no-clip render. Omit to use the whole video.
- `removeFiller` (`boolean`, optional): Optional flag to remove filler words from the rendered clips, mirroring the CLI submit --remove-filler.
- `skipCurate` (`boolean`, optional): Optional flag to skip all curation steps, mirroring the CLI submit --skip-curate. Bypasses curation entirely, which also means the submission returns ONE full-length output (the whole video, or the selected range) rather than multiple clips, with no ranking or scores -- do not choose it when the user wants several clips. Clip-only options (clipDurationsSec, enableAutoHook) do not apply and are rejected when set together. Distinct from skipSlicing, which also returns one full-length output but still runs curation over it.
- `skipSlicing` (`boolean`, optional): THIS IS THE NO-CLIP MODE: set true to keep the FULL video as a single output instead of cutting it into clips -- import / reframe / caption the whole video, with nothing trimmed away. Use for asks like "don't cut it into clips", "reframe the whole video", or "convert horizontal to vertical without clipping". Still available together with this: enableCaption (captions on/off) and aspectRatio (output orientation). Do NOT pair with rangeStart/rangeEnd expecting only that segment -- the range is currently ignored in this mode and the full source is rendered. Conflicts with clip-only options enableAutoHook and clipDurationsSec -- rejected when set together with this. Distinct from skipCurate: this suppresses only the CUTTING and still runs the curation pipeline over the whole video (so the single output can carry curation scores), whereas skipCurate bypasses curation entirely. To skip curation itself, use skipCurate.
- `sourceLang` (`string`, optional): Optional source language code (e.g. 'en', 'es'). Omit for auto-detect.
- `targetLang` (`string`, optional): Optional target language code (e.g. 'es', 'fr') to translate the rendered clips into -- translated text and captions, not synthesized voice. Omit to keep the source language.
- `title` (`string`, optional): Optional title for the uploaded video, mirroring the CLI submit --title.
- `topicKeywords` (`array`, optional): Optional topic keywords - only relevant when model='ClipAnything'.
- `webhookUrl` (`string`, optional): Optional webhook URL called when the project concludes, mirroring the CLI submit --webhook.

Example input: `{"videoUrl":"<videoUrl>"}`

### `opusclipmcp_opusclip_unschedule_publish`

Unschedule Publish · Destructive

Requests cancelling a previously-scheduled social post by schedule ID. This tool does NOT cancel directly: it returns an approval_url, and the schedule is cancelled only after the user reviews and confirms in the OpusClip app.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `scheduleId` (`string`, required): The schedule ID of the previously-scheduled social post to cancel.

Example input: `{"scheduleId":"<scheduleId>"}`

## Related

Other Media connectors ([all 22](/agentkit/connectors/?category=media)):

- [Reddit](/agentkit/connectors/reddit/): Scalekit connector, OAuth, 105 tools
- [Diarize](/agentkit/connectors/diarize/): Scalekit connector, Access token, 3 tools
- [YouTube](/agentkit/connectors/youtube/): Scalekit connector, OAuth, 45 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
