MCP server / tools reference

Katto’s official MCP server β€” 16 tools

Every tool the hosted server serves on tools/list, with its input schema, required parameters, read-only / destructive annotation and quota cost. This is the reference an agent (or you) uses to drive Katto from Claude, Cursor, ChatGPT or any MCP client. Connect it from the MCP hub, or read the REST API docs.

Katto is an AI video clipping tool that turns long videos into scored, captioned 9:16 clips. It exposes a public REST API, a CLI (npm katto-cli) and an official hosted MCP server (mcp.katto.tech, 16 tools, OAuth 2.1). All three are available on every plan, including free, and draw from the same monthly video quota as the dashboard.

Endpoint https://mcp.katto.tech/mcp (Streamable HTTP, OAuth 2.1 or Bearer sk_live_…). One monthly video quota is shared across the app, API, CLI and MCP; re-renders are free, dubbing is a Creator feature.

katto_create_clip_job

writeConsumes 1 video from your monthly quota

Submit a long video (YouTube, Twitch, Vimeo, Rumble, Zoom, Dailymotion) for clipping. Consumes 1 video from your monthly quota β€” check katto_get_usage first. Clips are produced asynchronously; returns a job id, then poll katto_get_job every 30-60 s until status is 'completed', or pass webhook_url to be notified. Pass idempotency_key when you might retry, so a retry never spends a second video. Fails if the URL is unsupported or the video is over 90 minutes.

ParameterTypeRequiredDescription
urlstringyesPublic video URL to clip.
webhook_urlstringβ€”Optional https URL that receives a signed POST when the job finishes, so you do not have to poll. Verify the signature with the secret from katto_get_webhook_secret. Private and local addresses are refused.
idempotency_keystringβ€”Optional unique string (max 255 chars). Retrying with the same key returns the original job instead of creating a second one and spending another video. Use one per intended job, e.g. a UUID.
configobjectβ€”Optional pre-clip settings.
Example call
{
  "name": "katto_create_clip_job",
  "arguments": {
    "url": "https://youtube.com/watch?v=…"
  }
}

katto_get_job

read-onlyFree β€” does not use video quota

Read-only. Get the status, progress and clips of a job by id. Clips come ranked by virality score (0-100, highest first; ties broken by clip_index). Each clip is { url, captions_url, title, score, clip_index, hd }: when status is 'completed' every url is a finished, downloadable clip; hd is true once the 1080p high-quality render is ready. hd=false does NOT mean broken β€” the url already works, the 1080p is just still rendering in the background (and stays the standard render on the free plan). The job-level hd_ready flag turns true once every clip is hd, i.e. the URLs are final and won't be swapped again (status='completed' fires earlier). Returns 404 for an unknown id.

ParameterTypeRequiredDescription
idstringyesJob id from katto_create_clip_job.
Example call
{
  "name": "katto_get_job",
  "arguments": {
    "id": "job_…"
  }
}

katto_list_jobs

read-onlyFree β€” does not use video quota

Read-only. List your recent jobs, newest first. Paginate with 'cursor' (pass the previous next_cursor); optional 'status' filter. Returns { jobs: [{id, status, source, created_at, completed_at}], next_cursor }.

ParameterTypeRequiredDescription
limitnumberβ€”How many jobs to return (1-100, default 20).
cursorstringβ€”Pass the previous response's next_cursor for the next page.
statusstringβ€”Optional filter, e.g. 'completed', 'queued', 'failed'.
Example call
{
  "name": "katto_list_jobs",
  "arguments": {
    "limit": 20,
    "cursor": "…",
    "status": "…"
  }
}

katto_get_clips

read-onlyFree β€” does not use video quota

Read-only convenience: the clips of a job as { url, captions_url, title, score, clip_index, hd }, ranked by score (highest first). hd=true means the 1080p render is ready; hd=false means the url is the standard render (HD still finishing, or the free plan). Empty until the first clip is ready.

ParameterTypeRequiredDescription
idstringyesJob id from katto_create_clip_job.
Example call
{
  "name": "katto_get_clips",
  "arguments": {
    "id": "job_…"
  }
}

katto_get_usage

read-onlyFree β€” does not use video quota

Read-only. Your current plan and monthly video quota: { plan, videos_used, videos_limit, videos_remaining }. Call before katto_create_clip_job to confirm remaining quota.

No parameters.

Example call
{
  "name": "katto_get_usage",
  "arguments": {}
}

katto_get_transcript

read-onlyFree β€” does not use video quota

Read-only. The transcript of a completed job as timestamped segments [{ start, end, text }]. Returns 404 while the job is still processing.

ParameterTypeRequiredDescription
idstringyesJob id from katto_create_clip_job.
Example call
{
  "name": "katto_get_transcript",
  "arguments": {
    "id": "job_…"
  }
}

katto_cancel_job

writedestructiveFree β€” does not use video quota

Cancel a still-running job (queued/processing) and refund the video back to your monthly quota. Safe to retry (idempotent). Returns an error if the job already finished, failed, or was cancelled.

ParameterTypeRequiredDescription
idstringyesJob id from katto_create_clip_job.
Example call
{
  "name": "katto_cancel_job",
  "arguments": {
    "id": "job_…"
  }
}

katto_get_account

read-onlyFree β€” does not use video quota

Read-only. The account behind this key: plan, this key's scopes (read/write), and monthly quota { videos_used, videos_limit, videos_remaining }.

No parameters.

Example call
{
  "name": "katto_get_account",
  "arguments": {}
}

katto_list_sources

read-onlyFree β€” does not use video quota

Read-only. The video platforms Katto can clip from, each with an example URL. Use it to confirm a URL is supported before calling katto_create_clip_job.

No parameters.

Example call
{
  "name": "katto_list_sources",
  "arguments": {}
}

katto_list_clip_lengths

read-onlyFree β€” does not use video quota

Read-only. The valid values for the optional config.clipLength on katto_create_clip_job (target clip-duration buckets). Note: clipLength is fixed at creation and cannot be changed by re-render.

No parameters.

Example call
{
  "name": "katto_list_clip_lengths",
  "arguments": {}
}

katto_list_caption_styles

read-onlyFree β€” does not use video quota

Read-only. The valid caption_style preset names for katto_rerender_clip (id + label), e.g. 'hormozi' for bold word-by-word highlight. Call this before re-rendering so you pass a real preset instead of guessing.

No parameters.

Example call
{
  "name": "katto_list_caption_styles",
  "arguments": {}
}

katto_rerender_clip

writeFree β€” does not use video quota

Re-render one already-finished clip with a new reframe layout and/or caption style (get valid caption_style values from katto_list_caption_styles). Free β€” does NOT use video quota. Each call starts a new render (not idempotent); the original clip is kept. Returns a rerender_id; poll katto_get_rerender for the new clip url.

ParameterTypeRequiredDescription
idstringyesJob id from katto_create_clip_job.
clip_indexnumberyes0-based index of the clip to re-render.
layout_mode"face_tracking" | "wide" | "split_screen" | "stacked" | "passthrough" | "grid_3" | "grid_4"β€”Force a reframing layout instead of letting detection choose one. Omit for automatic, which is what produces the best result on most clips.
caption_style"default" | "hormozi" | "yellowPop" | "redAlert" | "skyline" | "bubblegum" | "aqua" | "violet" | "headline" | "centerPop" | "topLime" | "impactMax" | "bebasGold" | "robotoBold" | "montserratClean" | "poppinsSoft" | "robotoDoc" | "broadcast" | "wideClean" | "mono" | "bebasWhite" | "rainbow" | "multicolor"β€”A caption style preset name. See katto_list_caption_styles for the labels.
Example call
{
  "name": "katto_rerender_clip",
  "arguments": {
    "id": "job_…",
    "clip_index": 0
  }
}

katto_dub_clip

writeFree β€” does not use video quota

Re-render one finished clip dubbed into one or more of 19 languages (en, es, fr, it, pt, hi, ja, zh, de, ko, nl, pl, ru, tr, id, vi, th, uk, ar). Creator feature (requires an active subscription); does NOT use your monthly video quota. Each call starts a new render (not idempotent). Returns a rerender_id; poll katto_get_rerender for the result.

ParameterTypeRequiredDescription
idstringyesJob id.
clip_indexnumberyes0-based clip index.
languagesarray<"en" | "es" | "fr" | "it" | "pt" | "hi" | "ja" | "zh" | "de" | "ko" | "nl" | "pl" | "ru" | "tr" | "id" | "vi" | "th" | "uk" | "ar">yesTarget languages for the dub, as ISO 639-1 codes. Nineteen are available; the clip keeps its original audio for any language not listed here.
Example call
{
  "name": "katto_dub_clip",
  "arguments": {
    "id": "job_…",
    "clip_index": 0,
    "languages": [
      "en"
    ]
  }
}

katto_get_rerender

read-onlyFree β€” does not use video quota

Read-only. Poll a re-render started by katto_rerender_clip or katto_dub_clip. Returns { status, clip_url, captions_url, dub_urls } β€” dub_urls is { lang: url } and is where a DUB lands (clip_url stays the undubbed re-render), null otherwise β€” clip_url is null until status is 'completed'.

ParameterTypeRequiredDescription
idstringyesJob id.
rerender_idstringyesThe rerender_id returned by rerender/dub.
Example call
{
  "name": "katto_get_rerender",
  "arguments": {
    "id": "job_…",
    "rerender_id": "…"
  }
}

katto_get_brand_kit

read-onlyFree β€” does not use video quota

Read-only. Your saved brand kits (colors, caption font and position, default layout, watermark url).

No parameters.

Example call
{
  "name": "katto_get_brand_kit",
  "arguments": {}
}

katto_get_webhook_secret

read-onlyFree β€” does not use video quota

Read-only. Returns your webhook signing SECRET β€” treat it as a credential (do not display or log it) β€” plus how to verify Katto's signed completion callbacks (HMAC-SHA256 of {timestamp}.{body}). Pass webhook_url on a job to receive them.

No parameters.

Example call
{
  "name": "katto_get_webhook_secret",
  "arguments": {}
}
Connect the server: Claude, all clients. Build against it with the REST API or the npm package. Machine-readable manifest: /mcp/tools.json.