@kolbo/mcp 1.3.2 → 1.5.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/README.md CHANGED
@@ -19,7 +19,7 @@ Add to `.claude/settings.json`:
19
19
  "mcpServers": {
20
20
  "kolbo": {
21
21
  "command": "npx",
22
- "args": ["-y", "@kolbo/mcp"],
22
+ "args": ["-y", "@kolbo/mcp@latest"],
23
23
  "env": {
24
24
  "KOLBO_API_KEY": "kolbo_live_..."
25
25
  }
@@ -39,6 +39,8 @@ Just ask Claude naturally:
39
39
  - *"Make a lo-fi hip hop beat"*
40
40
  - *"Read this out loud with a British female voice"*
41
41
  - *"Ask Claude about the latest AI news with web search on"*
42
+ - *"Analyze this video and tell me what prompts are shown on screen"*
43
+ - *"What's in this image?"*
42
44
  - *"Create a Visual DNA profile called 'Alex' from these images"*
43
45
 
44
46
  ## Available Tools (30)
@@ -63,10 +65,10 @@ Just ask Claude naturally:
63
65
 
64
66
  Every image/video/creative-director tool accepts `visual_dna_ids` and `moodboard_id` for character/style consistency across outputs — you can compose `create_visual_dna` → `generate_image` (with the DNA applied server-side) in a single agent turn. `generate_creative_director` also accepts `moodboard_ids` plural for blending.
65
67
 
66
- **Chat**
68
+ **Chat & Vision**
67
69
  | Tool | Description |
68
70
  |------|-------------|
69
- | `chat_send_message` | Multi-turn chat with any Kolbo model; supports web search and deep think |
71
+ | `chat_send_message` | Multi-turn chat with any Kolbo model. Pass `media_urls` to analyze images, videos, or audio — auto-routes to Gemini for vision. Supports web search and deep think. |
70
72
  | `chat_list_conversations` | List past chat threads |
71
73
  | `chat_get_messages` | Fetch messages in a conversation |
72
74
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolbo/mcp",
3
- "version": "1.3.2",
3
+ "version": "1.5.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": {
package/src/client.js CHANGED
@@ -91,7 +91,7 @@ function xdgDataDir() {
91
91
  }
92
92
 
93
93
  /**
94
- * Read the Kolbo CLI's auth store. The CLI writes credentials to
94
+ * Read the Kolbo Code auth store. Kolbo Code writes credentials to
95
95
  * <xdg-data>/kolbo/auth.json after device-code login.
96
96
  *
97
97
  * On Windows (Git Bash / MSYS2) xdg-basedir resolves to ~/.local/share,
package/src/tools/chat.js CHANGED
@@ -10,17 +10,18 @@ function registerChatTools(server, client) {
10
10
  // ─── chat_send_message ─────────────────────────────────────
11
11
  server.tool(
12
12
  'chat_send_message',
13
- 'Send a chat message to Kolbo AI. Starts a new conversation (omit session_id) or continues an existing one. Returns the assistant response when complete. Supports web search and deep think modes.',
13
+ 'Send a chat message to Kolbo AI. Starts a new conversation (omit session_id) or continues an existing one. Returns the assistant response when complete. Supports image/video/audio analysis via media_urls — pass public URLs and the model auto-routes to a vision-capable model (e.g. Gemini) when media is detected. Supports web search and deep think modes.',
14
14
  {
15
15
  message: z.string().describe('The user message to send'),
16
- model: z.string().optional().describe('Model identifier (e.g. "gpt-4o", "claude-sonnet-4-5"). Omit for Smart Select (auto).'),
16
+ model: z.string().optional().describe('Model identifier (e.g. "gpt-4o", "claude-sonnet-4-5", "gemini-2.5-pro"). Omit for Smart Select (auto). For image/video/audio analysis, prefer "gemini-2.5-pro" or omit to auto-route.'),
17
17
  session_id: z.string().optional().describe('Existing chat session ID to continue. Omit to start a new conversation.'),
18
18
  system_prompt: z.string().optional().describe('System prompt for the conversation. Only applied when creating a new session.'),
19
19
  web_search: z.boolean().optional().describe('Enable web search for this message. Default: false'),
20
20
  deep_think: z.boolean().optional().describe('Enable deep think (extended reasoning). Default: false'),
21
- enhance_prompt: z.boolean().optional().describe('Enhance the prompt. Default: true')
21
+ enhance_prompt: z.boolean().optional().describe('Enhance the prompt. Default: true'),
22
+ media_urls: z.array(z.string()).optional().describe('Public URLs of images, videos, or audio files to analyze. The model auto-routes to a vision-capable model when media is present. Use upload_media first to get a public URL for local files.')
22
23
  },
23
- async ({ message, model, session_id, system_prompt, web_search, deep_think, enhance_prompt }) => {
24
+ async ({ message, model, session_id, system_prompt, web_search, deep_think, enhance_prompt, media_urls }) => {
24
25
  const gen = await client.post('/v1/chat', {
25
26
  message,
26
27
  model,
@@ -28,7 +29,8 @@ function registerChatTools(server, client) {
28
29
  system_prompt,
29
30
  web_search,
30
31
  deep_think,
31
- enhance_prompt
32
+ enhance_prompt,
33
+ media_urls
32
34
  });
33
35
 
34
36
  // Deep think reasoning can run far longer than normal chat. Also grant
@@ -11,7 +11,7 @@ function registerModelTools(server, client) {
11
11
  'list_models',
12
12
  'List available AI models on Kolbo. Filter by type to find models for a specific generation type.',
13
13
  {
14
- type: z.string().optional().describe('Filter by type: "image", "video", "video_from_image", "music", "speech", "sound". Omit for all models.')
14
+ type: z.string().optional().describe('Filter by type: "image", "image_edit", "video", "video_from_image", "video_from_video", "music", "speech", "sound", "chat", "lipsync", "three_d", "elements", "first_last_frame", "transcription". Omit for all models.')
15
15
  },
16
16
  async ({ type }) => {
17
17
  const path = type ? `/v1/models?type=${encodeURIComponent(type)}` : '/v1/models';
@@ -9,10 +9,15 @@ function registerMoodboardTools(server, client) {
9
9
  // ─── list_moodboards ───────────────────────────────────────
10
10
  server.tool(
11
11
  'list_moodboards',
12
- 'List moodboards available to you: your own, system presets, and any organization moodboards. Returns id, name, master_prompt, thumbnail, and image URLs for each.',
13
- {},
14
- async () => {
15
- const result = await client.get('/v1/moodboards');
12
+ 'List moodboards. By default returns ALL (personal + system presets + organization). Use "scope" to filter: "personal" (user\'s own), "preset" or "global" (system presets), or "organization" (org-shared). Returns id, name, master_prompt, thumbnail, and image URLs for each.',
13
+ {
14
+ scope: z.enum(['all', 'personal', 'preset', 'global', 'organization']).optional().describe('Filter by scope. Default: "all" (everything accessible). "personal" = only your own. "preset"/"global" = system presets. "organization" = org-shared.')
15
+ },
16
+ async ({ scope } = {}) => {
17
+ const params = new URLSearchParams();
18
+ if (scope && scope !== 'all') params.set('scope', scope);
19
+ const qs = params.toString();
20
+ const result = await client.get(`/v1/moodboards${qs ? '?' + qs : ''}`);
16
21
  return {
17
22
  content: [{
18
23
  type: 'text',
@@ -76,10 +76,21 @@ function registerVisualDnaTools(server, client) {
76
76
  // ─── list_visual_dnas ──────────────────────────────────────
77
77
  server.tool(
78
78
  'list_visual_dnas',
79
- 'List your Visual DNA profiles. Returns id, name, type, and thumbnail for each.',
80
- {},
81
- async () => {
82
- const result = await client.get('/v1/visual-dna');
79
+ 'List Visual DNA profiles. By default returns ALL (personal + global cast presets + organization). Use "scope" to filter: "personal" (user\'s own), "global" (system cast/presets), or "organization" (org-shared). Use "search" to filter by name/tags/description. Use "collection" to filter global presets by collection (cast, influencers, props, locations, styles, glamour, street).',
80
+ {
81
+ scope: z.enum(['all', 'personal', 'global', 'organization']).optional().describe('Filter by scope. Default: "all" (everything accessible). "personal" = only your own. "global" = system presets/cast. "organization" = org-shared.'),
82
+ search: z.string().optional().describe('Search by name, tags, or description (case-insensitive)'),
83
+ collection: z.string().optional().describe('Filter global presets by collection: cast, influencers, props, locations, styles, glamour, street'),
84
+ tags: z.string().optional().describe('Comma-separated tags to filter by (OR logic)')
85
+ },
86
+ async ({ scope, search, collection, tags } = {}) => {
87
+ const params = new URLSearchParams();
88
+ if (scope && scope !== 'all') params.set('scope', scope);
89
+ if (search) params.set('search', search);
90
+ if (collection) params.set('collection', collection);
91
+ if (tags) params.set('tags', tags);
92
+ const qs = params.toString();
93
+ const result = await client.get(`/v1/visual-dna${qs ? '?' + qs : ''}`);
83
94
  return {
84
95
  content: [{
85
96
  type: 'text',