@starreel/mcp 0.1.58 → 0.1.60
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/README.md +1 -1
- package/SKILL.md +11 -1
- package/dist/tools/guide-data.js +5 -3
- package/dist/tools/produce.js +35 -2
- package/openapi.json +164 -5
- package/package.json +1 -1
- package/server.json +2 -2
package/README.md
CHANGED
|
@@ -128,7 +128,7 @@ See the [API docs](https://api.shortreelai.com/docs/mcp).
|
|
|
128
128
|
| Identity anchors | `generate_portraits_and_sheets` (portraits + character sheets = the consistency anchor) |
|
|
129
129
|
| Storyboards | `quote_storyboards` → `generate_storyboards` → `get_storyboards` |
|
|
130
130
|
| Frames & video | `quote_frames` → `generate_frames` · `quote_videos` → `generate_videos` |
|
|
131
|
-
| Audio | `generate_tts` · `generate_bgm` · `generate_sfx` · voice management |
|
|
131
|
+
| Audio | `generate_tts` · `generate_bgm` (steerable via `prompt`) · `get_bgm_prompt_guide` · `generate_sfx` · voice management |
|
|
132
132
|
| Finishing | `compose_episode` (free) · `get_final_cut` · `render_multi_aspect` · posters & covers |
|
|
133
133
|
| Localization | `translate_subtitles` · localization jobs |
|
|
134
134
|
| Ads / MV modes | product library & product sheets · MV lyrics → story → script |
|
package/SKILL.md
CHANGED
|
@@ -72,6 +72,7 @@ announces a condensed version as MCP `instructions` at connect time.
|
|
|
72
72
|
| A finished **shot list** (per-shot seconds / shot size / camera move) | `get_storyboard_table_spec` (the contract: shot-size / camera-move vocabulary, body layout, text-card syntax, a prompt for the external AI) → `check_storyboard_table` (same parser as the import; clear `errors`, read every `warning` — a missing duration, an unrecognised shot size or an empty body all get imported as-is) → `import_storyboard_table` (defaults to `auto_complete`: one background batch fills the professional fields and expands every shot's platform-built base description into full image / video prompts — metered text, tell the customer first; `auto_complete: false` imports only) → `get_autofill_status` until `done` → `review_storyboards` | `rewrite_script` + `generate_storyboards` — strips every production parameter (measured: 8 shots / 36 s became 20 shots / 109 s); importing without the check; reviewing before the completion batch finishes (the token expires when shots change) |
|
|
73
73
|
| **Structured data** — their own tool / spreadsheet export, or an external AI producing JSON (cast + scenes + shots in one go) | `get_bulk_import_spec` (contract + template + worked example + enums, same source as the validator) → `check_bulk_import` (same zod schema; unresolved character / scene references, dead shots and stage directions inside dialogue are surfaced) → `bulk_import_storyboards` (`mode: "replace"` only with the customer's explicit OK; defaults to `auto_complete`: professional fields for every shot, full image / video prompts only for shots that had no `image_prompt` — prompts you supply yourself are kept verbatim — metered text, tell the customer first) → `get_autofill_status` until `done` → `review_storyboards` | converting the JSON to text for `import_storyboard_table`; hand-building shots with `update_shot`; reviewing before the completion batch finishes |
|
|
74
74
|
| Their own portraits / scene / prop / shot images | `upload_image` · `set_character_portrait` · `upload_scene_image` · `upload_prop_sheet` · `upload_shot_frame` | rendering a "fix" elsewhere and uploading it — use `generate_shot_frame` |
|
|
75
|
+
| A scene plate that came out wrong (backdrop, era, light, layout) | `get_scene_prompt` → `update_scene` (`image_prompt`) → `regenerate_scene_image`; already-rendered shot frames still anchor on the old plate, so regenerate those shots too | re-running `generate_scene_images` (it only fills scenes that have **no** plate — it will not touch this one) |
|
|
75
76
|
| A voice sample / a required voice | `clone_voice` → `speak_with_voice` → `set_character_voice` / `assign_voices` | cloning without the rights-holder's consent |
|
|
76
77
|
| A song + lyrics | `create_drama` (`project_type: "mv"`) → `set_mv_lyrics` → `generate_mv_story` → `generate_mv_script` | `rewrite_script` (blocked for MV) |
|
|
77
78
|
| A product / brand | `create_drama` (`project_type: "ad"` or `"brand_film"`) → `add_product` → `generate_product_sheet` | writing brand copy as dialogue (it gets spoken) |
|
|
@@ -410,6 +411,14 @@ is only the part you write: the platform still layers identity anchors and
|
|
|
410
411
|
consistency constraints on top at generation time. Editing a prompt does not
|
|
411
412
|
re-generate anything — regenerate the shot afterwards.
|
|
412
413
|
|
|
414
|
+
The same applies one layer up, to the **scene plate** (the empty backdrop every
|
|
415
|
+
shot in that scene anchors on): `get_scene_prompt` reads one scene's prompt body,
|
|
416
|
+
`update_scene` writes it back as `image_prompt`, and `regenerate_scene_image`
|
|
417
|
+
re-renders that one scene — overwriting whatever plate it had, including an
|
|
418
|
+
uploaded one. Write the plate body as an environment with no people in it;
|
|
419
|
+
characters enter at the shot-frame layer. Shot frames already rendered are not
|
|
420
|
+
re-rendered with it: they still carry the old plate as their background anchor.
|
|
421
|
+
|
|
413
422
|
## Failure playbook
|
|
414
423
|
|
|
415
424
|
Failures surface as a human-readable `message` (MCP throws `Error(message)`;
|
|
@@ -586,7 +595,8 @@ to close") tells the vendor to fit that entire sequence into each 3-second shot.
|
|
|
586
595
|
`quote/generate_frames`, `chain_frames`, `quote/generate_videos`
|
|
587
596
|
- **Audio**: `generate_tts` (required before final cut), `clone_voice`,
|
|
588
597
|
`speak_with_voice`, `set_character_voice`, `list_voices`, `delete_voice`,
|
|
589
|
-
`generate_bgm
|
|
598
|
+
`generate_bgm` (optional `prompt` steers the music; read `get_bgm_prompt_guide` first),
|
|
599
|
+
`get_bgm_prompt_guide`, `replace_shot_dialogue`
|
|
590
600
|
- **Finish**: `compose_episode`, `get_final_cut`, `get_export`,
|
|
591
601
|
`generate_episode_poster`, `generate_cover`
|
|
592
602
|
- **Assemble it yourself**: `export_handoff_pack`, `get_handoff_toolchain` —
|
package/dist/tools/guide-data.js
CHANGED
|
@@ -188,6 +188,7 @@ export const PIPELINE = [
|
|
|
188
188
|
'generate_world_concept(默认必做,仍走报价)', 'generate_motion_templates', 'generate_color_script',
|
|
189
189
|
'generate_art_bible', 'extract_visual_lock', 'extract_setting_brief', 'generate_video_style',
|
|
190
190
|
'quote_scene_images', 'generate_scene_images', 'generate_prop_sheet',
|
|
191
|
+
'get_scene_prompt(读某场空景图的提示词正文,免费)', 'update_scene(image_prompt 改正文)', 'regenerate_scene_image(单场重出)',
|
|
191
192
|
],
|
|
192
193
|
billing: '报价确认后扣点',
|
|
193
194
|
note: '分镜后建只给出场角色出图更省;动作模板本就必须分镜后。',
|
|
@@ -233,6 +234,7 @@ export const QA_TOOLS = [
|
|
|
233
234
|
{ symptom: '动作发生在裁剪窗口之外', run: 'recommend_trim_window', then: ['trim_shot'] },
|
|
234
235
|
{ symptom: '画面多出一个人 / 多出一件道具', run: 'get_storyboards(先看该镜实际用的首帧)', then: ['generate_shot_frame(首帧本身就有→重生首帧再重生视频)', 'split_shot(帧干净、片中长出来→拆成 3~5 秒短镜)'] },
|
|
235
236
|
{ symptom: '出图 / 出视频前想知道哪些镜会被厂商拒', run: 'run_precheck', then: ['update_shot', 'generate_shot_frame'] },
|
|
237
|
+
{ symptom: '场景图(空景基板)不对 / 重出还是同一类图', run: 'get_scene_prompt', then: ['update_scene(改 image_prompt 正文——只改地点/时段是让平台重拼,拧不过来)', 'regenerate_scene_image(单场重出,覆盖旧图)', 'upload_scene_image(客户自有实拍/外部精修图)', 'generate_shot_frame(下游镜头帧不会自动跟着重出)'] },
|
|
236
238
|
{ symptom: '整集健康度 / 缺镜 / 进度', run: 'get_pipeline_status', then: ['get_health_report', 'review_all', 'get_storyboards', 'get_jobs', 'get_run_status', 'get_autofill_status(导入/一键填空的后台补全进度)'] },
|
|
237
239
|
{ symptom: '预算 / 余额', run: 'get_budget_status', then: ['get_cost_estimate'] },
|
|
238
240
|
];
|
|
@@ -241,12 +243,12 @@ export const OPTIONAL_BOOSTS = [
|
|
|
241
243
|
{ what: '美术圣经 / 视觉锁 / 世界观 Brief 抽取', tool: 'generate_art_bible', when: '建剧后;或 `extract_visual_lock` / `extract_setting_brief` 从剧本反推' },
|
|
242
244
|
{ what: '动作模板(统一全片运动语言)', tool: 'generate_motion_templates', when: '分镜后、出图前;漏了动作会散乱' },
|
|
243
245
|
{ what: '色彩脚本(统一色调)', tool: 'generate_color_script', when: '分镜后、出图前' },
|
|
244
|
-
{ what: '场景图(空景基板)', tool: 'generate_scene_images', when: '出镜头图前;先 `quote_scene_images`' },
|
|
246
|
+
{ what: '场景图(空景基板)', tool: 'generate_scene_images', when: '出镜头图前;先 `quote_scene_images`。出得不对:`get_scene_prompt` 读正文 → `update_scene` 改 image_prompt → `regenerate_scene_image` 单场重出' },
|
|
245
247
|
{ what: '场景组(同场景多镜一次成组出视频)', tool: 'generate_scene_groups', when: '先 `get_scene_group_plan` 看方案' },
|
|
246
248
|
{ what: '口型同步', tool: 'lipsync_episode', when: 'TTS 配音项目需要对口型时' },
|
|
247
249
|
{ what: '海报 / 封面', tool: 'generate_episode_poster', when: '成片后;`generate_drama_poster` / `generate_cover` 同族' },
|
|
248
250
|
{ what: '音效 / 特效 / 转场(本地库匹配)', tool: 'generate_sfx', when: '免费;`generate_effects` / `generate_transitions` 同族' },
|
|
249
|
-
{ what: '配乐', tool: 'generate_bgm', when: '
|
|
251
|
+
{ what: '配乐', tool: 'generate_bgm', when: '按整集情绪弧线生成;终拼自动接管。客户想指定音乐方向就带 prompt(整集一条),写法先读 `get_bgm_prompt_guide`(免费);不带 prompt 就是全自动' },
|
|
250
252
|
{ what: '字幕翻译', tool: 'translate_subtitles', when: '出海;双语烧录在项目设定里开' },
|
|
251
253
|
];
|
|
252
254
|
export const BILLING = {
|
|
@@ -255,7 +257,7 @@ export const BILLING = {
|
|
|
255
257
|
'quote_id 一次性、约 15 分钟过期;绝不擅自确认,视频报价可能上万点。',
|
|
256
258
|
pay_as_you_go: '文本步(改写 / 提取 / 自动填充 / 增强提示词)按 token 后付,无需报价但要事先告知。',
|
|
257
259
|
free_families: [
|
|
258
|
-
'所有 get_* / list_* / scan_* / review_* / check_* / recommend_* / get_capabilities_guide / get_autofill_status',
|
|
260
|
+
'所有 get_* / list_* / scan_* / review_* / check_* / recommend_* / get_capabilities_guide / get_autofill_status / get_bgm_prompt_guide',
|
|
259
261
|
'compose_episode / rerender_episode / render_multi_aspect / generate_sfx / generate_effects / generate_transitions',
|
|
260
262
|
'import_storyboard_table / adopt_external_script / get_script_format_spec / check_script_format',
|
|
261
263
|
'get_storyboard_table_spec / check_storyboard_table / get_bulk_import_spec / check_bulk_import / bulk_import_storyboards',
|
package/dist/tools/produce.js
CHANGED
|
@@ -818,7 +818,26 @@ export function registerProduceTools(server, client) {
|
|
|
818
818
|
})));
|
|
819
819
|
server.tool('generate_bgm', '给整集生成/更换 AI 配乐(按情绪弧线)。后台异步,按用量后付不欠费。返回情绪弧线段数与预估耗时;' +
|
|
820
820
|
'用 get_bgm_status 轮询生成进度。★配乐生成/改动**不会自动进已有成片**——完成后必须重新 ' +
|
|
821
|
-
'compose_episode(免费)才能听到;get_final_cut 的 bgm_stale=true 就是在提示这一步。别用 re-render(吃旧时间线,不含新配乐)
|
|
821
|
+
'compose_episode(免费)才能听到;get_final_cut 的 bgm_stale=true 就是在提示这一步。别用 re-render(吃旧时间线,不含新配乐)。\n' +
|
|
822
|
+
'★prompt 可选:不传=全自动(和以前一样)。传了就是在自动结果上再加方向,整集一条,系统仍按情绪弧线分幕。' +
|
|
823
|
+
'怎么写见 get_bgm_prompt_guide(免费);要点=只写音乐维度(情绪气质/主奏配器/速度动态/厚薄空间/风格参照),' +
|
|
824
|
+
'别写剧情(「主角发现真相时要紧张」→写「紧张,节奏推进感强」)。' +
|
|
825
|
+
'只出纯器乐:要人声/歌词/拟音当乐器都不会生效,会在 prompt_warnings 里点名但**不拦生成**。\n' +
|
|
826
|
+
'★prompt_mode: guide(默认)=你的要求与平台专业护栏(时代与题材匹配/配器节制/高潮保规模/段间差异)一起生效;' +
|
|
827
|
+
'override=直通,跳过护栏,只保留技术底线(纯器乐/时长/可循环)。override 效果自负,' +
|
|
828
|
+
'**先用 guide 试**,确实拧不过来再换。不传 prompt 时沿用该集上次填的(get_bgm_status 可查)。', {
|
|
829
|
+
episode_id: z.number().int().positive(),
|
|
830
|
+
prompt: z.string().optional().describe('配乐方向,整集一条,≤800 字。只写音乐维度,别写剧情。传空字符串=清除已存的提示词。'
|
|
831
|
+
+ '不传=沿用该集上次填的(没填过就是全自动)。'),
|
|
832
|
+
prompt_mode: z.enum(['guide', 'override']).optional().describe('guide(默认)=提示词与平台护栏一起生效;override=直通跳过审美护栏(技术底线仍在)。'),
|
|
833
|
+
}, async ({ episode_id, prompt, prompt_mode }) => jsonResult(await client.producePost(`/episodes/${episode_id}/bgm`, {
|
|
834
|
+
...(prompt === undefined ? {} : { prompt }),
|
|
835
|
+
...(prompt_mode ? { prompt_mode } : {}),
|
|
836
|
+
})));
|
|
837
|
+
server.tool('get_bgm_prompt_guide', '取「AI 配乐提示词」的书写规范:两个档位怎么选、该写哪些维度(附可照抄的示例)、' +
|
|
838
|
+
'哪些是写了也不会生效的硬限制(纯器乐/时长/不做音效/不复刻具体曲目)、常见写坏的方式。' +
|
|
839
|
+
'免费,纯静态,与具体剧目无关——写 generate_bgm 的 prompt 之前先读它,别自己猜。' +
|
|
840
|
+
'也适合直接把要点转述给客户看。', {}, async () => jsonResult(await client.produceGet('/bgm-prompt-guide')));
|
|
822
841
|
server.tool('set_shot_name_card', '给某一镜加/改/清「角色名卡」(画面侧边竖排人物名+朱红印章,终拼时烧进成片,含预览一致的书法字体)。' +
|
|
823
842
|
'name 传空字符串=清除本镜名卡。免费(纯数据,填了就显示)。适合群像出场镜逐个标注人物名。' +
|
|
824
843
|
'★别自己下载视频叠字再上传——那会绕开渲染机字体与印章素材,预览/成片不一致。', {
|
|
@@ -875,7 +894,10 @@ export function registerProduceTools(server, client) {
|
|
|
875
894
|
profile_locked: z.number().int().min(0).max(1).optional().describe('1=锁定档案(AI 提取不再覆盖外貌/性格/描述,防定妆图换脸);0=解锁'),
|
|
876
895
|
}, async ({ character_id, ...fields }) => jsonResult(await client.producePut(`/characters/${character_id}`, fields)));
|
|
877
896
|
server.tool('delete_character', '删除一个角色(提取误建/合并时用)。免费。', { character_id: z.number().int().positive() }, async ({ character_id }) => jsonResult(await client.produceDelete(`/characters/${character_id}`)));
|
|
878
|
-
server.tool('update_scene', '改场景设定(名字/描述/地点/时段/氛围)
|
|
897
|
+
server.tool('update_scene', '改场景设定(名字/描述/地点/时段/氛围),以及**场景图的出图提示词正文**(image_prompt)。免费(纯文本写库)。' +
|
|
898
|
+
'★场景图不满意时,改 image_prompt 才是直接手段——只改地点/时段是让平台重拼,拧不过来;' +
|
|
899
|
+
'改前先用 get_scene_prompt 读现值,改完用 regenerate_scene_image 重出这一场的图。' +
|
|
900
|
+
'★场景图变了不会自动重出已生成的镜头帧:那些帧仍拿旧场景图当背景锚,要跟上得逐镜重出。', {
|
|
879
901
|
scene_id: z.number().int().positive(),
|
|
880
902
|
name: z.string().optional(),
|
|
881
903
|
description: z.string().optional(),
|
|
@@ -883,7 +905,18 @@ export function registerProduceTools(server, client) {
|
|
|
883
905
|
physical_location: z.string().optional(),
|
|
884
906
|
time_of_day: z.string().optional(),
|
|
885
907
|
mood: z.string().optional(),
|
|
908
|
+
image_prompt: z.string().optional()
|
|
909
|
+
.describe('这一场**空景图**的提示词正文(全量覆盖本场现值)。★先 get_scene_prompt 读现值再改;★写空景——这张是场景基板,画面里不该有人物(人物由镜头帧那层注入)。出图时平台会在正文之上再拼画风块、空景约束与时代锁,不必你写'),
|
|
886
910
|
}, async ({ scene_id, ...fields }) => jsonResult(await client.producePut(`/scenes/${scene_id}`, fields)));
|
|
911
|
+
server.tool('get_scene_prompt', '读某一场**场景图(空景基板)**的提示词正文,供直接微调后用 update_scene 的 image_prompt 写回。免费。' +
|
|
912
|
+
'★逐场按需:改哪场读哪场(整集列表 get_scenes 是纯资产视图,不含提示词)。' +
|
|
913
|
+
'★这是场景表里的正文层;出图时平台还会在其上拼画风块、空景约束与时代锁(不在此处,也无需你写)。' +
|
|
914
|
+
'回执的 has_image 说明这一场是否已有图。', { scene_id: z.number().int().positive() }, async ({ scene_id }) => jsonResult(await client.produceGet(`/scenes/${scene_id}/prompt`)));
|
|
915
|
+
server.tool('regenerate_scene_image', '按当前提示词重出**这一场**的场景图(改完 image_prompt 让画面跟上)。图片步,按用量后付不欠费。' +
|
|
916
|
+
'★覆盖式:出好后本场旧图被换掉(要留档先 get_scene_prompt/资产列表拿旧图 URL)。' +
|
|
917
|
+
'★已生成的镜头帧不会自动跟着重出——它们仍拿旧场景图当背景锚,要跟上得逐镜重出。' +
|
|
918
|
+
'★与 generate_scene_images 的区别:那个是整剧批量、只补**缺图**的场景,已有图的一律跳过;' +
|
|
919
|
+
'这个是单场景强制重出。客户自己上传过的场景图也会被覆盖,先确认是不是要保留。', { scene_id: z.number().int().positive() }, async ({ scene_id }) => jsonResult(await client.producePost(`/scenes/${scene_id}/image/regenerate`)));
|
|
887
920
|
server.tool('delete_scene', '删除一个场景。免费。', { scene_id: z.number().int().positive() }, async ({ scene_id }) => jsonResult(await client.produceDelete(`/scenes/${scene_id}`)));
|
|
888
921
|
server.tool('generate_character_sheet', '给**单个**角色出三视图设定图(镜头一致性根锚,所有镜头帧都会引用;比定妆图更完整)。整集批量用 generate_character_sheets。' +
|
|
889
922
|
'前置:该角色已有定妆图。图片步,按用量后付不欠费。', { 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 } : {})));
|
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 → portraits & sheets → storyboards → 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). 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.60",
|
|
6
|
+
"description": "Turn a script into a finished, downloadable short-drama episode over REST.\n\nPipeline: script → AI rewrite → cast/scenes/props extraction → portraits & sheets → storyboards → 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). 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.60 tool surface (operationIds match MCP tool names 1:1)."
|
|
7
7
|
},
|
|
8
8
|
"servers": [
|
|
9
9
|
{
|
|
@@ -27,6 +27,10 @@
|
|
|
27
27
|
}
|
|
28
28
|
},
|
|
29
29
|
"tags": [
|
|
30
|
+
{
|
|
31
|
+
"name": "bgm-prompt-guide",
|
|
32
|
+
"description": "Operations under /bgm-prompt-guide"
|
|
33
|
+
},
|
|
30
34
|
{
|
|
31
35
|
"name": "bulk-import",
|
|
32
36
|
"description": "Operations under /bulk-import"
|
|
@@ -85,6 +89,42 @@
|
|
|
85
89
|
}
|
|
86
90
|
],
|
|
87
91
|
"paths": {
|
|
92
|
+
"/bgm-prompt-guide": {
|
|
93
|
+
"get": {
|
|
94
|
+
"operationId": "get_bgm_prompt_guide",
|
|
95
|
+
"summary": "取「AI 配乐提示词」的书写规范:两个档位怎么选、该写哪些维度(附可照抄的示例)、哪些是写了也不会生效的硬限制(纯器乐/时长/不做音效/不复刻具体曲目)、常见写坏的方式",
|
|
96
|
+
"description": "取「AI 配乐提示词」的书写规范:两个档位怎么选、该写哪些维度(附可照抄的示例)、哪些是写了也不会生效的硬限制(纯器乐/时长/不做音效/不复刻具体曲目)、常见写坏的方式。免费,纯静态,与具体剧目无关——写 generate_bgm 的 prompt 之前先读它,别自己猜。也适合直接把要点转述给客户看。",
|
|
97
|
+
"tags": [
|
|
98
|
+
"bgm-prompt-guide"
|
|
99
|
+
],
|
|
100
|
+
"responses": {
|
|
101
|
+
"200": {
|
|
102
|
+
"description": "StarReel envelope",
|
|
103
|
+
"content": {
|
|
104
|
+
"application/json": {
|
|
105
|
+
"schema": {
|
|
106
|
+
"type": "object",
|
|
107
|
+
"properties": {
|
|
108
|
+
"code": {
|
|
109
|
+
"type": "integer"
|
|
110
|
+
},
|
|
111
|
+
"message": {
|
|
112
|
+
"type": "string"
|
|
113
|
+
},
|
|
114
|
+
"data": {
|
|
115
|
+
"description": "Operation result payload"
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
"402": {
|
|
123
|
+
"description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
},
|
|
88
128
|
"/bulk-import/lint": {
|
|
89
129
|
"post": {
|
|
90
130
|
"operationId": "check_bulk_import",
|
|
@@ -2510,7 +2550,7 @@
|
|
|
2510
2550
|
"post": {
|
|
2511
2551
|
"operationId": "generate_bgm",
|
|
2512
2552
|
"summary": "给整集生成/更换 AI 配乐(按情绪弧线)",
|
|
2513
|
-
"description": "给整集生成/更换 AI 配乐(按情绪弧线)。后台异步,按用量后付不欠费。返回情绪弧线段数与预估耗时;用 get_bgm_status 轮询生成进度。★配乐生成/改动**不会自动进已有成片**——完成后必须重新 compose_episode(免费)才能听到;get_final_cut 的 bgm_stale=true 就是在提示这一步。别用 re-render(吃旧时间线,不含新配乐)。",
|
|
2553
|
+
"description": "给整集生成/更换 AI 配乐(按情绪弧线)。后台异步,按用量后付不欠费。返回情绪弧线段数与预估耗时;用 get_bgm_status 轮询生成进度。★配乐生成/改动**不会自动进已有成片**——完成后必须重新 compose_episode(免费)才能听到;get_final_cut 的 bgm_stale=true 就是在提示这一步。别用 re-render(吃旧时间线,不含新配乐)。\n★prompt 可选:不传=全自动(和以前一样)。传了就是在自动结果上再加方向,整集一条,系统仍按情绪弧线分幕。怎么写见 get_bgm_prompt_guide(免费);要点=只写音乐维度(情绪气质/主奏配器/速度动态/厚薄空间/风格参照),别写剧情(「主角发现真相时要紧张」→写「紧张,节奏推进感强」)。只出纯器乐:要人声/歌词/拟音当乐器都不会生效,会在 prompt_warnings 里点名但**不拦生成**。\n★prompt_mode: guide(默认)=你的要求与平台专业护栏(时代与题材匹配/配器节制/高潮保规模/段间差异)一起生效;override=直通,跳过护栏,只保留技术底线(纯器乐/时长/可循环)。override 效果自负,**先用 guide 试**,确实拧不过来再换。不传 prompt 时沿用该集上次填的(get_bgm_status 可查)。",
|
|
2514
2554
|
"tags": [
|
|
2515
2555
|
"episodes"
|
|
2516
2556
|
],
|
|
@@ -2525,6 +2565,28 @@
|
|
|
2525
2565
|
}
|
|
2526
2566
|
}
|
|
2527
2567
|
],
|
|
2568
|
+
"requestBody": {
|
|
2569
|
+
"required": false,
|
|
2570
|
+
"content": {
|
|
2571
|
+
"application/json": {
|
|
2572
|
+
"schema": {
|
|
2573
|
+
"type": "object",
|
|
2574
|
+
"properties": {
|
|
2575
|
+
"prompt": {
|
|
2576
|
+
"type": "string"
|
|
2577
|
+
},
|
|
2578
|
+
"prompt_mode": {
|
|
2579
|
+
"type": "string",
|
|
2580
|
+
"enum": [
|
|
2581
|
+
"guide",
|
|
2582
|
+
"override"
|
|
2583
|
+
]
|
|
2584
|
+
}
|
|
2585
|
+
}
|
|
2586
|
+
}
|
|
2587
|
+
}
|
|
2588
|
+
}
|
|
2589
|
+
},
|
|
2528
2590
|
"responses": {
|
|
2529
2591
|
"200": {
|
|
2530
2592
|
"description": "StarReel envelope",
|
|
@@ -5803,8 +5865,8 @@
|
|
|
5803
5865
|
"/scenes/{scene_id}": {
|
|
5804
5866
|
"put": {
|
|
5805
5867
|
"operationId": "update_scene",
|
|
5806
|
-
"summary": "改场景设定(名字/描述/地点/时段/氛围)",
|
|
5807
|
-
"description": "改场景设定(名字/描述/地点/时段/氛围)
|
|
5868
|
+
"summary": "改场景设定(名字/描述/地点/时段/氛围),以及**场景图的出图提示词正文**(image_prompt)",
|
|
5869
|
+
"description": "改场景设定(名字/描述/地点/时段/氛围),以及**场景图的出图提示词正文**(image_prompt)。免费(纯文本写库)。★场景图不满意时,改 image_prompt 才是直接手段——只改地点/时段是让平台重拼,拧不过来;改前先用 get_scene_prompt 读现值,改完用 regenerate_scene_image 重出这一场的图。★场景图变了不会自动重出已生成的镜头帧:那些帧仍拿旧场景图当背景锚,要跟上得逐镜重出。",
|
|
5808
5870
|
"tags": [
|
|
5809
5871
|
"scenes"
|
|
5810
5872
|
],
|
|
@@ -5843,6 +5905,9 @@
|
|
|
5843
5905
|
},
|
|
5844
5906
|
"mood": {
|
|
5845
5907
|
"type": "string"
|
|
5908
|
+
},
|
|
5909
|
+
"image_prompt": {
|
|
5910
|
+
"type": "string"
|
|
5846
5911
|
}
|
|
5847
5912
|
}
|
|
5848
5913
|
}
|
|
@@ -5922,6 +5987,100 @@
|
|
|
5922
5987
|
}
|
|
5923
5988
|
}
|
|
5924
5989
|
},
|
|
5990
|
+
"/scenes/{scene_id}/image/regenerate": {
|
|
5991
|
+
"post": {
|
|
5992
|
+
"operationId": "regenerate_scene_image",
|
|
5993
|
+
"summary": "按当前提示词重出**这一场**的场景图(改完 image_prompt 让画面跟上)",
|
|
5994
|
+
"description": "按当前提示词重出**这一场**的场景图(改完 image_prompt 让画面跟上)。图片步,按用量后付不欠费。★覆盖式:出好后本场旧图被换掉(要留档先 get_scene_prompt/资产列表拿旧图 URL)。★已生成的镜头帧不会自动跟着重出——它们仍拿旧场景图当背景锚,要跟上得逐镜重出。★与 generate_scene_images 的区别:那个是整剧批量、只补**缺图**的场景,已有图的一律跳过;这个是单场景强制重出。客户自己上传过的场景图也会被覆盖,先确认是不是要保留。",
|
|
5995
|
+
"tags": [
|
|
5996
|
+
"scenes"
|
|
5997
|
+
],
|
|
5998
|
+
"parameters": [
|
|
5999
|
+
{
|
|
6000
|
+
"name": "scene_id",
|
|
6001
|
+
"in": "path",
|
|
6002
|
+
"required": true,
|
|
6003
|
+
"schema": {
|
|
6004
|
+
"type": "integer",
|
|
6005
|
+
"exclusiveMinimum": 0
|
|
6006
|
+
}
|
|
6007
|
+
}
|
|
6008
|
+
],
|
|
6009
|
+
"responses": {
|
|
6010
|
+
"200": {
|
|
6011
|
+
"description": "StarReel envelope",
|
|
6012
|
+
"content": {
|
|
6013
|
+
"application/json": {
|
|
6014
|
+
"schema": {
|
|
6015
|
+
"type": "object",
|
|
6016
|
+
"properties": {
|
|
6017
|
+
"code": {
|
|
6018
|
+
"type": "integer"
|
|
6019
|
+
},
|
|
6020
|
+
"message": {
|
|
6021
|
+
"type": "string"
|
|
6022
|
+
},
|
|
6023
|
+
"data": {
|
|
6024
|
+
"description": "Operation result payload"
|
|
6025
|
+
}
|
|
6026
|
+
}
|
|
6027
|
+
}
|
|
6028
|
+
}
|
|
6029
|
+
}
|
|
6030
|
+
},
|
|
6031
|
+
"402": {
|
|
6032
|
+
"description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
|
|
6033
|
+
}
|
|
6034
|
+
}
|
|
6035
|
+
}
|
|
6036
|
+
},
|
|
6037
|
+
"/scenes/{scene_id}/prompt": {
|
|
6038
|
+
"get": {
|
|
6039
|
+
"operationId": "get_scene_prompt",
|
|
6040
|
+
"summary": "读某一场**场景图(空景基板)**的提示词正文,供直接微调后用 update_scene 的 image_prompt 写回",
|
|
6041
|
+
"description": "读某一场**场景图(空景基板)**的提示词正文,供直接微调后用 update_scene 的 image_prompt 写回。免费。★逐场按需:改哪场读哪场(整集列表 get_scenes 是纯资产视图,不含提示词)。★这是场景表里的正文层;出图时平台还会在其上拼画风块、空景约束与时代锁(不在此处,也无需你写)。回执的 has_image 说明这一场是否已有图。",
|
|
6042
|
+
"tags": [
|
|
6043
|
+
"scenes"
|
|
6044
|
+
],
|
|
6045
|
+
"parameters": [
|
|
6046
|
+
{
|
|
6047
|
+
"name": "scene_id",
|
|
6048
|
+
"in": "path",
|
|
6049
|
+
"required": true,
|
|
6050
|
+
"schema": {
|
|
6051
|
+
"type": "integer",
|
|
6052
|
+
"exclusiveMinimum": 0
|
|
6053
|
+
}
|
|
6054
|
+
}
|
|
6055
|
+
],
|
|
6056
|
+
"responses": {
|
|
6057
|
+
"200": {
|
|
6058
|
+
"description": "StarReel envelope",
|
|
6059
|
+
"content": {
|
|
6060
|
+
"application/json": {
|
|
6061
|
+
"schema": {
|
|
6062
|
+
"type": "object",
|
|
6063
|
+
"properties": {
|
|
6064
|
+
"code": {
|
|
6065
|
+
"type": "integer"
|
|
6066
|
+
},
|
|
6067
|
+
"message": {
|
|
6068
|
+
"type": "string"
|
|
6069
|
+
},
|
|
6070
|
+
"data": {
|
|
6071
|
+
"description": "Operation result payload"
|
|
6072
|
+
}
|
|
6073
|
+
}
|
|
6074
|
+
}
|
|
6075
|
+
}
|
|
6076
|
+
}
|
|
6077
|
+
},
|
|
6078
|
+
"402": {
|
|
6079
|
+
"description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
|
|
6080
|
+
}
|
|
6081
|
+
}
|
|
6082
|
+
}
|
|
6083
|
+
},
|
|
5925
6084
|
"/script-format/lint": {
|
|
5926
6085
|
"post": {
|
|
5927
6086
|
"operationId": "check_script_format",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@starreel/mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.60",
|
|
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.60",
|
|
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.60",
|
|
12
12
|
"transport": {
|
|
13
13
|
"type": "stdio"
|
|
14
14
|
},
|