kavel-mcp 0.1.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 Kavel (https://www.kavel.ai)
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 ADDED
@@ -0,0 +1,69 @@
1
+ # Kavel MCP
2
+
3
+ An MCP server for **[Kavel](https://www.kavel.ai)** — bring Kavel's AI photo & video generators into any MCP client (Claude, Cursor, Cline, …). Ask for an effect, get a model-tuned prompt, and open the right tool to generate it on [www.kavel.ai](https://www.kavel.ai).
4
+
5
+ No account or API key required to use this server — it helps you pick a tool and craft a prompt, then hands off to Kavel's free-tier generators.
6
+
7
+ ## What it does
8
+
9
+ | Tool | What it returns |
10
+ |---|---|
11
+ | `list_kavel_tools` | Browse/search Kavel's generators by goal (e.g. "make my dog look royal") |
12
+ | `build_kavel_prompt` | A model-tuned prompt recipe for a chosen effect, customized with your details |
13
+ | `open_in_kavel` | The direct generator URL, pre-set to the right mode |
14
+ | `list_kavel_models` | The image/video models Kavel runs and what each is good at |
15
+
16
+ ## Featured generators
17
+
18
+ - [AI Hairstyle Changer](https://www.kavel.ai/image/ai-hairstyle-changer)
19
+ - [AI Figurine Generator](https://www.kavel.ai/image/ai-figurine-generator)
20
+ - [AI Pet Portrait Generator](https://www.kavel.ai/image/ai-pet-portrait-generator)
21
+ - [AI Wedding Photo Generator](https://www.kavel.ai/image/ai-wedding-photo-generator)
22
+ - [90s Yearbook Photos](https://www.kavel.ai/image/90s-yearbook-photos)
23
+ - [AI Dance Video Generator](https://www.kavel.ai/video/ai-dance-video-generator)
24
+ - [HD Photo Converter](https://www.kavel.ai/image/hd-photo-converter)
25
+ - [Browse all →](https://www.kavel.ai)
26
+
27
+ ## Install
28
+
29
+ Run directly with npx:
30
+
31
+ ```bash
32
+ npx kavel-mcp
33
+ ```
34
+
35
+ ### Claude Desktop / Claude Code
36
+
37
+ Add to your MCP config (`claude_desktop_config.json` or `.mcp.json`):
38
+
39
+ ```json
40
+ {
41
+ "mcpServers": {
42
+ "kavel": {
43
+ "command": "npx",
44
+ "args": ["-y", "kavel-mcp"]
45
+ }
46
+ }
47
+ }
48
+ ```
49
+
50
+ ### Cursor / Cline
51
+
52
+ Point the client at the command `npx -y kavel-mcp` (stdio transport).
53
+
54
+ ## Develop
55
+
56
+ ```bash
57
+ npm install
58
+ npm run build
59
+ npm start
60
+ ```
61
+
62
+ ## Links
63
+
64
+ - Website: <https://www.kavel.ai>
65
+ - Issues: <https://github.com/hanshs474/kavel-mcp/issues>
66
+
67
+ ## License
68
+
69
+ MIT © [Kavel](https://www.kavel.ai)
@@ -0,0 +1,200 @@
1
+ // Kavel tool catalog — mirrors src/config/tool-pages.ts in the kavel site.
2
+ // Keep slugs/models/hubs in sync with the site so deep links stay valid.
3
+ export const KAVEL_BASE_URL = "https://www.kavel.ai";
4
+ export const KAVEL_MODELS = [
5
+ {
6
+ id: "nano-banana-2-lite",
7
+ name: "Nano Banana 2 Lite",
8
+ mediaType: "image",
9
+ freeTier: true,
10
+ summary: "Fast photo-editing image model. Strong at identity-preserving image-to-image edits (change hair, outfit, style) while keeping the same face and pose.",
11
+ },
12
+ {
13
+ id: "veo-3-1",
14
+ name: "Veo 3.1",
15
+ mediaType: "video",
16
+ freeTier: true,
17
+ summary: "Video model for text-to-video and image-to-video. Turns a still photo into short, coherent motion clips.",
18
+ },
19
+ ];
20
+ export const KAVEL_TOOLS = [
21
+ {
22
+ slug: "ai-dance-video-generator",
23
+ hub: "video",
24
+ title: "AI Dance Video Generator",
25
+ keyword: "AI Dance Video Generator",
26
+ desc: "Turn a photo into a dancing video.",
27
+ model: "veo-3-1",
28
+ scene: "image-to-video",
29
+ needsPhoto: true,
30
+ recipe: "Make the person in the photo do an energetic street dance — full body in frame, smooth on-beat moves, dynamic camera.",
31
+ },
32
+ {
33
+ slug: "ai-hairstyle-changer",
34
+ hub: "image",
35
+ title: "AI Hairstyle Changer",
36
+ keyword: "AI Hairstyle Changer",
37
+ desc: "Try a new hairstyle on your own photo.",
38
+ model: "nano-banana-2-lite",
39
+ scene: "image-to-image",
40
+ needsPhoto: true,
41
+ recipe: "Restyle the hair in the photo into a modern shoulder-length layered cut with soft waves, keeping the same face, skin, and expression. Natural lighting, photorealistic.",
42
+ },
43
+ {
44
+ slug: "ai-outfit-generator",
45
+ hub: "image",
46
+ title: "AI Outfit Generator",
47
+ keyword: "AI Outfit Generator",
48
+ desc: "Change the outfit on your photo.",
49
+ model: "nano-banana-2-lite",
50
+ scene: "image-to-image",
51
+ needsPhoto: true,
52
+ recipe: "Change the clothing in the photo into a well-tailored navy-blue blazer over a crisp white shirt, keeping the same face, hair, and pose. Photorealistic, natural fabric.",
53
+ },
54
+ {
55
+ slug: "ai-figurine-generator",
56
+ hub: "image",
57
+ title: "AI Figurine Generator",
58
+ keyword: "AI Figurine Generator",
59
+ desc: "Turn your photo into a collectible figurine.",
60
+ model: "nano-banana-2-lite",
61
+ scene: "image-to-image",
62
+ needsPhoto: true,
63
+ recipe: "Turn the person in the photo into a cute collectible vinyl designer figurine on a small round display base, glossy finish, keeping the same face and pose. Studio product-shot lighting, photorealistic render.",
64
+ },
65
+ {
66
+ slug: "ai-selfie-generator",
67
+ hub: "image",
68
+ title: "AI Selfie Generator",
69
+ keyword: "AI Selfie Generator",
70
+ desc: "Turn any photo into a polished selfie.",
71
+ model: "nano-banana-2-lite",
72
+ scene: "image-to-image",
73
+ needsPhoto: true,
74
+ recipe: "Turn this photo into a polished golden-hour portrait selfie of the same person outdoors — warm sunset backlight, softly blurred bokeh background, cinematic colour grade. Keep the same face, hair, and pose. Photorealistic.",
75
+ },
76
+ {
77
+ slug: "ai-muscle-generator",
78
+ hub: "image",
79
+ title: "AI Muscle Generator",
80
+ keyword: "AI Muscle Generator",
81
+ desc: "Add an athletic build to your photo.",
82
+ model: "nano-banana-2-lite",
83
+ scene: "image-to-image",
84
+ needsPhoto: true,
85
+ recipe: "Give the person in the photo a more muscular, athletic gym physique with broader shoulders and defined arms, keeping the same fitted shirt, face, and pose. Photorealistic, natural.",
86
+ },
87
+ {
88
+ slug: "ai-sticker-generator",
89
+ hub: "image",
90
+ title: "AI Sticker Generator",
91
+ keyword: "AI Sticker Generator",
92
+ desc: "Turn your photo into a die-cut sticker.",
93
+ model: "nano-banana-2-lite",
94
+ scene: "image-to-image",
95
+ needsPhoto: true,
96
+ recipe: "Turn the person in the photo into a cute die-cut vinyl sticker — bold vector cartoon style, thick white border, flat bright colours, keeping the same face, hair, and pose.",
97
+ },
98
+ {
99
+ slug: "ai-polaroid-generator",
100
+ hub: "image",
101
+ title: "AI Polaroid Generator",
102
+ keyword: "AI Polaroid Generator",
103
+ desc: "Turn your photo into a retro instant print.",
104
+ model: "nano-banana-2-lite",
105
+ scene: "image-to-image",
106
+ needsPhoto: true,
107
+ recipe: "Turn this photo into a vintage Polaroid instant print — classic white frame with a thick blank strip at the bottom, faded warm retro colour, soft film grain and a slight light leak. Keep the same people and pose.",
108
+ },
109
+ {
110
+ slug: "ai-pet-portrait-generator",
111
+ hub: "image",
112
+ title: "AI Pet Portrait Generator",
113
+ keyword: "AI Pet Portrait Generator",
114
+ desc: "Paint your pet as a royal oil painting.",
115
+ model: "nano-banana-2-lite",
116
+ scene: "image-to-image",
117
+ needsPhoto: true,
118
+ recipe: "Turn the animal in the photo into a majestic Renaissance royal oil painting of itself — ornate red velvet coat with gold embroidery and a lace collar, rich classical brushstrokes, dramatic lighting, gilded frame. Keep the same breed, face, and pose.",
119
+ },
120
+ {
121
+ slug: "90s-yearbook-photos",
122
+ hub: "image",
123
+ title: "90s Yearbook Photos",
124
+ keyword: "90s Yearbook Photos",
125
+ desc: "Turn a selfie into a retro class portrait.",
126
+ model: "nano-banana-2-lite",
127
+ scene: "image-to-image",
128
+ needsPhoto: true,
129
+ recipe: "Turn this into a cheesy 1990s high-school yearbook portrait of the same person — mottled blue laser studio backdrop, soft-focus glow, feathered nineties hair, a collared shirt under a sweater, faded scanned-print colour. Keep the same face.",
130
+ },
131
+ {
132
+ slug: "ai-wedding-photo-generator",
133
+ hub: "image",
134
+ title: "AI Wedding Photo Generator",
135
+ keyword: "AI Wedding Photo Generator",
136
+ desc: "See the two of you as a wedding portrait.",
137
+ model: "nano-banana-2-lite",
138
+ scene: "image-to-image",
139
+ needsPhoto: true,
140
+ recipe: "Turn this into an elegant wedding photograph of the same couple — a white lace gown with a bouquet and a fitted black tuxedo, at a sunlit venue with a floral arch and warm golden-hour bokeh. Keep both faces and the pose.",
141
+ },
142
+ {
143
+ slug: "ai-christmas-card-generator",
144
+ hub: "image",
145
+ title: "AI Christmas Card Generator",
146
+ keyword: "AI Christmas Card Generator",
147
+ desc: "Turn a photo into a festive holiday card.",
148
+ model: "nano-banana-2-lite",
149
+ scene: "image-to-image",
150
+ needsPhoto: true,
151
+ recipe: "Turn this into a festive Christmas holiday card photo of the same person — a cosy red knitted sweater and a Santa hat, beside a warmly lit decorated tree with fairy lights, a fireplace and stockings behind, snow through the window. Keep the same face.",
152
+ },
153
+ {
154
+ slug: "hd-photo-converter",
155
+ hub: "image",
156
+ title: "HD Photo Converter",
157
+ keyword: "HD Photo Converter",
158
+ desc: "Turn a blurry picture into a sharp HD photo.",
159
+ model: "nano-banana-2-lite",
160
+ scene: "image-to-image",
161
+ needsPhoto: true,
162
+ recipe: "Restore and upscale this photo into a crisp, high-definition picture of the same subject — remove the blur, the noise, and the compression artefacts, recover sharp skin texture, hair detail, and clean edges, and correct washed-out colour to natural tones. Keep the exact same person, pose, clothing, and background.",
163
+ },
164
+ {
165
+ slug: "ai-birthday-photoshoot-generator",
166
+ hub: "image",
167
+ title: "AI Birthday Photoshoot Generator",
168
+ keyword: "AI Birthday Photoshoot",
169
+ desc: "Turn a selfie into a cinematic birthday portrait.",
170
+ model: "nano-banana-2-lite",
171
+ scene: "image-to-image",
172
+ needsPhoto: true,
173
+ recipe: "Turn this into a cinematic birthday photoshoot of the same person — an elegant sequin party dress, gold foil number balloons and warm fairy lights behind, a softly blurred background with a candlelit birthday cake. Keep the exact same face, hair, and expression. Photorealistic.",
174
+ },
175
+ ];
176
+ // Deep link to a tool's generator page. en has no locale prefix (localePrefix
177
+ // 'as-needed'), and the page presets its own tuned prompt; the ?scene=/?mode=
178
+ // param opens the correct tab/mode.
179
+ export function toolUrl(tool) {
180
+ const param = tool.hub === "video" ? "mode" : "scene";
181
+ return `${KAVEL_BASE_URL}/${tool.hub}/${tool.slug}?${param}=${tool.scene}`;
182
+ }
183
+ export function findTool(slug) {
184
+ return KAVEL_TOOLS.find((t) => t.slug === slug);
185
+ }
186
+ // Lightweight keyword match over title/keyword/desc/slug for browse + recommend.
187
+ export function searchTools(query) {
188
+ const q = query.toLowerCase().trim();
189
+ if (!q)
190
+ return KAVEL_TOOLS;
191
+ const words = q.split(/\s+/);
192
+ return KAVEL_TOOLS.map((t) => {
193
+ const hay = `${t.title} ${t.keyword} ${t.desc} ${t.slug}`.toLowerCase();
194
+ const score = words.reduce((s, w) => (hay.includes(w) ? s + 1 : s), 0);
195
+ return { t, score };
196
+ })
197
+ .filter((x) => x.score > 0)
198
+ .sort((a, b) => b.score - a.score)
199
+ .map((x) => x.t);
200
+ }
package/dist/index.js ADDED
@@ -0,0 +1,153 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { z } from "zod";
5
+ import { KAVEL_BASE_URL, KAVEL_MODELS, KAVEL_TOOLS, findTool, searchTools, toolUrl, } from "./catalog.js";
6
+ const server = new McpServer({
7
+ name: "kavel-mcp",
8
+ version: "0.1.0",
9
+ });
10
+ function toolLine(t) {
11
+ return `- **${t.title}** (\`${t.slug}\`) — ${t.desc} Model: ${t.model}. Input: ${t.needsPhoto ? "a photo" : "a text prompt"}. Open: ${toolUrl(t)}`;
12
+ }
13
+ // ── Tool 1: browse / find a Kavel generator ────────────────────────────────
14
+ server.registerTool("list_kavel_tools", {
15
+ title: "List Kavel AI photo/video tools",
16
+ description: "Browse or search Kavel's AI photo & video generators (hairstyle changer, figurine, pet portrait, wedding photo, 90s yearbook, dance video, HD photo converter, and more). Use `query` to match a goal like 'make my dog look royal' or 'turn my selfie into a figurine'. Each result includes the direct URL on www.kavel.ai to generate it.",
17
+ inputSchema: {
18
+ query: z
19
+ .string()
20
+ .optional()
21
+ .describe("Optional goal or keyword to match, e.g. 'wedding photo', 'dancing video'."),
22
+ hub: z
23
+ .enum(["image", "video"])
24
+ .optional()
25
+ .describe("Optional filter: only image tools or only video tools."),
26
+ },
27
+ }, async ({ query, hub }) => {
28
+ let results = query ? searchTools(query) : KAVEL_TOOLS;
29
+ if (hub)
30
+ results = results.filter((t) => t.hub === hub);
31
+ if (results.length === 0) {
32
+ return {
33
+ content: [
34
+ {
35
+ type: "text",
36
+ text: `No Kavel tool matched "${query}". Browse all tools at ${KAVEL_BASE_URL}/image and ${KAVEL_BASE_URL}/video`,
37
+ },
38
+ ],
39
+ };
40
+ }
41
+ const body = results.map(toolLine).join("\n");
42
+ return {
43
+ content: [
44
+ {
45
+ type: "text",
46
+ text: `Kavel AI generators (${results.length}):\n\n${body}\n\nAll tools: ${KAVEL_BASE_URL}`,
47
+ },
48
+ ],
49
+ };
50
+ });
51
+ // ── Tool 2: model-tuned prompt for a chosen tool ───────────────────────────
52
+ server.registerTool("build_kavel_prompt", {
53
+ title: "Build a Kavel prompt",
54
+ description: "Get a model-tuned prompt for a specific Kavel tool. Returns Kavel's proven prompt recipe for that effect (tuned for its model), optionally customized with the user's details. Paste the result into the generator on the tool's page.",
55
+ inputSchema: {
56
+ tool: z
57
+ .string()
58
+ .describe("The tool slug from list_kavel_tools, e.g. 'ai-figurine-generator'."),
59
+ customization: z
60
+ .string()
61
+ .optional()
62
+ .describe("Optional extra details to weave in, e.g. 'make the figurine hold a skateboard' or 'red velvet dress'."),
63
+ },
64
+ }, async ({ tool, customization }) => {
65
+ const t = findTool(tool);
66
+ if (!t) {
67
+ return {
68
+ content: [
69
+ {
70
+ type: "text",
71
+ text: `Unknown tool "${tool}". Call list_kavel_tools to see valid slugs.`,
72
+ },
73
+ ],
74
+ isError: true,
75
+ };
76
+ }
77
+ const prompt = customization
78
+ ? `${t.recipe} Additional details: ${customization.trim()}`
79
+ : t.recipe;
80
+ const tips = t.needsPhoto
81
+ ? "Upload a clear, well-lit photo where the subject fills the frame."
82
+ : "Describe the subject, style, and setting concretely.";
83
+ return {
84
+ content: [
85
+ {
86
+ type: "text",
87
+ text: `Prompt for **${t.title}** (model ${t.model}):\n\n${prompt}\n\n` +
88
+ `Tip: ${tips}\n` +
89
+ `Generate here: ${toolUrl(t)}`,
90
+ },
91
+ ],
92
+ };
93
+ });
94
+ // ── Tool 3: open the generator to create it ────────────────────────────────
95
+ server.registerTool("open_in_kavel", {
96
+ title: "Open a Kavel generator",
97
+ description: "Get the direct URL to a Kavel tool's generator page (on www.kavel.ai), pre-set to the right mode with a tuned prompt, so the user can generate the result. Free-tier models let users generate without paying.",
98
+ inputSchema: {
99
+ tool: z
100
+ .string()
101
+ .describe("The tool slug from list_kavel_tools, e.g. 'ai-wedding-photo-generator'."),
102
+ },
103
+ }, async ({ tool }) => {
104
+ const t = findTool(tool);
105
+ if (!t) {
106
+ return {
107
+ content: [
108
+ {
109
+ type: "text",
110
+ text: `Unknown tool "${tool}". Call list_kavel_tools to see valid slugs.`,
111
+ },
112
+ ],
113
+ isError: true,
114
+ };
115
+ }
116
+ const steps = t.needsPhoto
117
+ ? `1. Open ${toolUrl(t)}\n2. Upload your photo.\n3. Generate (the page presets a tuned prompt — edit it if you like).`
118
+ : `1. Open ${toolUrl(t)}\n2. Type your prompt.\n3. Generate.`;
119
+ return {
120
+ content: [
121
+ {
122
+ type: "text",
123
+ text: `**${t.title}** — generate on Kavel:\n\n${steps}`,
124
+ },
125
+ ],
126
+ };
127
+ });
128
+ // ── Tool 4: list underlying models ─────────────────────────────────────────
129
+ server.registerTool("list_kavel_models", {
130
+ title: "List Kavel models",
131
+ description: "List the AI models Kavel runs (image and video), what each is good at, and whether it has a free tier.",
132
+ inputSchema: {},
133
+ }, async () => {
134
+ const body = KAVEL_MODELS.map((m) => `- **${m.name}** (\`${m.id}\`, ${m.mediaType}${m.freeTier ? ", free tier" : ""}) — ${m.summary}`).join("\n");
135
+ return {
136
+ content: [
137
+ {
138
+ type: "text",
139
+ text: `Kavel models:\n\n${body}\n\nTry them: ${KAVEL_BASE_URL}`,
140
+ },
141
+ ],
142
+ };
143
+ });
144
+ async function main() {
145
+ const transport = new StdioServerTransport();
146
+ await server.connect(transport);
147
+ // stderr is safe for logs; stdout is the MCP transport.
148
+ console.error("kavel-mcp running on stdio");
149
+ }
150
+ main().catch((err) => {
151
+ console.error("kavel-mcp fatal:", err);
152
+ process.exit(1);
153
+ });
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "kavel-mcp",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for Kavel (www.kavel.ai) — discover Kavel's AI photo/video generators, get model-tuned prompts, and open the right tool to generate. Tools: AI Hairstyle Changer, Figurine, Pet Portrait, Wedding Photo, 90s Yearbook, Dance Video, HD Photo Converter, and more.",
5
+ "keywords": [
6
+ "mcp",
7
+ "model-context-protocol",
8
+ "ai-image-generator",
9
+ "ai-video-generator",
10
+ "nano-banana",
11
+ "veo",
12
+ "image-to-image",
13
+ "prompt",
14
+ "kavel"
15
+ ],
16
+ "homepage": "https://www.kavel.ai",
17
+ "bugs": {
18
+ "url": "https://github.com/hanshs474/kavel-mcp/issues"
19
+ },
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/hanshs474/kavel-mcp.git"
23
+ },
24
+ "license": "MIT",
25
+ "author": "Kavel (https://www.kavel.ai)",
26
+ "type": "module",
27
+ "bin": {
28
+ "kavel-mcp": "dist/index.js"
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "README.md",
33
+ "LICENSE"
34
+ ],
35
+ "scripts": {
36
+ "build": "tsc",
37
+ "dev": "tsc --watch",
38
+ "start": "node dist/index.js",
39
+ "prepublishOnly": "npm run build"
40
+ },
41
+ "dependencies": {
42
+ "@modelcontextprotocol/sdk": "^1.12.0",
43
+ "zod": "^3.23.8"
44
+ },
45
+ "devDependencies": {
46
+ "@types/node": "^22.0.0",
47
+ "typescript": "^5.6.0"
48
+ },
49
+ "engines": {
50
+ "node": ">=18"
51
+ }
52
+ }