@kolbo/mcp 1.35.1 → 1.36.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/README.md CHANGED
@@ -233,6 +233,7 @@ Every generation tool also accepts an optional `project_id` arg that routes the
233
233
  | `list_projects` | List owned + shared projects (id, name, role, is_default) — call first to resolve a project name into the `project_id` you pass to generation tools |
234
234
  | `move_session` | Move a session (generation, chat, transcription…) and ALL its media to another project |
235
235
  | `create_doc` / `list_docs` / `get_doc` / `update_doc` / `share_doc` / `delete_doc` | AI Docs (Magic Pad): author project-scoped HTML documents, edit them, get public share links |
236
+ | `generate_character_sheet` | Generate a multi-angle character sheet from reference images (credits) → pass URL to create_visual_dna for stronger character consistency |
236
237
  | `list_visual_dna_folders` / `create_visual_dna_folder` / `update_visual_dna_folder` / `delete_visual_dna_folder` / `move_visual_dna_to_folder` | Organize Visual DNA characters into user folders (create/rename/recolor/delete + move DNAs in/out) |
237
238
  | `create_project` / `update_project` / `archive_project` / `unarchive_project` | Project lifecycle (create/rename/describe/archive; deletion stays in-app) |
238
239
  | `list_sessions` | Enumerate sessions across all types, filterable by project and type |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolbo/mcp",
3
- "version": "1.35.1",
3
+ "version": "1.36.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": {
@@ -20,16 +20,17 @@ 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.',
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).',
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"'),
27
27
  prompt_helper: z.string().optional().describe('Optional description/notes to guide DNA extraction'),
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
- audio: z.string().optional().describe('Optional audio source (URL or absolute local path)')
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 DNAs — it is the single biggest consistency booster. Omit for non-character DNAs or when the user declines.')
31
32
  },
32
- async ({ name, dna_type, prompt_helper, images, video, audio }) => {
33
+ async ({ name, dna_type, prompt_helper, images, video, audio, character_sheet_url }) => {
33
34
  if (!name || !name.trim()) {
34
35
  throw new Error('name is required');
35
36
  }
@@ -53,6 +54,7 @@ function registerVisualDnaTools(server, client, options = {}) {
53
54
  form.append('name', name);
54
55
  if (dna_type) form.append('dnaType', dna_type);
55
56
  if (prompt_helper) form.append('promptHelper', prompt_helper);
57
+ if (character_sheet_url) form.append('characterSheetUrl', character_sheet_url);
56
58
 
57
59
  for (const f of imageFiles) {
58
60
  form.append('images', f.buffer, { filename: f.filename, contentType: f.contentType });
@@ -159,6 +161,28 @@ function registerVisualDnaTools(server, client, options = {}) {
159
161
  }
160
162
  );
161
163
 
164
+ // ─── generate_character_sheet ──────────────────────────────
165
+ server.tool(
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`.',
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.')
170
+ },
171
+ async ({ image_urls }) => {
172
+ const result = await client.post('/v1/visual-dna/character-sheet', { image_urls });
173
+ return {
174
+ content: [{
175
+ type: 'text',
176
+ text: JSON.stringify({
177
+ character_sheet_url: result.character_sheet_url,
178
+ credits_used: result.credits_used,
179
+ _hint: 'Show the sheet to the user, then pass character_sheet_url to create_visual_dna as that DNA\'s reference.'
180
+ }, null, 2)
181
+ }]
182
+ };
183
+ }
184
+ );
185
+
162
186
  // ─── Visual DNA folders (organize characters) ──────────────
163
187
  // Folders are user-scoped and flat. Only PERSONAL Visual DNAs can live in
164
188
  // folders — global/organization presets are rejected by the server.