katto-mcp 0.1.0 → 0.2.0

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.
package/LICENSE ADDED
@@ -0,0 +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.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # katto-mcp
2
2
 
3
- MCP server for [Katto](https://katto.tech) — turn long videos into scored, captioned 9:16 clips from any MCP client (Claude Desktop, Cursor, Claude Code, …).
3
+ MCP server for [Katto](https://katto.tech) — turn long videos into scored, captioned 9:16 clips from any MCP client (Claude Desktop, Cursor, Claude Code, ChatGPT, …).
4
4
 
5
5
  It runs locally over stdio and calls the Katto REST API with your key. Nothing to host.
6
6
 
@@ -25,8 +25,12 @@ It runs locally over stdio and calls the Katto REST API with your key. Nothing t
25
25
 
26
26
  - **`katto_create_clip_job(url, config?)`** — submit a long video (YouTube, Twitch, Vimeo, Rumble, Zoom, Dailymotion). Returns a job id.
27
27
  - **`katto_get_job(id)`** — poll until `status` is `completed`; `clips` holds the finished MP4 + caption (SRT) urls.
28
+ - **`katto_list_jobs(limit?, cursor?, status?)`** — list your recent jobs, newest first (keyset pagination via `cursor`).
29
+ - **`katto_get_clips(id)`** — just the finished clips of a job.
30
+ - **`katto_get_transcript(id)`** — the job's timestamped transcript segments (`[{ start, end, text }]`).
31
+ - **`katto_get_usage()`** — your plan and remaining monthly video quota.
28
32
 
29
- Jobs draw from your Katto plan's monthly video quota (25 on Creator, 2 on Free). Videos up to 90 minutes.
33
+ 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 and read-only scoped keys — see the [docs](https://katto.tech/docs/api).
30
34
 
31
35
  ## Env
32
36
 
package/index.mjs CHANGED
@@ -75,9 +75,51 @@ const TOOLS = [
75
75
  required: ["id"],
76
76
  },
77
77
  },
78
+ {
79
+ name: "katto_list_jobs",
80
+ description:
81
+ "List your recent Katto jobs, newest first. Paginate with 'cursor' (pass the previous next_cursor) and " +
82
+ "optionally filter by 'status'. Returns { jobs: [{id, status, source, created_at, completed_at}], next_cursor }.",
83
+ inputSchema: {
84
+ type: "object",
85
+ properties: {
86
+ limit: { type: "number", description: "How many jobs to return (1-100, default 20)." },
87
+ cursor: { type: "string", description: "Pass the previous response's next_cursor for the next page." },
88
+ status: { type: "string", description: "Optional filter, e.g. 'completed', 'queued', 'failed'." },
89
+ },
90
+ },
91
+ },
92
+ {
93
+ name: "katto_get_clips",
94
+ description:
95
+ "Convenience: fetch just the finished clips of a job (9:16 MP4 urls + caption SRT urls). " +
96
+ "Returns an empty list while the job is still processing.",
97
+ inputSchema: {
98
+ type: "object",
99
+ properties: { id: { type: "string", description: "Job id from katto_create_clip_job." } },
100
+ required: ["id"],
101
+ },
102
+ },
103
+ {
104
+ name: "katto_get_usage",
105
+ description:
106
+ "Get your current plan and monthly video quota: { plan, videos_used, videos_limit, videos_remaining }.",
107
+ inputSchema: { type: "object", properties: {} },
108
+ },
109
+ {
110
+ name: "katto_get_transcript",
111
+ description:
112
+ "Get the compact transcript of a completed job as timestamped segments " +
113
+ "[{ start, end, text }]. Returns 404 while the job is still processing.",
114
+ inputSchema: {
115
+ type: "object",
116
+ properties: { id: { type: "string", description: "Job id from katto_create_clip_job." } },
117
+ required: ["id"],
118
+ },
119
+ },
78
120
  ];
79
121
 
80
- const server = new Server({ name: "katto", version: "0.1.0" }, { capabilities: { tools: {} } });
122
+ const server = new Server({ name: "katto", version: "0.2.0" }, { capabilities: { tools: {} } });
81
123
 
82
124
  server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));
83
125
 
@@ -92,6 +134,20 @@ server.setRequestHandler(CallToolRequestSchema, async (req) => {
92
134
  });
93
135
  } else if (name === "katto_get_job") {
94
136
  data = await api(`/api/v1/jobs/${encodeURIComponent(args.id)}`);
137
+ } else if (name === "katto_list_jobs") {
138
+ const qs = new URLSearchParams();
139
+ if (args.limit != null) qs.set("limit", String(args.limit));
140
+ if (args.cursor) qs.set("cursor", String(args.cursor));
141
+ if (args.status) qs.set("status", String(args.status));
142
+ const q = qs.toString();
143
+ data = await api(`/api/v1/jobs${q ? `?${q}` : ""}`);
144
+ } else if (name === "katto_get_clips") {
145
+ const job = await api(`/api/v1/jobs/${encodeURIComponent(args.id)}`);
146
+ data = { id: job.id, status: job.status, clips: job.clips || [] };
147
+ } else if (name === "katto_get_usage") {
148
+ data = await api("/api/v1/usage");
149
+ } else if (name === "katto_get_transcript") {
150
+ data = await api(`/api/v1/jobs/${encodeURIComponent(args.id)}/transcript`);
95
151
  } else {
96
152
  throw new Error(`Unknown tool: ${name}`);
97
153
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "katto-mcp",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "MCP server for Katto — turn long videos into scored, captioned 9:16 clips from any MCP client (Claude, Cursor, ...).",
5
5
  "type": "module",
6
6
  "bin": {
@@ -8,7 +8,8 @@
8
8
  },
9
9
  "files": [
10
10
  "index.mjs",
11
- "README.md"
11
+ "README.md",
12
+ "LICENSE"
12
13
  ],
13
14
  "engines": {
14
15
  "node": ">=18"
@@ -23,6 +24,9 @@
23
24
  "ai"
24
25
  ],
25
26
  "homepage": "https://katto.tech/docs/api",
27
+ "repository": { "type": "git", "url": "git+https://github.com/miracleweasel/katto-mcp.git" },
28
+ "bugs": { "url": "https://katto.tech/contact" },
29
+ "author": "Katto (https://katto.tech)",
26
30
  "license": "MIT",
27
31
  "dependencies": {
28
32
  "@modelcontextprotocol/sdk": "^1.0.0"