# OpusClip AI Producer MCP MCP Server

> **OpusClip AI Producer MCP MCP Server** is a hosted, multitenant Model Context Protocol (MCP) server run by **MewCP** (https://mewcp.com), giving AI agents managed access to OpusClip AI Producer MCP.
>
> MewCP takes care of all MCP infrastructure for you — credential storage, OAuth flows,
> token refresh, and production-grade auto-scaling — so your AI agents can connect to
> third-party services and run freely without you managing any MCP server yourself.
>
> Server page:  https://mewcp.com/mcp/ai-producer-mcp
> MewCP docs:   https://docs.mewcp.com
> Full catalog: https://mewcp.com/llms.txt

---

## About

OpusClip AI Producer turns raw footage into polished talking-head videos with AI-assisted editing. Trim clips, generate captions, enhance voice audio, reframe speakers, add B-roll and motion graphics, review transcripts, and export finished videos.

---

## Details

- Server ID: `ai-producer-mcp`
- Version: 0.2.0
- Tools: 47
- Authentication: OAuth, managed by MewCP
- Transport: http

---

## Access

The gateway URL below serves your **entire MewCP toolset**, not this server on its
own. Pasting a config snippet is not enough — OpusClip AI Producer MCP has to be in the toolset
first. In order:

1. Add OpusClip AI Producer MCP to your toolset at https://mewcp.com/mcp/ai-producer-mcp
2. Connect your OpusClip AI Producer MCP account (OAuth); MewCP stores the credential and attaches it to each call
3. Copy your MewCP API key from the dashboard (Developer)
4. Configure your client with the snippet for it below

Once connected, an agent does **not** see this server's tools as top-level tools.
It sees four meta-tools and reaches everything through them:

- `search(query)` — find tools by keyword across the toolset
- `get_schema(tools)` — full description and arguments for the tools you picked
- `list_accounts(provider)` — only when one app has several connected accounts
- `call_tool(server_maskedId, tool_name, args)` — execute

So the list below is what `search` can return for this server, not a set of
callable tool names on their own.

---

## Tools (47)

Descriptions are truncated to 160 characters; call `get_schema`
for the full text and the argument schema. Where a tool is annotated, its type
is shown — treat `destructive` as irreversible.

- `open_aip_app` _(read)_ — Opens the AI Producer sidebar app with published video examples. Returns title, message and next_data. Call it without arguments; opening it creates nothing.…
- `open_project_panel` _(write)_ — Opens one of your projects inside the AI Producer sidebar app. Returns exchange_url, a single-use sign-in link for the app's own frame. Called by the app, not…
- `open_videos_panel` _(write)_ — Opens your AI Producer videos inside the AI Producer sidebar app. Returns exchange_url, a single-use sign-in link for the app's own frame. Called by the app,…
- `search_project_mentions` _(read)_ — Searches your AI Producer projects by name for the composer's @ menu. Returns items, resource links to at most 20 projects, newest first. Called by the host,…
- `get_task` _(read)_ — Read the live state of the exact task a mutation on this surface returned. Terminal exactly when status is one of done | failed | cancelled; settled only then.…
- `cancel_task` _(destructive)_ — Cancel one active orchestration task, queued or running. Cancellation is graceful rather than immediate: the worker finishes its terminal bookkeeping first, so…
- `wait_task` _(read)_ — Wait inside one call for the exact task a mutation on this surface returned, answering with get_task's fields once status is one of done | failed | cancelled…
- `start_transcribe_project` _(write)_ — Make an editable draft from a video_ref you PUT; needs a credit wallet. Cannot PUT: start_project_from_attachment; no video: ask, never invent a video_ref.…
- `add_music` _(destructive)_ — Write music, beat timing and a ducked audio mix. Send sections on every call; direction only steers them. Sound effects use the plan's sfx beats. Takes the…
- `enhance_voice` _(destructive)_ — Enable voice enhancement for an editable project, or disable it; disabling reverts to the original audio. A separate task the user chooses explicitly: creation…
- `find_broll` _(destructive)_ — Find b-roll images: one search per query, then a vision pass picks the best for each; poll task_id with get_task. A query also in cutout_queries gets its…
- `get_pricing` _(read)_ — Read what every capability costs, in credits. Each row carries band (free / negligible / paid / expensive), credits per run, and available; a per_unit row also…
- `get_web_assignment` _(read)_ — Read the footage, optional reference and note (the creator's own words) sent from the AI Producer web page, by the web assignment id in their prompt. While a…
- `list_reference_presets` _(read)_ — List the reference style presets a creator can recreate by name: each preset's preset_id, name, look and category, from the current catalogue or the…
- `get_reference_preset` _(read)_ — Read one reference style preset: its name and look, and a 15-minute download_url to its folder, a zip of the reference analysis the reference-style skill…
- `start_project_from_attachment` _(write)_ — Create a project from a video the user attached in chat to edit, caption, or rough cut; the server fetches it. One per call; .mp4/.mov/.webm to 3584 MiB (2040…
- `build_captions` _(destructive)_ — Bake the caption layer from the subtitle pattern the caller picks into compositions/narrator_captions.html and transcript-src.json. A host project's result…
- `frame_speaker` _(write)_ — Measure the speaker per window (cut seconds) and, with matte true, cut them out. The task result gives each window its on-camera share, face and head band, and…
- `add_sound_effects` _(destructive)_ — Generate sound effects at the points you choose on the finished cut's timeline (at_ms) and mix them with the voice and any music. Send 1 to 12 hits in one…
- `list_sound_effects` _(read)_ — List the sound effect library with each sound's measurements: duration_ms, onset_ms, peak_ms (its loudest moment), hits and hits_ms (where each hit lands, ms…
- `place_sound_effects` _(destructive)_ — Place library sounds on this project's cut in one undoable edit. Each hit names a sound_id, the at_ms its anchor (first_hit, peak or onset) lands on, and an…
- `finish_project` _(write)_ — Mark an externally created, settled editable preview finished. Returns task_id, or success without a task if already finished. Refuses a busy or failed project…
- `resolve_selection` _(read)_ — Parse one @aip reference line the user copied off a project page into data. A line names its project, optionally a moment in composition time, and either an…
- `get_chat_history` _(read)_ — Read one stable page of a project's canonical chat transcript. The cursor is exclusive. Forward order starts at the oldest message and can enumerate the…
- `record_choices` _(destructive)_ — Store one decision card's selections. The latest answer replaces that card's previous answer; [] records an empty selection. Returns choices and…
- `get_editing_preset` _(read)_ — The editing preset saved on the calling account: the answers it keeps as defaults for a new project. Returns editing_preset, null when nothing is saved. The…
- `save_editing_preset` _(destructive)_ — Stores the calling account's editing preset. The object sent replaces the saved one whole, so a key left out of it is a key dropped; null, or an object with no…
- `list_versions` _(read)_ — List one project's saved editable versions and which of them is live, one page per call in stored order; pass next_cursor back as cursor for the rest. Only a…
- `restore_version` _(destructive)_ — Replace the live editable preview with one saved version, through the editor's own restore path. It takes the project lock and returns task_id to poll with…
- `generate_scene_restyles` _(write)_ — Generate a scene restyle cover for each window and write it into the project workspace; a timeline this server built also gets it placed, one you authored does…
- `sign_workspace_upload` _(write)_ — Sign PUT targets into one project's workspace. No bytes move: your shell PUTs each file to its upload_url, again if needed until upload_expires_at (last write…
- `list_workspace` _(read)_ — List what one project's render-engine workspace holds, one page per call; pass next_cursor back as cursor. Each file carries path, size in bytes, and md5, the…
- `get_workspace_file` _(read)_ — Read one file out of a project's render-engine workspace: what is deployed, not what you believe you uploaded. A text source comes back inline in content as…
- `commit_workspace` _(destructive)_ — Judge every file staged for one project and accept all or refuse all; only this call moves a staged file into the workspace a render reads. A composition is…
- `list_project_assets` _(read)_ — List registered project uploads available to composer @asset/handle mentions. Returns asset_id, handle, kind, path and media metadata, without media bytes or…
- `get_project_asset` _(read)_ — Read one project asset: a registered upload by asset_id, handle or @asset/handle, else a project Asset Library entry, including generated and Motion library…
- `list_motion_assets` _(read)_ — List the Motion library packages with this project's placement state for each, read at project_revision. An entry carries its inputs (a video input that needs…
- `get_motion_asset` _(read)_ — Read one package by motion_asset_id and version from the registry: the pinned manifest, the entry source per supported orientation, or for the one orientation…
- `materialize_motion_asset` _(write)_ — Place one certified package on this project's timeline at timeline_in_ms, the placement the browser's Add runs. expected_project_revision must equal the…
- `present_choices` _(write)_ — Display a question as an interactive card, with a text fallback for hosts without card support. Returns the question and options, not a user answer; no project…
- `get_transcript` _(read)_ — Read one project's transcript. detail segments is one line per segment with its text and bounds, a tenth of the bytes: read it first to plan a cut. detail…
- `sign_upload` _(write)_ — Sign a local .mp4/.mov/.webm upload, only for a client that PUTs the bytes itself. A host with no shell that holds only an attachment, such as ChatGPT, uses…
- `get_project` _(read)_ — Read project phase, status, active task, optional preferences, and editable readiness. include_spend adds ledger spend; null means unavailable. page_url opens…
- `get_view_url` _(write)_ — Mint a single-use browser URL for one readable project. url works exactly once: it starts an agent session and redirects to the project page in agent mode, and…
- `list_projects` _(read)_ — List your own projects, newest first, one page per call. total counts every project, and next_cursor is null on the last page. An item's progress is not…
- `start_export` _(write)_ — Render the project's current editable preview to a downloadable mp4. A render this call starts passes render-tree admission first: a preview that fails it is…
- `get_export_url` _(write)_ — Read the download link for the project's latest delivered export. state ready carries download_url and download_expires_at; deferred means a live turn still…

---

## Connect

Gateway URL: https://gateway.mewcp.com/personal/mcp

Every request carries one header:

    Authorization: Bearer <API_KEY>

Replace `API_KEY` with your own key from the dashboard (Developer).

## Apps

### Claude Desktop

Mac & Windows app

- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`

```json
{
  "mcpServers": {
    "mewcp": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote@latest",
        "https://gateway.mewcp.com/personal/mcp",
        "--header",
        "Authorization:${AUTH_HEADER}"
      ],
      "env": {
        "AUTH_HEADER": "Bearer API_KEY"
      }
    }
  }
}
```

Already have an "mcpServers" section in your config? Just add the server entry inside it.

1. Open Claude Desktop → Settings → Developer → "Edit Config"
2. Paste the snippet inside the outer { } of the config file (merge with your existing "mcpServers" section if you have one)
3. Save the file, then quit Claude Desktop completely and reopen it
4. Start a new conversation — your tool will be available

### VS Code

Copilot / Cline

- Command Palette → "MCP: Open User Configuration" (opens mcp.json). For one project only, use .vscode/mcp.json instead.

```json
{
  "mcp.servers": {
    "mewcp": {
      "type": "http",
      "url": "https://gateway.mewcp.com/personal/mcp",
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Already have a "servers" section in your mcp.json? Just add the server entry inside it.

1. Open VS Code → Command Palette (Cmd+Shift+P / Ctrl+Shift+P)
2. Run "MCP: Open User Configuration" to open your mcp.json
3. Paste the snippet and save
4. Start the server when prompted (or from the MCP servers view) and use it in Copilot Chat

### Cursor

AI-first editor

- macOS: `~/.cursor/mcp.json`
- Windows: `%USERPROFILE%\.cursor\mcp.json`

```json
{
  "mcpServers": {
    "mewcp": {
      "url": "https://gateway.mewcp.com/personal/mcp",
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Already have an "mcpServers" section in your mcp.json? Just add the server entry inside it.

1. Open Cursor → Settings → Cursor Settings → MCP
2. Click "Add new global MCP server"
3. Paste the snippet and save
4. Restart Cursor

### Codex

OpenAI's CLI agent

- Add the snippet to your Codex MCP config or your standard MCP config file for the CLI tool you use.

```json
{
  "mcpServers": {
    "mewcp": {
      "type": "http",
      "url": "https://gateway.mewcp.com/personal/mcp",
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Codex generally reads a standard MCP server block, so you can add this alongside your other configured servers.

1. Open your Codex MCP config or project-level config file
2. Paste the MewCP server block inside the config JSON/TOML structure your tool expects
3. Save the file and restart Codex
4. Verify the tool is available inside a fresh session

### Claude Code

Anthropic's CLI agent

- ~/.claude.json (user scope) or .mcp.json in your project root — create it if it doesn't exist. Or skip the file and use the CLI command below.

```json
{
  "mcpServers": {
    "mewcp": {
      "type": "http",
      "url": "https://gateway.mewcp.com/personal/mcp",
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Already have an "mcpServers" section in your config? Just add the server entry inside it.

1. Open ~/.claude.json (or .mcp.json in your project root) in a text editor
2. Paste the snippet inside the outer { } (merge with your existing "mcpServers" section if you have one)
3. Save the file and start (or restart) Claude Code
4. Or skip the file entirely and run the CLI command below instead

### OpenCode

Open-source terminal agent

- ~/.config/opencode/opencode.json (global) or opencode.json in your project root — create it if it doesn't exist.

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "mewcp": {
      "type": "remote",
      "url": "https://gateway.mewcp.com/personal/mcp",
      "enabled": true,
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Already have an "mcp" section in your opencode.json? Just add the server entry inside it.

1. Open ~/.config/opencode/opencode.json (or opencode.json in your project root) in a text editor
2. Paste the snippet inside the outer { } (merge with your existing "mcp" section if you have one)
3. Save the file and start (or restart) OpenCode

### OpenClaw

Self-hosted agent gateway

- ~/.openclaw/openclaw.json — create it if it doesn't exist.

```json
{
  "mcp": {
    "servers": {
      "mewcp": {
        "transport": "streamable-http",
        "url": "https://gateway.mewcp.com/personal/mcp",
        "enabled": true,
        "headers": {
          "Authorization": "Bearer API_KEY"
        }
      }
    }
  }
}
```

Already have an "mcp" section in your openclaw.json? Just add the server entry inside "servers".

1. Open ~/.openclaw/openclaw.json in a text editor
2. Paste the snippet inside the outer { } (merge with your existing "mcp" section if you have one)
3. Save the file and restart OpenClaw

### Antigravity

Google's agentic IDE

- ~/.gemini/config/mcp_config.json (global) or .agents/mcp_config.json (workspace-local) — create it if it doesn't exist.

```json
{
  "mcpServers": {
    "mewcp": {
      "serverUrl": "https://gateway.mewcp.com/personal/mcp",
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Already have an "mcpServers" section in your config? Just add the server entry inside it. Remote servers must use the "serverUrl" field — the legacy "url"/"httpUrl" fields aren't supported.

1. In the editor's agent side panel, click "…" → "MCP Servers" → "Manage MCP Servers" → "View raw config" (Antigravity CLI: type /mcp instead to open the Interactive MCP Manager)
2. Paste the snippet inside the outer { } (merge with your existing "mcpServers" section if you have one)
3. Save the file — the server connects automatically

### Hermes

Nous Research's CLI agent

- config.yaml in your Hermes config directory (~/.hermes) — add this under a top-level "mcp_servers:" key.

```yaml
mcp_servers:
  mewcp:
    url: "https://gateway.mewcp.com/personal/mcp"
    headers:
      Authorization: "Bearer API_KEY"
```

Already have an "mcp_servers" section in your config.yaml? Just add the server entry inside it.

1. Open config.yaml in your Hermes config directory
2. Paste the snippet under the top-level "mcp_servers:" key (merge with existing entries if you have any)
3. Save the file, then run /reload-mcp in Hermes (or start a fresh session)
4. Ask Hermes "Tell me which MCP-backed tools are available right now" to confirm it connected

### DeepSeek Harness

DeepSeek's agent harness

- cordis.yml in your DSH project — or the patch file you mount plugins from.

```yaml
- id: mcp-mewcp
  name: '@deepseek-ai/dsh-mcp-client'
  config:
    serverName: mewcp
    transport: streamable-http
    url: https://gateway.mewcp.com/personal/mcp
    headers:
      Authorization: "Bearer API_KEY"
```

One plugin instance = one MCP server. Add this entry to your plugin list; don't nest it inside another entry.

1. Open cordis.yml (or your patch file) in your DSH project
2. Paste the entry into your plugin list, keeping the leading dash and indentation
3. Restart DSH (or let HMR reload) — tools register as mcp__mewcp__<tool_name>
4. Verify with: dsh web --dump-config | grep -A3 mcp

## SDKs

### Python

fastmcp client

```python
import asyncio
from fastmcp import Client
from fastmcp.client.transports import StreamableHttpTransport

SERVER_URL = "https://gateway.mewcp.com/personal/mcp"
API_KEY = "API_KEY"

transport = StreamableHttpTransport(
    url=SERVER_URL,
    headers={
        "Authorization": f"Bearer {API_KEY}",
    }
)

async def main():
    client = Client(transport)
    async with client:
        tools = await client.list_tools()
        print(tools)

asyncio.run(main())
```

1. Install fastmcp: pip install fastmcp
2. Copy the snippet into your project
3. Replace API_KEY with your key from the dashboard
4. Run your script

### TypeScript

MCP SDK

```typescript
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";

const SERVER_URL = "https://gateway.mewcp.com/personal/mcp";
const API_KEY = "API_KEY";

const transport = new StreamableHTTPClientTransport(new URL(SERVER_URL), {
  requestInit: {
    headers: {
      Authorization: `Bearer ${API_KEY}`,
    },
  },
});

const client = new Client({ name: "mewcp-client", version: "1.0.0" });
await client.connect(transport);

const tools = await client.listTools();
console.log(tools.tools.map((t) => t.name));
```

1. Install: npm install @modelcontextprotocol/sdk
2. Copy the snippet into your project
3. Replace API_KEY with your key from the dashboard
4. Run with Node 18+ as an ES module (e.g. npx tsx script.ts)