katto-mcp 0.5.3 → 0.5.5
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/QUICKSTART.md +35 -0
- package/README.md +32 -4
- package/SKILL.md +45 -0
- package/index.mjs +53 -8
- package/package.json +45 -43
package/QUICKSTART.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Katto — 60-second quickstart
|
|
2
|
+
|
|
3
|
+
Turn a long video into captioned 9:16 short clips from your assistant, your terminal, or
|
|
4
|
+
your code. **One quota** (Creator: 25 videos/mo, ≤90 min each · Free: 2/mo), shared across
|
|
5
|
+
all three. Create a key at https://katto.tech/dashboard/api-keys (keys can be read-only).
|
|
6
|
+
|
|
7
|
+
## MCP — in Claude, Cursor, ChatGPT
|
|
8
|
+
Hosted, zero-install, OAuth 2.1:
|
|
9
|
+
```json
|
|
10
|
+
{ "mcpServers": { "katto": { "url": "https://mcp.katto.tech/mcp" } } }
|
|
11
|
+
```
|
|
12
|
+
Then just ask: *"Clip the best 6 moments from <url> and caption them."*
|
|
13
|
+
Prefer local? `npx -y katto-mcp` with `KATTO_API_KEY=sk_live_...`.
|
|
14
|
+
|
|
15
|
+
## CLI — in your terminal or a cron
|
|
16
|
+
```bash
|
|
17
|
+
npm i -g katto-cli
|
|
18
|
+
katto login # or set KATTO_API_KEY=sk_live_...
|
|
19
|
+
katto clip <url> --clips 6 --wait --json | jq '.clips[].url'
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## REST API — in your product
|
|
23
|
+
```bash
|
|
24
|
+
curl -X POST https://katto.tech/api/v1/jobs \
|
|
25
|
+
-H "Authorization: Bearer sk_live_..." \
|
|
26
|
+
-H "Idempotency-Key: $(uuidgen)" \
|
|
27
|
+
-H "Content-Type: application/json" \
|
|
28
|
+
-d '{"url":"https://youtube.com/watch?v=..."}'
|
|
29
|
+
# → { "job_id": "..." }
|
|
30
|
+
# then poll GET /v1/jobs/{id}, or pass a "webhook_url" for a signed completion callback.
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
What comes back: finished clips (MP4 + SRT captions + a title and a 0–100 score), 9:16,
|
|
34
|
+
word-timed captions, reframed. Re-render the layout/caption style or dub into 8 languages
|
|
35
|
+
for free (no quota). Full reference: https://katto.tech/docs/api
|
package/README.md
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# katto-mcp
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/katto-mcp)
|
|
4
|
+
[](https://www.npmjs.com/package/katto-mcp)
|
|
5
|
+
[](./LICENSE)
|
|
6
|
+
[](https://registry.modelcontextprotocol.io)
|
|
7
|
+
|
|
3
8
|
**The AI video clipping MCP server.** Turn long videos into scored, captioned, vertical 9:16 short clips from any MCP client (Claude, Cursor, Claude Code, ChatGPT, VS Code, and other conformant clients). Drop in a YouTube link, a podcast, or a Twitch VOD and get publish-ready shorts back through natural conversation.
|
|
4
9
|
|
|
5
10
|
Powered by [Katto](https://katto.tech), an AI video clipper that turns long-form video (podcasts, interviews, streams, webinars) into short-form clips for TikTok, Reels and YouTube Shorts. Katto is a flat-priced, no-credits alternative to tools like OpusClip: one 25-video quota covers videos up to 90 minutes each, with the API and MCP included on every paid plan (not gated behind an enterprise tier).
|
|
@@ -10,7 +15,7 @@ Ask your agent something like *"clip the best moments from this podcast and refr
|
|
|
10
15
|
|
|
11
16
|
- find the strongest 30 to 90 second moments in a long video and score each clip 0 to 100 on Hook, Flow, Value and Trend,
|
|
12
17
|
- reframe to vertical 9:16 with face tracking, split-screen for two speakers, and stacked layouts for gaming,
|
|
13
|
-
- burn word-by-word
|
|
18
|
+
- burn animated captions (auto-captioned in 99 languages via Whisper large-v3; word-by-word timing in 41 of them, sentence-level in the rest) and optionally dub into 8 languages,
|
|
14
19
|
- and hand back publish-ready MP4 files plus SRT caption urls.
|
|
15
20
|
|
|
16
21
|
Typical uses: repurpose a YouTube video into shorts, turn a podcast episode into clips, cut highlights from a Twitch VOD, or convert a long interview into vertical social posts.
|
|
@@ -43,7 +48,22 @@ For Cursor, CI and scripts. Create an API key at **[katto.tech/dashboard/api-key
|
|
|
43
48
|
|
|
44
49
|
The hosted endpoint above also accepts `Authorization: Bearer sk_live_...` directly for key-based clients.
|
|
45
50
|
|
|
46
|
-
##
|
|
51
|
+
## Install per client
|
|
52
|
+
|
|
53
|
+
**Claude Code** (hosted, OAuth):
|
|
54
|
+
```bash
|
|
55
|
+
claude mcp add --transport http katto https://mcp.katto.tech/mcp
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**Claude Desktop** — Settings → Connectors → *Add custom connector* → `https://mcp.katto.tech/mcp`, then sign in. (Or add the `npx` block above to `claude_desktop_config.json`.)
|
|
59
|
+
|
|
60
|
+
**Cursor** — Settings → MCP → *Add* → paste the `npx` JSON block above (uses `KATTO_API_KEY`).
|
|
61
|
+
|
|
62
|
+
**VS Code** (MCP extension) — add the same `npx` block to your MCP settings, or point it at the hosted URL if your client supports remote OAuth servers.
|
|
63
|
+
|
|
64
|
+
**ChatGPT** (Developer mode / connectors) — add a custom connector with URL `https://mcp.katto.tech/mcp`.
|
|
65
|
+
|
|
66
|
+
## Tools
|
|
47
67
|
|
|
48
68
|
Clipping:
|
|
49
69
|
- **`katto_create_clip_job(url, config?)`** clip a long video (YouTube, Twitch, Vimeo, Rumble, Zoom, Dailymotion). Returns a job id.
|
|
@@ -62,7 +82,7 @@ Account and reference:
|
|
|
62
82
|
- **`katto_get_usage()`** your plan and remaining monthly video quota.
|
|
63
83
|
- **`katto_get_account()`** the connected account, this key's scopes, and quota.
|
|
64
84
|
- **`katto_get_brand_kit()`** your saved brand kits (colors, caption font, layout, watermark).
|
|
65
|
-
- **`katto_get_webhook_secret()`** your webhook signing secret and how to verify signed callbacks.
|
|
85
|
+
- **`katto_get_webhook_secret()`** your webhook signing secret and how to verify signed callbacks (returns a secret — treat it like a credential).
|
|
66
86
|
- **`katto_list_sources()`** the video platforms Katto can clip from, with an example url each.
|
|
67
87
|
- **`katto_list_clip_lengths()`** the valid target clip-length buckets.
|
|
68
88
|
|
|
@@ -77,6 +97,12 @@ Jobs draw from your Katto plan's monthly video quota (25 on Creator, 2 on Free),
|
|
|
77
97
|
|
|
78
98
|
Full docs: **[katto.tech/docs/api](https://katto.tech/docs/api)**
|
|
79
99
|
|
|
100
|
+
## Security & data
|
|
101
|
+
|
|
102
|
+
- **Hosted auth is OAuth 2.1** — the API key is never written to your disk, and you can revoke a connected client anytime from your Katto account settings.
|
|
103
|
+
- **Local auth uses a scoped `sk_live_` key** you create yourself; keys can be read-only, and the npx server only sends it to `KATTO_API_URL` (default `katto.tech`) over HTTPS.
|
|
104
|
+
- `katto_get_webhook_secret` returns a signing secret — handle it like any credential; it is only needed to verify inbound webhook signatures.
|
|
105
|
+
|
|
80
106
|
## Also listed on
|
|
81
107
|
|
|
82
108
|
- npm: [katto-mcp](https://www.npmjs.com/package/katto-mcp)
|
|
@@ -96,4 +122,6 @@ Example prompts:
|
|
|
96
122
|
2. "Check the status of my last clipping job and give me the download links for the finished clips."
|
|
97
123
|
3. "Take clip 2 from that job, dub it into Spanish and re-render it with the Bold caption style."
|
|
98
124
|
|
|
99
|
-
|
|
125
|
+
## License
|
|
126
|
+
|
|
127
|
+
MIT — see [LICENSE](./LICENSE).
|
package/SKILL.md
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: katto-clip
|
|
3
|
+
description: Turn a long video (a YouTube / Twitch / Vimeo / Rumble / Zoom / Dailymotion link, or an upload) into scored, captioned, 9:16 short clips using Katto's cloud pipeline. Use when the user wants to clip, repurpose, or make shorts from long-form video, or to dub / re-render an existing clip.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Katto clipping skill
|
|
7
|
+
|
|
8
|
+
Katto runs the whole pipeline in its cloud — download → transcript → moment scoring →
|
|
9
|
+
cut → captions → reframe → optional dub → publish. You trigger it; nothing renders on
|
|
10
|
+
the local machine.
|
|
11
|
+
|
|
12
|
+
## Connect
|
|
13
|
+
- **Hosted MCP (recommended, zero-install):** point the client at `https://mcp.katto.tech/mcp`
|
|
14
|
+
(OAuth 2.1 + Dynamic Client Registration; no key on disk).
|
|
15
|
+
- **Local:** `npx -y katto-mcp` with `KATTO_API_KEY=sk_live_...` (Cursor, CI, cron).
|
|
16
|
+
- Tools are prefixed `katto_`. `tools/list` works without a key; every tool **call** needs a key.
|
|
17
|
+
|
|
18
|
+
## Core flow
|
|
19
|
+
1. `katto_create_clip_job({ url, config? })` → returns a `job_id`. Spends **1 video** from the
|
|
20
|
+
monthly quota. Pass an idempotency key so a retry never double-spends.
|
|
21
|
+
2. Poll `katto_get_job({ id })` until `status` is `"completed"`.
|
|
22
|
+
3. `katto_get_clips({ id })` → finished clips (MP4 url + SRT + title + score 0–100).
|
|
23
|
+
|
|
24
|
+
## Editing — never counts against quota
|
|
25
|
+
- `katto_rerender_clip({ id, clip_index, layout_mode?, caption_style? })`, then `katto_get_rerender(...)`.
|
|
26
|
+
- `katto_dub_clip({ id, clip_index, languages })` → dub into any of **8 languages**: en, es, fr, it, pt, hi, ja, zh.
|
|
27
|
+
|
|
28
|
+
## Reference / account
|
|
29
|
+
- `katto_get_usage`, `katto_get_account` — remaining quota, plan, this key's scopes.
|
|
30
|
+
- `katto_list_sources` (accepted platforms), `katto_list_clip_lengths` (valid length buckets).
|
|
31
|
+
- `katto_get_transcript` (timestamped), `katto_get_brand_kit`, `katto_get_webhook_secret` (treat as a credential).
|
|
32
|
+
|
|
33
|
+
## Rules of the road
|
|
34
|
+
- **One quota**, shared with the app / API / CLI: Creator = 25 videos/month, ≤90 min each; Free = 2/month.
|
|
35
|
+
Re-renders and dubs are free.
|
|
36
|
+
- Captions: **99 languages** (word-timed in 41, sentence-level in the rest). Dubbing: **8**. Publish: **7 platforms**.
|
|
37
|
+
- **Don't invent timings.** The only measured figure is ~5 minutes for 8 clips on a 20-minute video;
|
|
38
|
+
longer sources take longer. Say that, not a number you'd like.
|
|
39
|
+
|
|
40
|
+
## Example
|
|
41
|
+
User: *"Clip the best 6 moments from this podcast, then dub clip 2 in Spanish."*
|
|
42
|
+
→ `katto_create_clip_job(url, { clips: 6 })` → poll `katto_get_job` → `katto_get_clips`
|
|
43
|
+
→ `katto_dub_clip(id, 2, ["es"])` → `katto_get_rerender`.
|
|
44
|
+
|
|
45
|
+
Full reference: https://katto.tech/docs/api · OpenAPI: https://katto.tech/openapi.json
|
package/index.mjs
CHANGED
|
@@ -15,12 +15,19 @@ import { ListToolsRequestSchema, CallToolRequestSchema } from "@modelcontextprot
|
|
|
15
15
|
const API_URL = (process.env.KATTO_API_URL || "https://katto.tech").replace(/\/$/, "");
|
|
16
16
|
const API_KEY = process.env.KATTO_API_KEY;
|
|
17
17
|
|
|
18
|
+
// NOTE: we intentionally do NOT exit when the key is missing. The server must be
|
|
19
|
+
// able to start and answer tools/list WITHOUT a key so that MCP directory/aggregator
|
|
20
|
+
// sandboxes (Glama, mcp.so, ...) can enumerate the tools — otherwise they show
|
|
21
|
+
// "0 tools". Nothing runs unauthenticated: the key is enforced at call time in api()
|
|
22
|
+
// below, so tools/list is public but every tool CALL still requires a valid key.
|
|
18
23
|
if (!API_KEY) {
|
|
19
|
-
console.error("[katto-mcp] KATTO_API_KEY
|
|
20
|
-
process.exit(1);
|
|
24
|
+
console.error("[katto-mcp] No KATTO_API_KEY set — tools/list works, but calling any tool requires a key. Create one at https://katto.tech/dashboard/api-keys");
|
|
21
25
|
}
|
|
22
26
|
|
|
23
27
|
async function api(path, init = {}) {
|
|
28
|
+
if (!API_KEY) {
|
|
29
|
+
throw new Error("KATTO_API_KEY is required to call Katto tools. Create one at https://katto.tech/dashboard/api-keys and set it in your MCP client config.");
|
|
30
|
+
}
|
|
24
31
|
const res = await fetch(`${API_URL}${path}`, {
|
|
25
32
|
...init,
|
|
26
33
|
headers: {
|
|
@@ -146,7 +153,14 @@ const TOOLS = [
|
|
|
146
153
|
name: "katto_list_clip_lengths",
|
|
147
154
|
description:
|
|
148
155
|
"List the valid values for the optional config.clipLength on katto_create_clip_job (target clip " +
|
|
149
|
-
"duration buckets).",
|
|
156
|
+
"duration buckets). Note: clipLength is fixed at job creation and cannot be changed by re-render.",
|
|
157
|
+
inputSchema: { type: "object", properties: {} },
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
name: "katto_list_caption_styles",
|
|
161
|
+
description:
|
|
162
|
+
"List the valid caption_style preset names for katto_rerender_clip (e.g. 'hormozi' for bold " +
|
|
163
|
+
"word-by-word highlight). Call this before re-rendering so you pass a real preset, not a guess.",
|
|
150
164
|
inputSchema: { type: "object", properties: {} },
|
|
151
165
|
},
|
|
152
166
|
{
|
|
@@ -233,6 +247,7 @@ const ANNOTATIONS = {
|
|
|
233
247
|
katto_get_account: { title: "Get account", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
234
248
|
katto_list_sources: { title: "List supported sources", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
235
249
|
katto_list_clip_lengths: { title: "List clip-length options", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
250
|
+
katto_list_caption_styles: { title: "List caption styles", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
236
251
|
katto_rerender_clip: { title: "Re-render a clip", readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
|
|
237
252
|
katto_dub_clip: { title: "Dub a clip", readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
|
|
238
253
|
katto_get_rerender: { title: "Poll a re-render", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
@@ -244,16 +259,17 @@ const ANNOTATIONS = {
|
|
|
244
259
|
// on tools/list — identical across all sources, enriching the terser inline text.
|
|
245
260
|
const DESCRIPTIONS = {
|
|
246
261
|
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.",
|
|
247
|
-
katto_get_job: "Read-only. Get the status, progress and clips of a job by id.
|
|
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.",
|
|
248
263
|
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 }.",
|
|
249
|
-
katto_get_clips: "Read-only convenience:
|
|
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.",
|
|
250
265
|
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.",
|
|
251
266
|
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.",
|
|
252
267
|
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.",
|
|
253
268
|
katto_get_account: "Read-only. The account behind this key: plan, this key's scopes (read/write), and monthly quota { videos_used, videos_limit, videos_remaining }.",
|
|
254
269
|
katto_list_sources: "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.",
|
|
255
|
-
katto_list_clip_lengths: "Read-only. The valid values for the optional config.clipLength on katto_create_clip_job (target clip-duration buckets).",
|
|
256
|
-
|
|
270
|
+
katto_list_clip_lengths: "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.",
|
|
271
|
+
katto_list_caption_styles: "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.",
|
|
272
|
+
katto_rerender_clip: "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.",
|
|
257
273
|
katto_dub_clip: "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.",
|
|
258
274
|
katto_get_rerender: "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'.",
|
|
259
275
|
katto_get_brand_kit: "Read-only. Your saved brand kits (colors, caption font and position, default layout, watermark url).",
|
|
@@ -282,8 +298,35 @@ const CLIP_LENGTHS = [
|
|
|
282
298
|
{ value: '60_90', label: '60 to 90 seconds' },
|
|
283
299
|
{ value: '90_180', label: '90 to 180 seconds' },
|
|
284
300
|
];
|
|
301
|
+
// Valid values for caption_style on katto_rerender_clip. Mirrors the editor's
|
|
302
|
+
// named presets. Keep in sync with mcp-worker/src/index.js CAPTION_STYLES.
|
|
303
|
+
const CAPTION_STYLES = [
|
|
304
|
+
{ value: 'default', label: 'Default' },
|
|
305
|
+
{ value: 'hormozi', label: 'Hormozi (bold word-by-word highlight)' },
|
|
306
|
+
{ value: 'yellowPop', label: 'Yellow Pop' },
|
|
307
|
+
{ value: 'redAlert', label: 'Red Alert' },
|
|
308
|
+
{ value: 'skyline', label: 'Skyline' },
|
|
309
|
+
{ value: 'bubblegum', label: 'Bubblegum' },
|
|
310
|
+
{ value: 'aqua', label: 'Aqua' },
|
|
311
|
+
{ value: 'violet', label: 'Violet' },
|
|
312
|
+
{ value: 'headline', label: 'Headline' },
|
|
313
|
+
{ value: 'centerPop', label: 'Center Pop' },
|
|
314
|
+
{ value: 'topLime', label: 'Top Lime' },
|
|
315
|
+
{ value: 'impactMax', label: 'Impact Max' },
|
|
316
|
+
{ value: 'bebasGold', label: 'Bebas Gold' },
|
|
317
|
+
{ value: 'robotoBold', label: 'Roboto Bold' },
|
|
318
|
+
{ value: 'montserratClean', label: 'Montserrat' },
|
|
319
|
+
{ value: 'poppinsSoft', label: 'Poppins' },
|
|
320
|
+
{ value: 'robotoDoc', label: 'Roboto Doc' },
|
|
321
|
+
{ value: 'broadcast', label: 'Broadcast' },
|
|
322
|
+
{ value: 'wideClean', label: 'Wide Clean' },
|
|
323
|
+
{ value: 'mono', label: 'Mono' },
|
|
324
|
+
{ value: 'bebasWhite', label: 'Bebas' },
|
|
325
|
+
{ value: 'rainbow', label: 'Rainbow (per-word colour cycle)' },
|
|
326
|
+
{ value: 'multicolor', label: 'Multicolor' },
|
|
327
|
+
];
|
|
285
328
|
|
|
286
|
-
const server = new Server({ name: "katto", version: "0.5.
|
|
329
|
+
const server = new Server({ name: "katto", version: "0.5.5" }, { capabilities: { tools: {} } });
|
|
287
330
|
|
|
288
331
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS_LISTED }));
|
|
289
332
|
|
|
@@ -320,6 +363,8 @@ server.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
|
320
363
|
data = { sources: SOURCES, note: "You can also clip a local file via the REST API (POST /v1/uploads)." };
|
|
321
364
|
} else if (name === "katto_list_clip_lengths") {
|
|
322
365
|
data = { clip_lengths: CLIP_LENGTHS };
|
|
366
|
+
} else if (name === "katto_list_caption_styles") {
|
|
367
|
+
data = { caption_styles: CAPTION_STYLES };
|
|
323
368
|
} else if (name === "katto_rerender_clip") {
|
|
324
369
|
const b = {};
|
|
325
370
|
if (args.layout_mode) b.layout_mode = args.layout_mode;
|
package/package.json
CHANGED
|
@@ -1,43 +1,45 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "katto-mcp",
|
|
3
|
-
"version": "0.5.
|
|
4
|
-
"mcpName": "io.github.miracleweasel/katto-mcp",
|
|
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
|
-
"type": "module",
|
|
7
|
-
"bin": {
|
|
8
|
-
"katto-mcp": "index.mjs"
|
|
9
|
-
},
|
|
10
|
-
"files": [
|
|
11
|
-
"index.mjs",
|
|
12
|
-
"README.md",
|
|
13
|
-
"LICENSE"
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"video-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "katto-mcp",
|
|
3
|
+
"version": "0.5.5",
|
|
4
|
+
"mcpName": "io.github.miracleweasel/katto-mcp",
|
|
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
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"katto-mcp": "index.mjs"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"index.mjs",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE",
|
|
14
|
+
"SKILL.md",
|
|
15
|
+
"QUICKSTART.md"
|
|
16
|
+
],
|
|
17
|
+
"engines": {
|
|
18
|
+
"node": ">=18"
|
|
19
|
+
},
|
|
20
|
+
"keywords": [
|
|
21
|
+
"mcp",
|
|
22
|
+
"model-context-protocol",
|
|
23
|
+
"katto",
|
|
24
|
+
"video",
|
|
25
|
+
"clips",
|
|
26
|
+
"shorts",
|
|
27
|
+
"ai",
|
|
28
|
+
"ai-video-clipper",
|
|
29
|
+
"video-to-shorts",
|
|
30
|
+
"youtube-to-shorts",
|
|
31
|
+
"podcast-clips",
|
|
32
|
+
"ai-captions",
|
|
33
|
+
"ai-video-editor",
|
|
34
|
+
"repurpose-video",
|
|
35
|
+
"video-dubbing"
|
|
36
|
+
],
|
|
37
|
+
"homepage": "https://katto.tech/docs/api",
|
|
38
|
+
"repository": { "type": "git", "url": "git+https://github.com/miracleweasel/katto-mcp.git" },
|
|
39
|
+
"bugs": { "url": "https://katto.tech/contact" },
|
|
40
|
+
"author": "Katto (https://katto.tech)",
|
|
41
|
+
"license": "MIT",
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"@modelcontextprotocol/sdk": "^1.0.0"
|
|
44
|
+
}
|
|
45
|
+
}
|