@kolbo/mcp 1.42.0 → 1.43.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolbo/mcp",
3
- "version": "1.42.0",
3
+ "version": "1.43.0",
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": {
@@ -1,5 +1,5 @@
1
1
  <!-- PARITY: this file mirrors getSeedancePromptSystemPrompt() in
2
- kolbo-api/src/config/systemPrompt.js (lines ~775–855).
2
+ kolbo-api/src/config/systemPrompt.js.
3
3
  When that function changes, update this file in the same session.
4
4
  See packages/opencode/CLAUDE.md "MCP & Skill Sync Rule". -->
5
5
 
@@ -11,7 +11,7 @@ Load this file when the user wants a **Seedance 2 / Seedance 2.0** (ByteDance) v
11
11
 
12
12
  ## Universal Rules (apply to EVERY Seedance prompt)
13
13
 
14
- - **First line ALWAYS declares shot structure**: total duration, shot count, aspect ratio. Example: `Total: 15s / 6 shots / 16:9`. Put it at the BOTTOM of the prompt too.
14
+ - **First line ALWAYS declares shot structure**: total duration, shot count, aspect ratio. Example: `Total: 15s / 6 shots / 16:9`. Put it at the BOTTOM of the prompt too. For connected narrative sequences the proven phrasing is `N connected cinematic shots, 15 seconds total, 16:9, Multishot ON` — use it and keep `Multishot ON` for any multi-shot story.
15
15
  - **Order inside each shot**: Subject → Action → Camera → Style → Constraints → (Audio/SFX if relevant).
16
16
  - **Prompt length**: aim for ~120–280 words TOTAL across all shots combined (not per shot). Shorter than ~120 words = random output. Longer risks the 8000-char cap below and makes the model forget the opening. For 6-shot prompts, keep each shot 1–2 tight sentences.
17
17
  - **Character lock**: if a character recurs, open with `same character throughout all shots` to stop identity drift.
@@ -60,6 +60,136 @@ Load this file when the user wants a **Seedance 2 / Seedance 2.0** (ByteDance) v
60
60
  - Style anchor: `Cinematic stylized 3D animation, photorealistic <env>, stylized characters`.
61
61
  - Describe physics as precisely as character actions (particle simulation, volumetric dust, sand displacement, energy VFX).
62
62
 
63
+ ### 6. Reference-Anchored Cinematic Sequence (multi-character / named references — highest-fidelity format)
64
+
65
+ Use whenever the user gives named characters or multiple reference images (`@Image1`, `@Image2`, …) — a tactical unit clearing a bunker, a duel between two referenced characters, a war scene. **This is always an Elements-mode prompt** (route the card to `elements`). Structure:
66
+
67
+ 1. **Labeled scene header FIRST** (grounds the scene before any shot):
68
+ - `Time of day:` — hour + light quality + atmosphere (dust, haze, heavy silence before action).
69
+ - `Location:` — the environment in concrete physical detail (materials, wear, light direction, high-contrast blown-out entrance, etc.).
70
+ - `Characters:` — ONE line per person: `Name @ImageN — wardrobe, position in frame, what they carry`. End with "All must match their character references exactly."
71
+ 2. **REFERENCE CONSISTENCY block** — map every reference and pin what must NOT change: `Reference Image 1 is <X>. Preserve exact face, hair, anatomy, wardrobe, colors, props.` Add per-character energy/aura color rules, and any already-established story state (e.g. "the gem is already shattered — no intact gem, no red glow"). End with "Do not redesign, morph, recolor, or swap either character, their clothing, anatomy, weapons, or the environment."
72
+ 3. **Shots** — either titled (`Shot 1 — Medium Wide / Tactical Positioning`) or timecoded (`SHOT 1 — 0:00–0:03`); timecodes must sum to the total duration. Under each shot use **Camera → Action → Audio** in that order.
73
+ 4. **Continuity** — to chain a series, open with `Begin as a seamless continuation from <the exact last beat of the previous video>.`
74
+ 5. Close with whichever **Power Blocks** below actually apply (this format usually warrants all three; a simpler scene may need only AUDIO).
75
+
76
+ ## Power Blocks (CONDITIONAL — add ONLY the ones the shot actually needs; never pad a simple prompt)
77
+
78
+ These elevate rich cinematic / reference-anchored sequences. For a short, tight, single-idea prompt, skip them — the skill's "short prompts can hit hard, don't pad" rule wins. Apply each only when it earns its place:
79
+
80
+ - **AUDIO** — Seedance renders sound, so specify it whenever sound matters to the scene (most cinematic/action shots). Default diegetic: `AUDIO: No musical score. Synchronized production sound only:` then a comma list of the exact sounds in narrative order (boots scraping concrete, sling shift, layered breathing, distant sirens, weapon impacts, cloth movement, rushing air). Call for a musical score if the user wants one. Skip the block entirely for a deliberately silent or trivially simple shot.
81
+ - **AVOID** — add when there's real drift risk: referenced characters/DNAs, an established story state, or a specific content tone to enforce. `AVOID:` + the drifts to forbid: character morphing, costume/anatomy changes, missing signature details (a piercing, a scar), camera looking into the lens, glamorous posing, duplicated characters, extra weapons, text / subtitles / logos, plus content-specific negatives (e.g. "intact gemstone, red aura" once it's destroyed). Skip it when there's nothing meaningful to forbid.
82
+ - **PHYSICAL GROUNDING** — only when the shot has a real contact/impact (a boot planted on a chest, a weapon lock, a body thrown): spell out weight transfer, full contact, stable balance, material reaction, and the victim's physical response. Not needed for talking, walking, or ambient shots.
83
+
84
+ ## Dialogue & expression
85
+
86
+ - Dialogue goes in quotes and may be in ANY language (Hebrew included). For silent tension, deliver it as expression, not speech: `He does not speak. His expression clearly says: "…"`.
87
+
88
+ ## Content tone
89
+
90
+ - **Brutal war realism** — allow `Hollywood-style blood squib` impacts (visible spray, spreading stain on clothing, violent body reaction, hard collapse) when the user wants gritty combat.
91
+ - **Restrained / no-gore** — when intensity is wanted without gore, state it explicitly (`brutal supernatural strike but no blood, no open wound, no exposed flesh`) AND add the gore terms to the AVOID list.
92
+ - **Rapid-cut montage** (`N cuts / 2 seconds each`) — a valid structure: fixed-length hard cuts, vary the angle every cut (wide / medium / low / side / close handheld), state "Hard cuts. No slow motion," and reserve slow motion for a single named beat if any.
93
+
94
+ ## Universal Craft Layer (apply on top of any format above)
95
+
96
+ > This is the universal film-direction layer that lifts every prompt above the boilerplate. **Deep-dive reference:** `~/.kolbo/skills/seedance-2-prompting/SKILL.md` (Craft Edition — full block structure, every optical technique, and the pre-flight checklist).
97
+
98
+ ### Core principle
99
+
100
+ The model reacts to what can be **seen and measured**, not to mood words. Translate abstractions into observables.
101
+
102
+ - ❌ "tense scene" → ✅ "man freezes, slowly clenches his fist, light only from the side, half his face in shadow"
103
+ - ❌ "cool cinematic shot of a car, epic, fast" → ✅ "low tracking shot alongside the car as it powers through a wet curve, headlights glowing, spray off the tyres, hard buffeting camera shake"
104
+
105
+ ### Style — DISTRIBUTED, not a prefix
106
+
107
+ Never pile all style tokens at the top of the prompt. Each aspect lives in the block that already governs it:
108
+
109
+ - Lighting → inside the shot's LIGHTING description
110
+ - Lens / FOV → in OPTICS
111
+ - Color → either an explicit grade (when strong / stylized) or folded into LOCATION + LIGHTING for naturalistic looks
112
+ - Skin / acting → in PERFORMANCE
113
+ - Physics → in PHYSICS
114
+ - Format / resolution / grain → at the END as a suffix stack (before LOCKS)
115
+
116
+ ### Shot sizes
117
+
118
+ | Abbr | Meaning | In frame |
119
+ |------|---------|----------|
120
+ | ECU | Extreme Close-Up | a detail: eyes, button, headlight, hand |
121
+ | CU | Close-Up | full face / one element large |
122
+ | MCU | Medium Close-Up | head and shoulders |
123
+ | MS | Medium Shot | roughly to the waist |
124
+ | WS | Wide Shot | full figure + surroundings |
125
+ | EWS | Extreme Wide | scale, location |
126
+
127
+ ### FOV anchor table (degrees — what to write in the prompt)
128
+
129
+ | FOV | mm equiv | Purpose |
130
+ |-----|----------|---------|
131
+ | 180° | Fisheye | spherical distortion |
132
+ | 107° | 14–16mm | architectural ultra-wide |
133
+ | 84° | 20–24mm | wide |
134
+ | 63° | 28–35mm | observational |
135
+ | 47° | 40–50mm | neutral human perspective |
136
+ | 29° | 75–85mm | portrait compression |
137
+ | 18° | 100–135mm | natural portrait |
138
+ | 12° | 180–200mm | tele-detail |
139
+ | 8° | 300–400mm | extreme compression |
140
+
141
+ Use only the discrete steps. Not "23°" — use 18° or 29°.
142
+
143
+ ### Prompting rules
144
+
145
+ - **Positive only.** ❌ "does not fall backward" → ✅ "stays upright, feet planted."
146
+ - **Speeds in km/h.** ❌ "fast/slow" → ✅ "moves at 40 km/h", "camera pans at 5 km/h."
147
+ - **Atmosphere in % / meters.** ❌ "light fog" → ✅ "fog density 40%", "haze visible at 15 meters depth."
148
+ - **Atmosphere builds in steps across shots.** Shot 1: 20% → Shot 2: 40% → Shot 3: 60%.
149
+ - **Giant scale via human-height.** ❌ "huge, three meters tall" → ✅ "stands as tall as four humans stacked."
150
+ - **Left/right is from the camera.** "Subject moves left" = left from the camera's view.
151
+ - **Emotion through muscle movement**, not labels. ❌ "she looks sad" → ✅ "her eyes drop to the table, jaw tightens, she swallows once before answering."
152
+ - **WB in Kelvin.** 3200K / 4000K / 5600K / 8500K. Pick ONE for the scene's mood.
153
+ - **Color as material + light + role**, never a flat list. ❌ "she wears red, he wears blue" → ✅ "crimson silk scarf catching the cold tungsten spill from the corridor".
154
+ - **No equipment names**, no director references, no "shot on ARRI / Sigma 85mm / Roger Deakins".
155
+
156
+ ### Cuts and timing
157
+
158
+ - **Single continuous shot (oner)** → "one continuous shot, the camera does not cut on its own."
159
+ - **Sequential cuts, no timecodes** → "CUT 1 … CUT 2 … CUT 3".
160
+ - **Timed multishot** → explicit HARD CUTs at stated seconds, with timecode blocks `0.0s to 1.0s — [description]`.
161
+ - **Mixed real-time + slow-mo** → hard cuts only between speed modes. Each shot one speed start to finish.
162
+
163
+ ### Special protocols
164
+
165
+ - **4-mechanism multishot consistency stack** (extreme FOV: 8°, 107°): (1) sequence-wide identity lock, (2) LENS LOCK opener per beat, (3) LENS CHECK closer per beat, (4) color via material + light, not as a list. All four required.
166
+ - **Whip-pan timing:** 0.3s Subject A settled → 0.8s WHIP motion-blur → 1.4s Subject B settled. Whip under 0.8s renders as a hard cut without blur.
167
+ - **Anti-impact lock** (cracks/breaks without impact): "crowd PRESSES, not strikes", "fracture originates from edge stress, not center impact", "no impact point — pressure-based crack."
168
+
169
+ ### Optical techniques
170
+
171
+ - **Observation pattern (hidden-camera):** foreground occlusion 20–30% + atmospheric haze + 8°–12° super-tele vantage.
172
+ - **Sports broadcast:** 8° super-tele + handheld 1–2cm tremor + "anchored at distance, finding the action".
173
+ - **Tele compressed air column** at 8°–12°: "dust suspended in the long compressed air column between camera and subject".
174
+
175
+ ### Camera placement
176
+
177
+ Place CAMERA in the **3rd position** of each shot's core layers (Subject → Action → Camera → Style → Constraints). FOV gets ignored at the end, conflicts with identity at the front.
178
+
179
+ ### Pre-flight checklist (before output)
180
+
181
+ - Distributed style (no top-pile)?
182
+ - One camera movement per time slice?
183
+ - FOV in degrees from the table (not mm, not arbitrary)?
184
+ - WB in Kelvin?
185
+ - Speed in km/h, atmosphere in % or meters?
186
+ - Color via material + light + role?
187
+ - Positive phrasing (no "does not X")?
188
+ - No equipment / director names?
189
+ - Emotion through muscle, not labels?
190
+ - Multishot: FOV per segment + "no drift mid-segment"?
191
+ - 8000-char cap honored?
192
+
63
193
  ## Grid Storyboard Mode (3×3 grid input)
64
194
 
65
195
  When the user uploads a 3×3 grid image and asks for Seedance prompts, switch to this mode:
@@ -80,11 +210,20 @@ When the user uploads a 3×3 grid image and asks for Seedance prompts, switch to
80
210
 
81
211
  ## Output Discipline
82
212
 
83
- - Final prompt(s) ALWAYS in a fenced code block ready to paste into the Seedance `prompt` field (or pass as `prompt` on `generate_video` / `generate_elements`).
213
+ - Final prompt(s) ALWAYS in a fenced code block ready to paste into Seedance.
84
214
  - After the code block, give a 1-line "why this works" note (camera/escalation/physics choice).
85
215
  - If user asked in any language other than English, write your explanation in their language but keep the prompt itself English.
86
- - **Never exceed 8000 characters TOTAL** for the entire prompt as one string — that is the WHOLE prompt including every shot, every line of boilerplate, every SFX list, every newline. NOT 8000 per shot — 8000 for the prompt as one combined unit. Count before output. If over, rewrite tighter (cut adjectives, collapse boilerplate, merge or drop shots). NEVER split into multiple prompts / multiple code blocks / "part 1 / part 2" to work around the limit.
216
+ - **Never exceed 8000 characters TOTAL for the entire prompt as one string** — that is the WHOLE prompt including every shot, every line of boilerplate, every SFX list, every newline. NOT 8000 per shot — 8000 for the prompt as one combined unit. Count before output. If over, rewrite tighter (cut adjectives, collapse boilerplate, merge or drop shots). NEVER split into multiple prompts / multiple code blocks / "part 1 / part 2" to work around the limit.
217
+
218
+ ## Where to run in Kolbo
219
+
220
+ Seedance 2 lives in the **Video** category. Route the prompt card by the INPUTS:
221
+
222
+ - **First & Last Frame** (`first_last_frame` tag) when the video must begin on one frame and end on another (start + end image, morph A→B). This wins even if Visual DNAs / characters / elements are referenced inside it — First-Last-Frame supports DNAs/elements too.
223
+ - **Elements** (`elements` tag) when the scene is built from reference assets — a Visual DNA / character (`@name`), a moodboard (`#name`), or reference images composed into a NEW scene, with no explicit start+end frame. This is the default for any "@Character does X" / loopable-idle / new-scene-from-my-refs request.
224
+ - **Image-to-Video** (`image_to_video` tag) only when a single existing image is animated as-is.
225
+ - **Text-to-Video** (`text_to_video` tag) only when there is no reference image or character at all.
87
226
 
88
227
  ## Seedance + Visual DNA / References
89
228
 
90
- When a character must stay consistent, pair Seedance with Visual DNA via `generate_elements` (NOT `generate_video` — text-to-video silently drops `visual_dna_ids`). Tag the DNA inside the prompt with `@<dna-name>` — see `workflows/visual-dna.md`. For grid/storyboard inputs, the source frame is `@image1`.
229
+ When a character must stay consistent, pair Seedance with Visual DNA via `generate_elements` (NOT `generate_video` — text-to-video silently drops `visual_dna_ids`). Tag the DNA inside the prompt with `@<dna-name>` — see `workflows/visual-dna.md`. For grid/storyboard inputs, the source frame is `@image1`.
@@ -20,7 +20,7 @@ function registerVisualDnaTools(server, client, options = {}) {
20
20
  // ─── create_visual_dna ─────────────────────────────────────
21
21
  server.tool(
22
22
  'create_visual_dna',
23
- 'Create a Visual DNA profile from reference media. Each item in images/video/audio can be a public URL or an absolute local file path. Max 4 images, 1 video, 1 audio. Files capped at 25MB each. For CHARACTER DNAs, a multi-angle character sheet dramatically improves consistency — offer to generate one with `generate_character_sheet` first, then pass its URL as `character_sheet_url` here (see that tool).',
23
+ 'Create a Visual DNA profile from reference media. Each item in images/video/audio can be a public URL or an absolute local file path. Max 4 images, 1 video, 1 audio. Files capped at 25MB each. For EVERY DNA type, a reference sheet dramatically improves consistency (character turnaround / product details / location angles / style board) — offer to generate one with `generate_character_sheet` (matching `sheet_type`) first, then pass its URL as `character_sheet_url` here (see that tool).',
24
24
  {
25
25
  name: z.string().describe('Name of the Visual DNA profile. **Pick a short, lowercase, no-space single token** (e.g. `maya`, `tokyo_neon`, `brand_red`, `esther_model`) — never names with spaces (`Sarah Johnson` ❌). The user/LLM types this as `@<name>` inside generation prompts, and the @ parser stops at the first space, so `@Sarah Johnson` matches only `Sarah` and the binding silently drops. Multi-word concepts should use underscores or be a single token. Names are case-insensitive on lookup, but **reserved** values rejected on creation: `Image1`, `Image2`, …, `Video1`, …, `Audio1`, … (any-language characters allowed; max 100 chars).'),
26
26
  dna_type: z.string().optional().describe('Type: "character", "style", "product", "scene", "environment". Default: "character"'),
@@ -28,7 +28,7 @@ function registerVisualDnaTools(server, client, options = {}) {
28
28
  images: z.array(z.string()).optional().describe('Array of image sources (URLs or absolute local paths). Max 4.'),
29
29
  video: z.string().optional().describe('Optional video source (URL or absolute local path)'),
30
30
  audio: z.string().optional().describe('Optional audio source (URL or absolute local path)'),
31
- character_sheet_url: z.string().optional().describe('URL of a multi-angle character sheet (from `generate_character_sheet`) to set as the DNA\'s primary reference. Strongly recommended for character DNAsit is the single biggest consistency booster. Omit for non-character DNAs or when the user declines.')
31
+ character_sheet_url: z.string().optional().describe('URL of a reference sheet (from `generate_character_sheet`, any sheet_type) to set as the DNA\'s primary reference. Works for ALL DNA types — character turnaround, product detail sheet, location sheet, or style board and is the single biggest consistency booster. Omit only when the user declines.')
32
32
  },
33
33
  async ({ name, dna_type, prompt_helper, images, video, audio, character_sheet_url }) => {
34
34
  if (!name || !name.trim()) {
@@ -164,12 +164,13 @@ function registerVisualDnaTools(server, client, options = {}) {
164
164
  // ─── generate_character_sheet ──────────────────────────────
165
165
  server.tool(
166
166
  'generate_character_sheet',
167
- 'Generate a multi-angle character sheet (turnaround) from 1+ reference image URLs — the same step the in-app Visual DNA wizard offers. The sheet is the single strongest consistency booster for a character DNA. CHARGES CREDITS, so when the user is about to create a character DNA, OFFER this first ("want me to generate a character sheet for stronger consistency? it costs a few credits") and only run it on a yes. Returns `character_sheet_url` — pass it as `character_sheet_url` to `create_visual_dna`.',
167
+ 'Generate a reference sheet for a Visual DNA from 1+ reference image URLs — the same step the in-app Visual DNA wizard offers, for EVERY DNA type via `sheet_type`: character = multi-angle turnaround, product = angles + branding/material/construction close-ups, environment = location angles + one signature detail, style = a style board (the same look applied to six varied subjects). The sheet is the single strongest consistency booster for a DNA, and it always preserves the reference\'s original art style (2D stays 2D, photo stays photo). CHARGES CREDITS, so when the user is about to create a DNA, OFFER this first ("want me to generate a reference sheet for stronger consistency? it costs a few credits") and only run it on a yes. Returns `character_sheet_url` — pass it as `character_sheet_url` to `create_visual_dna` with the matching `dna_type`.',
168
168
  {
169
- image_urls: z.array(z.string()).min(1).describe('Reference image URLs of the character (front/side/varied angles work best). Use generated-image URLs or upload_media output.')
169
+ image_urls: z.array(z.string()).min(1).describe('Reference image URLs of the subject (for characters: front/side/varied angles work best). Use generated-image URLs or upload_media output.'),
170
+ sheet_type: z.enum(['character', 'product', 'environment', 'style']).optional().describe('Which sheet layout to generate — match the DNA type it will be attached to. Defaults to character.')
170
171
  },
171
- async ({ image_urls }) => {
172
- const result = await client.post('/v1/visual-dna/character-sheet', { image_urls });
172
+ async ({ image_urls, sheet_type }) => {
173
+ const result = await client.post('/v1/visual-dna/character-sheet', { image_urls, ...(sheet_type ? { sheet_type } : {}) });
173
174
  return {
174
175
  content: [{
175
176
  type: 'text',