@starreel/mcp 0.1.196 → 0.1.200
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/i18n/tools.en.json +4 -2
- package/dist/i18n/tools.zh-CN.json +3 -1
- package/dist/tools/guide-data.js +1 -1
- package/dist/tools/produce.js +24 -1
- package/openapi.json +168 -3
- package/package.json +1 -1
- package/server.json +2 -2
package/dist/i18n/tools.en.json
CHANGED
|
@@ -148,7 +148,7 @@
|
|
|
148
148
|
"list_bgm_cues": "List this episode's BGM cues (AI score split into emotion-based acts; each cue covers a shot range sb_from~sb_to): id, coverage, gain_db (null = follow volume preset), fade_in_ms / fade_out_ms, track_offset_ms / start_shift_ms (null = system decides). episode_id null means a **series-wide shared cue**; changing it affects all episodes. Free.",
|
|
149
149
|
"update_bgm_cue": "Adjust one BGM cue's volume, fade in/out, and start point (free). To change the track or covered shot range, regenerate with generate_bgm. ★Examples: BGM enters too abruptly → increase fade_in_ms; a segment masks dialogue → lower gain_db; want to start from the track's climax → set track_offset_ms; want it to enter after the first shot in this segment starts speaking → set start_shift_ms. Re-compose with compose_episode after changes for them to take effect.",
|
|
150
150
|
"get_bgm_prompt_guide": "Get the writing guide for “AI score prompts”: how to choose between the two tiers, what dimensions to include (with copy-ready examples), hard constraints that will not take effect even if written (pure instrumental/duration/no sound effects/no copying specific tracks), and common bad prompt patterns. Free, static, unrelated to any specific drama—read this before writing generate_bgm prompt; do not guess. Also suitable to relay key points directly to clients.",
|
|
151
|
-
"set_shot_name_card": "Add/change/clear a “layout title card” for one shot (burned into the final cut during final stitching, with preview-matched calligraphy font and cinnabar-red seal). Pass name as an empty string = clear this shot's title card. Free (data only; it displays once filled). Two modes: ① omit orient/placement/font_size = character name card (single vertical column character name at screen side, suited for ensemble entrance shots); ② provide any of them = generic layout title card; name can be a **full line of dialogue or narration** (auto-splits columns by punctuation and fits font size to the tallest column). placement=\"auto\" automatically chooses position by background brightness and texture (avoids faces/bright areas); orient=\"auto\" falls back to horizontal layout when the background is too busy. ★Do not download the video, overlay text yourself, and upload it—that bypasses renderer font and seal assets, causing preview/final cut mismatch.",
|
|
151
|
+
"set_shot_name_card": "Add/change/clear a “layout title card” for one shot (burned into the final cut during final stitching, with preview-matched calligraphy font and cinnabar-red seal). Pass name as an empty string = clear this shot's title card. Free (data only; it displays once filled). Two modes: ① omit orient/placement/font_size = character name card (single vertical column character name at screen side, suited for ensemble entrance shots); ② provide any of them = generic layout title card; name can be a **full line of dialogue or narration** (auto-splits columns by punctuation and fits font size to the tallest column). placement=\"auto\" automatically chooses position by background brightness and texture (avoids faces/bright areas); orient=\"auto\" falls back to horizontal layout when the background is too busy. ★Do not download the video, overlay text yourself, and upload it—that bypasses renderer font and seal assets, causing preview/final cut mismatch. (3) position=\"subtitle\" = narrative text card in the same place and style as dialogue subtitles; combine with start_ms to make it appear mid-shot (best on shots without dialogue to avoid overlapping subtitles). After editing, run compose_episode to re-cut (rerender_episode reuses the saved timeline and will not pick it up).",
|
|
152
152
|
"extract_segment_to_library": "Extract a time span from one shot (or one episode final cut), save it as a reusable asset, and add it to my asset library. Free (pure trim, no vendor call). Typical use: flashbacks/memory montages—visuals all reuse existing shots, marginal cost 0. The span is in seconds relative to **the source video**; if the end exceeds video duration, it is automatically clamped and the actual range is echoed in span. Repeated calls with the same source and same span hit the content hash and reuse the existing asset (reused=true), avoiding duplicate library rows. ★Do not download the video and cut locally with ffmpeg—the vendor outputs have GOPs up to 10s, so keyframe cuts will inevitably drift; this uses the platform's already-normalized exact cut points.",
|
|
153
153
|
"get_bgm_status": "Check AI score generation status for an episode: running (whether generation is in progress) + list of library score tracks (track/covered shot segments/fade in/out) + cue count. Free. After score is done, re-run compose_episode to include it in the final cut.",
|
|
154
154
|
"translate_subtitles": "Translate an episode's subtitles into a second language and enable bilingual subtitles. Backend async, postpaid by usage, no arrears.",
|
|
@@ -239,5 +239,7 @@
|
|
|
239
239
|
"get_handoff_toolchain": "Get the source code for the asset handoff package assembly toolchain (compile_timeline.py timeline compiler / assemble.sh ffmpeg assembly script). Free. This tool only returns source text and **will not** write files on your machine—save it to your working directory yourself before running.\ncompile_timeline.py expands “shot-relative” subtitle/dialogue/SFX anchors into absolute timecodes on your own timeline and handles global offsets caused by overlapping transitions; assemble.sh is a complete ffmpeg assembly baseline from raw clips to final cut (trim → normalize → concat/xfade → music sidechain → subtitles → two-pass master). Dependencies: ffmpeg (with libass for subtitle burn-in), ffprobe, jq, python3.",
|
|
240
240
|
"save_handoff_toolchain": "Write the assembly toolchain (fetch_pack.py / compile_timeline.py / assemble.sh) directly to a local directory, avoiding manual copy/paste. Free. The directory must **already exist** and be an absolute path; filenames are fixed and cannot be customized.\nRefuses to write into hidden directories (~/.ssh, ~/.config, .git…) and system directories—this is disk writing, not reading, and overwriting the wrong place is irreversible.\nFull workflow after writing to disk:\n python3 fetch_pack.py manifest.json -o ./pack # Download assets and materialize inline subtitles as SRT\n python3 compile_timeline.py ./pack [--transitions plan.json]\n ./assemble.sh ./pack out.mp4 [plan.json]",
|
|
241
241
|
"get_post_production_checklist": "Read this episode's **post-production effects checklist** (free). Items marked in the script as [VFX: …] or written in shot prompts as \"post-production / composited later\" are **not composited by the platform**—image and video generation leave them out and the final cut does not add them, so the finished episode lacks these story elements unless handled. Per item: shot_number, time start_s~end_s, content, source (vfx_tag shot annotation / prompt / script_unassigned = in the rewritten script but not attached to any shot), narrative_required (story-critical; cosmetic items such as color grading are false), status (pending / done_external / waived). ★Review before composing; tell the client about narrative_required pending items and ask: do it in external post (then mark_post_production_item done_external), change the shot so the platform draws it (update_shot then regenerate that shot), or drop it (waived). review_videos / compose_episode give an advisory for unhandled items.",
|
|
242
|
-
"mark_post_production_item": "Mark one item of the post-production checklist (free): status=done_external (client finished it outside the platform) / waived (client decided not to do it) / pending (undo). key comes from get_post_production_checklist; it changes after the shot or prompt is edited—on 400, re-read the checklist. (Marking post-production items requires explicit client consent in every execution mode, including autopilot.) Marking is bookkeeping only and does not change the final cut; if the client wants the externally finished version delivered, use register_external_delivery."
|
|
242
|
+
"mark_post_production_item": "Mark one item of the post-production checklist (free): status=done_external (client finished it outside the platform) / waived (client decided not to do it) / pending (undo). key comes from get_post_production_checklist; it changes after the shot or prompt is edited—on 400, re-read the checklist. (Marking post-production items requires explicit client consent in every execution mode, including autopilot.) Marking is bookkeeping only and does not change the final cut; if the client wants the externally finished version delivered, use register_external_delivery.",
|
|
243
|
+
"get_drama_logo": "Read this drama's final-cut logo settings (image URL / width / corner / margins / opacity). Free. null = no logo set.",
|
|
244
|
+
"set_drama_logo": "Set an image logo (corner bug) for this drama's final cut; it is overlaid above subtitles for the whole video. Free, no video regeneration. Upload the logo first with upload_image (transparent PNG recommended) and pass its URL as src. Size/margins are in px on a 720p-height baseline and scale with the output height (e.g. ~260px wide on 1080x1920 portrait -> width≈98). Takes effect on the next compose_episode / rerender_episode. Pass logo:null to clear."
|
|
243
245
|
}
|
|
@@ -150,7 +150,7 @@
|
|
|
150
150
|
"list_bgm_cues": "列出本集的配乐段(AI 配乐按情绪分幕,每段覆盖一段镜号 sb_from~sb_to):id、覆盖范围、gain_db(null=跟随音量档)、fade_in_ms / fade_out_ms、track_offset_ms / start_shift_ms(null=系统决定)。episode_id 为 null 的是**整剧共用段**,改它会影响所有集。免费。",
|
|
151
151
|
"update_bgm_cue": "调某一段配乐的音量、淡入淡出与起点(免费)。换曲目或改覆盖镜号范围用 generate_bgm 重新生成。★例:配乐进得太突兀→加大 fade_in_ms;某段压对白→降 gain_db;想从曲子的高潮部分开始→设 track_offset_ms;想等这段第一镜开口之后再进→设 start_shift_ms。改完 compose_episode 重新合成才生效。",
|
|
152
152
|
"get_bgm_prompt_guide": "取「AI 配乐提示词」的书写规范:两个档位怎么选、该写哪些维度(附可照抄的示例)、哪些是写了也不会生效的硬限制(纯器乐/时长/不做音效/不复刻具体曲目)、常见写坏的方式。免费,纯静态,与具体剧目无关——写 generate_bgm 的 prompt 之前先读它,别自己猜。也适合直接把要点转述给客户看。",
|
|
153
|
-
"set_shot_name_card": "给某一镜加/改/清「版式字卡」(终拼时烧进成片,含预览一致的书法字体与朱红印章)。name 传空字符串=清除本镜字卡。免费(纯数据,填了就显示)。两种用法:①不填 orient/placement/font_size = 角色名卡(画面侧边单列竖排人物名,适合群像出场镜);②填了其中任意一个 = 通用版式字卡,name 可以是**整句台词或旁白**(按标点自动切列、按最高列拟合字号)。placement=\"auto\" 会按背景亮度与粗糙度自动挑位置(躲开人脸/亮部);orient=\"auto\"
|
|
153
|
+
"set_shot_name_card": "给某一镜加/改/清「版式字卡」(终拼时烧进成片,含预览一致的书法字体与朱红印章)。name 传空字符串=清除本镜字卡。免费(纯数据,填了就显示)。两种用法:①不填 orient/placement/font_size = 角色名卡(画面侧边单列竖排人物名,适合群像出场镜);②填了其中任意一个 = 通用版式字卡,name 可以是**整句台词或旁白**(按标点自动切列、按最高列拟合字号)。placement=\"auto\" 会按背景亮度与粗糙度自动挑位置(躲开人脸/亮部);orient=\"auto\" 在背景太花时自动回退横排。③position=\"subtitle\" = 叙事字卡,与对白字幕同位同样式,可配 start_ms 从镜中段出现(无对白的镜最合适,避免与对白字幕重叠)。改完调 compose_episode 重新终拼生效(rerender_episode 沿用已存时间轴,带不上)。★别自己下载视频叠字再上传——那会绕开渲染机字体与印章素材,预览/成片不一致。",
|
|
154
154
|
"extract_segment_to_library": "把某一镜(或某集成片)的某个时间区间抽出来,存成可复用的素材,进我的素材库。免费(纯剪切,不走厂商)。典型用法:闪回/回忆蒙太奇——画面全用已有镜头,边际成本为 0。区间是相对**该来源视频**的秒数;末端超出片长会自动夹回来并在 span 里回显实际区间。同源同区间重复调用会命中内容哈希、复用已有素材(reused=true),不会在库里堆重复行。★别自己下载视频再用本地 ffmpeg 切——厂商产物的 GOP 长达 10s,按关键帧切必然偏,这里走的是平台已经趟平的精确切点。",
|
|
155
155
|
"get_bgm_status": "查某集 AI 配乐生成状态:running(是否在生成)+已入库的配乐轨列表(track/覆盖镜段/淡入淡出)+cue 数。免费。配乐 done 后需重新 compose_episode 才进成片。",
|
|
156
156
|
"translate_subtitles": "把某集字幕翻译成第二语言并开启双语。后台异步,按用量后付不欠费。",
|
|
@@ -184,6 +184,8 @@
|
|
|
184
184
|
"delete_character": "删除一个角色(提取误建/合并时用)。免费。",
|
|
185
185
|
"update_scene": "改场景设定(名字/描述/地点/时段/氛围),以及**场景图的出图提示词正文**(image_prompt)。免费(纯文本写库)。★场景图不满意时,改 image_prompt 才是直接手段——只改地点/时段是让平台重拼,拧不过来;改前先用 get_scene_prompt 读现值,改完用 regenerate_scene_image 重出这一场的图。★场景图变了不会自动重出已生成的镜头帧:那些帧仍拿旧场景图当背景锚,要跟上得逐镜重出。",
|
|
186
186
|
"set_era_contract": "设**本集**的时代契约(免费,纯文本写库)。★这是唯一压得过视觉锁的时代机制——古装/民国/仙侠类项目**出图前必设**,不设的话平台只能靠提示词正文堆字对抗,时代错乱(现代物件混进古代画面、仙境被画成写实古代)基本都是这里空着导致的。\n五档怎么选:\n· modern —— 现代/当代都市。不确定时用这档。\n· republican —— 民国、二十世纪早期。\n· historical —— 可考据的历史朝代;这档会要求画面向**考据写实**靠拢。\n· fantasy —— ★仙侠/奇幻/仙境:修真世界、妖灵化形一类**非写实**的东方奇幻。这类项目**别填 historical**——那档要求考据写实,会把发光灵气、悬浮地貌、非人化形一并判成「不合时代」,把画面往写实古代拽。\n· surreal —— ★现代 + 超现实:当代都市里有作者设定的超现实元素(超现实人体、都市异象)。基线同 modern;把超现实设定逐条写进 positive,它们被当作世界观正典、审计不判时代冲突;其中描述人物身体的设定适用于画面里每个人(含无参考的路人与人群),描述环境的只作用于世界。这类项目**别填 fantasy**——那档写死东方仙侠并禁当代服装。\n★设完不会自动重出已生成的图:要让画面跟上,得再调 generate_frames / regenerate_scene_image。★某一场要破例,用 update_scene 的 era_contract 单独覆写(场级压过集级)。",
|
|
187
|
+
"get_drama_logo": "读本剧的成片台标设置(图片地址 / 宽度 / 位置 / 边距 / 不透明度)。免费。null = 没设台标。",
|
|
188
|
+
"set_drama_logo": "设置本剧成片的图片台标(角标 logo),终拼时叠在全片字幕之上、整片可见。免费、不重出视频。先 upload_image 上传台标(建议透明底 PNG)拿到 URL 再传 src。尺寸/边距按 720p 高度基准、渲染时按成片高度等比缩放(例:1080×1920 竖屏要宽约 260px → width≈98)。改完 compose_episode / rerender_episode 生效。传 logo:null 清除台标。",
|
|
187
189
|
"get_era_contract": "读本集的时代契约现值 + 各场的场级覆写清单 + 五个可选档位的用途说明。免费。改之前先读一次:能看清「集级设的是哪档、哪几场被单独覆写过」,避免整集统一的时代被逐场填乱。★era_contract 为 null 就是**没设**——古装/仙侠项目看到 null 应当先 set_era_contract 再出图。",
|
|
188
190
|
"get_scene_prompt": "读某一场**场景图(空景基板)**的提示词正文,供直接微调后用 update_scene 的 image_prompt 写回。免费。★逐场按需:改哪场读哪场(整集列表 get_scenes 是纯资产视图,不含提示词)。★这是场景表里的正文层;出图时平台还会在其上拼画风块、空景约束与时代锁(不在此处,也无需你写)。回执的 has_image 说明这一场是否已有图。",
|
|
189
191
|
"quote_scene_lighting_ref": "给某个场景补一张打光参考图的报价(免费,不出图)。打光参考图=只复现该场景光线、不当身份参考的图:新版是无身份光照探针(中性灰背景上两只哑光标定球,不含任何人物),平台尚未对该剧切换新版时仍是中性人脸特写;报价返回的 note 会说明本剧这次出的是哪一种。近景/特写镜看不到场景图时靠它统一光线。场景缺它时(例如上传了新场景图后)才需要补;有宽景镜但还没出首帧的场景不必补(宽景镜出帧时平台自动派生)。不够格时返回 400 并说明原因。⚠️ 批量报价确认流程:先调对应的 quote_* 工具拿 estimated_points 与 quote_id,再用 quote_id 调本工具(报价确认按执行模式:专业模式 / 未确认方案 / 本环节由客户把控 → 讲给客户、客户同意才做,别替客户决定;本环节托管 → 不问客户,照 get_production_plan 的 autopilot.default_decisions 执行,平台记进 get_autopilot_log)。托管环节报价须在预算硬上限内,被 402 BUDGET_WOULD_EXCEED 拦下就停下问客户。★**出图类报价(定妆图/场景图/出帧)给的是两个数**:estimated_points 是**上界**(按该模型参考图张数上限估,保证你不会按低了的预算开跑、出到一半 402 中断);同一响应里的 typical_points 是**通常花费**。两个都要告诉客户——只说上界会让人以为贵得多(满参考图的上界可达通常值的 2 倍以上),只说通常值又会让余额准备不足。固定价模型下两者相等,这时说一个数就行。出视频的报价与扣费同函数,不存在这个区间。",
|
package/dist/tools/guide-data.js
CHANGED
|
@@ -281,7 +281,7 @@ export const PIPELINE = [
|
|
|
281
281
|
},
|
|
282
282
|
{
|
|
283
283
|
step: '10 成片与交付',
|
|
284
|
-
tools: ['compose_episode', 'get_final_cut', 'get_export', 'rerender_episode', 'get_deliverables', 'generate_deliverables', 'render_multi_aspect', 'generate_effects', 'generate_transitions', 'generate_episode_poster', 'generate_drama_poster', 'generate_cover', 'translate_subtitles', 'get_pipeline_status'],
|
|
284
|
+
tools: ['compose_episode', 'get_final_cut', 'get_export', 'rerender_episode', 'get_deliverables', 'generate_deliverables', 'render_multi_aspect', 'generate_effects', 'generate_transitions', 'set_drama_logo', 'get_drama_logo', 'generate_episode_poster', 'generate_drama_poster', 'generate_cover', 'translate_subtitles', 'get_pipeline_status'],
|
|
285
285
|
billing: '免费',
|
|
286
286
|
note: '终拼免费(ffmpeg+COS);成片前用 `get_pipeline_status` 确认没有缺镜;配乐晚于成片(bgm_stale)重新 compose 即可。',
|
|
287
287
|
},
|
package/dist/tools/produce.js
CHANGED
|
@@ -1873,6 +1873,7 @@ export function registerProduceTools(server, client) {
|
|
|
1873
1873
|
'两种用法:①不填 orient/placement/font_size = 角色名卡(画面侧边单列竖排人物名,适合群像出场镜);' +
|
|
1874
1874
|
'②填了其中任意一个 = 通用版式字卡,name 可以是**整句台词或旁白**(按标点自动切列、按最高列拟合字号)。' +
|
|
1875
1875
|
'placement="auto" 会按背景亮度与粗糙度自动挑位置(躲开人脸/亮部);orient="auto" 在背景太花时自动回退横排。' +
|
|
1876
|
+
'③position="subtitle" = 叙事字卡,与对白字幕同位同样式,可配 start_ms 从镜中段出现(无对白的镜最合适,避免与对白字幕重叠)。改完调 compose_episode 重新终拼生效(rerender_episode 沿用已存时间轴,带不上)。' +
|
|
1876
1877
|
'★别自己下载视频叠字再上传——那会绕开渲染机字体与印章素材,预览/成片不一致。', {
|
|
1877
1878
|
storyboard_id: z.number().int().positive(),
|
|
1878
1879
|
name: z.string().describe('字卡正文(人物名,或版式模式下的任意文案/整句台词);空字符串=清除字卡'),
|
|
@@ -1885,12 +1886,18 @@ export function registerProduceTools(server, client) {
|
|
|
1885
1886
|
.describe('选位方式。不填=贴 side 那一边的固定位;auto=按背景亮度/粗糙度滑窗选位,躲开人和亮部'),
|
|
1886
1887
|
font_size: z.number().int().positive().optional()
|
|
1887
1888
|
.describe('字号上限(默认 72);实际字号按最高列拟合,不会超过它'),
|
|
1888
|
-
|
|
1889
|
+
start_ms: z.number().int().min(0).max(60000).nullable().optional()
|
|
1890
|
+
.describe('镜内起点毫秒(相对本镜开头),默认 0;字卡显示到 duration_ms 或镜尾'),
|
|
1891
|
+
position: z.enum(['subtitle']).nullable().optional()
|
|
1892
|
+
.describe('subtitle = 叙事字卡:与对白字幕同位同样式(底部居中),name 里用换行写多行(如双语两行);不画印章、不走选位;不传=保留原值,传 null=清除(回到侧边/版式字卡)'),
|
|
1893
|
+
}, async ({ storyboard_id, name, seal, side, duration_ms, orient, placement, font_size, start_ms, position }) => jsonResult(await client.producePut(`/storyboards/${storyboard_id}/name-card`, {
|
|
1889
1894
|
name, ...(seal !== undefined ? { seal } : {}), ...(side !== undefined ? { side } : {}),
|
|
1890
1895
|
...(duration_ms !== undefined ? { duration_ms } : {}),
|
|
1891
1896
|
...(orient !== undefined ? { orient } : {}),
|
|
1892
1897
|
...(placement !== undefined ? { placement } : {}),
|
|
1893
1898
|
...(font_size !== undefined ? { font_size } : {}),
|
|
1899
|
+
...(start_ms !== undefined ? { start_ms } : {}),
|
|
1900
|
+
...(position !== undefined ? { position } : {}),
|
|
1894
1901
|
})));
|
|
1895
1902
|
server.tool('extract_segment_to_library', '把某一镜(或某集成片)的某个时间区间抽出来,存成可复用的素材,进我的素材库。免费(纯剪切,不走厂商)。' +
|
|
1896
1903
|
'典型用法:闪回/回忆蒙太奇——画面全用已有镜头,边际成本为 0。' +
|
|
@@ -2138,6 +2145,22 @@ export function registerProduceTools(server, client) {
|
|
|
2138
2145
|
negative: z.array(z.string()).optional()
|
|
2139
2146
|
.describe('额外的禁止项(可留空)。写该档基线没覆盖、但本项目必须禁的东西'),
|
|
2140
2147
|
}, async ({ episode_id, ...rest }) => jsonResult(await client.producePut(`/episodes/${episode_id}/era-contract`, rest)));
|
|
2148
|
+
server.tool('get_drama_logo', '读本剧的成片台标设置(图片地址 / 宽度 / 位置 / 边距 / 不透明度)。免费。null = 没设台标。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.produceGet(`/dramas/${drama_id}/logo`)));
|
|
2149
|
+
server.tool('set_drama_logo', '设置本剧成片的图片台标(角标 logo),终拼时叠在全片字幕之上、整片可见。免费、不重出视频。'
|
|
2150
|
+
+ '先 upload_image 上传台标(建议透明底 PNG)拿到 URL 再传 src。尺寸/边距按 720p 高度基准、渲染时按成片高度等比缩放'
|
|
2151
|
+
+ '(例:1080×1920 竖屏要宽约 260px → width≈98)。改完 compose_episode / rerender_episode 生效。传 logo:null 清除台标。', {
|
|
2152
|
+
drama_id: z.number().int().positive(),
|
|
2153
|
+
src: z.string().url().optional().describe('台标图片 URL(http/https,upload_image 返回的地址)'),
|
|
2154
|
+
width: z.number().int().min(8).max(400).optional().describe('宽度 px(720p 基准),默认 90;高按原图比例'),
|
|
2155
|
+
opacity: z.number().min(0).max(1).optional().describe('不透明度 0–1,默认 0.85'),
|
|
2156
|
+
gravity: z.enum(['NorthEast', 'NorthWest', 'SouthEast', 'SouthWest']).optional().describe('角落:NorthEast 右上(默认)/ NorthWest 左上 / SouthEast 右下 / SouthWest 左下'),
|
|
2157
|
+
margin_x: z.number().int().min(0).max(200).optional().describe('距左右边 px(720p 基准),默认 14'),
|
|
2158
|
+
margin_y: z.number().int().min(0).max(200).optional().describe('距上下边 px(720p 基准),默认 14'),
|
|
2159
|
+
logo: z.null().optional().describe('传 null 清除台标(此时别传 src)'),
|
|
2160
|
+
}, async ({ drama_id, ...fields }) => {
|
|
2161
|
+
const payload = Object.fromEntries(Object.entries(fields).filter(([, v]) => v !== undefined));
|
|
2162
|
+
return jsonResult(await client.producePut(`/dramas/${drama_id}/logo`, payload));
|
|
2163
|
+
});
|
|
2141
2164
|
server.tool('get_era_contract', '读本集的时代契约现值 + 各场的场级覆写清单 + 五个可选档位的用途说明。免费。'
|
|
2142
2165
|
+ '改之前先读一次:能看清「集级设的是哪档、哪几场被单独覆写过」,避免整集统一的时代被逐场填乱。'
|
|
2143
2166
|
+ '★era_contract 为 null 就是**没设**——古装/仙侠项目看到 null 应当先 set_era_contract 再出图。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/era-contract`)));
|
package/openapi.json
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
"openapi": "3.1.0",
|
|
3
3
|
"info": {
|
|
4
4
|
"title": "StarReel Production API",
|
|
5
|
-
"version": "0.1.
|
|
6
|
-
"description": "Turn a script into a finished, downloadable short-drama episode over REST.\n\nPipeline: script → AI rewrite → cast/scenes/props extraction → storyboards → portraits & sheets + scene plates → keyframes → video shots → TTS → final cut (.mp4).\n\n**Billing is prepaid and agent-safe**: big-ticket stages are quote-then-generate (`quote_*` returns a `quote_id`). For video, quote == actual charge. For images the quote is a *range* — models billed per reference image are priced before those are assembled, so `estimated_points` is the upper bound (size the balance by it and a run never dies half-way) and `typical_points` is the usual cost; fixed-price models return the two equal. Insufficient balance returns 402 — nothing half-runs and the account never goes negative.\n\nAuth: exchange your API key at `POST /v1/agent/token` for a 15-minute bearer token.\n\nGenerated from the @starreel/mcp v0.1.
|
|
5
|
+
"version": "0.1.200",
|
|
6
|
+
"description": "Turn a script into a finished, downloadable short-drama episode over REST.\n\nPipeline: script → AI rewrite → cast/scenes/props extraction → storyboards → portraits & sheets + scene plates → keyframes → video shots → TTS → final cut (.mp4).\n\n**Billing is prepaid and agent-safe**: big-ticket stages are quote-then-generate (`quote_*` returns a `quote_id`). For video, quote == actual charge. For images the quote is a *range* — models billed per reference image are priced before those are assembled, so `estimated_points` is the upper bound (size the balance by it and a run never dies half-way) and `typical_points` is the usual cost; fixed-price models return the two equal. Insufficient balance returns 402 — nothing half-runs and the account never goes negative.\n\nAuth: exchange your API key at `POST /v1/agent/token` for a 15-minute bearer token.\n\nGenerated from the @starreel/mcp v0.1.200 tool surface (operationIds match MCP tool names 1:1)."
|
|
7
7
|
},
|
|
8
8
|
"servers": [
|
|
9
9
|
{
|
|
@@ -2270,6 +2270,146 @@
|
|
|
2270
2270
|
}
|
|
2271
2271
|
}
|
|
2272
2272
|
},
|
|
2273
|
+
"/dramas/{drama_id}/logo": {
|
|
2274
|
+
"get": {
|
|
2275
|
+
"operationId": "get_drama_logo",
|
|
2276
|
+
"summary": "读本剧的成片台标设置(图片地址 / 宽度 / 位置 / 边距 / 不透明度)",
|
|
2277
|
+
"description": "读本剧的成片台标设置(图片地址 / 宽度 / 位置 / 边距 / 不透明度)。免费。null = 没设台标。",
|
|
2278
|
+
"tags": [
|
|
2279
|
+
"dramas"
|
|
2280
|
+
],
|
|
2281
|
+
"parameters": [
|
|
2282
|
+
{
|
|
2283
|
+
"name": "drama_id",
|
|
2284
|
+
"in": "path",
|
|
2285
|
+
"required": true,
|
|
2286
|
+
"schema": {
|
|
2287
|
+
"type": "integer",
|
|
2288
|
+
"exclusiveMinimum": 0
|
|
2289
|
+
}
|
|
2290
|
+
}
|
|
2291
|
+
],
|
|
2292
|
+
"responses": {
|
|
2293
|
+
"200": {
|
|
2294
|
+
"description": "StarReel envelope",
|
|
2295
|
+
"content": {
|
|
2296
|
+
"application/json": {
|
|
2297
|
+
"schema": {
|
|
2298
|
+
"type": "object",
|
|
2299
|
+
"properties": {
|
|
2300
|
+
"code": {
|
|
2301
|
+
"type": "integer"
|
|
2302
|
+
},
|
|
2303
|
+
"message": {
|
|
2304
|
+
"type": "string"
|
|
2305
|
+
},
|
|
2306
|
+
"data": {
|
|
2307
|
+
"description": "Operation result payload"
|
|
2308
|
+
}
|
|
2309
|
+
}
|
|
2310
|
+
}
|
|
2311
|
+
}
|
|
2312
|
+
}
|
|
2313
|
+
},
|
|
2314
|
+
"402": {
|
|
2315
|
+
"description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
|
|
2316
|
+
}
|
|
2317
|
+
}
|
|
2318
|
+
},
|
|
2319
|
+
"put": {
|
|
2320
|
+
"operationId": "set_drama_logo",
|
|
2321
|
+
"summary": "设置本剧成片的图片台标(角标 logo),终拼时叠在全片字幕之上、整片可见",
|
|
2322
|
+
"description": "设置本剧成片的图片台标(角标 logo),终拼时叠在全片字幕之上、整片可见。免费、不重出视频。先 upload_image 上传台标(建议透明底 PNG)拿到 URL 再传 src。尺寸/边距按 720p 高度基准、渲染时按成片高度等比缩放(例:1080×1920 竖屏要宽约 260px → width≈98)。改完 compose_episode / rerender_episode 生效。传 logo:null 清除台标。",
|
|
2323
|
+
"tags": [
|
|
2324
|
+
"dramas"
|
|
2325
|
+
],
|
|
2326
|
+
"parameters": [
|
|
2327
|
+
{
|
|
2328
|
+
"name": "drama_id",
|
|
2329
|
+
"in": "path",
|
|
2330
|
+
"required": true,
|
|
2331
|
+
"schema": {
|
|
2332
|
+
"type": "integer",
|
|
2333
|
+
"exclusiveMinimum": 0
|
|
2334
|
+
}
|
|
2335
|
+
}
|
|
2336
|
+
],
|
|
2337
|
+
"requestBody": {
|
|
2338
|
+
"required": false,
|
|
2339
|
+
"content": {
|
|
2340
|
+
"application/json": {
|
|
2341
|
+
"schema": {
|
|
2342
|
+
"type": "object",
|
|
2343
|
+
"properties": {
|
|
2344
|
+
"src": {
|
|
2345
|
+
"type": "string",
|
|
2346
|
+
"format": "uri"
|
|
2347
|
+
},
|
|
2348
|
+
"width": {
|
|
2349
|
+
"type": "integer",
|
|
2350
|
+
"minimum": 8,
|
|
2351
|
+
"maximum": 400
|
|
2352
|
+
},
|
|
2353
|
+
"opacity": {
|
|
2354
|
+
"type": "number",
|
|
2355
|
+
"minimum": 0,
|
|
2356
|
+
"maximum": 1
|
|
2357
|
+
},
|
|
2358
|
+
"gravity": {
|
|
2359
|
+
"type": "string",
|
|
2360
|
+
"enum": [
|
|
2361
|
+
"NorthEast",
|
|
2362
|
+
"NorthWest",
|
|
2363
|
+
"SouthEast",
|
|
2364
|
+
"SouthWest"
|
|
2365
|
+
]
|
|
2366
|
+
},
|
|
2367
|
+
"margin_x": {
|
|
2368
|
+
"type": "integer",
|
|
2369
|
+
"minimum": 0,
|
|
2370
|
+
"maximum": 200
|
|
2371
|
+
},
|
|
2372
|
+
"margin_y": {
|
|
2373
|
+
"type": "integer",
|
|
2374
|
+
"minimum": 0,
|
|
2375
|
+
"maximum": 200
|
|
2376
|
+
},
|
|
2377
|
+
"logo": {
|
|
2378
|
+
"type": "null"
|
|
2379
|
+
}
|
|
2380
|
+
}
|
|
2381
|
+
}
|
|
2382
|
+
}
|
|
2383
|
+
}
|
|
2384
|
+
},
|
|
2385
|
+
"responses": {
|
|
2386
|
+
"200": {
|
|
2387
|
+
"description": "StarReel envelope",
|
|
2388
|
+
"content": {
|
|
2389
|
+
"application/json": {
|
|
2390
|
+
"schema": {
|
|
2391
|
+
"type": "object",
|
|
2392
|
+
"properties": {
|
|
2393
|
+
"code": {
|
|
2394
|
+
"type": "integer"
|
|
2395
|
+
},
|
|
2396
|
+
"message": {
|
|
2397
|
+
"type": "string"
|
|
2398
|
+
},
|
|
2399
|
+
"data": {
|
|
2400
|
+
"description": "Operation result payload"
|
|
2401
|
+
}
|
|
2402
|
+
}
|
|
2403
|
+
}
|
|
2404
|
+
}
|
|
2405
|
+
}
|
|
2406
|
+
},
|
|
2407
|
+
"402": {
|
|
2408
|
+
"description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
|
|
2409
|
+
}
|
|
2410
|
+
}
|
|
2411
|
+
}
|
|
2412
|
+
},
|
|
2273
2413
|
"/dramas/{drama_id}/motion-templates": {
|
|
2274
2414
|
"post": {
|
|
2275
2415
|
"operationId": "generate_motion_templates",
|
|
@@ -13285,7 +13425,7 @@
|
|
|
13285
13425
|
"put": {
|
|
13286
13426
|
"operationId": "set_shot_name_card",
|
|
13287
13427
|
"summary": "给某一镜加/改/清「版式字卡」(终拼时烧进成片,含预览一致的书法字体与朱红印章)",
|
|
13288
|
-
"description": "给某一镜加/改/清「版式字卡」(终拼时烧进成片,含预览一致的书法字体与朱红印章)。name 传空字符串=清除本镜字卡。免费(纯数据,填了就显示)。两种用法:①不填 orient/placement/font_size = 角色名卡(画面侧边单列竖排人物名,适合群像出场镜);②填了其中任意一个 = 通用版式字卡,name 可以是**整句台词或旁白**(按标点自动切列、按最高列拟合字号)。placement=\"auto\" 会按背景亮度与粗糙度自动挑位置(躲开人脸/亮部);orient=\"auto\"
|
|
13428
|
+
"description": "给某一镜加/改/清「版式字卡」(终拼时烧进成片,含预览一致的书法字体与朱红印章)。name 传空字符串=清除本镜字卡。免费(纯数据,填了就显示)。两种用法:①不填 orient/placement/font_size = 角色名卡(画面侧边单列竖排人物名,适合群像出场镜);②填了其中任意一个 = 通用版式字卡,name 可以是**整句台词或旁白**(按标点自动切列、按最高列拟合字号)。placement=\"auto\" 会按背景亮度与粗糙度自动挑位置(躲开人脸/亮部);orient=\"auto\" 在背景太花时自动回退横排。③position=\"subtitle\" = 叙事字卡,与对白字幕同位同样式,可配 start_ms 从镜中段出现(无对白的镜最合适,避免与对白字幕重叠)。改完调 compose_episode 重新终拼生效(rerender_episode 沿用已存时间轴,带不上)。★别自己下载视频叠字再上传——那会绕开渲染机字体与印章素材,预览/成片不一致。",
|
|
13289
13429
|
"tags": [
|
|
13290
13430
|
"storyboards"
|
|
13291
13431
|
],
|
|
@@ -13343,6 +13483,31 @@
|
|
|
13343
13483
|
"font_size": {
|
|
13344
13484
|
"type": "integer",
|
|
13345
13485
|
"exclusiveMinimum": 0
|
|
13486
|
+
},
|
|
13487
|
+
"start_ms": {
|
|
13488
|
+
"anyOf": [
|
|
13489
|
+
{
|
|
13490
|
+
"type": "integer",
|
|
13491
|
+
"minimum": 0,
|
|
13492
|
+
"maximum": 60000
|
|
13493
|
+
},
|
|
13494
|
+
{
|
|
13495
|
+
"type": "null"
|
|
13496
|
+
}
|
|
13497
|
+
]
|
|
13498
|
+
},
|
|
13499
|
+
"position": {
|
|
13500
|
+
"anyOf": [
|
|
13501
|
+
{
|
|
13502
|
+
"type": "string",
|
|
13503
|
+
"enum": [
|
|
13504
|
+
"subtitle"
|
|
13505
|
+
]
|
|
13506
|
+
},
|
|
13507
|
+
{
|
|
13508
|
+
"type": "null"
|
|
13509
|
+
}
|
|
13510
|
+
]
|
|
13346
13511
|
}
|
|
13347
13512
|
},
|
|
13348
13513
|
"required": [
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@starreel/mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.200",
|
|
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.200",
|
|
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.200",
|
|
12
12
|
"transport": {
|
|
13
13
|
"type": "stdio"
|
|
14
14
|
},
|