freebeat-mcp 0.1.1 → 0.1.3

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.
Files changed (35) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +102 -3
  3. package/dist/capabilities/media/register.d.ts +3 -0
  4. package/dist/capabilities/media/register.js +13 -0
  5. package/dist/capabilities/media/register.js.map +1 -0
  6. package/dist/capabilities/media/tools/edit-image.d.ts +3 -0
  7. package/dist/capabilities/media/tools/edit-image.js +53 -0
  8. package/dist/capabilities/media/tools/edit-image.js.map +1 -0
  9. package/dist/capabilities/media/tools/generate-image.d.ts +3 -0
  10. package/dist/capabilities/media/tools/generate-image.js +53 -0
  11. package/dist/capabilities/media/tools/generate-image.js.map +1 -0
  12. package/dist/capabilities/media/tools/generate-video.d.ts +3 -0
  13. package/dist/capabilities/media/tools/generate-video.js +58 -0
  14. package/dist/capabilities/media/tools/generate-video.js.map +1 -0
  15. package/dist/capabilities/media/tools/get-model-help.d.ts +2 -0
  16. package/dist/capabilities/media/tools/get-model-help.js +26 -0
  17. package/dist/capabilities/media/tools/get-model-help.js.map +1 -0
  18. package/dist/capabilities/media/tools/list-models.d.ts +2 -0
  19. package/dist/capabilities/media/tools/list-models.js +32 -0
  20. package/dist/capabilities/media/tools/list-models.js.map +1 -0
  21. package/dist/capabilities/media/tools/shared.d.ts +42 -0
  22. package/dist/capabilities/media/tools/shared.js +72 -0
  23. package/dist/capabilities/media/tools/shared.js.map +1 -0
  24. package/dist/capabilities/tasks/tools/get-task-status.d.ts +1 -1
  25. package/dist/capabilities/tasks/tools/get-task-status.js +78 -2
  26. package/dist/capabilities/tasks/tools/get-task-status.js.map +1 -1
  27. package/dist/core/model-catalog.d.ts +48 -0
  28. package/dist/core/model-catalog.js +291 -0
  29. package/dist/core/model-catalog.js.map +1 -0
  30. package/dist/index.js +2 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/services/freebeat-api.d.ts +110 -0
  33. package/dist/services/freebeat-api.js +96 -0
  34. package/dist/services/freebeat-api.js.map +1 -1
  35. package/package.json +3 -2
package/CHANGELOG.md ADDED
@@ -0,0 +1,17 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on Keep a Changelog, and this project follows Semantic Versioning.
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [0.1.3] - 2026-06-18
10
+
11
+ ### Added
12
+ - Added Open RPC model discovery with `list_models` and `get_model_help`.
13
+ - Added image generation, single-image editing, and text-to-video MCP tools.
14
+ - Added Open RPC batch status support through `get_task_status`.
15
+
16
+ ### Changed
17
+ - Documented image/video generation workflows and batch result handling in the README.
package/README.md CHANGED
@@ -4,7 +4,7 @@ MCP server for Freebeat creative workflows.
4
4
 
5
5
  Use it from MCP clients such as Claude Desktop and Cursor through `npx freebeat-mcp`.
6
6
 
7
- It currently supports audio and image upload, effect template discovery, AI effect generation, AI music video generation, and async task polling.
7
+ It currently supports audio and image upload, effect template discovery, AI effect generation, AI music video generation, Open RPC image/video generation, model discovery, and async task polling.
8
8
 
9
9
  ## Features
10
10
 
@@ -13,6 +13,9 @@ It currently supports audio and image upload, effect template discovery, AI effe
13
13
  - Supported effect template listing
14
14
  - AI effect generation
15
15
  - AI music video generation
16
+ - Supported image and video model discovery
17
+ - AI image generation and single-image editing
18
+ - AI text-to-video generation
16
19
  - Generic task polling and result retrieval
17
20
 
18
21
  ## Installation
@@ -176,11 +179,106 @@ Returns a task envelope with:
176
179
  - `task_type` currently `music_video_generation`
177
180
  - `status`
178
181
 
182
+ ### `list_models`
183
+
184
+ List supported Open RPC models for either `image` or `video`.
185
+
186
+ Recommended flow:
187
+
188
+ - `list_models` with `type: "image"` before `generate_image` or `edit_image`
189
+ - `list_models` with `type: "video"` before `generate_video`
190
+ - optional `get_model_help` for model-specific examples and constraints
191
+
192
+ Each model entry includes:
193
+
194
+ - `model_id`
195
+ - `model`, the API model key when one is available
196
+ - `display_name`
197
+ - `commands`
198
+ - `constraints`
199
+
200
+ ### `get_model_help`
201
+
202
+ Show detailed usage guidance for one Open RPC model.
203
+
204
+ Parameters:
205
+
206
+ - `model` required, using either a numeric `model_id` or API model key from `list_models`
207
+
208
+ Use this before video generation to confirm required `duration`, `resolution`, supported `aspect_ratio`, and whether `generate_audio` is supported.
209
+
210
+ ### `generate_image`
211
+
212
+ Create an async Open RPC image generation batch.
213
+
214
+ Recommended flow:
215
+
216
+ - `list_models` with `type: "image"`
217
+ - optional `get_model_help`
218
+ - `generate_image`
219
+ - `get_task_status` with the returned `batch_id`
220
+
221
+ Parameters:
222
+
223
+ - `model` required, from `list_models`
224
+ - `prompt` required, trimmed length must be `1` to `2000`
225
+ - `size` optional
226
+ - `resolution` optional
227
+ - `quality` optional
228
+ - `count` optional, default `1`
229
+
230
+ For GPT-Image 2 (`model_id` `108`), the MCP server sends `quality: "medium"` and `resolution: "1024x1024"` by default when omitted. If `resolution` is omitted but `size` is provided, that `size` is also sent as `resolution` for compatibility.
231
+
232
+ ### `edit_image`
233
+
234
+ Create an async Open RPC single-image edit batch.
235
+
236
+ Recommended flow:
237
+
238
+ - `upload_image` or provide an existing image URL
239
+ - `list_models` with `type: "image"`
240
+ - optional `get_model_help`
241
+ - `edit_image`
242
+ - `get_task_status` with the returned `batch_id`
243
+
244
+ Parameters:
245
+
246
+ - `model` required, from `list_models`
247
+ - `image` required, a single image URL
248
+ - `prompt` required, trimmed length must be `1` to `2000`
249
+ - `resolution` optional
250
+ - `quality` optional
251
+ - `count` optional, default `1`
252
+
253
+ ### `generate_video`
254
+
255
+ Create an async Open RPC text-to-video batch.
256
+
257
+ Recommended flow:
258
+
259
+ - `list_models` with `type: "video"`
260
+ - `get_model_help`
261
+ - `generate_video`
262
+ - `get_task_status` with the returned `batch_id`
263
+
264
+ Parameters:
265
+
266
+ - `model` required, from `list_models`
267
+ - `prompt` required, trimmed length must be `1` to `2000`
268
+ - `duration` required when the selected model declares supported durations
269
+ - `resolution` required when the selected model declares supported resolutions
270
+ - `aspect_ratio` optional, validated when the selected model declares supported ratios
271
+ - `generate_audio` optional, only accepted for models that support generated audio
272
+
273
+ Video model constraints are validated locally before a request is sent.
274
+
179
275
  ### `get_task_status`
180
276
 
181
- Poll a Freebeat async task until it reaches a terminal status. Current MCP endpoints return lowercase status values such as `pending`, `completed`, and `failed`; older backends may still return uppercase variants.
277
+ Poll a Freebeat async task or Open RPC batch until it reaches a terminal status. Current MCP endpoints return lowercase status values such as `pending`, `completed`, and `failed`; older backends may still return uppercase variants.
278
+
279
+ For legacy MV/effect tasks, continue polling while the status is still in progress. Only call `get_task_result` after the status is `completed`.
182
280
 
183
- Continue polling while the status is still in progress. Only call `get_task_result` after the status is `completed`.
281
+ For Open RPC image/video batches, pass the returned `batch_id` as `task_id`. You can also pass `serial_no` to query a single batch item. Completed batch items include result URLs directly in `get_task_status`, so `get_task_result` is not used for Open RPC batches.
184
282
 
185
283
  Returns a stable task envelope including:
186
284
 
@@ -190,6 +288,7 @@ Returns a stable task envelope including:
190
288
  - `error_message` optional, present when backend reports a failed task
191
289
  - `error_code` optional, present when backend reports a failed task
192
290
  - `message` optional, present when status is `completed` or `failed`
291
+ - `items` optional, present for Open RPC batches and containing `image_url`, `video_url`, or `edit_images` when available
193
292
 
194
293
  ### `get_task_result`
195
294
 
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { FreebeatApiClient } from "../../services/freebeat-api.js";
3
+ export declare function registerMediaTools(server: McpServer, client: FreebeatApiClient): void;
@@ -0,0 +1,13 @@
1
+ import { registerEditImageTool } from "./tools/edit-image.js";
2
+ import { registerGenerateImageTool } from "./tools/generate-image.js";
3
+ import { registerGenerateVideoTool } from "./tools/generate-video.js";
4
+ import { registerGetModelHelpTool } from "./tools/get-model-help.js";
5
+ import { registerListModelsTool } from "./tools/list-models.js";
6
+ export function registerMediaTools(server, client) {
7
+ registerListModelsTool(server);
8
+ registerGetModelHelpTool(server);
9
+ registerGenerateImageTool(server, client);
10
+ registerEditImageTool(server, client);
11
+ registerGenerateVideoTool(server, client);
12
+ }
13
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../../src/capabilities/media/register.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,MAAM,UAAU,kBAAkB,CAChC,MAAiB,EACjB,MAAyB;IAEzB,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/B,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,yBAAyB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,yBAAyB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { FreebeatApiClient } from "../../../services/freebeat-api.js";
3
+ export declare function registerEditImageTool(server: McpServer, client: Pick<FreebeatApiClient, "createImageBatch">): void;
@@ -0,0 +1,53 @@
1
+ import { z } from "zod";
2
+ import { resolveImageQuality, resolveImageResolution, resolveModelForCommand, } from "../../../core/model-catalog.js";
3
+ import { normalizeGenerationPrompt } from "../../../core/prompt.js";
4
+ import { formatToolError, jsonContent } from "../../../core/response.js";
5
+ import { batchCreateOutputSchema, normalizeBatchCreate } from "./shared.js";
6
+ export function registerEditImageTool(server, client) {
7
+ server.registerTool("edit_image", {
8
+ description: "Create an Open RPC single-image edit batch. Use an image URL, usually from upload_image, then query progress with get_task_status using the returned batch_id.",
9
+ outputSchema: batchCreateOutputSchema,
10
+ inputSchema: {
11
+ model: z.string().min(1).describe("Image edit model id or API model key."),
12
+ image: z.string().min(1).describe("Single image URL to edit."),
13
+ prompt: z
14
+ .string()
15
+ .trim()
16
+ .min(1, "prompt must not be empty or whitespace only")
17
+ .max(2000, "prompt must be at most 2000 characters after trimming")
18
+ .describe("Image edit prompt."),
19
+ resolution: z
20
+ .string()
21
+ .optional()
22
+ .describe("Image resolution for supported models. GPT-Image 2 defaults to 1024x1024."),
23
+ quality: z
24
+ .string()
25
+ .optional()
26
+ .describe("Image quality for supported models. GPT-Image 2 supports low, medium, high."),
27
+ count: z.number().int().positive().optional().default(1).describe("Number of edits."),
28
+ },
29
+ }, async ({ model, image, prompt, resolution, quality, count }) => {
30
+ try {
31
+ const resolvedModel = resolveModelForCommand("image_edit", model);
32
+ const response = await client.createImageBatch({
33
+ items: [
34
+ {
35
+ businessType: 11,
36
+ modelId: String(resolvedModel.modelId),
37
+ generationType: 8,
38
+ prompt: normalizeGenerationPrompt(prompt),
39
+ images: [image],
40
+ resolution: resolveImageResolution(resolvedModel, resolution),
41
+ quality: resolveImageQuality(resolvedModel, quality),
42
+ count,
43
+ },
44
+ ],
45
+ });
46
+ return jsonContent(normalizeBatchCreate(response, "Image edit"));
47
+ }
48
+ catch (error) {
49
+ return formatToolError(error);
50
+ }
51
+ });
52
+ }
53
+ //# sourceMappingURL=edit-image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-image.js","sourceRoot":"","sources":["../../../../src/capabilities/media/tools/edit-image.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAEzE,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAE5E,MAAM,UAAU,qBAAqB,CACnC,MAAiB,EACjB,MAAmD;IAEnD,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;QACE,WAAW,EACT,gKAAgK;QAClK,YAAY,EAAE,uBAAuB;QACrC,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,uCAAuC,CAAC;YAC1E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;YAC9D,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,IAAI,EAAE;iBACN,GAAG,CAAC,CAAC,EAAE,6CAA6C,CAAC;iBACrD,GAAG,CAAC,IAAI,EAAE,uDAAuD,CAAC;iBAClE,QAAQ,CAAC,oBAAoB,CAAC;YACjC,UAAU,EAAE,CAAC;iBACV,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,2EAA2E,CAAC;YACxF,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,6EAA6E,CAAC;YAC1F,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;SACtF;KACF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;QAC7D,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,sBAAsB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YAClE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC;gBAC7C,KAAK,EAAE;oBACL;wBACE,YAAY,EAAE,EAAE;wBAChB,OAAO,EAAE,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC;wBACtC,cAAc,EAAE,CAAC;wBACjB,MAAM,EAAE,yBAAyB,CAAC,MAAM,CAAC;wBACzC,MAAM,EAAE,CAAC,KAAK,CAAC;wBACf,UAAU,EAAE,sBAAsB,CAAC,aAAa,EAAE,UAAU,CAAC;wBAC7D,OAAO,EAAE,mBAAmB,CAAC,aAAa,EAAE,OAAO,CAAC;wBACpD,KAAK;qBACN;iBACF;aACF,CAAC,CAAC;YAEH,OAAO,WAAW,CAAC,oBAAoB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { FreebeatApiClient } from "../../../services/freebeat-api.js";
3
+ export declare function registerGenerateImageTool(server: McpServer, client: Pick<FreebeatApiClient, "createImageBatch">): void;
@@ -0,0 +1,53 @@
1
+ import { z } from "zod";
2
+ import { resolveImageQuality, resolveImageResolution, resolveModelForCommand, } from "../../../core/model-catalog.js";
3
+ import { normalizeGenerationPrompt } from "../../../core/prompt.js";
4
+ import { formatToolError, jsonContent } from "../../../core/response.js";
5
+ import { batchCreateOutputSchema, normalizeBatchCreate } from "./shared.js";
6
+ export function registerGenerateImageTool(server, client) {
7
+ server.registerTool("generate_image", {
8
+ description: "Create an Open RPC image generation batch. Recommended flow: list_models(type=image) -> generate_image -> get_task_status using the returned batch_id.",
9
+ outputSchema: batchCreateOutputSchema,
10
+ inputSchema: {
11
+ model: z.string().min(1).describe("Image model id or API model key."),
12
+ prompt: z
13
+ .string()
14
+ .trim()
15
+ .min(1, "prompt must not be empty or whitespace only")
16
+ .max(2000, "prompt must be at most 2000 characters after trimming")
17
+ .describe("Image generation prompt."),
18
+ size: z.string().optional().describe("Image size for supported models, for example 1024x1024."),
19
+ resolution: z
20
+ .string()
21
+ .optional()
22
+ .describe("Image resolution for supported models. GPT-Image 2 defaults to 1024x1024."),
23
+ quality: z
24
+ .string()
25
+ .optional()
26
+ .describe("Image quality for supported models. GPT-Image 2 supports low, medium, high."),
27
+ count: z.number().int().positive().optional().default(1).describe("Number of images."),
28
+ },
29
+ }, async ({ model, prompt, size, resolution, quality, count }) => {
30
+ try {
31
+ const resolvedModel = resolveModelForCommand("image_generate", model);
32
+ const response = await client.createImageBatch({
33
+ items: [
34
+ {
35
+ businessType: 9,
36
+ modelId: String(resolvedModel.modelId),
37
+ generationType: 6,
38
+ prompt: normalizeGenerationPrompt(prompt),
39
+ size,
40
+ resolution: resolveImageResolution(resolvedModel, resolution, size),
41
+ quality: resolveImageQuality(resolvedModel, quality),
42
+ count,
43
+ },
44
+ ],
45
+ });
46
+ return jsonContent(normalizeBatchCreate(response, "Image generation"));
47
+ }
48
+ catch (error) {
49
+ return formatToolError(error);
50
+ }
51
+ });
52
+ }
53
+ //# sourceMappingURL=generate-image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-image.js","sourceRoot":"","sources":["../../../../src/capabilities/media/tools/generate-image.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAEzE,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAE5E,MAAM,UAAU,yBAAyB,CACvC,MAAiB,EACjB,MAAmD;IAEnD,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,WAAW,EACT,wJAAwJ;QAC1J,YAAY,EAAE,uBAAuB;QACrC,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,kCAAkC,CAAC;YACrE,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,IAAI,EAAE;iBACN,GAAG,CAAC,CAAC,EAAE,6CAA6C,CAAC;iBACrD,GAAG,CAAC,IAAI,EAAE,uDAAuD,CAAC;iBAClE,QAAQ,CAAC,0BAA0B,CAAC;YACvC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;YAC/F,UAAU,EAAE,CAAC;iBACV,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,2EAA2E,CAAC;YACxF,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,6EAA6E,CAAC;YAC1F,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;SACvF;KACF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;QAC5D,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,sBAAsB,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YACtE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC;gBAC7C,KAAK,EAAE;oBACL;wBACE,YAAY,EAAE,CAAC;wBACf,OAAO,EAAE,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC;wBACtC,cAAc,EAAE,CAAC;wBACjB,MAAM,EAAE,yBAAyB,CAAC,MAAM,CAAC;wBACzC,IAAI;wBACJ,UAAU,EAAE,sBAAsB,CAAC,aAAa,EAAE,UAAU,EAAE,IAAI,CAAC;wBACnE,OAAO,EAAE,mBAAmB,CAAC,aAAa,EAAE,OAAO,CAAC;wBACpD,KAAK;qBACN;iBACF;aACF,CAAC,CAAC;YAEH,OAAO,WAAW,CAAC,oBAAoB,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC,CAAC;QACzE,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { FreebeatApiClient } from "../../../services/freebeat-api.js";
3
+ export declare function registerGenerateVideoTool(server: McpServer, client: Pick<FreebeatApiClient, "createVideoBatch">): void;
@@ -0,0 +1,58 @@
1
+ import { z } from "zod";
2
+ import { resolveGenerateAudioValue, resolveModelForCommand, validateVideoGenerateOptions, } from "../../../core/model-catalog.js";
3
+ import { normalizeGenerationPrompt } from "../../../core/prompt.js";
4
+ import { formatToolError, jsonContent } from "../../../core/response.js";
5
+ import { batchCreateOutputSchema, normalizeBatchCreate } from "./shared.js";
6
+ export function registerGenerateVideoTool(server, client) {
7
+ server.registerTool("generate_video", {
8
+ description: "Create an Open RPC text-to-video batch. Recommended flow: list_models(type=video) -> get_model_help -> generate_video -> get_task_status using the returned batch_id.",
9
+ outputSchema: batchCreateOutputSchema,
10
+ inputSchema: {
11
+ model: z.string().min(1).describe("Video model id or API model key."),
12
+ prompt: z
13
+ .string()
14
+ .trim()
15
+ .min(1, "prompt must not be empty or whitespace only")
16
+ .max(2000, "prompt must be at most 2000 characters after trimming")
17
+ .describe("Video generation prompt."),
18
+ duration: z.number().int().positive().optional().describe("Video duration in seconds."),
19
+ resolution: z.string().optional().describe("Video resolution, for example 720p."),
20
+ aspect_ratio: z.string().optional().describe("Video aspect ratio, for example 16:9."),
21
+ generate_audio: z
22
+ .boolean()
23
+ .optional()
24
+ .default(false)
25
+ .describe("Generate video audio when the selected model supports it."),
26
+ },
27
+ }, async ({ model, prompt, duration, resolution, aspect_ratio, generate_audio }) => {
28
+ try {
29
+ const resolvedModel = resolveModelForCommand("video_generate", model);
30
+ validateVideoGenerateOptions(resolvedModel, {
31
+ duration,
32
+ resolution,
33
+ aspectRatio: aspect_ratio,
34
+ generateAudio: generate_audio,
35
+ });
36
+ const audio = resolveGenerateAudioValue(resolvedModel, Boolean(generate_audio));
37
+ const response = await client.createVideoBatch({
38
+ items: [
39
+ {
40
+ modelId: String(resolvedModel.modelId),
41
+ generationType: 1,
42
+ prompt: normalizeGenerationPrompt(prompt),
43
+ duration,
44
+ resolution,
45
+ aspectRatio: aspect_ratio,
46
+ audio,
47
+ generateAudio: audio,
48
+ },
49
+ ],
50
+ });
51
+ return jsonContent(normalizeBatchCreate(response, "Video generation"));
52
+ }
53
+ catch (error) {
54
+ return formatToolError(error);
55
+ }
56
+ });
57
+ }
58
+ //# sourceMappingURL=generate-video.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-video.js","sourceRoot":"","sources":["../../../../src/capabilities/media/tools/generate-video.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAEzE,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAE5E,MAAM,UAAU,yBAAyB,CACvC,MAAiB,EACjB,MAAmD;IAEnD,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,WAAW,EACT,uKAAuK;QACzK,YAAY,EAAE,uBAAuB;QACrC,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,kCAAkC,CAAC;YACrE,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,IAAI,EAAE;iBACN,GAAG,CAAC,CAAC,EAAE,6CAA6C,CAAC;iBACrD,GAAG,CAAC,IAAI,EAAE,uDAAuD,CAAC;iBAClE,QAAQ,CAAC,0BAA0B,CAAC;YACvC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;YACvF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;YACjF,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;YACrF,cAAc,EAAE,CAAC;iBACd,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,KAAK,CAAC;iBACd,QAAQ,CAAC,2DAA2D,CAAC;SACzE;KACF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,EAAE,EAAE;QAC9E,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,sBAAsB,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YACtE,4BAA4B,CAAC,aAAa,EAAE;gBAC1C,QAAQ;gBACR,UAAU;gBACV,WAAW,EAAE,YAAY;gBACzB,aAAa,EAAE,cAAc;aAC9B,CAAC,CAAC;YACH,MAAM,KAAK,GAAG,yBAAyB,CAAC,aAAa,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;YAEhF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC;gBAC7C,KAAK,EAAE;oBACL;wBACE,OAAO,EAAE,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC;wBACtC,cAAc,EAAE,CAAC;wBACjB,MAAM,EAAE,yBAAyB,CAAC,MAAM,CAAC;wBACzC,QAAQ;wBACR,UAAU;wBACV,WAAW,EAAE,YAAY;wBACzB,KAAK;wBACL,aAAa,EAAE,KAAK;qBACrB;iBACF;aACF,CAAC,CAAC;YAEH,OAAO,WAAW,CAAC,oBAAoB,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC,CAAC;QACzE,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerGetModelHelpTool(server: McpServer): void;
@@ -0,0 +1,26 @@
1
+ import { z } from "zod";
2
+ import { formatToolError, jsonContent } from "../../../core/response.js";
3
+ import { getModelHelp } from "../../../core/model-catalog.js";
4
+ export function registerGetModelHelpTool(server) {
5
+ server.registerTool("get_model_help", {
6
+ description: "Show detailed usage guidance for one Open RPC image or video model. Use the returned help to set required duration, resolution, aspect_ratio, quality, and audio options.",
7
+ outputSchema: {
8
+ success: z.literal(true).describe("Whether model help was retrieved successfully."),
9
+ help: z.string().describe("Model-specific usage and constraints."),
10
+ },
11
+ inputSchema: {
12
+ model: z.string().min(1).describe("Model id or API model key to inspect."),
13
+ },
14
+ }, async ({ model }) => {
15
+ try {
16
+ return jsonContent({
17
+ success: true,
18
+ help: getModelHelp(model),
19
+ });
20
+ }
21
+ catch (error) {
22
+ return formatToolError(error);
23
+ }
24
+ });
25
+ }
26
+ //# sourceMappingURL=get-model-help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-model-help.js","sourceRoot":"","sources":["../../../../src/capabilities/media/tools/get-model-help.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAE9D,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,WAAW,EACT,2KAA2K;QAC7K,YAAY,EAAE;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,gDAAgD,CAAC;YACnF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;SACnE;QACD,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,uCAAuC,CAAC;SAC3E;KACF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QAClB,IAAI,CAAC;YACH,OAAO,WAAW,CAAC;gBACjB,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC;aAC1B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerListModelsTool(server: McpServer): void;
@@ -0,0 +1,32 @@
1
+ import { z } from "zod";
2
+ import { formatToolError, jsonContent } from "../../../core/response.js";
3
+ import { listModels } from "../../../core/model-catalog.js";
4
+ import { modelListMessage, normalizeModel } from "./shared.js";
5
+ export function registerListModelsTool(server) {
6
+ server.registerTool("list_models", {
7
+ description: "List supported Open RPC image or video models. Use this before generate_image, edit_image, or generate_video to choose the model value and inspect constraints.",
8
+ outputSchema: {
9
+ success: z.literal(true).describe("Whether model discovery completed successfully."),
10
+ models: z
11
+ .array(z.record(z.unknown()))
12
+ .describe("Supported models with model IDs, model keys, commands, and constraints."),
13
+ message: z.string().describe("Human-readable summary."),
14
+ },
15
+ inputSchema: {
16
+ type: z.enum(["image", "video"]).describe("Model type to list."),
17
+ },
18
+ }, async ({ type }) => {
19
+ try {
20
+ const models = listModels(type);
21
+ return jsonContent({
22
+ success: true,
23
+ models: models.map(normalizeModel),
24
+ message: modelListMessage(type, models.length),
25
+ });
26
+ }
27
+ catch (error) {
28
+ return formatToolError(error);
29
+ }
30
+ });
31
+ }
32
+ //# sourceMappingURL=list-models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-models.js","sourceRoot":"","sources":["../../../../src/capabilities/media/tools/list-models.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE/D,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,WAAW,EACT,iKAAiK;QACnK,YAAY,EAAE;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,iDAAiD,CAAC;YACpF,MAAM,EAAE,CAAC;iBACN,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;iBAC5B,QAAQ,CAAC,yEAAyE,CAAC;YACtF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;SACxD;QACD,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;SACjE;KACF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;YAEhC,OAAO,WAAW,CAAC;gBACjB,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC;gBAClC,OAAO,EAAE,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;aAC/C,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { z } from "zod";
2
+ import { OpenRpcBatchCreateResponse } from "../../../services/freebeat-api.js";
3
+ import { ModelKind, StaticModelCatalogItem as CatalogModel } from "../../../core/model-catalog.js";
4
+ export declare const batchCreateOutputSchema: {
5
+ success: z.ZodLiteral<true>;
6
+ batch_id: z.ZodString;
7
+ batch_status: z.ZodString;
8
+ total_count: z.ZodNumber;
9
+ accepted_count: z.ZodNumber;
10
+ failed_count: z.ZodNumber;
11
+ accepted_credits: z.ZodNumber;
12
+ estimated_failed_credits: z.ZodNumber;
13
+ items: z.ZodArray<z.ZodObject<{
14
+ business_type: z.ZodNumber;
15
+ accepted: z.ZodBoolean;
16
+ serial_no: z.ZodNullable<z.ZodString>;
17
+ need_credits: z.ZodNumber;
18
+ status: z.ZodString;
19
+ code: z.ZodNullable<z.ZodUnion<[z.ZodNumber, z.ZodString]>>;
20
+ message: z.ZodNullable<z.ZodString>;
21
+ }, "strip", z.ZodTypeAny, {
22
+ code: string | number | null;
23
+ message: string | null;
24
+ status: string;
25
+ accepted: boolean;
26
+ business_type: number;
27
+ serial_no: string | null;
28
+ need_credits: number;
29
+ }, {
30
+ code: string | number | null;
31
+ message: string | null;
32
+ status: string;
33
+ accepted: boolean;
34
+ business_type: number;
35
+ serial_no: string | null;
36
+ need_credits: number;
37
+ }>, "many">;
38
+ message: z.ZodString;
39
+ };
40
+ export declare function normalizeBatchCreate(response: OpenRpcBatchCreateResponse, noun: string): Record<string, unknown>;
41
+ export declare function normalizeModel(model: CatalogModel): Record<string, unknown>;
42
+ export declare function modelListMessage(kind: ModelKind, count: number): string;
@@ -0,0 +1,72 @@
1
+ import { z } from "zod";
2
+ export const batchCreateOutputSchema = {
3
+ success: z.literal(true).describe("Whether the batch request was accepted by Freebeat."),
4
+ batch_id: z.string().describe("Open RPC batch ID for get_task_status."),
5
+ batch_status: z.string().describe("Initial batch status."),
6
+ total_count: z.number().describe("Total number of submitted items."),
7
+ accepted_count: z.number().describe("Number of accepted items."),
8
+ failed_count: z.number().describe("Number of rejected items."),
9
+ accepted_credits: z.number().describe("Credits accepted by the batch."),
10
+ estimated_failed_credits: z.number().describe("Estimated credits for rejected items."),
11
+ items: z
12
+ .array(z.object({
13
+ business_type: z.number(),
14
+ accepted: z.boolean(),
15
+ serial_no: z.string().nullable(),
16
+ need_credits: z.number(),
17
+ status: z.string(),
18
+ code: z.union([z.number(), z.string()]).nullable(),
19
+ message: z.string().nullable(),
20
+ }))
21
+ .describe("Per-item batch acceptance details."),
22
+ message: z.string().describe("Human-readable next-step guidance."),
23
+ };
24
+ export function normalizeBatchCreate(response, noun) {
25
+ return {
26
+ success: true,
27
+ batch_id: response.batchId,
28
+ batch_status: response.batchStatus,
29
+ total_count: response.totalCount,
30
+ accepted_count: response.acceptedCount,
31
+ failed_count: response.failedCount,
32
+ accepted_credits: response.acceptedCredits,
33
+ estimated_failed_credits: response.estimatedFailedCredits,
34
+ items: response.items.map((item) => ({
35
+ business_type: item.businessType,
36
+ accepted: item.accepted,
37
+ serial_no: item.serialNo,
38
+ need_credits: item.needCredits,
39
+ status: item.status,
40
+ code: item.code,
41
+ message: item.message,
42
+ })),
43
+ message: `${noun} batch queued. Use get_task_status with task_id="${response.batchId}" to check status.`,
44
+ };
45
+ }
46
+ export function normalizeModel(model) {
47
+ return {
48
+ type: model.kind,
49
+ provider: model.provider,
50
+ model_id: model.modelId,
51
+ model: model.apiModelKey ?? String(model.modelId),
52
+ display_name: model.displayName,
53
+ available: model.available,
54
+ commands: model.commands,
55
+ generation_types: model.generationTypes,
56
+ tags: model.tags,
57
+ description: model.description,
58
+ constraints: {
59
+ aspect_ratios: model.constraints.aspectRatios,
60
+ resolutions: model.constraints.resolutions,
61
+ durations: model.constraints.durations,
62
+ styles: model.constraints.styles,
63
+ generate_audio: model.constraints.generateAudio,
64
+ credits: model.constraints.credits,
65
+ credit_options: model.constraints.creditOptions,
66
+ },
67
+ };
68
+ }
69
+ export function modelListMessage(kind, count) {
70
+ return `Retrieved ${count} ${kind} model(s).`;
71
+ }
72
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../src/capabilities/media/tools/shared.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  import { FreebeatApiClient } from "../../../services/freebeat-api.js";
3
- export declare function registerGetTaskStatusTool(server: McpServer, client: Pick<FreebeatApiClient, "getTaskStatus">): void;
3
+ export declare function registerGetTaskStatusTool(server: McpServer, client: Pick<FreebeatApiClient, "getTaskStatus" | "queryBatch">): void;