@kolbo/mcp 1.82.2 → 1.82.3

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolbo/mcp",
3
- "version": "1.82.2",
3
+ "version": "1.82.3",
4
4
  "description": "Kolbo AI MCP Server - Generate images, videos, music, speech, and sound effects from Claude Code",
5
5
  "main": "src/index.js",
6
6
  "bin": {
@@ -280,8 +280,12 @@ function renderChips(sc) {
280
280
  var s = sc.settings || {};
281
281
  var kind = displayKind(sc);
282
282
  if (kind) h += chip(iconFor(kind) + ' ' + kind);
283
- if (s.duration) h += chip(ICONS.clock + ' ' + fmtDur(s.duration) + (s.shots > 1 ? ' · ' + s.shots + ' shots' : ''));
284
- else if (s.shots > 1) h += chip(s.shots + ' shots');
283
+ // Shot count when we know it, otherwise just say multishot is on the
284
+ // provider picks the count in that case, and showing nothing made an
285
+ // enabled toggle look like it had not applied.
286
+ var shotLabel = s.shots > 1 ? (s.shots + ' shots') : (s.multi_shot ? 'multishot' : '');
287
+ if (s.duration) h += chip(ICONS.clock + ' ' + fmtDur(s.duration) + (shotLabel ? ' · ' + shotLabel : ''));
288
+ else if (shotLabel) h += chip(shotLabel);
285
289
  if (s.resolution) h += chip(esc(s.resolution));
286
290
  if (s.aspect_ratio) h += chip(esc(s.aspect_ratio));
287
291
  if (s.quality) h += chip(esc(s.quality) + ' quality');
@@ -186,6 +186,9 @@ const videoSettings = (a = {}) => ({
186
186
  // echoed back on start, then to per-shot × shots.
187
187
  duration: a.duration ?? a.reported_duration ?? (a.shot_duration && a.shots ? a.shot_duration * a.shots : undefined),
188
188
  ...(a.shots > 1 ? { shots: a.shots } : {}),
189
+ // Multishot with no explicit count: the provider decides how many, so there
190
+ // is no number to show — but the card still has to say the toggle applied.
191
+ ...(a.multi_shot ? { multi_shot: true } : {}),
189
192
  resolution: a.resolution,
190
193
  aspect_ratio: a.aspect_ratio,
191
194
  ...(a.mode ? { mode: a.mode } : {}),
@@ -1374,7 +1377,14 @@ function registerGenerateTools(server, client, options = {}) {
1374
1377
  settings: videoSettings({
1375
1378
  duration,
1376
1379
  reported_duration: startResponse?.duration ?? startResponse?.result?.duration,
1377
- shots: multi_shot_count ?? (Array.isArray(multi_shots) ? multi_shots.length : undefined),
1380
+ // `multi_shots` is a boolean (z.boolean()); the old
1381
+ // `Array.isArray(multi_shots) ? multi_shots.length : undefined`
1382
+ // branch could never be true, so enabling multishot WITHOUT an
1383
+ // explicit count left shots undefined and the card silently showed
1384
+ // no multishot indicator at all. Carry the flag so the chip can
1385
+ // render even when the shot count is the provider's to decide.
1386
+ shots: multi_shot_count,
1387
+ multi_shot: multi_shots === true || undefined,
1378
1388
  resolution, aspect_ratio, enhance_prompt, visual_dna_ids, preset_id,
1379
1389
  }),
1380
1390
  // Already bucketed and deduped above, so a URL handed to `files`
@@ -1396,7 +1406,14 @@ function registerGenerateTools(server, client, options = {}) {
1396
1406
  settings: videoSettings({
1397
1407
  duration,
1398
1408
  reported_duration: result.result?.duration,
1399
- shots: multi_shot_count ?? (Array.isArray(multi_shots) ? multi_shots.length : undefined),
1409
+ // `multi_shots` is a boolean (z.boolean()); the old
1410
+ // `Array.isArray(multi_shots) ? multi_shots.length : undefined`
1411
+ // branch could never be true, so enabling multishot WITHOUT an
1412
+ // explicit count left shots undefined and the card silently showed
1413
+ // no multishot indicator at all. Carry the flag so the chip can
1414
+ // render even when the shot count is the provider's to decide.
1415
+ shots: multi_shot_count,
1416
+ multi_shot: multi_shots === true || undefined,
1400
1417
  resolution, aspect_ratio, enhance_prompt, visual_dna_ids, preset_id,
1401
1418
  }),
1402
1419
  reference_images: [...urlsOf('image'), ...(keyframes || []).map((keyframe) => keyframe.image_url)],
@@ -102,7 +102,7 @@ function registerVisualDnaTools(server, client, options = {}) {
102
102
  {
103
103
  scope: z.enum(['all', 'personal', 'global', 'organization']).optional().describe('Default: "personal" — the user\'s own DNAs (plus a shared project\'s when project_id is set). "global" = the ~1000 system cast/preset DNAs, for browsing when the user needs a character and has none of their own. "organization" = org-shared. "all" = everything, rarely wanted.'),
104
104
  search: z.string().optional().describe('Search by name, tags, or description (case-insensitive). Matches at WORD STARTS, so "man" finds "Man"/"Manager" but not "woman" or "romantic". Name matches are ranked first.'),
105
- collection: z.string().optional().describe('Filter global presets by collection: cast, influencers, props, locations, styles, glamour, street'),
105
+ collection: z.string().optional().describe('Filter global presets by collection: cast, influencers, props, locations, styles, street'),
106
106
  tags: z.string().optional().describe('Comma-separated tags to filter by (OR logic)'),
107
107
  page: z.number().optional().describe('Page number, 1-indexed. Default: 1. Needed to reach the global cast beyond the first page.'),
108
108
  limit: z.number().optional().describe('Results per page, max 100. Default: 50'),