@kolbo/mcp 1.86.4 → 1.87.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
@@ -296,3 +296,7 @@ Both are optional — the local install logs in via the browser on first use.
296
296
  - [API Documentation](https://docs.kolbo.ai/developer-api)
297
297
  - [Kolbo AI Platform](https://kolbo.ai)
298
298
  - [Get API Key](https://app.kolbo.ai)
299
+
300
+ ### Chat thinking level
301
+
302
+ `chat_send_message` accepts optional `thinking_level`, using an ID from `list_models` with `type: "text"`. The server validates it against the resolved model; omitted or invalid values use `thinkingDefault`. Existing safeguards and legacy `deep_think` take precedence. Discover allowed levels through `thinkingLevels`; no package update is required when the server changes a model capability.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolbo/mcp",
3
- "version": "1.86.4",
3
+ "version": "1.87.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": {
package/src/tools/chat.js CHANGED
@@ -19,11 +19,12 @@ function registerChatTools(server, client) {
19
19
  system_prompt: z.string().optional().describe('System prompt for the conversation. Only applied when creating a new session.'),
20
20
  web_search: z.boolean().optional().describe('Enable web search for this message. Default: false'),
21
21
  deep_think: z.boolean().optional().describe('Enable deep think (extended reasoning). Default: false'),
22
+ thinking_level: z.string().optional().describe('Thinking effort ID from list_models type="text" thinkingLevels. The server uses the model catalog default when omitted or invalid. Separate from legacy deep_think; safeguards take precedence.'),
22
23
  enhance_prompt: z.boolean().optional().describe('Enhance the prompt. Default: false — only pass true if the user explicitly asks to enhance/improve the prompt.'),
23
24
  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. For a local file, get a URL first via the LOCAL FILE route in this tool\'s description.'),
24
25
  project_id: projectIdField
25
26
  },
26
- async ({ message, model, session_id, system_prompt, web_search, deep_think, enhance_prompt = false, media_urls, project_id }) => {
27
+ async ({ message, model, session_id, system_prompt, web_search, deep_think, thinking_level, enhance_prompt = false, media_urls, project_id }) => {
27
28
  // Every generate_* tool resolves its model this way; chat was the one
28
29
  // `model` arg that went straight to the API, which has no fuzzy matching.
29
30
  // So the display names list_models hands back ("Claude Fable 5") came
@@ -38,6 +39,7 @@ function registerChatTools(server, client) {
38
39
  system_prompt,
39
40
  web_search,
40
41
  deep_think,
42
+ ...(thinking_level !== undefined ? { thinking_level } : {}),
41
43
  enhance_prompt,
42
44
  media_urls,
43
45
  project_id
@@ -192,6 +192,9 @@ function registerModelTools(server, client, options = {}) {
192
192
  // model says no, and absence means the API doesn't expose the field.
193
193
  const formatSpecs = m => {
194
194
  const parts = [];
195
+ if (m.haveThinking && Array.isArray(m.thinkingLevels) && m.thinkingLevels.length) {
196
+ parts.push(`thinking_level: ${m.thinkingLevels.map(level => level.id).join('/')} (default ${m.thinkingDefault})`);
197
+ }
195
198
  const types = Array.isArray(m.types) ? m.types : [];
196
199
  const isVideoType = types.some(t =>
197
200
  ['text_to_video', 'img_to_video', 'video_to_video', 'elements',