katto-mcp 0.3.0 → 0.3.2
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/README.md +15 -4
- package/index.mjs +35 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,12 +2,19 @@
|
|
|
2
2
|
|
|
3
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
|
+
Two ways to connect:
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## Hosted (zero-install, recommended)
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
Point any OAuth-capable MCP client (ChatGPT, Claude web/desktop, MCP Inspector) at the hosted endpoint and sign in with your Katto account — the key never touches your disk, and you can revoke access anytime:
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
https://mcp.katto.tech/mcp (Streamable HTTP · OAuth)
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Local (npx)
|
|
16
|
+
|
|
17
|
+
For Cursor, CI and scripts. Create an API key at **[katto.tech/dashboard/api-keys](https://katto.tech/dashboard/api-keys)**, then add the server to your MCP client config:
|
|
11
18
|
|
|
12
19
|
```json
|
|
13
20
|
{
|
|
@@ -21,6 +28,8 @@ It runs locally over stdio and calls the Katto REST API with your key. Nothing t
|
|
|
21
28
|
}
|
|
22
29
|
```
|
|
23
30
|
|
|
31
|
+
The hosted endpoint above also accepts `Authorization: Bearer sk_live_...` directly for key-based clients.
|
|
32
|
+
|
|
24
33
|
## Tools
|
|
25
34
|
|
|
26
35
|
- **`katto_create_clip_job(url, config?)`** — submit a long video (YouTube, Twitch, Vimeo, Rumble, Zoom, Dailymotion). Returns a job id.
|
|
@@ -29,6 +38,8 @@ It runs locally over stdio and calls the Katto REST API with your key. Nothing t
|
|
|
29
38
|
- **`katto_get_clips(id)`** — just the finished clips of a job.
|
|
30
39
|
- **`katto_get_transcript(id)`** — the job's timestamped transcript segments (`[{ start, end, text }]`).
|
|
31
40
|
- **`katto_get_usage()`** — your plan and remaining monthly video quota.
|
|
41
|
+
- **`katto_cancel_job(id)`** — cancel a running job and refund the monthly video slot.
|
|
42
|
+
- **`katto_get_account()`** — the connected account, this key's scopes, and quota.
|
|
32
43
|
|
|
33
44
|
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).
|
|
34
45
|
|
package/index.mjs
CHANGED
|
@@ -135,9 +135,39 @@ const TOOLS = [
|
|
|
135
135
|
"{ videos_used, videos_limit, videos_remaining }.",
|
|
136
136
|
inputSchema: { type: "object", properties: {} },
|
|
137
137
|
},
|
|
138
|
+
{
|
|
139
|
+
name: "katto_list_sources",
|
|
140
|
+
description:
|
|
141
|
+
"List the video platforms Katto can clip from, with an example URL for each. Use this to confirm a " +
|
|
142
|
+
"URL is supported before calling katto_create_clip_job.",
|
|
143
|
+
inputSchema: { type: "object", properties: {} },
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
name: "katto_list_clip_lengths",
|
|
147
|
+
description:
|
|
148
|
+
"List the valid values for the optional config.clipLength on katto_create_clip_job (target clip " +
|
|
149
|
+
"duration buckets).",
|
|
150
|
+
inputSchema: { type: "object", properties: {} },
|
|
151
|
+
},
|
|
152
|
+
];
|
|
153
|
+
|
|
154
|
+
// Static reference data — returned by the list_* tools without an API call.
|
|
155
|
+
const SOURCES = [
|
|
156
|
+
{ id: 'youtube', example: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ' },
|
|
157
|
+
{ id: 'twitch', example: 'https://www.twitch.tv/videos/123456789' },
|
|
158
|
+
{ id: 'vimeo', example: 'https://vimeo.com/123456789' },
|
|
159
|
+
{ id: 'rumble', example: 'https://rumble.com/v1a2b3c-title.html' },
|
|
160
|
+
{ id: 'zoom', example: 'https://zoom.us/rec/share/abc123' },
|
|
161
|
+
{ id: 'dailymotion', example: 'https://www.dailymotion.com/video/x8abcde' },
|
|
162
|
+
];
|
|
163
|
+
const CLIP_LENGTHS = [
|
|
164
|
+
{ value: 'lt30', label: 'Under 30 seconds' },
|
|
165
|
+
{ value: '30_60', label: '30 to 60 seconds' },
|
|
166
|
+
{ value: '60_90', label: '60 to 90 seconds' },
|
|
167
|
+
{ value: '90_180', label: '90 to 180 seconds' },
|
|
138
168
|
];
|
|
139
169
|
|
|
140
|
-
const server = new Server({ name: "katto", version: "0.3.
|
|
170
|
+
const server = new Server({ name: "katto", version: "0.3.2" }, { capabilities: { tools: {} } });
|
|
141
171
|
|
|
142
172
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));
|
|
143
173
|
|
|
@@ -170,6 +200,10 @@ server.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
|
170
200
|
data = await api(`/api/v1/jobs/${encodeURIComponent(args.id)}`, { method: "DELETE" });
|
|
171
201
|
} else if (name === "katto_get_account") {
|
|
172
202
|
data = await api("/api/v1/me");
|
|
203
|
+
} else if (name === "katto_list_sources") {
|
|
204
|
+
data = { sources: SOURCES, note: "You can also clip a local file via the REST API (POST /v1/uploads)." };
|
|
205
|
+
} else if (name === "katto_list_clip_lengths") {
|
|
206
|
+
data = { clip_lengths: CLIP_LENGTHS };
|
|
173
207
|
} else {
|
|
174
208
|
throw new Error(`Unknown tool: ${name}`);
|
|
175
209
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "katto-mcp",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"mcpName": "io.github.miracleweasel/katto-mcp",
|
|
5
5
|
"description": "MCP server for Katto — turn long videos into scored, captioned 9:16 clips from any MCP client (Claude, Cursor, ...).",
|
|
6
6
|
"type": "module",
|