{
  "name": "katto",
  "version": "0.5.4",
  "endpoint": "https://mcp.katto.tech/mcp",
  "docs": "https://katto.tech/mcp",
  "tools": [
    {
      "name": "katto_create_clip_job",
      "title": "Create clip job",
      "description": "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 until status is 'completed'. Fails if the URL is unsupported or the video is over 90 minutes.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "description": "Public video URL to clip."
          },
          "config": {
            "type": "object",
            "description": "Optional pre-clip settings.",
            "properties": {
              "genre": {
                "type": "string",
                "description": "e.g. podcast, gaming, sports, interview"
              },
              "clipLength": {
                "type": "string",
                "enum": [
                  "lt30",
                  "30_60",
                  "60_90",
                  "90_180"
                ]
              },
              "customPrompt": {
                "type": "string"
              },
              "topics": {
                "type": "string"
              }
            }
          }
        },
        "required": [
          "url"
        ]
      },
      "readOnly": false,
      "destructive": false,
      "quota": "Consumes 1 video from your monthly quota"
    },
    {
      "name": "katto_get_job",
      "title": "Get job status & clips",
      "description": "Read-only. Get the status, progress and clips of a job by id. When status is 'completed', 'clips' holds the finished 9:16 MP4 urls and caption (SRT) urls; while processing, clips is empty. Returns 404 for an unknown id.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Job id from katto_create_clip_job."
          }
        },
        "required": [
          "id"
        ]
      },
      "readOnly": true,
      "destructive": false,
      "quota": "Free — does not use video quota"
    },
    {
      "name": "katto_list_jobs",
      "title": "List jobs",
      "description": "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 }.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "number",
            "description": "How many jobs to return (1-100, default 20)."
          },
          "cursor": {
            "type": "string",
            "description": "Pass the previous response's next_cursor for the next page."
          },
          "status": {
            "type": "string",
            "description": "Optional filter, e.g. 'completed', 'queued', 'failed'."
          }
        }
      },
      "readOnly": true,
      "destructive": false,
      "quota": "Free — does not use video quota"
    },
    {
      "name": "katto_get_clips",
      "title": "Get finished clips",
      "description": "Read-only convenience: just the finished clips of a job (9:16 MP4 urls + caption SRT urls + title + virality score). Returns an empty list while the job is still processing.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Job id from katto_create_clip_job."
          }
        },
        "required": [
          "id"
        ]
      },
      "readOnly": true,
      "destructive": false,
      "quota": "Free — does not use video quota"
    },
    {
      "name": "katto_get_usage",
      "title": "Get plan & quota",
      "description": "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.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "readOnly": true,
      "destructive": false,
      "quota": "Free — does not use video quota"
    },
    {
      "name": "katto_get_transcript",
      "title": "Get transcript",
      "description": "Read-only. The transcript of a completed job as timestamped segments [{ start, end, text }]. Returns 404 while the job is still processing.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Job id from katto_create_clip_job."
          }
        },
        "required": [
          "id"
        ]
      },
      "readOnly": true,
      "destructive": false,
      "quota": "Free — does not use video quota"
    },
    {
      "name": "katto_cancel_job",
      "title": "Cancel job & refund slot",
      "description": "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.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Job id from katto_create_clip_job."
          }
        },
        "required": [
          "id"
        ]
      },
      "readOnly": false,
      "destructive": true,
      "quota": "Free — does not use video quota"
    },
    {
      "name": "katto_get_account",
      "title": "Get account",
      "description": "Read-only. The account behind this key: plan, this key's scopes (read/write), and monthly quota { videos_used, videos_limit, videos_remaining }.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "readOnly": true,
      "destructive": false,
      "quota": "Free — does not use video quota"
    },
    {
      "name": "katto_list_sources",
      "title": "List supported sources",
      "description": "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.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "readOnly": true,
      "destructive": false,
      "quota": "Free — does not use video quota"
    },
    {
      "name": "katto_list_clip_lengths",
      "title": "List clip-length options",
      "description": "Read-only. The valid values for the optional config.clipLength on katto_create_clip_job (target clip-duration buckets).",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "readOnly": true,
      "destructive": false,
      "quota": "Free — does not use video quota"
    },
    {
      "name": "katto_rerender_clip",
      "title": "Re-render a clip",
      "description": "Re-render one already-finished clip with a new reframe layout and/or caption style. 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.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Job id from katto_create_clip_job."
          },
          "clip_index": {
            "type": "number",
            "description": "0-based index of the clip to re-render."
          },
          "layout_mode": {
            "type": "string",
            "enum": [
              "face_tracking",
              "wide",
              "split_screen",
              "stacked",
              "passthrough",
              "grid_3",
              "grid_4"
            ]
          },
          "caption_style": {
            "type": "string",
            "description": "A caption style preset name."
          }
        },
        "required": [
          "id",
          "clip_index"
        ]
      },
      "readOnly": false,
      "destructive": false,
      "quota": "Free — does not use video quota"
    },
    {
      "name": "katto_dub_clip",
      "title": "Dub a clip",
      "description": "Re-render one finished clip dubbed into one or more of 8 languages (en, es, fr, it, pt, hi, ja, zh). Free — does NOT use video quota. Each call starts a new render (not idempotent). Returns a rerender_id; poll katto_get_rerender for the result.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Job id."
          },
          "clip_index": {
            "type": "number",
            "description": "0-based clip index."
          },
          "languages": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "en",
                "es",
                "fr",
                "it",
                "pt",
                "hi",
                "ja",
                "zh"
              ]
            }
          }
        },
        "required": [
          "id",
          "clip_index",
          "languages"
        ]
      },
      "readOnly": false,
      "destructive": false,
      "quota": "Free — does not use video quota"
    },
    {
      "name": "katto_get_rerender",
      "title": "Poll a re-render",
      "description": "Read-only. Poll a re-render started by katto_rerender_clip or katto_dub_clip. Returns { status, clip_url, captions_url } — clip_url is null until status is 'completed'.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Job id."
          },
          "rerender_id": {
            "type": "string",
            "description": "The rerender_id returned by rerender/dub."
          }
        },
        "required": [
          "id",
          "rerender_id"
        ]
      },
      "readOnly": true,
      "destructive": false,
      "quota": "Free — does not use video quota"
    },
    {
      "name": "katto_get_brand_kit",
      "title": "Get brand kits",
      "description": "Read-only. Your saved brand kits (colors, caption font and position, default layout, watermark url).",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "readOnly": true,
      "destructive": false,
      "quota": "Free — does not use video quota"
    },
    {
      "name": "katto_get_webhook_secret",
      "title": "Get webhook signing secret",
      "description": "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.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "readOnly": true,
      "destructive": false,
      "quota": "Free — does not use video quota"
    }
  ]
}
