katto-mcp 0.5.5 → 0.5.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +1 -0
  3. package/index.mjs +10 -5
  4. package/package.json +4 -1
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Katto (https://katto.tech)
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Katto (https://katto.tech)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -85,6 +85,7 @@ Account and reference:
85
85
  - **`katto_get_webhook_secret()`** your webhook signing secret and how to verify signed callbacks (returns a secret — treat it like a credential).
86
86
  - **`katto_list_sources()`** the video platforms Katto can clip from, with an example url each.
87
87
  - **`katto_list_clip_lengths()`** the valid target clip-length buckets.
88
+ - **`katto_list_caption_styles()`** the caption-style presets you can pass as `caption_style` when creating a job or re-rendering a clip.
88
89
 
89
90
  Jobs draw from your Katto plan's monthly video quota (25 on Creator, 2 on Free), videos up to 90 minutes. The underlying REST API also supports `Idempotency-Key` safe retries, read-only scoped keys, and signed HMAC webhooks. See the [docs](https://katto.tech/docs/api).
90
91
 
package/index.mjs CHANGED
@@ -177,7 +177,12 @@ const TOOLS = [
177
177
  type: "string",
178
178
  enum: ["face_tracking", "wide", "split_screen", "stacked", "passthrough", "grid_3", "grid_4"],
179
179
  },
180
- caption_style: { type: "string", description: "A caption style preset name." },
180
+ caption_style: {
181
+ type: "string",
182
+ // Keep in sync with CAPTION_STYLES below (katto_list_caption_styles).
183
+ enum: ["default", "hormozi", "yellowPop", "redAlert", "skyline", "bubblegum", "aqua", "violet", "headline", "centerPop", "topLime", "impactMax", "bebasGold", "robotoBold", "montserratClean", "poppinsSoft", "robotoDoc", "broadcast", "wideClean", "mono", "bebasWhite", "rainbow", "multicolor"],
184
+ description: "A caption style preset name. See katto_list_caption_styles for the labels.",
185
+ },
181
186
  },
182
187
  required: ["id", "clip_index"],
183
188
  },
@@ -259,9 +264,9 @@ const ANNOTATIONS = {
259
264
  // on tools/list — identical across all sources, enriching the terser inline text.
260
265
  const DESCRIPTIONS = {
261
266
  katto_create_clip_job: "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.",
262
- katto_get_job: "Read-only. Get the status, progress and clips of a job by id. Each clip is { url, captions_url, title, score, final }: score is the 0-100 virality score (sort by it to rank), and final is true once the HQ 1080p render is ready — during processing you may see interim clips with final=false whose url is a preview that will be replaced. Returns 404 for an unknown id.",
267
+ katto_get_job: "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.",
263
268
  katto_list_jobs: "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 }.",
264
- katto_get_clips: "Read-only convenience: the clips of a job as { url, captions_url, title, score, final }. Sort by score for the top N. `final` is false while a clip's HQ render is still finishing. Empty until the first clip is ready.",
269
+ katto_get_clips: "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.",
265
270
  katto_get_usage: "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.",
266
271
  katto_get_transcript: "Read-only. The transcript of a completed job as timestamped segments [{ start, end, text }]. Returns 404 while the job is still processing.",
267
272
  katto_cancel_job: "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.",
@@ -326,7 +331,7 @@ const CAPTION_STYLES = [
326
331
  { value: 'multicolor', label: 'Multicolor' },
327
332
  ];
328
333
 
329
- const server = new Server({ name: "katto", version: "0.5.5" }, { capabilities: { tools: {} } });
334
+ const server = new Server({ name: "katto", version: "0.5.7" }, { capabilities: { tools: {} } });
330
335
 
331
336
  server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS_LISTED }));
332
337
 
@@ -350,7 +355,7 @@ server.setRequestHandler(CallToolRequestSchema, async (req) => {
350
355
  data = await api(`/api/v1/jobs${q ? `?${q}` : ""}`);
351
356
  } else if (name === "katto_get_clips") {
352
357
  const job = await api(`/api/v1/jobs/${encodeURIComponent(args.id)}`);
353
- data = { id: job.id, status: job.status, clips: job.clips || [] };
358
+ data = { id: job.id, status: job.status, clips: job.clips || [], dropped_clip_indices: job.dropped_clip_indices || [], dropped_clips: job.dropped_clips || [] };
354
359
  } else if (name === "katto_get_usage") {
355
360
  data = await api("/api/v1/usage");
356
361
  } else if (name === "katto_get_transcript") {
package/package.json CHANGED
@@ -1,12 +1,15 @@
1
1
  {
2
2
  "name": "katto-mcp",
3
- "version": "0.5.5",
3
+ "version": "0.5.7",
4
4
  "mcpName": "io.github.miracleweasel/katto-mcp",
5
5
  "description": "AI video clipping MCP server: turn long videos, podcasts and Twitch VODs into scored, captioned 9:16 shorts from Claude, Cursor, ChatGPT and any MCP client.",
6
6
  "type": "module",
7
7
  "bin": {
8
8
  "katto-mcp": "index.mjs"
9
9
  },
10
+ "scripts": {
11
+ "check-drift": "node check-tool-drift.mjs"
12
+ },
10
13
  "files": [
11
14
  "index.mjs",
12
15
  "README.md",