@starreel/mcp 0.1.22 → 0.1.24
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 +34 -2
- package/package.json +1 -1
package/dist/tools/produce.js
CHANGED
|
@@ -31,6 +31,9 @@ const WORKFLOW_HINT = '★三档执行策略(别把三档混着问客户):' +
|
|
|
31
31
|
'广告另需 add_product+generate_product_sheet;MV 走 set_mv_lyrics→generate_mv_story→generate_mv_script。' +
|
|
32
32
|
'③【可选增强·AI 主动提示客户·报价确认才做】世界观图/美术圣经生成/视觉锁抽取/色彩脚本/动作模板/场景图/场景组/口型/海报/音效/配乐/字幕翻译——' +
|
|
33
33
|
'这些提升一致性/质量、大多收费。★AI 应主动告知客户这些可做并给报价,客户确认才跑;既不默默跳过、也不擅自扣费。' +
|
|
34
|
+
'★两条锁定纪律:①**画幅比例**在 create_drama 即定、drama 级锁定,之后所有出图/出视频/成片都用它、**别中途改**' +
|
|
35
|
+
'(改了已生成内容画幅会不一致、漂移);不设默认 9:16。②**拆镜每镜 5-7 秒是对 AI 出视频优化的正常时长**,' +
|
|
36
|
+
'别因「镜偏长」误判就重拆——generate_storyboards 会**替换整集所有分镜**、已出图白费,已有分镜后端会拦、需 confirm_replace。' +
|
|
34
37
|
'用 get_pipeline_status 查进度(按项目类型返回专属步骤)。';
|
|
35
38
|
const ETHNICITY_CODES = [
|
|
36
39
|
'east_asian', 'southeast_asian', 'south_asian', 'central_asian',
|
|
@@ -100,7 +103,7 @@ export function registerProduceTools(server, client) {
|
|
|
100
103
|
genre: z.string().optional().describe('题材,如 都市/悬疑/古装'),
|
|
101
104
|
style: z.string().optional().describe('风格描述'),
|
|
102
105
|
description: z.string().optional(),
|
|
103
|
-
aspect_ratio: z.enum(ASPECT_RATIOS).optional().describe('画幅比例(默认 9:16 竖屏短剧)'),
|
|
106
|
+
aspect_ratio: z.enum(ASPECT_RATIOS).optional().describe('画幅比例(默认 9:16 竖屏短剧)。★drama级锁定:建剧即定、之后所有出图/出视频/成片都用它,别中途改(改了已生成内容画幅不一致、漂移)'),
|
|
104
107
|
video_resolution: z.enum(VIDEO_RESOLUTIONS).optional().describe('视频分辨率(默认 720p;成本随分辨率上升)'),
|
|
105
108
|
setting_brief: z
|
|
106
109
|
.string()
|
|
@@ -160,7 +163,13 @@ export function registerProduceTools(server, client) {
|
|
|
160
163
|
// ---------- 拆镜(storyboards) ----------
|
|
161
164
|
server.tool('quote_storyboards', '报价:把某一集的剧本拆成分镜(storyboards)要多少点。返回 estimated_points 与 quote_id。零扣费。' +
|
|
162
165
|
'拿到后把点数告诉用户征求同意,再用 quote_id 调 generate_storyboards。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/storyboards/quote`)));
|
|
163
|
-
server.tool('generate_storyboards', '确认后拆镜:后台跑(分钟级),立即返回 status:generating。用 get_storyboards
|
|
166
|
+
server.tool('generate_storyboards', '确认后拆镜:后台跑(分钟级),立即返回 status:generating。用 get_storyboards 轮询。' +
|
|
167
|
+
'★注意:拆镜会**替换整集所有已有分镜**(已调好/已出图的全丢、要重花钱重来)。每镜 5-7 秒是对 AI 出视频' +
|
|
168
|
+
'优化的**正常**时长,别因「一镜偏长」觉得有问题就重拆。已有分镜时后端会拦,确认重拆才带 confirm_replace=true。' + CONFIRM_HINT, {
|
|
169
|
+
episode_id: z.number().int().positive(),
|
|
170
|
+
quote_id: z.string().describe('来自 quote_storyboards'),
|
|
171
|
+
confirm_replace: z.boolean().optional().describe('本集已有分镜时必须 true 才重拆(会替换整集所有分镜,已出图白费)'),
|
|
172
|
+
}, async ({ episode_id, quote_id, confirm_replace }) => jsonResult(await client.producePost(`/episodes/${episode_id}/storyboards/generate`, confirm_replace ? { quote_id, confirm_replace } : { quote_id })));
|
|
164
173
|
server.tool('get_storyboards', '读某一集的分镜列表(供审阅/查进度)。含每镜首帧(first_frame_image)与视频(video_url)是否就绪。' +
|
|
165
174
|
'★每镜还带**结构化状态**:frame_status/video_status(ready/pending/authorizing/rejected/failed/none)、' +
|
|
166
175
|
'fail_reason(sensitive/text_sensitive/copyright/face_mismatch/account_overdue/quota_full/authorizing/' +
|
|
@@ -394,6 +403,29 @@ export function registerProduceTools(server, client) {
|
|
|
394
403
|
server.tool('generate_character_sheet', '给**单个**角色出三视图设定图(镜头一致性根锚,所有镜头帧都会引用;比定妆图更完整)。整集批量用 generate_character_sheets。' +
|
|
395
404
|
'前置:该角色已有定妆图。图片步,按用量后付不欠费。', { 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 } : {})));
|
|
396
405
|
server.tool('generate_prop_sheet', '给道具 AI 出设定图。图片步,按用量后付不欠费。', { prop_id: z.number().int().positive() }, async ({ prop_id }) => jsonResult(await client.producePost(`/props/${prop_id}/generate-sheet`)));
|
|
406
|
+
// ========== 剧目级资产:道具库 CRUD + 色彩脚本/动作模板读取 ==========
|
|
407
|
+
server.tool('get_props', '列剧目道具库(每个道具名称/类型/描述/设定图)。★道具库≠广告商品库(add_product/list_products 是带货商品);道具库是剧目道具。免费。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.produceGet(`/dramas/${drama_id}/props`)));
|
|
408
|
+
server.tool('create_prop', '往道具库加一个道具。extract_assets 会自动提取道具,这里供手动补建。免费(建条目;填了 description 会自动触发出设定图、后付)。', {
|
|
409
|
+
drama_id: z.number().int().positive(),
|
|
410
|
+
name: z.string().min(1).describe('道具名'),
|
|
411
|
+
type: z.string().optional().describe('类型(如 武器/信物/家具)'),
|
|
412
|
+
description: z.string().optional().describe('外观描述(填了会自动触发出设定图)'),
|
|
413
|
+
prompt: z.string().optional().describe('出图 prompt(可选)'),
|
|
414
|
+
physical_size_hint: z.string().optional().describe('物理尺寸提示'),
|
|
415
|
+
episode_id: z.number().int().positive().optional(),
|
|
416
|
+
}, async ({ drama_id, ...fields }) => jsonResult(await client.producePost(`/props`, { drama_id, ...fields })));
|
|
417
|
+
server.tool('update_prop', '改道具(名称/类型/描述/prompt/尺寸)。免费。', {
|
|
418
|
+
prop_id: z.number().int().positive(),
|
|
419
|
+
name: z.string().optional(),
|
|
420
|
+
type: z.string().optional(),
|
|
421
|
+
description: z.string().optional(),
|
|
422
|
+
prompt: z.string().optional(),
|
|
423
|
+
physical_size_hint: z.string().optional(),
|
|
424
|
+
}, async ({ prop_id, ...fields }) => jsonResult(await client.producePut(`/props/${prop_id}`, fields)));
|
|
425
|
+
server.tool('delete_prop', '删一个道具。免费。', { prop_id: z.number().int().positive() }, async ({ prop_id }) => jsonResult(await client.produceDelete(`/props/${prop_id}`)));
|
|
426
|
+
server.tool('mark_signature_prop', '标记/取消「招牌道具」(会在多镜复现的关键道具,加强一致性追踪)。signature=false 取消。免费。', { prop_id: z.number().int().positive(), signature: z.boolean().optional().describe('默认 true 标记;false 取消') }, async ({ prop_id, signature }) => jsonResult(await client.producePost(`/props/${prop_id}/signature`, { signature: signature !== false })));
|
|
427
|
+
server.tool('get_color_scripts', '读该剧已生成的色彩脚本(全片配色情绪)。generate_color_script 生成、此工具读取。免费。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.produceGet(`/dramas/${drama_id}/color-scripts`)));
|
|
428
|
+
server.tool('get_motion_templates', '读该剧已有的动作模板(运镜/动作预设)。generate_motion_templates 生成、此工具读取。免费。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.produceGet(`/dramas/${drama_id}/motion-templates`)));
|
|
397
429
|
// ========== P2 · 连续性 / 场景组 / 多画幅 ==========
|
|
398
430
|
server.tool('chain_frames', '整集首尾帧接力链:让每镜首帧承接上镜尾帧,镜间画面连续(比各镜独立出帧更顺)。按用量后付。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/chain-frames`)));
|
|
399
431
|
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`)));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@starreel/mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.24",
|
|
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",
|