@kolbo/mcp 1.33.0 → 1.34.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
+ | `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) |
236
237
  | `check_credits` | Check credit balance |
237
238
  | `get_generation_status` | Check one or many generations (`generation_ids`); `wait=true` blocks server-side until done — replaces client polling loops |
238
239
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolbo/mcp",
3
- "version": "1.33.0",
3
+ "version": "1.34.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": {
@@ -158,6 +158,76 @@ function registerVisualDnaTools(server, client, options = {}) {
158
158
  };
159
159
  }
160
160
  );
161
+
162
+ // ─── Visual DNA folders (organize characters) ──────────────
163
+ // Folders are user-scoped and flat. Only PERSONAL Visual DNAs can live in
164
+ // folders — global/organization presets are rejected by the server.
165
+
166
+ server.tool(
167
+ 'list_visual_dna_folders',
168
+ 'List the user\'s Visual DNA folders with per-folder item counts. Use to organize large character casts: find the right folder before moving a DNA, or show the user how their characters are grouped. To list the DNAs INSIDE a folder, call `list_visual_dnas` and filter by the `folder_id` field on each profile.',
169
+ {},
170
+ async () => {
171
+ const result = await client.get('/v1/visual-dna/folders');
172
+ return { content: [{ type: 'text', text: JSON.stringify({ folders: result.folders || [], count: result.count || 0 }, null, 2) }] };
173
+ }
174
+ );
175
+
176
+ server.tool(
177
+ 'create_visual_dna_folder',
178
+ 'Create a Visual DNA folder for organizing characters (e.g. "Main Cast", "Villains", "Film X Characters"). Folder names are unique per user (409 on duplicates). Then use `move_visual_dna_to_folder` to file DNAs into it.',
179
+ {
180
+ name: z.string().describe('Folder name (max 100 chars, unique per user).'),
181
+ color: z.string().optional().describe('Optional hex color for the folder chip, e.g. "#FF5733".')
182
+ },
183
+ async ({ name, color }) => {
184
+ const body = { name };
185
+ if (color) body.color = color;
186
+ const result = await client.post('/v1/visual-dna/folders', body);
187
+ return { content: [{ type: 'text', text: JSON.stringify(result.folder, null, 2) }] };
188
+ }
189
+ );
190
+
191
+ server.tool(
192
+ 'update_visual_dna_folder',
193
+ 'Rename and/or recolor a Visual DNA folder.',
194
+ {
195
+ folder_id: z.string().describe('The folder id (from list_visual_dna_folders).'),
196
+ name: z.string().describe('New folder name (required by the server — pass the current name to keep it).'),
197
+ color: z.string().optional().describe('New hex color, e.g. "#00AA00".')
198
+ },
199
+ async ({ folder_id, name, color }) => {
200
+ const body = { name };
201
+ if (color !== undefined) body.color = color;
202
+ const result = await client.put(`/v1/visual-dna/folders/${encodeURIComponent(folder_id)}`, body);
203
+ return { content: [{ type: 'text', text: JSON.stringify(result.folder, null, 2) }] };
204
+ }
205
+ );
206
+
207
+ server.tool(
208
+ 'delete_visual_dna_folder',
209
+ 'Delete a Visual DNA folder. The DNAs inside are NOT deleted — they move back to the root level (response includes items_moved_to_root). Safe to call without confirmation for empty folders; mention the contents-move when the folder has items.',
210
+ {
211
+ folder_id: z.string().describe('The folder id to delete.')
212
+ },
213
+ async ({ folder_id }) => {
214
+ const result = await client.delete(`/v1/visual-dna/folders/${encodeURIComponent(folder_id)}`);
215
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
216
+ }
217
+ );
218
+
219
+ server.tool(
220
+ 'move_visual_dna_to_folder',
221
+ 'Move a Visual DNA into a folder, or back to root. Personal DNAs only — global presets must be imported first, and organization DNAs cannot go in personal folders. When creating many characters for a project, create a folder first and file each DNA as you go.',
222
+ {
223
+ visual_dna_id: z.string().describe('The Visual DNA profile id to move.'),
224
+ folder_id: z.string().nullable().describe('Target folder id (from list_visual_dna_folders), or null to move the DNA back to root.')
225
+ },
226
+ async ({ visual_dna_id, folder_id }) => {
227
+ const result = await client.put(`/v1/visual-dna/${encodeURIComponent(visual_dna_id)}/folder`, { folder_id: folder_id ?? null });
228
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
229
+ }
230
+ );
161
231
  }
162
232
 
163
233
  module.exports = { registerVisualDnaTools };