@kolbo/mcp 1.124.0 → 1.125.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.124.0",
3
+ "version": "1.125.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": {
@@ -379,14 +379,26 @@ function registerProjectTools(server, client) {
379
379
 
380
380
  server.tool(
381
381
  'get_project_story',
382
- 'Read the STORY of a project you own — its public page written as an ordered post (headings, text, media, workflow steps with their real prompts, before/after pairs) — plus `available_media`: every item the story may use (this project\'s generated results and the owner\'s own uploads), with media_id, type, prompt and model. Call this FIRST before writing or editing a story: you need the `version` (pass it back as `base_version`) and the media ids. Also returns whether the project is published and its listing status.',
383
- { project_id: z.string().describe('ObjectId of a project you OWN.') },
384
- async ({ project_id }) => pubText(await client.get(`/v1/projects/${encodeURIComponent(project_id)}/publish/story`))
382
+ 'Read the STORY of a project you own — its public page written as an ordered post (headings, text, media, workflow steps with their real prompts, before/after pairs) — plus `available_media`: the items the story may use (this project\'s generated results and the owner\'s own uploads, newest 200). Each item is COMPACT by default: media_id, file name (generation ids are in it), type, model and the first 120 characters of its prompt. Narrow the list with `search` (file name or prompt text) or `media_type`; pass `media: "full"` only when you need urls and complete prompts, or `media: "none"` when you only need the version. Call this FIRST before writing or editing a story: you need the `version` (pass it back as `base_version`) and the media ids. Also returns whether the project is published and its listing status.',
383
+ {
384
+ project_id: z.string().describe('ObjectId of a project you OWN.'),
385
+ media: z.enum(['compact', 'full', 'none']).optional().describe('How to list available_media. compact (default) = id, file name, type, model, prompt opening. full = urls and complete prompts (large). none = leave the list out.'),
386
+ media_type: z.enum(['image', 'video', 'audio']).optional().describe('Only list this media type.'),
387
+ search: z.string().optional().describe('Only list items whose file name or prompt contains this text, e.g. a generation id.')
388
+ },
389
+ async ({ project_id, media, media_type, search }) => {
390
+ const q = new URLSearchParams();
391
+ if (media) q.set('media', media);
392
+ if (media_type) q.set('media_type', media_type);
393
+ if (search) q.set('search', search);
394
+ const qs = q.toString();
395
+ return pubText(await client.get(`/v1/projects/${encodeURIComponent(project_id)}/publish/story${qs ? `?${qs}` : ''}`));
396
+ }
385
397
  );
386
398
 
387
399
  server.tool(
388
400
  'update_project_story',
389
- 'REPLACE the story of a project you own (the public page\'s post) with the blocks you pass, in order. Read `get_project_story` first and pass its `version` as `base_version`: if the owner (or another agent) saved in between you get STORY_VERSION_CONFLICT — read again and re-apply. Blocks reference media by media_id from `available_media`; to use a NEW image or video, put it in the project first (`upload_media` with `project_id`, or generate with `project_id`). A `step` shows the generation\'s real prompt and model automatically — never retype them. Invalid blocks come back as `errors` with the block `index`; nothing is saved until all are valid. `warnings` are advice (missing captions, no steps). Good structure: hero media → short intro → "How it was made" heading → 3-8 steps in order → before/after where an upload became a result → one closing line. If the project is published the change is live at once, so confirm with the user before replacing a story they wrote.',
401
+ 'REPLACE the story of a project you own (the public page\'s post) with the blocks you pass, in order. Read `get_project_story` first and pass its `version` as `base_version`: if the owner (or another agent) saved in between you get STORY_VERSION_CONFLICT — read again and re-apply. Blocks reference media by media_id from `available_media`; to use a NEW image or video, put it in the project first (`upload_media` with `project_id`, or generate with `project_id`). A `step` shows the generation\'s real prompt and model automatically — never retype them. Invalid blocks come back as `errors` with the block `index`; nothing is saved until all are valid. The saved story comes back compact (each block\'s media as id, file name and prompt opening); read the new `version` from it. `warnings` are advice (missing captions, no steps). Good structure: hero media → short intro → "How it was made" heading → 3-8 steps in order → before/after where an upload became a result → one closing line. If the project is published the change is live at once, so confirm with the user before replacing a story they wrote.',
390
402
  {
391
403
  project_id: z.string().describe('ObjectId of a project you OWN.'),
392
404
  blocks: z.array(storyBlock).describe('The whole story, in order (max 60 blocks). An empty array clears it.'),