@kolbo/mcp 1.5.4 → 1.5.6
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/package.json +1 -1
- package/src/tools/generate.js +14 -14
- package/src/tools/models.js +16 -6
package/package.json
CHANGED
package/src/tools/generate.js
CHANGED
|
@@ -15,7 +15,7 @@ function registerGenerateTools(server, client) {
|
|
|
15
15
|
'Generate image(s) from a text prompt using Kolbo AI. Supports Visual DNA profiles (for character/style/product consistency), moodboards (for style direction), reference images (for composition guidance), batch generation (num_images), and web-search grounding. For EDITING an existing image, use generate_image_edit instead. For a coordinated multi-scene set (storyboard, ad campaign), use generate_creative_director. Returns the final image URL(s) when complete.',
|
|
16
16
|
{
|
|
17
17
|
prompt: z.string().describe('Text description of the image to generate'),
|
|
18
|
-
model: z.string().optional().describe('Model identifier. Use list_models type="
|
|
18
|
+
model: z.string().optional().describe('Model identifier. Use list_models type="text_to_img" to see options. Omit for Smart Select.'),
|
|
19
19
|
aspect_ratio: z.string().optional().describe('Aspect ratio (e.g., "1:1", "16:9", "9:16"). Default: "1:1"'),
|
|
20
20
|
enhance_prompt: z.boolean().optional().describe('Enhance the prompt for better results. Default: true'),
|
|
21
21
|
num_images: z.number().optional().describe('Number of images to generate in one call. Default: 1'),
|
|
@@ -54,7 +54,7 @@ function registerGenerateTools(server, client) {
|
|
|
54
54
|
'Edit or transform an existing image using AI. Provide the source image URL(s) in `source_images` and describe the edit in `prompt` (e.g., "remove the background", "change the car color to red", "add sunglasses to the person"). Supports Visual DNA profiles and moodboards for style-consistent edits. For creating a brand new image from scratch, use generate_image. Returns the edited image URL(s) when complete.',
|
|
55
55
|
{
|
|
56
56
|
prompt: z.string().describe('Description of the edit to apply (e.g., "remove the background", "change the sky to sunset")'),
|
|
57
|
-
model: z.string().optional().describe('Model identifier. Use list_models type="
|
|
57
|
+
model: z.string().optional().describe('Model identifier. Use list_models type="image_editing" to see options. Omit for Smart Select.'),
|
|
58
58
|
source_images: z.array(z.string()).describe('Array of source image URLs to edit. Typically one, but some models accept multiple for compositing.'),
|
|
59
59
|
aspect_ratio: z.string().optional().describe('Output aspect ratio (e.g., "1:1", "16:9", "9:16"). Default: "1:1"'),
|
|
60
60
|
enhance_prompt: z.boolean().optional().describe('Enhance the prompt for better results. Default: true'),
|
|
@@ -90,10 +90,10 @@ function registerGenerateTools(server, client) {
|
|
|
90
90
|
// ─── generate_creative_director ─────────────────────────────
|
|
91
91
|
server.tool(
|
|
92
92
|
'generate_creative_director',
|
|
93
|
-
'Generate 2–8 related images or videos as one coherent set from a single creative brief. Use this when the user gives a general brief ("make 4 product shots", "create a storyboard") and you are planning the scenes — it handles style consistency and runs scenes in parallel. If the user explicitly provides separate prompts for each image, use parallel generate_image calls instead. Supports image and video modes (
|
|
93
|
+
'Generate 2–8 related images or videos as one coherent set from a single creative brief. Use scene_count (NOT num_images) to set the number of scenes (1–8, default 4). Use this when the user gives a general brief ("make 4 product shots", "create a storyboard") and you are planning the scenes — it handles style consistency and runs scenes in parallel. If the user explicitly provides separate prompts for each image, use parallel generate_image calls instead. Supports image and video modes (workflow_type). Visual DNA and moodboard references keep character/style consistent across every scene.',
|
|
94
94
|
{
|
|
95
95
|
prompt: z.string().describe('Creative brief or concept describing the full set of scenes to generate'),
|
|
96
|
-
scene_count: z.number().optional().describe('Number of scenes to generate, 1–8. Default: 4'),
|
|
96
|
+
scene_count: z.number().optional().describe('Number of scenes/images to generate, 1–8. Default: 4. Use this — NOT num_images — to control how many outputs are created.'),
|
|
97
97
|
model: z.string().optional().describe('Model identifier applied to every scene. Omit for Smart Select.'),
|
|
98
98
|
aspect_ratio: z.string().optional().describe('Aspect ratio applied to every scene (e.g., "1:1", "16:9", "9:16"). Default: "1:1"'),
|
|
99
99
|
workflow_type: z.string().optional().describe('"image" (default) or "video"'),
|
|
@@ -144,7 +144,7 @@ function registerGenerateTools(server, client) {
|
|
|
144
144
|
'Generate a video from a text prompt using Kolbo AI. For animating an existing still image into motion, use generate_video_from_image instead. For a coordinated multi-scene video campaign, use generate_creative_director with workflow_type="video". Supports Visual DNA profiles (for character consistency) and reference images (for style guidance). Returns the final video URL when complete.',
|
|
145
145
|
{
|
|
146
146
|
prompt: z.string().describe('Text description of the video to generate'),
|
|
147
|
-
model: z.string().optional().describe('Model identifier. Use list_models type="
|
|
147
|
+
model: z.string().optional().describe('Model identifier. Use list_models type="text_to_video" to see options. Check supported_durations and supported_aspect_ratios.'),
|
|
148
148
|
aspect_ratio: z.string().optional().describe('Aspect ratio (e.g., "16:9", "9:16", "1:1"). Default: "16:9"'),
|
|
149
149
|
duration: z.number().optional().describe('Duration in seconds. Must be a value the chosen model supports — check supported_durations from list_models. Default: 5'),
|
|
150
150
|
enhance_prompt: z.boolean().optional().describe('Enhance the prompt. Default: true'),
|
|
@@ -183,7 +183,7 @@ function registerGenerateTools(server, client) {
|
|
|
183
183
|
{
|
|
184
184
|
image_url: z.string().describe('URL of the source image to animate'),
|
|
185
185
|
prompt: z.string().describe('Text description of the desired MOTION (e.g., "camera slowly pans right while the character walks forward")'),
|
|
186
|
-
model: z.string().optional().describe('Model identifier. Use list_models type="
|
|
186
|
+
model: z.string().optional().describe('Model identifier. Use list_models type="img_to_video" to see options.'),
|
|
187
187
|
aspect_ratio: z.string().optional().describe('Output aspect ratio (e.g., "16:9", "9:16", "1:1"). Default: "16:9"'),
|
|
188
188
|
duration: z.number().optional().describe('Duration in seconds. Must be a value the chosen model supports. Default: 5'),
|
|
189
189
|
enhance_prompt: z.boolean().optional().describe('Enhance the motion prompt. Default: true'),
|
|
@@ -219,7 +219,7 @@ function registerGenerateTools(server, client) {
|
|
|
219
219
|
'Generate music from a text description using Kolbo AI. Supports instrumental mode, custom lyrics, style direction, and vocal gender. Default model is Suno. Returns the final audio URL when complete.',
|
|
220
220
|
{
|
|
221
221
|
prompt: z.string().describe('Text description of the music to generate (e.g., "upbeat electronic dance track with synthesizers")'),
|
|
222
|
-
model: z.string().optional().describe('Model identifier. Use list_models type="
|
|
222
|
+
model: z.string().optional().describe('Model identifier. Use list_models type="music_gen" to see options. Omit for Suno (default).'),
|
|
223
223
|
style: z.string().optional().describe('Music style / genre (e.g., "pop", "rock", "lo-fi", "electronic", "jazz")'),
|
|
224
224
|
instrumental: z.boolean().optional().describe('Generate instrumental only, no vocals. Default: false'),
|
|
225
225
|
lyrics: z.string().optional().describe('Custom lyrics for the song. If omitted, lyrics are generated automatically from the prompt unless instrumental is true.'),
|
|
@@ -257,7 +257,7 @@ function registerGenerateTools(server, client) {
|
|
|
257
257
|
{
|
|
258
258
|
text: z.string().describe('The text to convert to speech'),
|
|
259
259
|
voice: z.string().optional().describe('Voice ID (from list_voices) or voice display name (e.g., "Rachel", "Adam"). Default: "Rachel"'),
|
|
260
|
-
model: z.string().optional().describe('Model identifier. Use list_models type="
|
|
260
|
+
model: z.string().optional().describe('Model identifier. Use list_models type="text_to_speech" to see options. Default: eleven_v3'),
|
|
261
261
|
language: z.string().optional().describe('Language code (e.g., "en-US", "he-IL", "es-ES"). Default: "en-US"')
|
|
262
262
|
},
|
|
263
263
|
async ({ text, voice, model, language }) => {
|
|
@@ -289,7 +289,7 @@ function registerGenerateTools(server, client) {
|
|
|
289
289
|
'Generate sound effects (not music, not speech) from a text description using Kolbo AI. Use this for ambient sounds, foley, impacts, atmospheres, UI sounds, etc. For music use generate_music; for voice use generate_speech. Returns the final audio URL when complete.',
|
|
290
290
|
{
|
|
291
291
|
prompt: z.string().describe('Text description of the sound effect (e.g., "thunder clap with rain", "door creaking open", "futuristic UI beep")'),
|
|
292
|
-
model: z.string().optional().describe('Model identifier. Use list_models type="
|
|
292
|
+
model: z.string().optional().describe('Model identifier. Use list_models type="text_to_sound" to see options. Default: elevenlabs-sound-effects-v1'),
|
|
293
293
|
duration: z.number().optional().describe('Duration in seconds. Omit for automatic duration.')
|
|
294
294
|
},
|
|
295
295
|
async ({ prompt, model, duration }) => {
|
|
@@ -380,7 +380,7 @@ function registerGenerateTools(server, client) {
|
|
|
380
380
|
'Generate a video from reference elements (images and/or videos) + a text prompt. Use when the user wants to animate specific uploaded/referenced assets — e.g. "animate this product", "put these 3 characters into a scene". Supports Visual DNA for character consistency. For text-only → video use generate_video instead. For animating a single still image use generate_video_from_image. Returns the final video URL when complete.',
|
|
381
381
|
{
|
|
382
382
|
prompt: z.string().describe('Text description of the desired video / animation'),
|
|
383
|
-
model: z.string().optional().describe('Model identifier. Use list_models type="
|
|
383
|
+
model: z.string().optional().describe('Model identifier. Use list_models type="elements" to see options (Seedance 2, Kling O3 Reference, Grok Imagine, Veo 3.1, etc.). Omit for Smart Select.'),
|
|
384
384
|
reference_images: z.array(z.string()).optional().describe('Array of public image URLs used as reference elements (product shots, character references, etc.). URL mode.'),
|
|
385
385
|
files: z.array(z.string()).optional().describe('Array of URLs or absolute local paths — alternative to reference_images. Use this when you have local files to upload. Each item can be a URL OR a local path.'),
|
|
386
386
|
duration: z.number().optional().describe('Duration in seconds. Default: 5'),
|
|
@@ -447,7 +447,7 @@ function registerGenerateTools(server, client) {
|
|
|
447
447
|
first_frame: z.string().optional().describe('URL or absolute local path to the first frame (file mode — alternative to first_frame_url)'),
|
|
448
448
|
last_frame: z.string().optional().describe('URL or absolute local path to the last frame (file mode — alternative to last_frame_url)'),
|
|
449
449
|
prompt: z.string().optional().describe('Optional description of the desired motion between the two frames (e.g. "smooth camera dolly in")'),
|
|
450
|
-
model: z.string().optional().describe('Model identifier. Use list_models type="
|
|
450
|
+
model: z.string().optional().describe('Model identifier. Use list_models type="firstlastgenerations" to see options. Omit for Smart Select.'),
|
|
451
451
|
duration: z.number().optional().describe('Duration in seconds. Default: 5'),
|
|
452
452
|
aspect_ratio: z.string().optional().describe('Aspect ratio (auto-detected from first frame if not provided). Default: "16:9"'),
|
|
453
453
|
enhance_prompt: z.boolean().optional().describe('Enhance the prompt. Default: true'),
|
|
@@ -512,7 +512,7 @@ function registerGenerateTools(server, client) {
|
|
|
512
512
|
source: z.string().describe('URL or absolute local path to the source image or video (the face to animate)'),
|
|
513
513
|
audio: z.string().describe('URL or absolute local path to the audio track (the voice to sync to)'),
|
|
514
514
|
text_prompt: z.string().optional().describe('Optional text prompt (for performance-capable models)'),
|
|
515
|
-
model: z.string().optional().describe('Model identifier. Use list_models type="lipsync" to see options. Omit for Smart Select.'),
|
|
515
|
+
model: z.string().optional().describe('Model identifier. Use list_models type="lipsync-image" or type="lipsync-video" to see options. Omit for Smart Select.'),
|
|
516
516
|
bounding_box_target: z.array(z.number()).optional().describe('Optional bounding box [x, y, w, h] for multi-face inputs (Hedra Character3 style). Leave empty for single-face.')
|
|
517
517
|
},
|
|
518
518
|
async ({ source, audio, text_prompt, model, bounding_box_target }) => {
|
|
@@ -581,7 +581,7 @@ function registerGenerateTools(server, client) {
|
|
|
581
581
|
{
|
|
582
582
|
source_video: z.string().describe('URL or absolute local path to the source video to restyle'),
|
|
583
583
|
prompt: z.string().describe('Text description of the desired restyle / transformation'),
|
|
584
|
-
model: z.string().optional().describe('Model identifier. Omit for Smart Select.'),
|
|
584
|
+
model: z.string().optional().describe('Model identifier. Use list_models type="video_to_video" to see options. Omit for Smart Select.'),
|
|
585
585
|
aspect_ratio: z.string().optional().describe('Output aspect ratio. Default: matches source'),
|
|
586
586
|
duration: z.number().optional().describe('Duration in seconds (default: matches source)'),
|
|
587
587
|
enhance_prompt: z.boolean().optional().describe('Enhance the prompt. Default: true'),
|
|
@@ -679,7 +679,7 @@ function registerGenerateTools(server, client) {
|
|
|
679
679
|
reference_images: z.array(z.string()).optional().describe('Array of public image URLs. 1 image → single mode, 2+ → multi mode.'),
|
|
680
680
|
mode: z.string().optional().describe('Explicitly set mode: "text" | "single" | "multi". Auto-detected from reference_images if omitted.'),
|
|
681
681
|
texture_prompt: z.string().optional().describe('Optional prompt to guide texture generation'),
|
|
682
|
-
model: z.string().optional().describe('Model identifier. Use list_models type="three_d" to see options.'),
|
|
682
|
+
model: z.string().optional().describe('Model identifier. Use list_models type="three_d" to see all 3D options, or filter by sub-type: "3d_text_to_model", "3d_image_to_model", "3d_multi_image_to_model", "3d_world".'),
|
|
683
683
|
topology: z.string().optional().describe('Topology preset (optional, model-specific)'),
|
|
684
684
|
target_polycount: z.number().optional().describe('Target polygon count (optional, model-specific)'),
|
|
685
685
|
enable_tpose: z.boolean().optional().describe('Force T-pose for character models (optional)'),
|
package/src/tools/models.js
CHANGED
|
@@ -11,21 +11,31 @@ function registerModelTools(server, client) {
|
|
|
11
11
|
'list_models',
|
|
12
12
|
'List available AI models on Kolbo. Filter by type to find models for a specific generation type.',
|
|
13
13
|
{
|
|
14
|
-
type: z.string().optional().describe('Filter by type: "image", "image_edit", "video", "video_from_image", "video_from_video", "music", "speech", "sound", "chat", "lipsync", "three_d"
|
|
14
|
+
type: z.string().optional().describe('Filter by DB type name: "text_to_img", "image_editing", "text_to_video", "img_to_video", "draw_to_video", "video_to_video", "elements", "firstlastgenerations", "lipsync-image", "lipsync-video", "music_gen", "text_to_speech", "text_to_sound", "stt", "text". Legacy aliases also accepted: "image", "image_edit", "video", "video_from_image", "video_from_video", "music", "speech", "sound", "chat", "lipsync" (both lipsync types), "three_d" (all 3D types), "first_last_frame", "transcription". Omit for all models.')
|
|
15
15
|
},
|
|
16
16
|
async ({ type }) => {
|
|
17
17
|
const path = type ? `/v1/models?type=${encodeURIComponent(type)}` : '/v1/models';
|
|
18
18
|
const result = await client.get(path);
|
|
19
19
|
|
|
20
|
-
//
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
// Split into auto-selectable (has summary) and named-only (no summary)
|
|
21
|
+
const withSummary = result.models.filter(m => m.summary && m.summary.trim() !== '');
|
|
22
|
+
const withoutSummary = result.models.filter(m => !m.summary || m.summary.trim() === '');
|
|
23
|
+
|
|
24
|
+
const formatModel = m =>
|
|
25
|
+
`${m.identifier} (${m.name}) - ${m.credit} credits${m.recommended ? ' [RECOMMENDED]' : ''}${m.new_model ? ' [NEW]' : ''}${m.summary ? ` — ${m.summary}` : ''}`;
|
|
26
|
+
|
|
27
|
+
const sections = [];
|
|
28
|
+
if (withSummary.length > 0) {
|
|
29
|
+
sections.push(`Auto-selectable models (${withSummary.length}) — safe to pick based on quality + cost:\n${withSummary.map(formatModel).join('\n')}`);
|
|
30
|
+
}
|
|
31
|
+
if (withoutSummary.length > 0) {
|
|
32
|
+
sections.push(`Named-only models (${withoutSummary.length}) — only use if the user explicitly requests by name:\n${withoutSummary.map(formatModel).join('\n')}`);
|
|
33
|
+
}
|
|
24
34
|
|
|
25
35
|
return {
|
|
26
36
|
content: [{
|
|
27
37
|
type: 'text',
|
|
28
|
-
text: `Available models (${result.count}):\n\n${
|
|
38
|
+
text: `Available models (${result.count}):\n\n${sections.join('\n\n')}\n\nUse the "identifier" value as the "model" parameter in generate tools.`
|
|
29
39
|
}]
|
|
30
40
|
};
|
|
31
41
|
}
|