@starreel/mcp 0.1.18 → 0.1.20
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 +56 -10
- package/package.json +1 -1
package/dist/tools/produce.js
CHANGED
|
@@ -22,12 +22,16 @@ const CONFIRM_HINT = '⚠️ 批量报价确认流程:先调对应的 quote_*
|
|
|
22
22
|
// → quote/generate_storyboards → quote/generate_frames → quote/generate_videos
|
|
23
23
|
// → compose_episode → get_final_cut / get_export
|
|
24
24
|
// 项目设定随时可 update_project_settings;剧目级资产(色彩脚本/动作模板/世界观图/美术圣经)可选增强。
|
|
25
|
-
const WORKFLOW_HINT = '
|
|
26
|
-
'
|
|
27
|
-
'
|
|
28
|
-
'
|
|
29
|
-
'
|
|
30
|
-
'
|
|
25
|
+
const WORKFLOW_HINT = '★三档执行策略(别把三档混着问客户):' +
|
|
26
|
+
'①【基础项目设定·免费·必做地基·建剧即设好,别建空壳】project_type/setting_brief(世界观·ERA LOCK)/' +
|
|
27
|
+
'ethnicity(族裔)/画幅分辨率,以及一致性锚 cinematography_prompt(摄影DNA)·art_bible(美术圣经)·visual_lock(视觉锁定)——' +
|
|
28
|
+
'全免费,是驱动全链一致性的地基;不设好,后续所有生成都跑偏、返工重花钱。用 create_drama/update_project_settings 直接设。' +
|
|
29
|
+
'②【产线主干·按序不跳步】set_script→rewrite_script→extract_assets→generate_portraits_and_sheets(定妆图+设定图)→' +
|
|
30
|
+
'assign_voices(分配音色)→storyboards→frames→videos→generate_tts→compose;收费步照现有 quote 报价确认流程。' +
|
|
31
|
+
'广告另需 add_product+generate_product_sheet;MV 走 set_mv_lyrics→generate_mv_story→generate_mv_script。' +
|
|
32
|
+
'③【可选增强·AI 主动提示客户·报价确认才做】世界观图/美术圣经生成/视觉锁抽取/色彩脚本/动作模板/场景图/场景组/口型/海报/音效/配乐/字幕翻译——' +
|
|
33
|
+
'这些提升一致性/质量、大多收费。★AI 应主动告知客户这些可做并给报价,客户确认才跑;既不默默跳过、也不擅自扣费。' +
|
|
34
|
+
'用 get_pipeline_status 查进度(按项目类型返回专属步骤)。';
|
|
31
35
|
const ETHNICITY_CODES = [
|
|
32
36
|
'east_asian', 'southeast_asian', 'south_asian', 'central_asian',
|
|
33
37
|
'caucasian', 'middle_eastern', 'african', 'latin_american',
|
|
@@ -40,6 +44,39 @@ const ETHNICITY_CODES = [
|
|
|
40
44
|
const FRAME_TYPE_ARG = z.enum(['first_frame', 'last_frame', 'both']);
|
|
41
45
|
const ASPECT_RATIOS = ['9:16', '16:9', '1:1', '4:5', '4:3', '21:9'];
|
|
42
46
|
const VIDEO_RESOLUTIONS = ['480p', '720p', '1080p', '4k'];
|
|
47
|
+
// 「项目设定页」通用视觉/音频/字幕/转场设定 —— create_drama 与 update_project_settings 共用。
|
|
48
|
+
// 后端内部 PUT /dramas 已接受写库,facade 白名单 Wave3 已放行(produce-create-fields.ts)。
|
|
49
|
+
// 不含内部产线/成本开关(strict_mode/best_of_n/shoppable/budget_points 等,需产品决策)。
|
|
50
|
+
const PROJECT_SETTINGS_FIELDS = {
|
|
51
|
+
// 整剧视觉一致性锚(注入所有出图/视频 prompt,决定跨镜一致)
|
|
52
|
+
cinematography_prompt: z.string().optional().describe('摄影DNA:镜头/镜片/光圈/调色一揽子,注入所有出图/视频prompt,整剧镜头一致'),
|
|
53
|
+
art_bible: z.string().optional().describe('美术圣经:色调/材质/气质,注入所有生图prompt,统一视觉风格'),
|
|
54
|
+
visual_lock: z.string().optional().describe('视觉锁定:民族外貌/服装约束/禁止元素,最高优先级、无条件注入所有生图prompt'),
|
|
55
|
+
video_style_prompt: z.string().optional().describe('视频风格锁定·正向风格词(前置注入,描述渲染质感/美术)'),
|
|
56
|
+
video_negative_prompt: z.string().optional().describe('视频风格锁定·负向排除词(末尾追加,防风格跳变)'),
|
|
57
|
+
motifs: z.string().optional().describe('视觉母题:反复出现的物件/颜色,逗号分隔(每个应≥3镜复现)'),
|
|
58
|
+
theme: z.string().optional().describe('主题(一句话核心冲突·防跑题);★≠theme_statement,这是UI「主题」框对应的列'),
|
|
59
|
+
// 音频(BGM 源/开关/音量 + 用视频原声)
|
|
60
|
+
bgm_enabled: z.boolean().optional().describe('BGM总开关:false=终拼不混任何BGM,保留视频原声'),
|
|
61
|
+
bgm_source: z.enum(['own', 'clip']).optional().describe("BGM来源:own=自有BGM流水线(默认,抑制裸片BGM);clip=保留视频原生BGM、终拼不叠加"),
|
|
62
|
+
bgm_volume_preset: z.enum(['off', 'low', 'auto', 'high']).optional().describe('BGM音量档:off静音/low轻(-28dB)/auto自适应(默认,静段可闻·对白不压麦)/high强'),
|
|
63
|
+
bgm_volume_db: z.number().optional().describe('自定义BGM音量(dB,负值),覆盖预设档、关自适应'),
|
|
64
|
+
use_clip_audio: z.boolean().optional().describe('用视频原声:true=跳过TTS配音,直接用视频自带声音(★直接改成片音频)'),
|
|
65
|
+
// 字幕(烧录/双语/仅译文/位置/边距/动效)
|
|
66
|
+
show_subtitles: z.boolean().optional().describe('字幕烧录总开关:false=不烧字幕轨'),
|
|
67
|
+
subtitle_secondary_lang: z.string().optional().describe('双语字幕第二语言(如 en/ja);设了即双语(需先字幕同步翻译该语言)'),
|
|
68
|
+
subtitle_translation_only: z.boolean().optional().describe('仅显示译文(不显原文)'),
|
|
69
|
+
subtitle_position: z.enum(['bottom', 'top']).optional().describe('字幕位置(默认 bottom)'),
|
|
70
|
+
subtitle_margin_v: z.number().optional().describe('字幕边距 MarginV 像素(与画面边缘距离,默认 80)'),
|
|
71
|
+
subtitle_animation: z.string().optional().describe('字幕动效:fade(默认)/bounce弹跳/typewriter打字机/highlight高亮'),
|
|
72
|
+
// 转场 + 多画幅裁切 + 片头尾卡
|
|
73
|
+
default_transition: z.string().optional().describe('镜头间转场预设(默认 fade;21种+智能)'),
|
|
74
|
+
default_transition_ms: z.number().optional().describe('转场时长 ms(默认 250;短剧 200-400 体感佳)'),
|
|
75
|
+
reframe_mode: z.string().optional().describe('一源多画幅裁切策略'),
|
|
76
|
+
reframe_anchor: z.string().optional().describe('多画幅裁切锚点'),
|
|
77
|
+
cover_card_default: z.string().optional().describe('片头封面卡默认'),
|
|
78
|
+
poster_card_default: z.string().optional().describe('片尾海报卡默认'),
|
|
79
|
+
};
|
|
43
80
|
/** 把友好 ethnicity 枚举 + note 组装成后端认的结构化族裔锁 { code, note? }。 */
|
|
44
81
|
function buildEthnicityLock(ethnicity, note) {
|
|
45
82
|
if (!ethnicity)
|
|
@@ -54,7 +91,10 @@ export function registerProduceTools(server, client) {
|
|
|
54
91
|
// 参数=「项目设定 / 新建项目」页对外能设的全部通用字段(不含内部产线开关)。
|
|
55
92
|
// 尤其 setting_brief(世界观 Brief)与 ethnicity:它们是全链 ERA LOCK / 族裔单一真相源,
|
|
56
93
|
// 建剧时设好,下游剧本改写·分镜·所有出图都据它约束——不设则按剧本语言自动推断(旧行为)。
|
|
57
|
-
server.tool('create_drama', '新建一部短剧(剧壳)
|
|
94
|
+
server.tool('create_drama', '新建一部短剧(剧壳)。★强烈建议建剧时一并设好基础项目设定——project_type/setting_brief(世界观·ERA LOCK)/' +
|
|
95
|
+
'ethnicity(族裔)/画幅分辨率,以及一致性锚(cinematography_prompt/art_bible/visual_lock)。这些全免费、' +
|
|
96
|
+
'是驱动全链一致性的地基;只传 title 建空壳会让后续所有生成跑偏、返工重花钱。' +
|
|
97
|
+
'按 total_episodes 自动建 N 空集,返回 drama_id 与各集 episode_id。免费。', {
|
|
58
98
|
title: z.string().describe('剧名'),
|
|
59
99
|
total_episodes: z.number().int().min(1).max(200).optional().describe('集数(默认 1),自动建 N 个空集'),
|
|
60
100
|
genre: z.string().optional().describe('题材,如 都市/悬疑/古装'),
|
|
@@ -74,6 +114,7 @@ export function registerProduceTools(server, client) {
|
|
|
74
114
|
.describe('项目类型(默认 drama)。ad=广告(改写走 ad_script_rewriter);mv=音乐(走歌词→故事→剧本子流程);brand_film=品牌微电影(默认16:9)'),
|
|
75
115
|
rewrite_mode: z.enum(['standard', 'director']).optional().describe('AI改写深度:standard 或 director(导演级)'),
|
|
76
116
|
director_style: z.string().optional().describe('导演风格包 key'),
|
|
117
|
+
...PROJECT_SETTINGS_FIELDS,
|
|
77
118
|
}, async (args) => {
|
|
78
119
|
const { ethnicity, ethnicity_note, ...rest } = args;
|
|
79
120
|
const body = { ...rest };
|
|
@@ -164,8 +205,11 @@ export function registerProduceTools(server, client) {
|
|
|
164
205
|
server.tool('get_final_cut', '查某一集成片状态与下载链接。status=completed 时返回 download_url(我方 COS 直链,可直接下载)。免费。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/final-cut`)));
|
|
165
206
|
server.tool('get_export', '查某一集导出/母版状态(成片终拼后的可下载母版)。免费。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/export`)));
|
|
166
207
|
// ========== 项目设定(建后可改)==========
|
|
167
|
-
server.tool('update_project_settings', '
|
|
168
|
-
'
|
|
208
|
+
server.tool('update_project_settings', '建剧后修改项目设定。除画幅/分辨率/世界观Brief/族裔/题材/导演风格外,现覆盖★整剧视觉一致性锚' +
|
|
209
|
+
'(摄影DNA cinematography_prompt/美术圣经 art_bible/视觉锁定 visual_lock/视频风格正负向词/视觉母题 motifs)、' +
|
|
210
|
+
'音频(bgm_source 自有vs原生/bgm_volume_preset 音量/use_clip_audio 用视频原声)、' +
|
|
211
|
+
'字幕(show_subtitles/双语 subtitle_secondary_lang/位置/边距/动效)、转场——即项目设定页全部通用设定。免费。' +
|
|
212
|
+
'⚠️ 世界观 Brief/族裔/画幅/一致性锚等改后,已生成的内容不会自动更新,需重生对应内容。', {
|
|
169
213
|
drama_id: z.number().int().positive(),
|
|
170
214
|
genre: z.string().optional(),
|
|
171
215
|
style: z.string().optional(),
|
|
@@ -192,6 +236,7 @@ export function registerProduceTools(server, client) {
|
|
|
192
236
|
// MV 专属
|
|
193
237
|
mv_lyrics: z.string().optional(),
|
|
194
238
|
mv_audio_url: z.string().optional(),
|
|
239
|
+
...PROJECT_SETTINGS_FIELDS,
|
|
195
240
|
}, async (args) => {
|
|
196
241
|
const { drama_id, ethnicity, ethnicity_note, ...rest } = args;
|
|
197
242
|
const body = { ...rest };
|
|
@@ -201,7 +246,8 @@ export function registerProduceTools(server, client) {
|
|
|
201
246
|
return jsonResult(await client.producePut(`/dramas/${drama_id}`, body));
|
|
202
247
|
});
|
|
203
248
|
// ========== 项目设定页子资源(可选增强,提升一致性/风格锁)==========
|
|
204
|
-
server.tool('generate_world_concept', '生成世界观概念图(固定4格:全景/时代/主场景/色彩)
|
|
249
|
+
server.tool('generate_world_concept', '(★可选增强·主动提示客户·报价确认才做)生成世界观概念图(固定4格:全景/时代/主场景/色彩),提升整剧视觉一致性。' +
|
|
250
|
+
'AI 应告知客户这项可做并给报价,客户确认才跑(不默默跳过、不擅自扣费)。需 setting_brief ≥30字。图片步,按固定成本后付、不欠费。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.producePost(`/dramas/${drama_id}/world-concept`)));
|
|
205
251
|
server.tool('generate_art_bible', '生成美术圣经(色调/材质/气质,读角色+元数据)。文本步后付不欠费。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.producePost(`/dramas/${drama_id}/art-bible`)));
|
|
206
252
|
server.tool('extract_visual_lock', '从世界观 Brief + 角色抽取「视觉锁定」规则(写 visual_lock,统一出图风格/族裔)。文本步后付不欠费。', {
|
|
207
253
|
drama_id: z.number().int().positive(),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@starreel/mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.20",
|
|
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",
|