@writepanda/mcp 1.98.0 → 1.100.0
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/bin/server.mjs +89 -11
- package/package.json +1 -1
package/bin/server.mjs
CHANGED
|
@@ -229,6 +229,40 @@ const TOOLS = [
|
|
|
229
229
|
inputSchema: { type: "object", properties: {} },
|
|
230
230
|
command: "system.isWhisperModelDownloaded",
|
|
231
231
|
},
|
|
232
|
+
{
|
|
233
|
+
name: "system_get_narration_engine",
|
|
234
|
+
description:
|
|
235
|
+
"Read the active narration (TTS) engine for the current workspace. Returns { engine } — 'local-kokoro' (default; Kokoro-82M on-device, English, no key/cloud) or 'replicate' (cloud TTS, needs the user's Replicate key). Use before recommending a switch or when disclosing which engine narration uses.",
|
|
236
|
+
inputSchema: { type: "object", properties: {} },
|
|
237
|
+
command: "system.getNarrationEngine",
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
name: "system_set_narration_engine",
|
|
241
|
+
description:
|
|
242
|
+
"Set the DEFAULT narration engine for the current workspace. Pass `engine` = 'local-kokoro' (on-device English, no key) or 'replicate' (cloud, needs the user's Replicate key). Individual media_generate_narration calls can still override this via their `model` arg. Switching to local triggers a one-time ~330 MB model download on first use — call system_is_kokoro_model_downloaded to check.",
|
|
243
|
+
inputSchema: {
|
|
244
|
+
type: "object",
|
|
245
|
+
properties: {
|
|
246
|
+
engine: { type: "string", description: "'local-kokoro' | 'replicate'." },
|
|
247
|
+
},
|
|
248
|
+
required: ["engine"],
|
|
249
|
+
},
|
|
250
|
+
command: "system.setNarrationEngine",
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
name: "system_is_kokoro_model_downloaded",
|
|
254
|
+
description:
|
|
255
|
+
"Check whether the local Kokoro-82M TTS model (English on-device narration) has been downloaded. Returns { downloaded: boolean }. The model (~330 MB) auto-downloads on first local narration; calling this first lets you surface the download instead of a long first-run wait.",
|
|
256
|
+
inputSchema: { type: "object", properties: {} },
|
|
257
|
+
command: "system.isKokoroModelDownloaded",
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
name: "system_download_kokoro_model",
|
|
261
|
+
description:
|
|
262
|
+
"Pre-download the local Kokoro-82M TTS model + voices (~330 MB) now so the first narration doesn't pay the wait. Idempotent; returns { downloaded: true }. Optional — narration also auto-downloads on first use.",
|
|
263
|
+
inputSchema: { type: "object", properties: {} },
|
|
264
|
+
command: "system.downloadKokoroModel",
|
|
265
|
+
},
|
|
232
266
|
|
|
233
267
|
// ── workspaces (v1.19) ──────────────────────────────────────────
|
|
234
268
|
// Multi-workspace isolation: each workspace has its own projects,
|
|
@@ -854,7 +888,7 @@ const TOOLS = [
|
|
|
854
888
|
{
|
|
855
889
|
name: "project_add_motion_graphic",
|
|
856
890
|
description:
|
|
857
|
-
"Drop a motion-graphic MP4/WebM onto the timeline. PREFERRED: pass `fromJob` (the jobId from motion_render_html / motion_generate / motion_concat) — the server resolves the outputPath internally, so you never handle the path string at all. Fallback: pass `file` (an absolute path) only for external/uploaded files. Also accepts `file: 'bundled:transition/<id>'` (ids from asset_list_transitions) — the house-opener pattern: a bundled transition placed as an overlay auto-stamps transitionId so it COVER-fits any canvas (a 16:9 sweep fills a 9:16 frame) and carries its SFX via soundUrl. **Defaults to a `bundled:sound/mouse-click` SFX as the graphic appears** — pass `soundUrl: null` to make it silent, or any other `bundled:sound/<id>` to swap the sound.",
|
|
891
|
+
"Drop a motion-graphic MP4/WebM onto the timeline. PREFERRED: pass `fromJob` (the jobId from motion_render_html / motion_generate / motion_concat) — the server resolves the outputPath internally, so you never handle the path string at all. Fallback: pass `file` (an absolute path) only for external/uploaded files. Also accepts `file: 'bundled:transition/<id>'` (ids from asset_list_transitions) — the house-opener pattern: a bundled transition placed as an overlay auto-stamps transitionId so it COVER-fits any canvas (a 16:9 sweep fills a 9:16 frame) and carries its SFX via soundUrl. Image files (png/jpg/webp/gif/avif) are detected and render as image overlays; pair `file: <image>` with `layer: 'background'` for a timed BACKGROUND-IMAGE underlay (cover-fills the canvas behind the camera — with a background-effect remove region over the same span, the image replaces the speaker's real background for just that duration). **Defaults to a `bundled:sound/mouse-click` SFX as the graphic appears** — pass `soundUrl: null` to make it silent, or any other `bundled:sound/<id>` to swap the sound.",
|
|
858
892
|
inputSchema: {
|
|
859
893
|
type: "object",
|
|
860
894
|
properties: {
|
|
@@ -1223,6 +1257,48 @@ const TOOLS = [
|
|
|
1223
1257
|
},
|
|
1224
1258
|
command: "project.add-spotlight",
|
|
1225
1259
|
},
|
|
1260
|
+
{
|
|
1261
|
+
name: "project_add_background_effect",
|
|
1262
|
+
description:
|
|
1263
|
+
"Add a BACKGROUND EFFECT region on the camera video: AI person segmentation runs between startMs and endMs and either BLURS the background behind the speaker (mode 'blur' — video-call style) or REMOVES it so the project wallpaper shows through behind them (mode 'remove'). Behaves exactly like a zoom region on the timeline: draggable, trimmable, source-anchored (pass anchorSourceMs when placing from a transcript word so it survives later trims). Camera / talking-head footage only. Preview and export render it identically. Find placed regions via project_read under editor.backgroundEffectRegions[]; retime/restyle with project_update_region (regionType 'background-effect'), delete with project_remove_region.",
|
|
1264
|
+
inputSchema: {
|
|
1265
|
+
type: "object",
|
|
1266
|
+
properties: {
|
|
1267
|
+
id: { type: "string" },
|
|
1268
|
+
path: { type: "string" },
|
|
1269
|
+
atMs: { type: "number", description: "Edited-time start (ms). Or pass startMs." },
|
|
1270
|
+
startMs: { type: "number", description: "Alias for atMs (edited-time start, ms)." },
|
|
1271
|
+
endMs: { type: "number", description: "Edited-time end (ms). Alternative to durationMs." },
|
|
1272
|
+
durationMs: {
|
|
1273
|
+
type: "number",
|
|
1274
|
+
description: "Duration in ms. Default 5000 when neither durationMs nor endMs given.",
|
|
1275
|
+
},
|
|
1276
|
+
mode: {
|
|
1277
|
+
type: "string",
|
|
1278
|
+
enum: ["blur", "remove"],
|
|
1279
|
+
description:
|
|
1280
|
+
'"blur" = person sharp, background gaussian-blurred. "remove" = background cut away; the project wallpaper/background shows through behind the person.',
|
|
1281
|
+
},
|
|
1282
|
+
strength: {
|
|
1283
|
+
type: "number",
|
|
1284
|
+
description:
|
|
1285
|
+
"Blur strength in px sigma at 1080p (mode='blur' only; ignored for 'remove'). 1-120, default 18.",
|
|
1286
|
+
},
|
|
1287
|
+
anchorSourceMs: {
|
|
1288
|
+
type: "number",
|
|
1289
|
+
description:
|
|
1290
|
+
"Anchor to a SOURCE-time moment (transcript word startMs). The region then re-anchors automatically on subsequent trim/speed edits.",
|
|
1291
|
+
},
|
|
1292
|
+
anchorSourceEndMs: {
|
|
1293
|
+
type: "number",
|
|
1294
|
+
description: "Optional anchor end (source ms) for ranged anchoring.",
|
|
1295
|
+
},
|
|
1296
|
+
expectedRevision: { type: "number" },
|
|
1297
|
+
},
|
|
1298
|
+
required: ["mode"],
|
|
1299
|
+
},
|
|
1300
|
+
command: "project.add-background-effect",
|
|
1301
|
+
},
|
|
1226
1302
|
{
|
|
1227
1303
|
name: "project_update_spotlight",
|
|
1228
1304
|
description:
|
|
@@ -1624,7 +1700,7 @@ const TOOLS = [
|
|
|
1624
1700
|
{
|
|
1625
1701
|
name: "project_remove_region",
|
|
1626
1702
|
description:
|
|
1627
|
-
"Delete an existing region (zoom, trim, speed, annotation, fx, overlay, clip-transform, audio-overlay) by its id. Use project_read to find region ids — visual regions live under editor.*Regions; audio overlays live under audioOverlays[]. If the region belongs to a link group (designed-segment pair: a clip-transform parking the camera into one half + the panel motion-graphic on the other half), deleting either half also removes its peer so the pair stays coherent. Returns the updated project.",
|
|
1703
|
+
"Delete an existing region (zoom, trim, speed, annotation, fx, overlay, clip-transform, background-effect, audio-overlay) by its id. Use project_read to find region ids — visual regions live under editor.*Regions; audio overlays live under audioOverlays[]. If the region belongs to a link group (designed-segment pair: a clip-transform parking the camera into one half + the panel motion-graphic on the other half), deleting either half also removes its peer so the pair stays coherent. Returns the updated project.",
|
|
1628
1704
|
inputSchema: {
|
|
1629
1705
|
type: "object",
|
|
1630
1706
|
properties: {
|
|
@@ -1633,7 +1709,7 @@ const TOOLS = [
|
|
|
1633
1709
|
regionType: {
|
|
1634
1710
|
type: "string",
|
|
1635
1711
|
description:
|
|
1636
|
-
"zoom | trim | speed | annotation | fx | overlay | clip-transform | audio-overlay",
|
|
1712
|
+
"zoom | trim | speed | annotation | fx | overlay | clip-transform | background-effect | audio-overlay",
|
|
1637
1713
|
},
|
|
1638
1714
|
regionId: { type: "string", description: "id of the region to delete" },
|
|
1639
1715
|
expectedRevision: { type: "number" },
|
|
@@ -1664,7 +1740,7 @@ const TOOLS = [
|
|
|
1664
1740
|
{
|
|
1665
1741
|
name: "project_update_region",
|
|
1666
1742
|
description:
|
|
1667
|
-
"Patch fields on an existing region without replacing it. Accepts any subset of the region's own properties — only the supplied fields are changed, everything else is preserved. Overlay geometry (x/y/width/height) is PERCENT of canvas 0-100; values <= 1 are treated as 0-1 fractions and scaled. Works on zoom (depth, focusX, focusY, focusMode: 'static'|'auto' — set 'auto' for the cursor-follow camera), trim (startMs, endMs), speed (startMs, endMs, speed), fx (atMs, durationMs, opacity, blendMode, speed), annotation, overlay, clip-transform (startMs, endMs, preset, transitionMs), and audio-overlay (startMs, endMs, sourceStartMs, volume — lets you drag-trim an audio overlay without removing it). Time shifts on a link-grouped region (e.g. one half of a designed segment) propagate to every peer in the group so the pair stays coherent.",
|
|
1743
|
+
"Patch fields on an existing region without replacing it. Accepts any subset of the region's own properties — only the supplied fields are changed, everything else is preserved. Overlay geometry (x/y/width/height) is PERCENT of canvas 0-100; values <= 1 are treated as 0-1 fractions and scaled. Works on zoom (depth, focusX, focusY, focusMode: 'static'|'auto' — set 'auto' for the cursor-follow camera), trim (startMs, endMs), speed (startMs, endMs, speed), fx (atMs, durationMs, opacity, blendMode, speed), annotation, overlay, clip-transform (startMs, endMs, preset, transitionMs), background-effect (startMs, endMs, mode: 'blur'|'remove', strength), and audio-overlay (startMs, endMs, sourceStartMs, volume — lets you drag-trim an audio overlay without removing it). Time shifts on a link-grouped region (e.g. one half of a designed segment) propagate to every peer in the group so the pair stays coherent.",
|
|
1668
1744
|
inputSchema: {
|
|
1669
1745
|
type: "object",
|
|
1670
1746
|
properties: {
|
|
@@ -1673,7 +1749,7 @@ const TOOLS = [
|
|
|
1673
1749
|
regionType: {
|
|
1674
1750
|
type: "string",
|
|
1675
1751
|
description:
|
|
1676
|
-
"zoom | trim | speed | annotation | fx | overlay | clip-transform | audio-overlay",
|
|
1752
|
+
"zoom | trim | speed | annotation | fx | overlay | clip-transform | background-effect | audio-overlay",
|
|
1677
1753
|
},
|
|
1678
1754
|
regionId: { type: "string", description: "id of the region to update" },
|
|
1679
1755
|
patch: {
|
|
@@ -2390,27 +2466,29 @@ const TOOLS = [
|
|
|
2390
2466
|
{
|
|
2391
2467
|
name: "media_generate_narration",
|
|
2392
2468
|
description:
|
|
2393
|
-
"Generate a voiceover / narration audio clip
|
|
2469
|
+
"Generate a voiceover / narration audio clip. Project-agnostic; writes audio to <userData>/narration/ and returns { audioPath, durationMs, model, voice, predictionId }. Canonical workflow: media_generate_narration → project_add_audio (place at startMs, pass the returned durationMs so the overlay is sized to the speech). DEFAULT is the LOCAL, on-device Kokoro engine (English) — no API key, no cloud, runs on the user's machine; the model auto-downloads (~330 MB) on first use. Kokoro voices (pass in `voice`): af_heart (default), af_bella, am_michael, bf_emma, bm_george, etc. (a*=American, b*=British; f=female, m=male). To use CLOUD TTS instead (more voices/languages, needs the user's Replicate key), set `model` to a Replicate model: 'elevenlabs-v3' (most expressive — embed inline tags like [excited]/[whispers]) | 'gemini-flash-tts' (30 voices, multilingual, 'style' sets tone) | 'minimax-turbo' (fast, 'style' maps to an emotion, 'speed' 0.5-2). Cloud voices — gemini Kore/Puck/Charon; minimax Friendly_Person/Wise_Woman. Omit `model` to honour the workspace default (system_get_narration_engine).",
|
|
2394
2470
|
inputSchema: {
|
|
2395
2471
|
type: "object",
|
|
2396
2472
|
properties: {
|
|
2397
2473
|
text: {
|
|
2398
2474
|
type: "string",
|
|
2399
2475
|
description:
|
|
2400
|
-
"The script to speak. For elevenlabs-v3 you can embed delivery tags inline, e.g. 'Welcome [excited] to the future of editing.'",
|
|
2476
|
+
"The script to speak. For the cloud elevenlabs-v3 model you can embed delivery tags inline, e.g. 'Welcome [excited] to the future of editing.' (Local Kokoro ignores such tags.)",
|
|
2401
2477
|
},
|
|
2402
2478
|
model: {
|
|
2403
2479
|
type: "string",
|
|
2404
|
-
description:
|
|
2480
|
+
description:
|
|
2481
|
+
"Engine/model selector. Omit for the workspace default (local Kokoro). 'kokoro-local' forces on-device English. Cloud (needs Replicate key): 'elevenlabs-v3' | 'gemini-flash-tts' | 'minimax-turbo'.",
|
|
2405
2482
|
},
|
|
2406
2483
|
voice: {
|
|
2407
2484
|
type: "string",
|
|
2408
2485
|
description:
|
|
2409
|
-
"Voice
|
|
2486
|
+
"Voice for the chosen engine. Local Kokoro: af_heart/af_bella/am_michael/bf_emma/bm_george/... Cloud: gemini Kore/Puck/...; minimax Friendly_Person/... Omit for the engine's default voice.",
|
|
2410
2487
|
},
|
|
2411
2488
|
language: {
|
|
2412
2489
|
type: "string",
|
|
2413
|
-
description:
|
|
2490
|
+
description:
|
|
2491
|
+
"Optional BCP-47 language hint for the cloud models, e.g. 'en-US', 'es-ES'. Local Kokoro is English-only and ignores this.",
|
|
2414
2492
|
},
|
|
2415
2493
|
style: {
|
|
2416
2494
|
type: "string",
|
|
@@ -3012,7 +3090,7 @@ const TOOLS = [
|
|
|
3012
3090
|
const server = new Server(
|
|
3013
3091
|
{
|
|
3014
3092
|
name: "pandastudio",
|
|
3015
|
-
version: "1.
|
|
3093
|
+
version: "1.73.0",
|
|
3016
3094
|
},
|
|
3017
3095
|
{
|
|
3018
3096
|
capabilities: {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@writepanda/mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.100.0",
|
|
4
4
|
"description": "Model Context Protocol server for PandaStudio. Exposes the desktop video editor's automation surface to Cursor, Continue, Cline, Claude Desktop, and any MCP-compliant client.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"pandastudio",
|