@starreel/mcp 0.1.11 → 0.1.13

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
@@ -38,9 +38,16 @@ create_drama → set_script(raw) → rewrite_script(AI draft, user may edit)
38
38
  standard extract → storyboards → … flow. Call `list_project_options` first to
39
39
  show the user the real project types, aspect ratios, and resolutions.
40
40
 
41
- Free steps: `create_drama`, `set_script`, all `get_*`, edits, `compose_episode`.
42
- Metered text (post-paid): `rewrite_script`, `extract_assets`. Every image/video
43
- step is split into `quote_*` + `generate_*`.
41
+ Free (DB + ffmpeg, no vendor call): `create_drama`, `set_script`, all `get_*`,
42
+ edits, `update_project_settings`, `compose_episode`, `render_multi_aspect`,
43
+ `generate_sfx` / `generate_effects` / `generate_transitions` (local-library
44
+ match), `generate_deliverables`, `add_product` / `list_products`.
45
+ Metered (every AI generation): all images, all video, TTS, and all LLM text
46
+ (`rewrite_script`, `extract_assets`, art-bible, visual-lock, setting-brief,
47
+ style/color/motion locks, MV story/script, subtitle translation). Only the
48
+ big-ticket image/video stages (portraits, storyboards, frames, videos,
49
+ scene-images) carry a `quote_*`; the other metered steps have no quote and bill
50
+ by usage — 402 mid-run if the balance can't cover them (never overdraft).
44
51
 
45
52
  ## The ten disciplines (hard rules)
46
53
 
@@ -53,10 +60,12 @@ content that will be rejected.
53
60
  and tell the user to recharge. Never loop-retry a 402 — it will never
54
61
  succeed and only spins.
55
62
 
56
- 2. **Quote before you spend; the quote is the charge.** Every spending step is
57
- `quote_*` then `generate_*`. Show the user the quoted cost and get an
58
- explicit yes before calling `generate_*`. For video, quote == actual charge.
59
- Do not auto-approve large spends on the user's behalf.
63
+ 2. **Quote before you spend; the quote is the charge.** Big-ticket stages
64
+ (portraits, storyboards, frames, videos, scene-images) are `quote_*` then
65
+ `generate_*` — show the quote and get an explicit yes; for video, quote ==
66
+ actual charge. Other AI-generation steps (TTS, posters, sheets, style locks,
67
+ MV story/script …) have no quote and bill by usage — still tell the user
68
+ before running them. Never auto-approve large spends on the user's behalf.
60
69
 
61
70
  3. **`retryable` decides retry-vs-change — never blind-retry.** On failure read
62
71
  the structured `fail_reason` / `retryable` (from `get_storyboards`) or the
@@ -73,6 +82,12 @@ content that will be rejected.
73
82
  user is authorized to use (their own voice, or a rights-holder's written
74
83
  consent). `clone_voice` is billed per voice (auto-refunded on failure).
75
84
  Never clone a public figure's or third party's voice without authorization.
85
+ Cloning needs **no character and no drama** — `clone_voice` returns a
86
+ `voice_id` (e.g. `lib:12`) you can immediately audition with
87
+ `speak_with_voice` (any text → downloadable audio URL). Bind it to a
88
+ character with `set_character_voice` only when you actually need it to
89
+ dub a shot. Always pass that same `voice_id` — never a raw number from
90
+ somewhere else.
76
91
 
77
92
  6. **Follow the pipeline order — do not skip.** `set_script` → `rewrite_script`
78
93
  → `extract_assets` → portraits → storyboards → frames → videos. Always
@@ -136,7 +151,8 @@ refund on failure); you never compensate manually.
136
151
  - **Shots → video**: `quote/generate_storyboards`, `get_storyboards`,
137
152
  `quote/generate_frames`, `chain_frames`, `quote/generate_videos`
138
153
  - **Audio**: `generate_tts` (required before final cut), `clone_voice`,
139
- `set_character_voice`, `list_voices`, `generate_bgm`, `replace_shot_dialogue`
154
+ `speak_with_voice`, `set_character_voice`, `list_voices`, `delete_voice`,
155
+ `generate_bgm`, `replace_shot_dialogue`
140
156
  - **Finish**: `compose_episode`, `get_final_cut`, `get_export`,
141
157
  `generate_episode_poster`, `generate_cover`
142
158
  - **Edit**: `edit_video_shot`, `regenerate_shot_video`, `split_shot`,
@@ -315,9 +315,13 @@ export function registerProduceTools(server, client) {
315
315
  }, async ({ drama_id, ...fields }) => jsonResult(await client.producePost(`/dramas/${drama_id}/products`, fields)));
316
316
  server.tool('list_products', '广告项目:列出商品库。免费。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.produceGet(`/dramas/${drama_id}/products`)));
317
317
  // ========== AI 声音克隆(voice cloning)==========
318
- server.tool('clone_voice', '从一段**已授权**的音频样本克隆音色,存入你的音色库,返回音色 id。' +
318
+ // 音色是**独立资产**:克隆 → 试听下载,全程不需要角色。绑角色只是「要出片」时的
319
+ // 可选下游动作。voice_id 形如 `lib:12`,克隆/列表/试听/绑定四处同一命名空间。
320
+ server.tool('clone_voice', '从一段**已授权**的音频样本克隆音色,返回 voice_id。**不需要先有角色或剧目**。' +
319
321
  '⚠️ 样本必须是本人/持权人**同意授权**的声音(否则侵权,与真人/版权门同理)。' +
320
- '按平台价计费(每个音色一口价);失败自动退款。之后 set_character_voice 绑到角色,generate_tts 即用它配音。', {
322
+ '样本会自动转写出配套文本(零样本克隆需要),10 秒左右清晰人声即可,别用纯音乐/静音。' +
323
+ '按平台价计费(每个音色一口价)。克隆完可直接 speak_with_voice 试听下载;' +
324
+ '只有要用它配音出片时,才需要再 set_character_voice 绑到角色。', {
321
325
  name: z.string().min(1).describe('音色命名(便于管理)'),
322
326
  sample_file_path: z.string().optional().describe('本地授权音频样本路径(mp3/wav/m4a,自动上传;与 sample_url 二选一)'),
323
327
  sample_url: z.string().optional().describe('已上传到 COS 的样本 URL(与 sample_file_path 二选一)'),
@@ -330,7 +334,19 @@ export function registerProduceTools(server, client) {
330
334
  throw new Error('需要 sample_file_path(本地样本自动上传)或 sample_url(已上传的 URL)');
331
335
  return jsonResult(await client.producePost('/voice-clones', notes ? { name, sample_url: url, notes } : { name, sample_url: url }));
332
336
  });
333
- server.tool('list_voices', '列出我音色库里的克隆音色(id/名字/状态)。免费。', {}, async () => jsonResult(await client.produceGet('/voice-clones')));
334
- server.tool('delete_voice', '删除音色库里的一个克隆音色。免费。', { voice_clone_id: z.number().int().positive() }, async ({ voice_clone_id }) => jsonResult(await client.produceDelete(`/voice-clones/${voice_clone_id}`)));
335
- server.tool('set_character_voice', '把克隆音色绑到某角色(voice_clone_id 来自 clone_voice/list_voices)。绑定后 generate_tts 用它给该角色配音。免费。', { character_id: z.number().int().positive(), voice_clone_id: z.number().int().positive().describe('音色库 id') }, async ({ character_id, voice_clone_id }) => jsonResult(await client.producePost(`/characters/${character_id}/voice`, { library_id: voice_clone_id })));
337
+ server.tool('speak_with_voice', '让某个音色说一段任意文本,返回可下载的音频 URL。**不需要角色、不需要剧目**——' +
338
+ '克隆完先用它验收音色像不像,或直接把音频拿去别处用。按文本长度计费(tts 档)。', {
339
+ voice_id: z.string().describe('来自 clone_voice / list_voices 的 voice_id(形如 lib:12)'),
340
+ text: z.string().min(1).max(500).describe('要让这个音色说的话(上限 500 字)'),
341
+ }, async ({ voice_id, text }) => {
342
+ const id = String(voice_id).replace(/^lib:/, '');
343
+ return jsonResult(await client.producePost(`/voice-clones/${id}/speak`, { text }));
344
+ });
345
+ server.tool('list_voices', '列出可用音色:我克隆的私有音色 + 平台公共音色(voice_id/名字/试听样本)。免费。', {}, async () => jsonResult(await client.produceGet('/voice-clones')));
346
+ server.tool('delete_voice', '删除我音色库里的一个克隆音色(平台公共音色不可删)。免费。', { voice_id: z.string().describe('形如 lib:12') }, async ({ voice_id }) => jsonResult(await client.produceDelete(`/voice-clones/${String(voice_id).replace(/^lib:/, '')}`)));
347
+ server.tool('set_character_voice', '把音色绑到某角色,之后 generate_tts 用它给该角色配音。免费。' +
348
+ '只有要出片时才需要这步——克隆和试听都不需要角色。', {
349
+ character_id: z.number().int().positive(),
350
+ voice_id: z.string().describe('来自 clone_voice / list_voices 的 voice_id(形如 lib:12)'),
351
+ }, async ({ character_id, voice_id }) => jsonResult(await client.producePost(`/characters/${character_id}/voice`, { voice_id })));
336
352
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@starreel/mcp",
3
- "version": "0.1.11",
3
+ "version": "0.1.13",
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.10",
5
+ "version": "0.1.13",
6
6
  "websiteUrl": "https://starreel.ai",
7
7
  "packages": [
8
8
  {
9
9
  "registryType": "npm",
10
10
  "identifier": "@starreel/mcp",
11
- "version": "0.1.10",
11
+ "version": "0.1.13",
12
12
  "transport": { "type": "stdio" },
13
13
  "environmentVariables": [
14
14
  {