@kolbo/mcp 1.116.0 → 1.117.1

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.116.0",
3
+ "version": "1.117.1",
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": {
@@ -1933,7 +1933,7 @@ function registerGenerateTools(server, client, options = {}) {
1933
1933
  {
1934
1934
  source: z.string().describe('URL or absolute local path to the source image or video (the face to animate). For lipsync-video: duration must fall within `min_video_duration`-`max_video_duration` from list_models.'),
1935
1935
  audio: z.string().describe('URL or absolute local path to the audio track (the voice to sync to). Duration must fall within `min_audio_duration`-`max_audio_duration` from list_models; format must be in `supported_audio_formats` (when set).'),
1936
- text_prompt: z.string().optional().describe('Optional text prompt (for performance-capable models). For Sync-3 this is the free-text emotion/acting prompt, e.g. "speaking with excitement, calm and serious".'),
1936
+ text_prompt: z.string().optional().describe('Optional text prompt (for performance-capable models). For Sync-3 this is the free-text emotion/acting prompt, e.g. "speaking with excitement, calm and serious". For OmniHuman 2.0 (model "bytedance/omnihuman-2.0", lipsync-image: one photo + 4-300s of audio, native 720p) it directs the scene, gestures and camera, e.g. "she sings on a small stage, slow push-in, hands on the mic".'),
1937
1937
  model: z.string().optional().describe('Model identifier. Use list_models type="lipsync-image" or type="lipsync-video" to see options. Pick a SPECIFIC model — do NOT omit (omitting = Smart Select auto-pick, which we avoid); call list_models for this type and choose the model that best fits the user\'s intent.'),
1938
1938
  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.'),
1939
1939
  // Sync-3 (fal-ai/sync-lipsync/v3) only; ignored by other models.
@@ -115,6 +115,17 @@ const identifierRow = (m) => ({
115
115
  ...(m.new_model ? { new_model: true } : {}),
116
116
  });
117
117
 
118
+ // upgrade_entry credits a purchase to the surface that sent the user (kolbo-map
119
+ // markUpgradeEntryFromUrl). Set server-side so the card AND the text link carry it;
120
+ // a tag already on the URL is kept.
121
+ function withUpgradeEntry(raw, entry) {
122
+ try {
123
+ const u = new URL(raw);
124
+ if (!u.searchParams.has('upgrade_entry')) u.searchParams.set('upgrade_entry', entry);
125
+ return u.toString();
126
+ } catch { return raw; }
127
+ }
128
+
118
129
  function registerModelTools(server, client, options = {}) {
119
130
  const ui = () => appsEnabled(server, options);
120
131
  // ─── list_models ───────────────────────────────────────────
@@ -516,7 +527,7 @@ function registerModelTools(server, client, options = {}) {
516
527
  current_plan: data?.current_plan || null,
517
528
  plans: data?.plans || [],
518
529
  credit_packs: data?.credit_packs || [],
519
- pricing_url: data?.pricing_url || 'https://app.kolbo.ai/pricing',
530
+ pricing_url: withUpgradeEntry(data?.pricing_url || 'https://app.kolbo.ai/pricing', 'mcp_plans_card'),
520
531
  };
521
532
  // structuredContent SHADOWS the text on widget hosts, so everything the
522
533
  // agent needs to talk about pricing has to live in the object above.
@@ -533,4 +544,4 @@ function registerModelTools(server, client, options = {}) {
533
544
  );
534
545
  }
535
546
 
536
- module.exports = { registerModelTools };
547
+ module.exports = { registerModelTools, withUpgradeEntry };