@writepanda/mcp 1.69.0 → 1.72.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 +27 -6
  2. package/package.json +1 -1
package/bin/server.mjs CHANGED
@@ -564,7 +564,7 @@ const TOOLS = [
564
564
  {
565
565
  name: "project_fork_from_shot",
566
566
  description:
567
- "Fork an exported video's AI-generated shot into a new 9:16 project. Carries forward the source project's timing surgery (trim regions, transcript edits, speed regions, per-clip transcribed/audioCleaned status) but STRIPS every overlay row — zooms, FX, motion graphics, captions, transitions, lower thirds, annotations, clip-transforms, background music — because those were sized for 16:9 and don't fit a vertical short. The new project is cropped to the shot's [startMs, endMs] range, switched to 9:16, and ready to receive Shorts-native graphics/captions on top. Pass exportId + shotId from export.list (the shot lives under `entry.generatedShots[]`); the verb looks up the source project path, runs the fork, writes the new file, and returns its id + path. If the source project has been edited since export (revision drift) the verb returns `revision_mismatch` with the live revision; confirm with the user and retry with `force: true`. Returns { id, path, name, aspectRatio, sourceProjectPath, sourceProjectRevision, liveRevision, project }.",
567
+ "Fork an exported video's AI-generated shot into a new 9:16 project. Carries forward the source project's timing surgery (trim regions, transcript edits, speed regions, per-clip transcribed/audioCleaned status) but STRIPS every overlay row — zooms, FX, motion graphics, captions, transitions, lower thirds, annotations, clip-transforms, background music — because those were sized for 16:9 and don't fit a vertical short. The new project is cropped to the shot's [startMs, endMs] range, switched to 9:16 with a centered cover-crop so the landscape source FILLS the vertical frame (not letterboxed), and ready to receive Shorts-native graphics/captions on top. Pass exportId + shotId from export.list (the shot lives under `entry.generatedShots[]`); the verb looks up the source project path, runs the fork, writes the new file, and returns its id + path. If the source project has been edited since export (revision drift) the verb returns `revision_mismatch` with the live revision; confirm with the user and retry with `force: true`. Returns { id, path, name, aspectRatio, sourceProjectPath, sourceProjectRevision, liveRevision, project }.",
568
568
  inputSchema: {
569
569
  type: "object",
570
570
  properties: {
@@ -692,7 +692,7 @@ const TOOLS = [
692
692
  {
693
693
  name: "project_add_designed_segment",
694
694
  description:
695
- "Create a 'designed segment' — the YouTube split where the host stays LIVE on one half and a motion-graphic panel fills the other (host right / panel left, like a Vox or MKBHD explainer beat). ONE atomic call places both pieces over the same time range with the same transition and source anchor, so they can't drift or mismatch: the camera is repositioned + cover-cropped into its half (a full-bleed split clip-transform) and a full-frame transparent panel graphic is composited on top. Stays in the live compositor — camera is full-quality and scrubbable, nothing baked. IMPORTANT: author the panel graphic as a FULL-FRAME (1920×1080) TRANSPARENT render via motion_render_html --transparent — paint the opaque panel + content on the panel side, leave the camera's half fully transparent (it reveals the repositioned host). See SKILL.md 'Designed segments'.",
695
+ "Create a 'designed segment' — the split where the host stays LIVE on one half and a motion-graphic panel fills the other. 16:9: host right / panel left, like a Vox or MKBHD explainer beat. 9:16 SHORTS: host in a top/bottom band, panel in the other band (cameraSide top|bottom). ONE atomic call places both pieces over the same time range with the same transition and source anchor, so they can't drift or mismatch: the camera is repositioned + cover-cropped into its half (a full-bleed split clip-transform) and a full-frame transparent panel graphic is composited on top. Stays in the live compositor — camera is full-quality and scrubbable, nothing baked. IMPORTANT: author the panel graphic as a FULL-FRAME TRANSPARENT render at the project aspect via motion_render_html --transparent (1920x1080 for 16:9, 1080x1920 for 9:16; the premium `paper-panel` and `vox-side-panel` templates are aspect-aware — render either at 9:16 and it reflows into a top/bottom band) — paint the opaque panel + content on the panel side, leave the camera's half fully transparent (it reveals the repositioned host). See SKILL.md 'Designed segments' and 'Editing a Short'.",
696
696
  inputSchema: {
697
697
  type: "object",
698
698
  properties: {
@@ -712,15 +712,15 @@ const TOOLS = [
712
712
  atMs: { type: "number", description: "Default: end of timeline" },
713
713
  cameraSide: {
714
714
  type: "string",
715
- enum: ["left", "right"],
715
+ enum: ["left", "right", "top", "bottom"],
716
716
  description:
717
- "Which half the CAMERA fills; the panel graphic fills the opposite half. 'right' is the canonical reference (host right, panel left).",
717
+ "Which half the CAMERA fills; the panel graphic fills the opposite half. 16:9: 'left'/'right' ('right' is the canonical reference — host right, panel left). 9:16 SHORTS: 'top'/'bottom' — the camera fills a horizontal band and the panel covers the other band (render a premium panel like `paper-panel` or `vox-side-panel` at 9:16; both reflow into a top/bottom band).",
718
718
  },
719
719
  cameraRatio: {
720
720
  type: "number",
721
721
  enum: [50, 55],
722
722
  description:
723
- "Camera's share of the frame width: 55 (default, the reference split) or 50 (balanced). Panel gets the remaining 45 or 50. Author the panel's opaque width to match (e.g. left 45% for cameraSide=right, cameraRatio=55).",
723
+ "Camera's share of the split axis (width for left/right, height for top/bottom): 55 (default for 16:9) or 50 (balanced — pair the 9:16 shorts template with 50). Panel gets the rest. Author the panel's opaque band to match (e.g. left 45% for cameraSide=right ratio=55; bottom 50% for cameraSide=top ratio=50).",
724
724
  },
725
725
  transitionMs: {
726
726
  type: "number",
@@ -1310,6 +1310,27 @@ const TOOLS = [
1310
1310
  },
1311
1311
  command: "project.set-crop",
1312
1312
  },
1313
+ {
1314
+ name: "project_set_focal_point",
1315
+ description:
1316
+ "Set or clear a clip's FACE FOCAL POINT (source-normalised 0-1, origin top-left). When set, cover-cropped layouts — a 9:16 fill or a top/bottom designed-segment band — bias toward this point instead of centering geometrically, so the face stays in frame. Omit clipId to apply to ALL clips (single-clip shorts). Pass clear=true (or omit x/y) to reset to centered. NOTE: the editor AUTO-DETECTS this for vertical talking-head clips when they open, so you rarely need this — use it to override the auto framing or when building a short fully headless.",
1317
+ inputSchema: {
1318
+ type: "object",
1319
+ properties: {
1320
+ id: { type: "string" },
1321
+ path: { type: "string" },
1322
+ clipId: {
1323
+ type: "string",
1324
+ description: "Target clip id (from project.read clipStates). Omit to apply to all clips.",
1325
+ },
1326
+ x: { type: "number", description: "Face center X, 0-1. Omit (with y) to clear." },
1327
+ y: { type: "number", description: "Face center Y, 0-1. Omit (with x) to clear." },
1328
+ clear: { type: "boolean", description: "Reset the focal point to geometric centering." },
1329
+ expectedRevision: { type: "number" },
1330
+ },
1331
+ },
1332
+ command: "project.set-focal-point",
1333
+ },
1313
1334
  {
1314
1335
  name: "project_set_export_settings",
1315
1336
  description:
@@ -2400,7 +2421,7 @@ const TOOLS = [
2400
2421
  const server = new Server(
2401
2422
  {
2402
2423
  name: "pandastudio",
2403
- version: "1.69.0",
2424
+ version: "1.70.0",
2404
2425
  },
2405
2426
  {
2406
2427
  capabilities: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@writepanda/mcp",
3
- "version": "1.69.0",
3
+ "version": "1.72.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",