@starreel/mcp 0.1.5 → 0.1.7
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/dist/tools/produce.js +32 -0
- package/package.json +1 -1
- package/server.json +2 -2
package/dist/tools/produce.js
CHANGED
|
@@ -36,6 +36,9 @@ function buildEthnicityLock(ethnicity, note) {
|
|
|
36
36
|
return ethnicity === 'custom' ? { code: 'custom', note: note ?? '' } : { code: ethnicity };
|
|
37
37
|
}
|
|
38
38
|
export function registerProduceTools(server, client) {
|
|
39
|
+
// ---------- 建剧前:列可选项 ----------
|
|
40
|
+
server.tool('list_project_options', '列出建剧的全部可选项:项目类型(短剧/广告/MV/品牌片)、画幅比例、视频分辨率(带中英标签+说明+默认值)。' +
|
|
41
|
+
'建剧前先调它,把选项给用户挑,再照 key 传给 create_drama。免费。', {}, async () => jsonResult(await client.produceGet('/project-options')));
|
|
39
42
|
// ---------- 建剧 ----------
|
|
40
43
|
// 参数=「项目设定 / 新建项目」页对外能设的全部通用字段(不含内部产线开关)。
|
|
41
44
|
// 尤其 setting_brief(世界观 Brief)与 ethnicity:它们是全链 ERA LOCK / 族裔单一真相源,
|
|
@@ -279,4 +282,33 @@ export function registerProduceTools(server, client) {
|
|
|
279
282
|
server.tool('delete_scene', '删除一个场景。免费。', { scene_id: z.number().int().positive() }, async ({ scene_id }) => jsonResult(await client.produceDelete(`/scenes/${scene_id}`)));
|
|
280
283
|
server.tool('generate_character_sheet', '给角色出三视图设定图(比定妆图更完整的身份锚,一致性更稳)。图片步,按用量后付不欠费。', { character_id: z.number().int().positive(), episode_id: z.number().int().positive().optional() }, async ({ character_id, episode_id }) => jsonResult(await client.producePost(`/characters/${character_id}/sheet`, episode_id ? { episode_id } : {})));
|
|
281
284
|
server.tool('generate_prop_sheet', '给道具 AI 出设定图。图片步,按用量后付不欠费。', { prop_id: z.number().int().positive() }, async ({ prop_id }) => jsonResult(await client.producePost(`/props/${prop_id}/generate-sheet`)));
|
|
285
|
+
// ========== P2 · 连续性 / 场景组 / 多画幅 ==========
|
|
286
|
+
server.tool('chain_frames', '整集首尾帧接力链:让每镜首帧承接上镜尾帧,镜间画面连续(比各镜独立出帧更顺)。按用量后付。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/chain-frames`)));
|
|
287
|
+
server.tool('get_scene_group_plan', '查某一集的场景组规划(镜头如何归组做连续长镜)。免费。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/scene-group-plan`)));
|
|
288
|
+
server.tool('generate_scene_groups', '生成场景组(把连续镜头归组,连续长镜/批量出图的地基)。后台异步。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/scene-groups`)));
|
|
289
|
+
server.tool('render_multi_aspect', '把成片按多个画幅(竖/横/方)重渲一版,便于多平台分发。免费(纯 ffmpeg),后台异步。', {
|
|
290
|
+
episode_id: z.number().int().positive(),
|
|
291
|
+
aspects: z.array(z.enum(['9:16', '16:9', '1:1', '4:5'])).optional().describe('目标画幅集'),
|
|
292
|
+
}, async ({ episode_id, aspects }) => jsonResult(await client.producePost(`/episodes/${episode_id}/render-multi-aspect`, aspects ? { aspects } : {})));
|
|
293
|
+
// ========== P2 · 口型 / 海报封面 ==========
|
|
294
|
+
server.tool('lipsync_shot', '给单镜做口型同步(对白与人物嘴型对齐)。按用量后付。', { storyboard_id: z.number().int().positive() }, async ({ storyboard_id }) => jsonResult(await client.producePost(`/storyboards/${storyboard_id}/lipsync`)));
|
|
295
|
+
server.tool('lipsync_episode', '给整集批量口型同步。后台异步,按用量后付。用 get_lipsync_status 查进度。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/lipsync-batch`)));
|
|
296
|
+
server.tool('get_lipsync_status', '查整集口型同步进度。免费。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/lipsync-status`)));
|
|
297
|
+
server.tool('generate_episode_poster', '给某一集生成海报图。图片步,按用量后付。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/poster`)));
|
|
298
|
+
server.tool('generate_drama_poster', '给整部剧生成海报图(KV)。图片步,按用量后付。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.producePost(`/dramas/${drama_id}/poster`)));
|
|
299
|
+
server.tool('generate_cover', '给整部剧生成片头封面图。图片步,按用量后付。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.producePost(`/dramas/${drama_id}/cover`)));
|
|
300
|
+
// ========== P2 · 音效 / 特效 / 转场 ==========
|
|
301
|
+
server.tool('generate_sfx', '给整集自动匹配+生成音效(SFX)。后台异步,按用量后付。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/sfx`)));
|
|
302
|
+
server.tool('generate_effects', '给整集自动匹配视觉特效。后台异步,按用量后付。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/effects`)));
|
|
303
|
+
server.tool('generate_transitions', '给整集自动加转场(闪白/玻璃碎裂等)。后台异步。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/transitions`)));
|
|
304
|
+
// ========== P2 · 品牌片交付物 / 广告商品库 ==========
|
|
305
|
+
server.tool('get_deliverables', '品牌片:读交付物树(海报/母版/分轨/各平台版等)。免费。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.produceGet(`/dramas/${drama_id}/deliverables`)));
|
|
306
|
+
server.tool('generate_deliverables', '品牌片:一键生成全部交付物。后台异步,按用量后付。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.producePost(`/dramas/${drama_id}/deliverables`)));
|
|
307
|
+
server.tool('add_product', '广告项目:往商品库加一个商品(名称/卖点/图),供带货广告露出。免费。', {
|
|
308
|
+
drama_id: z.number().int().positive(),
|
|
309
|
+
name: z.string().min(1),
|
|
310
|
+
description: z.string().optional().describe('卖点/描述'),
|
|
311
|
+
image_url: z.string().optional().describe('商品图 URL(先 upload_image 拿)'),
|
|
312
|
+
}, async ({ drama_id, ...fields }) => jsonResult(await client.producePost(`/dramas/${drama_id}/products`, fields)));
|
|
313
|
+
server.tool('list_products', '广告项目:列出商品库。免费。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.produceGet(`/dramas/${drama_id}/products`)));
|
|
282
314
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@starreel/mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.7",
|
|
4
4
|
"mcpName": "ai.starreel/starreel",
|
|
5
5
|
"description": "StarReel MCP server — drive the AI short-drama production pipeline (script → storyboards → frames → video → final cut) from Claude, Cursor, or any MCP client",
|
|
6
6
|
"license": "MIT",
|
package/server.json
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-09-29/server.schema.json",
|
|
3
3
|
"name": "ai.starreel/starreel",
|
|
4
4
|
"description": "Turn a script into a finished, downloadable short-drama episode — via MCP or REST.",
|
|
5
|
-
"version": "0.1.
|
|
5
|
+
"version": "0.1.7",
|
|
6
6
|
"websiteUrl": "https://starreel.ai",
|
|
7
7
|
"packages": [
|
|
8
8
|
{
|
|
9
9
|
"registryType": "npm",
|
|
10
10
|
"identifier": "@starreel/mcp",
|
|
11
|
-
"version": "0.1.
|
|
11
|
+
"version": "0.1.7",
|
|
12
12
|
"transport": { "type": "stdio" },
|
|
13
13
|
"environmentVariables": [
|
|
14
14
|
{
|