@writepanda/mcp 1.55.0 → 1.57.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 +47 -6
- package/package.json +1 -1
package/bin/server.mjs
CHANGED
|
@@ -1193,7 +1193,7 @@ const TOOLS = [
|
|
|
1193
1193
|
{
|
|
1194
1194
|
name: "project_set_webcam_layout",
|
|
1195
1195
|
description:
|
|
1196
|
-
"Set the webcam layout preset and optional position/scale
|
|
1196
|
+
"Set the PROJECT-LEVEL webcam layout preset and optional position/scale. Use 'none' to hide the webcam. 'podcast' = two co-equal speaker tiles (host + guest). 'podcast-host-full'/'podcast-guest-full' = a single speaker full-frame (host=mediaPath/speaker 1, guest=webcamPath/speaker 2). To vary the layout PER SECTION of a podcast, split the clip and use project_set_clip_layout instead.",
|
|
1197
1197
|
inputSchema: {
|
|
1198
1198
|
type: "object",
|
|
1199
1199
|
properties: {
|
|
@@ -1202,7 +1202,7 @@ const TOOLS = [
|
|
|
1202
1202
|
preset: {
|
|
1203
1203
|
type: "string",
|
|
1204
1204
|
description:
|
|
1205
|
-
"picture-in-picture | vertical-stack | side-by-side |
|
|
1205
|
+
"picture-in-picture | vertical-stack | side-by-side | podcast | podcast-host-full | podcast-guest-full | none",
|
|
1206
1206
|
},
|
|
1207
1207
|
cx: {
|
|
1208
1208
|
type: "number",
|
|
@@ -1443,20 +1443,61 @@ const TOOLS = [
|
|
|
1443
1443
|
{
|
|
1444
1444
|
name: "project_set_clip_kind",
|
|
1445
1445
|
description:
|
|
1446
|
-
"Stamp a clip's capture origin authoritatively: kind = camera | screen | upload. project.read returns each clip's kind (your visual-strategy signal: camera → designed segments + emphasis zooms; screen → cursor zooms). On pre-v1.28 projects kind wasn't recorded, so project.read INFERS it (flagged kindInferred:true) — and inference can be wrong. Use this to correct/lock it. `camera` = talking-head; `screen` = screen recording (maybe with webcam PiP); `upload` = imported file.",
|
|
1446
|
+
"Stamp a clip's capture origin authoritatively: kind = camera | screen | upload | podcast. project.read returns each clip's kind (your visual-strategy signal: camera → designed segments + emphasis zooms; screen → cursor zooms). On pre-v1.28 projects kind wasn't recorded, so project.read INFERS it (flagged kindInferred:true) — and inference can be wrong. Use this to correct/lock it. `camera` = talking-head; `screen` = screen recording (maybe with webcam PiP); `upload` = imported file; `podcast` = two-speaker composite (host=mediaPath, guest=webcamPath).",
|
|
1447
1447
|
inputSchema: {
|
|
1448
1448
|
type: "object",
|
|
1449
1449
|
properties: {
|
|
1450
1450
|
id: { type: "string" },
|
|
1451
1451
|
path: { type: "string" },
|
|
1452
1452
|
clipId: { type: "string", description: "Clip id from project_read mainTrack.clips[n].id" },
|
|
1453
|
-
kind: { type: "string", enum: ["camera", "screen", "upload"] },
|
|
1453
|
+
kind: { type: "string", enum: ["camera", "screen", "upload", "podcast"] },
|
|
1454
1454
|
expectedRevision: { type: "number" },
|
|
1455
1455
|
},
|
|
1456
1456
|
required: ["clipId", "kind"],
|
|
1457
1457
|
},
|
|
1458
1458
|
command: "project.set-clip-kind",
|
|
1459
1459
|
},
|
|
1460
|
+
{
|
|
1461
|
+
name: "project_set_webcam_offset",
|
|
1462
|
+
description:
|
|
1463
|
+
"Fine-tune a podcast composite's guest/host sync. offsetMs shifts the guest (webcamPath) relative to the host: positive delays the guest, negative advances it, 0 clears it (±10000). Honored in preview + export — the guest VIDEO and AUDIO shift together. Use when the two speakers look or sound slightly out of sync.",
|
|
1464
|
+
inputSchema: {
|
|
1465
|
+
type: "object",
|
|
1466
|
+
properties: {
|
|
1467
|
+
id: { type: "string" },
|
|
1468
|
+
path: { type: "string" },
|
|
1469
|
+
clipId: { type: "string", description: "Clip id of the podcast composite" },
|
|
1470
|
+
offsetMs: {
|
|
1471
|
+
type: "number",
|
|
1472
|
+
description: "Guest time nudge in ms (±10000). Positive delays guest; 0 clears.",
|
|
1473
|
+
},
|
|
1474
|
+
expectedRevision: { type: "number" },
|
|
1475
|
+
},
|
|
1476
|
+
required: ["clipId", "offsetMs"],
|
|
1477
|
+
},
|
|
1478
|
+
command: "project.set-webcam-offset",
|
|
1479
|
+
},
|
|
1480
|
+
{
|
|
1481
|
+
name: "project_set_clip_layout",
|
|
1482
|
+
description:
|
|
1483
|
+
"Set ONE clip's webcam layout — the per-section override for a podcast. preset: podcast | podcast-host-full | podcast-guest-full | picture-in-picture | side-by-side | vertical-stack | none (none clears the override so the clip inherits the project layout). 'podcast-host-full' shows only speaker 1 (host=mediaPath) full-frame; 'podcast-guest-full' shows only speaker 2 (guest=webcamPath). Speaker-driven editing flow: transcript_get returns each word's `speaker` ('host'/'guest') for podcast clips; project_split_clip at the points where the active speaker changes; then call this per section to cut to whoever is talking. Honored in preview + export.",
|
|
1484
|
+
inputSchema: {
|
|
1485
|
+
type: "object",
|
|
1486
|
+
properties: {
|
|
1487
|
+
id: { type: "string" },
|
|
1488
|
+
path: { type: "string" },
|
|
1489
|
+
clipId: { type: "string", description: "Clip id of the section to set" },
|
|
1490
|
+
preset: {
|
|
1491
|
+
type: "string",
|
|
1492
|
+
description:
|
|
1493
|
+
"podcast | podcast-host-full | podcast-guest-full | picture-in-picture | side-by-side | vertical-stack | none",
|
|
1494
|
+
},
|
|
1495
|
+
expectedRevision: { type: "number" },
|
|
1496
|
+
},
|
|
1497
|
+
required: ["clipId", "preset"],
|
|
1498
|
+
},
|
|
1499
|
+
command: "project.set-clip-layout",
|
|
1500
|
+
},
|
|
1460
1501
|
|
|
1461
1502
|
// ── transcript-based editing ────────────────────────────────────
|
|
1462
1503
|
{
|
|
@@ -1476,7 +1517,7 @@ const TOOLS = [
|
|
|
1476
1517
|
{
|
|
1477
1518
|
name: "transcript_get",
|
|
1478
1519
|
description:
|
|
1479
|
-
"Return the merged edited-time transcript: every word with id, text, startMs, endMs in EDITED-TIMELINE coordinates. Use word IDs as input to transcript_delete_words.",
|
|
1520
|
+
"Return the merged edited-time transcript: every word with id, text, startMs, endMs in EDITED-TIMELINE coordinates. Use word IDs as input to transcript_delete_words. For a PODCAST composite, each word also carries `speaker` ('host' = speaker 1 / mediaPath, 'guest' = speaker 2 / webcamPath) — use these spans to drive project_set_clip_layout (cut to whoever is talking).",
|
|
1480
1521
|
inputSchema: {
|
|
1481
1522
|
type: "object",
|
|
1482
1523
|
properties: {
|
|
@@ -2230,7 +2271,7 @@ const TOOLS = [
|
|
|
2230
2271
|
const server = new Server(
|
|
2231
2272
|
{
|
|
2232
2273
|
name: "pandastudio",
|
|
2233
|
-
version: "1.
|
|
2274
|
+
version: "1.57.0",
|
|
2234
2275
|
},
|
|
2235
2276
|
{
|
|
2236
2277
|
capabilities: {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@writepanda/mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.57.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",
|