@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.
Files changed (2) hide show
  1. package/bin/server.mjs +47 -6
  2. 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 for the current project. Use 'none' to hide the webcam overlay entirely.",
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 | none. 'none' hides the webcam.",
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.55.0",
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.55.0",
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",