@starreel/mcp 0.1.94 → 0.1.95

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
@@ -959,6 +959,25 @@ to close") tells the vendor to fit that entire sequence into each 3-second shot.
959
959
  `get_bgm_prompt_guide`, `replace_shot_dialogue`
960
960
  - **Finish**: `compose_episode`, `get_final_cut`, `get_export`,
961
961
  `generate_episode_poster`, `generate_cover`
962
+ - **What did this drama cost?** `get_drama_bill` — per kind `charged` / `refunded`
963
+ / `net`. **`net` is the spend** (same number as the web "spent on this drama"
964
+ and `get_budget_status`); `charged` includes failed calls that were refunded
965
+ automatically, so never report it as cost. `in_flight` = charged, result not
966
+ out yet (the platform charges on submit and refunds on failure — there is no
967
+ separate hold). `rework.video` = second-and-later successful videos of the
968
+ same shot. `account_level` = voice clones / designs / auditions that belong to
969
+ no drama — listed separately, **not** in the drama's total. Build a cost
970
+ write-up from this, not from your own tally.
971
+ - **Every platform cut is versioned automatically.** Each `compose_episode` /
972
+ `rerender_episode` / multi-aspect render registers a `source=platform` entry in
973
+ `list_deliveries`: file sha256, and a manifest of what that render actually
974
+ used — per shot whether it was the raw clip, the composed clip, the re-voiced
975
+ clip or the lip-synced one (`source_kind`), which dialogue / music / SFX files,
976
+ subtitle count and text hash, plus the dialogue-audit tally at that moment.
977
+ Write delivery notes and "which version did we ship" answers **from that
978
+ manifest**, not from memory — notes written for v1 silently go stale by v4.
979
+ Platform entries never become the current delivery on their own;
980
+ `set_current_delivery` the one the customer actually gets.
962
981
  - **Delivered a cut you finished outside the platform** (re-voiced lines, trims,
963
982
  an ending card, music): `register_external_delivery` the exact file you hand to
964
983
  the customer — **every time**, including revisions. Otherwise the platform's
@@ -745,7 +745,8 @@ export function registerProduceTools(server, client) {
745
745
  }, async ({ episode_id, force }) => jsonResult(await client.producePost(`/episodes/${episode_id}/compose`, force ? { force: true } : {})));
746
746
  server.tool('get_final_cut', '查某一集成片状态与下载链接。status=completed 时返回 download_url(我方 COS 直链,可直接下载)。免费。' +
747
747
  '★bgm_stale=true 表示配乐在成片之后生成/改动、尚未进成片:重新 compose_episode(免费)即可,别用 re-render。' +
748
- '★若登记过外部交付版本(register_external_delivery),另返回 delivery——那才是客户实际收到的一版;download_url 仍是平台自己拼的成片。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/final-cut`)));
748
+ '★若设过当前交付版(register_external_delivery 登记的外部版,或 set_current_delivery 指定的平台版),另返回 delivery——那才是客户实际收到的一版;download_url 仍是平台最新一次拼的成片。' +
749
+ '要看每一版成片用了什么、哈希是多少,用 list_deliveries。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/final-cut`)));
749
750
  server.tool('get_export', '查某一集导出/母版状态(成片终拼后的可下载母版)。免费。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/export`)));
750
751
  server.tool('review_final_cut', '**成片体检**:导出前把整集过一遍——没出图的镜、字幕一屏放不下、人物没有身份锚、'
751
752
  + '镜头连续性(跳轴)、以及一次错别字通读。'
@@ -1062,8 +1063,14 @@ export function registerProduceTools(server, client) {
1062
1063
  throw new Error('file_path 与 file_url 必须给一个');
1063
1064
  return jsonResult(await client.producePost(`/episodes/${episode_id}/deliveries`, { file_url: url, note, manifest }));
1064
1065
  });
1065
- server.tool('list_deliveries', '列本集已登记的外部交付版本(新→旧),每条含 sha256、时长、is_current 与完整交付清单(每镜来源 + 外部后期说明)。免费。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/deliveries`)));
1066
- server.tool('set_current_delivery', '把本集的某个已登记交付版本设为当前(例如客户最终选了较早的一版)。免费。只影响 get_final_cut 的 delivery,不改平台成片。', { episode_id: z.number().int().positive(), delivery_id: z.number().int().positive() }, async ({ episode_id, delivery_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/deliveries/${delivery_id}/current`)));
1066
+ server.tool('list_deliveries', '列本集**所有成片版本**(新→旧,平台成片与外部交付共用一条版本号),每条含 sha256、时长、is_current 与完整清单。免费。' +
1067
+ '\n★source=platform:平台每出一版成片(compose_episode / rerender_episode / 多画幅)都会**自动登记**,清单记的是**渲染用的那份时间线**——' +
1068
+ '每镜用的是原片/合成片/换轨产物/口型产物(source_kind)、对白/配乐/音效各用了哪些文件、字幕条数与文本哈希、文件 sha256,' +
1069
+ '以及登记时刻的台词审计分族计数。写交付说明、核对「交出去的是哪一版」以它为准,别凭记忆。' +
1070
+ '平台版本**不会自动成为当前交付版**;客户选定哪一版,用 set_current_delivery 指过去。' +
1071
+ '\n★source=external:register_external_delivery 登记的外部后期成片。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/deliveries`)));
1072
+ server.tool('set_current_delivery', '把本集的某个成片版本设为当前交付版(例如客户最终选了较早的一版)。免费。平台版本(source=platform)与外部版本都可以设。' +
1073
+ '只影响 get_final_cut 的 delivery,不改平台成片。', { episode_id: z.number().int().positive(), delivery_id: z.number().int().positive() }, async ({ episode_id, delivery_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/deliveries/${delivery_id}/current`)));
1067
1074
  server.tool('upload_shot_footage', '用**客户自有的整段视频**(录屏 / 产品实拍 / 第三方成片)直接当某镜的视频——实拍素材镜。' +
1068
1075
  '登记后该镜不再 AI 出图/出视频(generate_videos 会跳过它,单镜重生会被拒),终拼原样使用,镜头时长按素材真实长度回写,' +
1069
1076
  '首/尾帧从素材抽帧供帧链与预览用。免费。适用:宣传片里的到账界面录屏、后台大屏实录、产品实拍、客户已有的成片片段。' +
@@ -1370,6 +1377,13 @@ export function registerProduceTools(server, client) {
1370
1377
  // ========== P1 · 任务进度 + 成本/预算 ==========
1371
1378
  server.tool('get_jobs', '查一部剧的任务队列进度(出图/出视频/合成各阶段的 pending/processing/done/failed)。' +
1372
1379
  '异步生成后用它看进度。免费。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.produceGet(`/dramas/${drama_id}/jobs`)));
1380
+ server.tool('get_drama_bill', '本剧净费用账单(免费)。核账、回答「到底花了多少、钱花在哪、退了多少」时用它,别自己拼流水。' +
1381
+ '\n· totals / by_kind:每类 charged(扣费)、refunded(已退回)、net(净额)、charges/refunds(笔数)。' +
1382
+ '**net 才是花费**,与网页「本剧已花费」、get_budget_status 同源;charged 含失败后自动退回的空转,只用于核账。' +
1383
+ '\n· in_flight:已扣费、结果还没出的任务(平台是提交即扣、失败再退,没有单独的预扣)。' +
1384
+ '\n· rework.video:同一镜第 2 次起的成功出片(返工);出图不计(首帧/尾帧/best-of-N 候选本来就是同镜多张)。' +
1385
+ '\n· account_level:音色库克隆/设计/试听等**不属于任何一部剧**的语音扣费,单列、counted_in_drama=false,不计入本剧。' +
1386
+ '\n· available=false:账本暂时不可达,不给数字(不拿估算冒充),稍后重试。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.produceGet(`/dramas/${drama_id}/bill`)));
1373
1387
  server.tool('get_cost_estimate', '查一部剧的整体成本预估(点数)。免费。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.produceGet(`/dramas/${drama_id}/cost-estimate`)));
1374
1388
  server.tool('get_budget_status', '查一部剧的预算状态(预算/已花费/剩余)。免费。' +
1375
1389
  'spent 与网页「本剧已花费」同源(平台扣费账本净额,已减退款),by_kind 为按类分项(ai_image/ai_video/ai_text/ai_music/tts_local…)。' +
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.94",
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.94 tool surface (operationIds match MCP tool names 1:1)."
5
+ "version": "0.1.95",
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.95 tool surface (operationIds match MCP tool names 1:1)."
7
7
  },
8
8
  "servers": [
9
9
  {
@@ -1301,6 +1301,53 @@
1301
1301
  }
1302
1302
  }
1303
1303
  },
1304
+ "/dramas/{drama_id}/bill": {
1305
+ "get": {
1306
+ "operationId": "get_drama_bill",
1307
+ "summary": "本剧净费用账单(免费)",
1308
+ "description": "本剧净费用账单(免费)。核账、回答「到底花了多少、钱花在哪、退了多少」时用它,别自己拼流水。\n· totals / by_kind:每类 charged(扣费)、refunded(已退回)、net(净额)、charges/refunds(笔数)。**net 才是花费**,与网页「本剧已花费」、get_budget_status 同源;charged 含失败后自动退回的空转,只用于核账。\n· in_flight:已扣费、结果还没出的任务(平台是提交即扣、失败再退,没有单独的预扣)。\n· rework.video:同一镜第 2 次起的成功出片(返工);出图不计(首帧/尾帧/best-of-N 候选本来就是同镜多张)。\n· account_level:音色库克隆/设计/试听等**不属于任何一部剧**的语音扣费,单列、counted_in_drama=false,不计入本剧。\n· available=false:账本暂时不可达,不给数字(不拿估算冒充),稍后重试。",
1309
+ "tags": [
1310
+ "dramas"
1311
+ ],
1312
+ "parameters": [
1313
+ {
1314
+ "name": "drama_id",
1315
+ "in": "path",
1316
+ "required": true,
1317
+ "schema": {
1318
+ "type": "integer",
1319
+ "exclusiveMinimum": 0
1320
+ }
1321
+ }
1322
+ ],
1323
+ "responses": {
1324
+ "200": {
1325
+ "description": "StarReel envelope",
1326
+ "content": {
1327
+ "application/json": {
1328
+ "schema": {
1329
+ "type": "object",
1330
+ "properties": {
1331
+ "code": {
1332
+ "type": "integer"
1333
+ },
1334
+ "message": {
1335
+ "type": "string"
1336
+ },
1337
+ "data": {
1338
+ "description": "Operation result payload"
1339
+ }
1340
+ }
1341
+ }
1342
+ }
1343
+ }
1344
+ },
1345
+ "402": {
1346
+ "description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
1347
+ }
1348
+ }
1349
+ }
1350
+ },
1304
1351
  "/dramas/{drama_id}/budget-status": {
1305
1352
  "get": {
1306
1353
  "operationId": "get_budget_status",
@@ -3326,8 +3373,8 @@
3326
3373
  "/episodes/{episode_id}/deliveries": {
3327
3374
  "get": {
3328
3375
  "operationId": "list_deliveries",
3329
- "summary": "列本集已登记的外部交付版本(新→旧),每条含 sha256、时长、is_current 与完整交付清单(每镜来源 + 外部后期说明)",
3330
- "description": "列本集已登记的外部交付版本(新→旧),每条含 sha256、时长、is_current 与完整交付清单(每镜来源 + 外部后期说明)。免费。",
3376
+ "summary": "列本集**所有成片版本**(新→旧,平台成片与外部交付共用一条版本号),每条含 sha256、时长、is_current 与完整清单",
3377
+ "description": "列本集**所有成片版本**(新→旧,平台成片与外部交付共用一条版本号),每条含 sha256、时长、is_current 与完整清单。免费。\n★source=platform:平台每出一版成片(compose_episode / rerender_episode / 多画幅)都会**自动登记**,清单记的是**渲染用的那份时间线**——每镜用的是原片/合成片/换轨产物/口型产物(source_kind)、对白/配乐/音效各用了哪些文件、字幕条数与文本哈希、文件 sha256,以及登记时刻的台词审计分族计数。写交付说明、核对「交出去的是哪一版」以它为准,别凭记忆。平台版本**不会自动成为当前交付版**;客户选定哪一版,用 set_current_delivery 指过去。\n★source=external:register_external_delivery 登记的外部后期成片。",
3331
3378
  "tags": [
3332
3379
  "episodes"
3333
3380
  ],
@@ -3373,8 +3420,8 @@
3373
3420
  "/episodes/{episode_id}/deliveries/{delivery_id}/current": {
3374
3421
  "post": {
3375
3422
  "operationId": "set_current_delivery",
3376
- "summary": "把本集的某个已登记交付版本设为当前(例如客户最终选了较早的一版)",
3377
- "description": "把本集的某个已登记交付版本设为当前(例如客户最终选了较早的一版)。免费。只影响 get_final_cut 的 delivery,不改平台成片。",
3423
+ "summary": "把本集的某个成片版本设为当前交付版(例如客户最终选了较早的一版)",
3424
+ "description": "把本集的某个成片版本设为当前交付版(例如客户最终选了较早的一版)。免费。平台版本(source=platform)与外部版本都可以设。只影响 get_final_cut 的 delivery,不改平台成片。",
3378
3425
  "tags": [
3379
3426
  "episodes"
3380
3427
  ],
@@ -4316,7 +4363,7 @@
4316
4363
  "get": {
4317
4364
  "operationId": "get_final_cut",
4318
4365
  "summary": "查某一集成片状态与下载链接",
4319
- "description": "查某一集成片状态与下载链接。status=completed 时返回 download_url(我方 COS 直链,可直接下载)。免费。★bgm_stale=true 表示配乐在成片之后生成/改动、尚未进成片:重新 compose_episode(免费)即可,别用 re-render。★若登记过外部交付版本(register_external_delivery),另返回 delivery——那才是客户实际收到的一版;download_url 仍是平台自己拼的成片。",
4366
+ "description": "查某一集成片状态与下载链接。status=completed 时返回 download_url(我方 COS 直链,可直接下载)。免费。★bgm_stale=true 表示配乐在成片之后生成/改动、尚未进成片:重新 compose_episode(免费)即可,别用 re-render。★若设过当前交付版(register_external_delivery 登记的外部版,或 set_current_delivery 指定的平台版),另返回 delivery——那才是客户实际收到的一版;download_url 仍是平台最新一次拼的成片。要看每一版成片用了什么、哈希是多少,用 list_deliveries。",
4320
4367
  "tags": [
4321
4368
  "episodes"
4322
4369
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@starreel/mcp",
3
- "version": "0.1.94",
3
+ "version": "0.1.95",
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.94",
5
+ "version": "0.1.95",
6
6
  "websiteUrl": "https://starreel.ai",
7
7
  "packages": [
8
8
  {
9
9
  "registryType": "npm",
10
10
  "identifier": "@starreel/mcp",
11
- "version": "0.1.94",
11
+ "version": "0.1.95",
12
12
  "transport": {
13
13
  "type": "stdio"
14
14
  },