@starreel/mcp 0.1.202 → 0.1.206

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/SKILL.md CHANGED
@@ -1566,7 +1566,12 @@ to close") tells the vendor to fit that entire sequence into each 3-second shot.
1566
1566
  `applicable=false`) → `trim_shot`; ④ `audit_seams(episode_id)` for continuity
1567
1567
  between adjacent shots — the default `dry_run` is free, running it is billed by
1568
1568
  text tokens, so only pass `dry_run:false` + `confirm_usage_billing:true` after the
1569
- customer accepts; ⑤ `compose_episode`. When the cut shows a problem, come back to
1569
+ customer accepts; ⑤ `preview_seams` → `get_seam_previews` (free: one 2-second
1570
+ clip per seam — 1 s before the out point + 1 s after the in point, current trims
1571
+ and transitions applied through the same build/render path as the final cut —
1572
+ plus an edge-frame comparison image and the `audit_seams` verdict; re-run it on
1573
+ the seam you changed, since crossfades / inserts / overlays used as patches often
1574
+ create new problems); ⑥ `compose_episode`. When the cut shows a problem, come back to
1570
1575
  these tools to find the shot instead of re-exporting. Advisory only, not a gate;
1571
1576
  trims and seam audits don't invalidate the `review_videos` token.
1572
1577
 
@@ -203,6 +203,8 @@
203
203
  "get_motion_templates": "Read existing motion templates for this drama (camera/action presets). Generated by generate_motion_templates; read with this tool. Free.",
204
204
  "record_product_text_review": "Free: record the user's manual verification result for current original product text. Call only after the user explicitly opens the file, checks it word by word, and confirms the result; do not substitute model judgment as manual verification. From get_storyboards product_text, take the current contract_hash and the frame position, file, generation_id in reviews; for uploaded assets generation_id is null, and media_version from the same response must be passed. Any change invalidates old reviews. Does not regenerate, does not switch the adopted version, and does not represent client acceptance of the entire film.",
205
205
  "audit_seams": "Audit edit continuity of current bilateral frames; checks only, does not regenerate or replace assets. Default dry_run=true returns the scope to audit and is free. Insert details only check object identity and state, not composition copying. Existing current valid conclusions are not re-audited. Execution is billed by actual text token usage; estimated_points=null means the amount is not quoted, not free. First show the plan and billing method; only pass dry_run=false and confirm_usage_billing=true after explicit client acceptance. After execution, use get_storyboards seam_review to inspect actual results; attempted does not mean passed.",
206
+ "preview_seams": "★Run this first when checking transition/seam problems instead of repeatedly exporting the whole episode. Free, zero charge (pure ffmpeg; no vendor calls and no on-the-fly TTS synthesis). Renders one short clip for every seam between adjacent shots in the episode: the last 1 second before the outgoing shot's out point + the first 1 second after the incoming shot's in point (for transitions longer than 0.5 s each side takes 2× the transition), applying the current trim windows and transition settings with the same timeline-building and rendering logic as the final compose (only the canvas is scaled down; no BGM and no subtitles). Also returns an edge-frame comparison image for both sides, plus the existing audit_seams conclusion. Async: this tool only starts the job; poll get_seam_previews until status=done. seams is optional: re-render only the listed seam indexes (use it to re-check after changing a trim/transition). ★Decide the fix after watching: if the action does not connect, run recommend_trim_window → trim_shot; if the transition is wrong, change the transition. Patch-up tricks such as crossfade ghosting, zoom-in inserts or occluding overlays often introduce new problems themselves — after changing anything, run this tool again on that seam.",
207
+ "get_seam_previews": "Check progress and results of preview_seams. Free. While status=running, read progress.done/total; when status=done, each entry of result.seams[] gives: from_shot_id/to_shot_id, transition (effective transition), left/right (in/out points on the source video, src_in_ms/src_out_ms, trim already applied), preview_url (the short clip), compare_image_url (left = last frame of the outgoing shot before the transition starts, right = first frame of the incoming shot after the transition ends), audit (audit_seams conclusion; not_enabled = not enabled for this drama). A non-empty result.synth_skipped_shot_ids means those shots have no synthesized voice-over yet and the preview treats them as silent. A single-shot episode returns seam_count=0.",
206
208
  "chain_frames": "Whole-episode first/last-frame relay chain: make each shot's first frame inherit the previous shot's last frame so inter-shot visuals are continuous (smoother than generating each shot independently). ★When to call: after first frames are done and any last frames required by tail_frame_plan are also filled, before review_frames / generate_videos. The platform only auto-runs this once when batch frame generation on the official site finishes; episodes generated shot by shot (generate_frames / generate_shot_frame) often have never been chained — get_storyboards seam_state=unchained means this kind of seam.\n★First use dry_run:true (free, does not write DB or generate images): returns planned_copy / planned_reframe / estimated_points / needs_last_frame. copy = directly replace this shot's first frame with the previous shot's last frame (free, but this shot's shot size becomes the same as the previous shot); reframe = use the previous shot's last frame as an anchor to regenerate this shot's first frame according to this shot's visual description (one image per seam, preserves shot size). Tell the client the plan and estimated_points; after confirmation, call again **without dry_run** to execute (postpaid by usage).\n★The platform decides which seams to chain: intentional cuts (scene/time jump/costume change/insert shot), shots with existing video, and already-chained seams are skipped — “already chained” = the first frame is the previous shot's last frame, or reframe is chained to the previous shot's **current** last frame, so repeated execution will not charge again. If the previous shot's last frame is later regenerated, that seam will reappear in the plan; that seam is indeed broken. To fill individual seams, use chain_shot_from_prev / chain_shot_from. Shots whose first frame is changed by execution and already have video will be marked pending regeneration. ★Execution only dispatches reframe and does not wait for image generation: use get_jobs to view first_frame generation rows for these shots; wait until all pending/processing are finished (for failed, check error_msg; for a single seam use chain_shot_from to reconnect; while the old first frame still exists, get_storyboards frame_status remains ready and failure is not visible), then use get_storyboards to verify seam_state and review_frames — auditing too early will audit the old first frame, and the token will be invalidated later.",
207
209
  "chain_shot_from_prev": "(Free) Directly set the previous shot's last frame as this shot's first frame: visuals connect 100%, zero cost, no image generation. ★Use when: the two shots are a continuation from the same camera position and same shot size (seam_state=unchained/broken and this shot should already share the previous shot's composition). ★Do not use for seams with shot-size changes (wide → close-up, etc.): it will overwrite this shot's shot-size design, and later image generation may be judged “inconsistent with design” — for such seams use chain_shot_from with mode=reframe. If this shot already has video, it will be marked pending regeneration. If this shot's first frame is already client-locked (first_frame_pinned), the call is rejected; pass force:true only to overwrite it (any execution mode requires explicit client consent, including managed mode).",
208
210
  "quote_chain_shot_from": "(Free quote) chain_shot_from with mode=reframe deducts **one image** (regenerate this shot's first frame anchored on the source frame); quote before execution (quote confirmation follows execution mode: professional mode / unconfirmed plan / this step is customer-controlled → explain to the customer and proceed only after customer approval; do not decide for them; this step is autopiloted → do not ask the customer, execute per get_production_plan autopilot.default_decisions, and the platform records it in get_autopilot_log). Returns quote_id / estimated_points; quote_id is one-time and valid only for this shot. mode=copy needs no quote.",
@@ -212,6 +212,8 @@
212
212
  "get_motion_templates": "读该剧已有的动作模板(运镜/动作预设)。generate_motion_templates 生成、此工具读取。免费。",
213
213
  "record_product_text_review": "免费记录用户对当前产品原字的人工核对结果。只有用户明确打开文件逐字核对并确认结果后才能调用;不得用模型判断冒充人工核对。从 get_storyboards 的 product_text 取当前 contract_hash 和 reviews 中的帧位、文件、generation_id;上传素材 generation_id 为 null,必须传同一响应的 media_version。任一变化后旧审核不能沿用。不重生、不换采用版本、不代表整片客户验收。",
214
214
  "audit_seams": "审核当前双边帧的剪辑连续性,只检查、不重生、不替换资产。默认 dry_run=true 返回待审范围,不收费。插入细节仅检查物体身份和状态,不要求复制构图。已有当前有效结论不重复审核。执行会按实际文本 token 用量计费,estimated_points=null 表示金额未报价,并非免费。先展示计划和计费方式,经客户明确接受后才传 dry_run=false 与 confirm_usage_billing=true。执行后用 get_storyboards 的 seam_review 检查实际结果;attempted 不代表通过。",
215
+ "preview_seams": "★查转场/接缝问题先跑这个,不要反复导出整片。免费零扣费(纯 ffmpeg,不调厂商,也不现场合成配音)。按集为每处相邻镜接缝渲染一段短片:前镜出点前 1 秒 + 后镜入点后 1 秒(转场长于 0.5 秒时两侧各取 2×转场),套用当前 trim 窗口与转场设置,与终拼同一套建轴和渲染逻辑(只缩小画幅;不含配乐与字幕)。同时给出两侧边缘帧对照图,并附上 audit_seams 的现有结论。异步:本工具只起任务,用 get_seam_previews 轮询到 status=done。seams 可选,只重渲指定序号的缝(改了某处 trim/转场后复查用)。★看完再决定怎么修:动作没接上先 recommend_trim_window → trim_shot;转场不合适改转场;叠化重影、放大插镜、遮挡这类补救手法本身常引入新问题,改完务必再跑一次本工具复查那道缝。",
216
+ "get_seam_previews": "查 preview_seams 的进度与结果。免费。status=running 时看 progress.done/total;status=done 时 result.seams[] 每道缝给出:from_shot_id/to_shot_id、transition(有效转场)、left/right(两侧在源视频上的入出点 src_in_ms/src_out_ms,已含 trim)、preview_url(短片)、compare_image_url(左=前镜转场开始前最后一帧,右=后镜转场结束后第一帧)、audit(audit_seams 结论;not_enabled=本剧未开启)。result.synth_skipped_shot_ids 非空表示这些镜配音尚未合成,预览按无配音处理。单镜集 seam_count=0。",
215
217
  "chain_frames": "整集首尾帧接力链:让每镜首帧承接上镜尾帧,镜间画面连续(比各镜独立出帧更顺)。★何时调:首帧出完、tail_frame_plan 要的尾帧也补完之后,review_frames / generate_videos 之前。平台只在官网批量出帧结束时自动跑一次;逐镜出帧(generate_frames / generate_shot_frame)的集多半从没接过——get_storyboards 的 seam_state=unchained 就是这种缝。\n★先 dry_run:true(免费,不写库不出图):回 planned_copy / planned_reframe / estimated_points / needs_last_frame。copy=本镜首帧直接换成上镜尾帧(免费,但本镜景别会变成和上镜一样);reframe=以上镜尾帧为锚按本镜画面描述重生首帧(每道一张图,保景别)。把计划和 estimated_points 告诉客户,确认后**不带 dry_run** 再调一次执行(按用量后付)。\n★平台自己判哪道缝该接:有意切换(换场/时间跳跃/换装/插入镜)、已出视频的镜、已经接好的缝都会跳过——「已接好」= 首帧就是上镜尾帧,或 reframe 接在上镜**当前**尾帧上,所以重复执行不会重复扣费。上镜尾帧后来被重生过的缝会重新出现在计划里,那道缝确实断了。只补个别缝用 chain_shot_from_prev / chain_shot_from。执行后改了首帧的镜若已有视频会被标为待重生。★执行只派发 reframe、不等出图:用 get_jobs 看这些镜的 first_frame 出图行,等 pending/processing 全部结束(failed 的看 error_msg,单道用 chain_shot_from 重接;旧首帧还在时 get_storyboards 的 frame_status 仍是 ready、看不出失败),再用 get_storyboards 核对 seam_state、review_frames——提前审会审到旧首帧,token 随后作废。",
216
218
  "chain_shot_from_prev": "(免费)把上一镜的尾帧**直接**设为本镜首帧:画面 100% 接上,零成本、不出图。★适用:两镜是同一机位、同一景别的延续(seam_state=unchained/broken 且本镜本来就该和上镜一个构图)。★别用于景别有变化的缝(全景→近景等):那会把本镜的景别设计冲掉,且后续出图可能被判「与设计不符」——这种缝用 chain_shot_from 的 mode=reframe。本镜已有视频的会被标为待重生。本镜首帧若已被客户定稿(first_frame_pinned)会被拒;覆盖它(任何执行模式都须客户明确同意,托管也不例外)才传 force:true。",
217
219
  "quote_chain_shot_from": "(免费报价)chain_shot_from 的 mode=reframe 要扣**一张图**(以源帧为锚重生本镜首帧),执行前先报价(报价确认按执行模式:专业模式 / 未确认方案 / 本环节由客户把控 → 讲给客户、客户同意才做,别替客户决定;本环节托管 → 不问客户,照 get_production_plan 的 autopilot.default_decisions 执行,平台记进 get_autopilot_log)。回 quote_id / estimated_points;quote_id 一次性、只对这一镜有效。mode=copy 不需要报价。",
@@ -168,6 +168,7 @@ export const ENTRY_POINTS = [
168
168
  'split_shot',
169
169
  'trim_shot',
170
170
  'recommend_trim_window',
171
+ 'preview_seams / get_seam_previews(每道接缝一段 2 秒短片 + 边缘帧对照,与终拼同逻辑;查转场不必导整片;免费)',
171
172
  'regenerate_shot_video',
172
173
  'edit_video_shot(就地编辑;get_edit_capabilities 先看当前引擎支持什么)',
173
174
  'repaint_shot_video / reskin_shot_video(保留原片动作、整体换人换装;get_repaint_capabilities 先看本剧开没开)',
@@ -317,6 +318,7 @@ export const QA_TOOLS = [
317
318
  'update_shot(speed_factor:只是成片里变速播放,不改厂商生成的内容——做慢镜氛围用,治不了「没演出来」)',
318
319
  ] },
319
320
  { symptom: '动作发生在裁剪窗口之外', run: 'recommend_trim_window', then: ['trim_shot'] },
321
+ { symptom: '转场 / 接缝看着不对(跳、重影、接不上)', run: 'preview_seams(免费;get_seam_previews 轮询,逐道缝看短片与对照图,别反复导出整片)', then: ['recommend_trim_window → trim_shot(动作没接上)', 'update_shot(transition_type / transition_duration_ms 改转场,免费;之后 compose_episode 重拼才生效)', 'preview_seams(改完只传那道缝的 seams 序号复查——叠化/插镜/遮挡这类补救常带出新问题)'] },
320
322
  { symptom: '画面多出一个人 / 多出一件道具', run: 'get_storyboards(先看该镜实际用的首帧)', then: ['generate_shot_frame(首帧本身就有→重生首帧再重生视频)', 'split_shot(帧干净、片中长出来→拆成 3~5 秒短镜)'] },
321
323
  { symptom: '出图 / 出视频前想知道哪些镜会被厂商拒', run: 'run_precheck', then: ['update_shot', 'generate_shot_frame'] },
322
324
  { symptom: '要跑全集 / 想知道整部剧有多少问题、该先修哪几集', run: 'run_drama_precheck', then: ['run_precheck(对 attention 里那几集拿逐条明细)', 'plan_precheck_fix', 'update_shot'] },
@@ -2328,6 +2328,22 @@ export function registerProduceTools(server, client) {
2328
2328
  dry_run: z.boolean().optional().describe('默认 true,只读计划'),
2329
2329
  confirm_usage_billing: z.boolean().optional().describe('仅客户明确接受按实际文本 token 用量计费后传 true'),
2330
2330
  }, async ({ episode_id, dry_run, confirm_usage_billing }) => jsonResult(await client.producePost(`/episodes/${episode_id}/audit-seams`, { dry_run: dry_run !== false, confirm_usage_billing: confirm_usage_billing === true })));
2331
+ server.tool('preview_seams', '★查转场/接缝问题先跑这个,不要反复导出整片。免费零扣费(纯 ffmpeg,不调厂商,也不现场合成配音)。'
2332
+ + '按集为每处相邻镜接缝渲染一段短片:前镜出点前 1 秒 + 后镜入点后 1 秒(转场长于 0.5 秒时两侧各取 2×转场),'
2333
+ + '套用当前 trim 窗口与转场设置,与终拼同一套建轴和渲染逻辑,看到的就是 compose_episode 重拼会得到的接缝(只缩小画幅;不含配乐与字幕)。'
2334
+ + '同时给出两侧边缘帧对照图,并附上 audit_seams 的现有结论。'
2335
+ + '异步:本工具只起任务,用 get_seam_previews 轮询到 status=done。'
2336
+ + 'seams 可选,只重渲指定序号的缝(改了某处 trim/转场后复查用)。'
2337
+ + '★看完再决定怎么修:动作没接上先 recommend_trim_window → trim_shot;转场不合适改转场;'
2338
+ + '叠化重影、放大插镜、遮挡这类补救手法本身常引入新问题,改完务必再跑一次本工具复查那道缝。', {
2339
+ episode_id: z.number().int().positive(),
2340
+ seams: z.array(z.number().int().min(0)).optional().describe('只渲染这些接缝序号(0 = 第 1 镜与第 2 镜之间);缺省 = 全部'),
2341
+ }, async ({ episode_id, seams }) => jsonResult(await client.producePost(`/episodes/${episode_id}/seam-previews`, seams?.length ? { seams } : {})));
2342
+ server.tool('get_seam_previews', '查 preview_seams 的进度与结果。免费。status=running 时看 progress.done/total;'
2343
+ + 'status=done 时 result.seams[] 每道缝给出:from_shot_id/to_shot_id、transition(有效转场)、'
2344
+ + 'left/right(两侧在源视频上的入出点 src_in_ms/src_out_ms,已含 trim)、preview_url(短片)、'
2345
+ + 'compare_image_url(左=前镜转场开始前最后一帧,右=后镜转场结束后第一帧)、audit(audit_seams 结论;not_enabled=本剧未开启)。'
2346
+ + 'result.synth_skipped_shot_ids 非空表示这些镜配音尚未合成,预览按无配音处理。单镜集 seam_count=0。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/seam-previews`)));
2331
2347
  // ========== P2 · 连续性 / 场景组 / 多画幅 ==========
2332
2348
  server.tool('chain_frames', '整集首尾帧接力链:让每镜首帧承接上镜尾帧,镜间画面连续(比各镜独立出帧更顺)。' +
2333
2349
  '★何时调:首帧出完、tail_frame_plan 要的尾帧也补完之后,review_frames / generate_videos 之前。' +
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.202",
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.202 tool surface (operationIds match MCP tool names 1:1)."
5
+ "version": "0.1.206",
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.206 tool surface (operationIds match MCP tool names 1:1)."
7
7
  },
8
8
  "servers": [
9
9
  {
@@ -9270,6 +9270,117 @@
9270
9270
  }
9271
9271
  }
9272
9272
  },
9273
+ "/episodes/{episode_id}/seam-previews": {
9274
+ "post": {
9275
+ "operationId": "preview_seams",
9276
+ "summary": "★查转场/接缝问题先跑这个,不要反复导出整片",
9277
+ "description": "★查转场/接缝问题先跑这个,不要反复导出整片。免费零扣费(纯 ffmpeg,不调厂商,也不现场合成配音)。按集为每处相邻镜接缝渲染一段短片:前镜出点前 1 秒 + 后镜入点后 1 秒(转场长于 0.5 秒时两侧各取 2×转场),套用当前 trim 窗口与转场设置,与终拼同一套建轴和渲染逻辑,看到的就是 compose_episode 重拼会得到的接缝(只缩小画幅;不含配乐与字幕)。同时给出两侧边缘帧对照图,并附上 audit_seams 的现有结论。异步:本工具只起任务,用 get_seam_previews 轮询到 status=done。seams 可选,只重渲指定序号的缝(改了某处 trim/转场后复查用)。★看完再决定怎么修:动作没接上先 recommend_trim_window → trim_shot;转场不合适改转场;叠化重影、放大插镜、遮挡这类补救手法本身常引入新问题,改完务必再跑一次本工具复查那道缝。",
9278
+ "tags": [
9279
+ "episodes"
9280
+ ],
9281
+ "parameters": [
9282
+ {
9283
+ "name": "episode_id",
9284
+ "in": "path",
9285
+ "required": true,
9286
+ "schema": {
9287
+ "type": "integer",
9288
+ "exclusiveMinimum": 0
9289
+ }
9290
+ }
9291
+ ],
9292
+ "requestBody": {
9293
+ "required": false,
9294
+ "content": {
9295
+ "application/json": {
9296
+ "schema": {
9297
+ "type": "object",
9298
+ "properties": {
9299
+ "seams": {
9300
+ "type": "array",
9301
+ "items": {
9302
+ "type": "integer",
9303
+ "minimum": 0
9304
+ }
9305
+ }
9306
+ }
9307
+ }
9308
+ }
9309
+ }
9310
+ },
9311
+ "responses": {
9312
+ "200": {
9313
+ "description": "StarReel envelope",
9314
+ "content": {
9315
+ "application/json": {
9316
+ "schema": {
9317
+ "type": "object",
9318
+ "properties": {
9319
+ "code": {
9320
+ "type": "integer"
9321
+ },
9322
+ "message": {
9323
+ "type": "string"
9324
+ },
9325
+ "data": {
9326
+ "description": "Operation result payload"
9327
+ }
9328
+ }
9329
+ }
9330
+ }
9331
+ }
9332
+ },
9333
+ "402": {
9334
+ "description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
9335
+ }
9336
+ }
9337
+ },
9338
+ "get": {
9339
+ "operationId": "get_seam_previews",
9340
+ "summary": "查 preview_seams 的进度与结果",
9341
+ "description": "查 preview_seams 的进度与结果。免费。status=running 时看 progress.done/total;status=done 时 result.seams[] 每道缝给出:from_shot_id/to_shot_id、transition(有效转场)、left/right(两侧在源视频上的入出点 src_in_ms/src_out_ms,已含 trim)、preview_url(短片)、compare_image_url(左=前镜转场开始前最后一帧,右=后镜转场结束后第一帧)、audit(audit_seams 结论;not_enabled=本剧未开启)。result.synth_skipped_shot_ids 非空表示这些镜配音尚未合成,预览按无配音处理。单镜集 seam_count=0。",
9342
+ "tags": [
9343
+ "episodes"
9344
+ ],
9345
+ "parameters": [
9346
+ {
9347
+ "name": "episode_id",
9348
+ "in": "path",
9349
+ "required": true,
9350
+ "schema": {
9351
+ "type": "integer",
9352
+ "exclusiveMinimum": 0
9353
+ }
9354
+ }
9355
+ ],
9356
+ "responses": {
9357
+ "200": {
9358
+ "description": "StarReel envelope",
9359
+ "content": {
9360
+ "application/json": {
9361
+ "schema": {
9362
+ "type": "object",
9363
+ "properties": {
9364
+ "code": {
9365
+ "type": "integer"
9366
+ },
9367
+ "message": {
9368
+ "type": "string"
9369
+ },
9370
+ "data": {
9371
+ "description": "Operation result payload"
9372
+ }
9373
+ }
9374
+ }
9375
+ }
9376
+ }
9377
+ },
9378
+ "402": {
9379
+ "description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
9380
+ }
9381
+ }
9382
+ }
9383
+ },
9273
9384
  "/episodes/{episode_id}/sfx": {
9274
9385
  "post": {
9275
9386
  "operationId": "generate_sfx",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@starreel/mcp",
3
- "version": "0.1.202",
3
+ "version": "0.1.206",
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.202",
5
+ "version": "0.1.206",
6
6
  "websiteUrl": "https://starreel.ai",
7
7
  "packages": [
8
8
  {
9
9
  "registryType": "npm",
10
10
  "identifier": "@starreel/mcp",
11
- "version": "0.1.202",
11
+ "version": "0.1.206",
12
12
  "transport": {
13
13
  "type": "stdio"
14
14
  },