@writepanda/mcp 1.66.0 → 1.69.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 +36 -8
  2. package/package.json +1 -1
package/bin/server.mjs CHANGED
@@ -561,6 +561,37 @@ const TOOLS = [
561
561
  },
562
562
  command: "project.new",
563
563
  },
564
+ {
565
+ name: "project_fork_from_shot",
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 }.",
568
+ inputSchema: {
569
+ type: "object",
570
+ properties: {
571
+ exportId: {
572
+ type: "string",
573
+ description: "Export library entry id (from export.list).",
574
+ },
575
+ shotId: {
576
+ type: "string",
577
+ description:
578
+ "Shot id (from the export entry's `generatedShots` array; produced by generate-shorts).",
579
+ },
580
+ aspectRatio: {
581
+ type: "string",
582
+ description:
583
+ "Target aspect. Defaults to '9:16' (the right answer for almost every shot generator output).",
584
+ },
585
+ force: {
586
+ type: "boolean",
587
+ description:
588
+ "Set true to fork even when the source project has drifted since export. Without it, drift returns revision_mismatch and the caller must confirm with the user first.",
589
+ },
590
+ },
591
+ required: ["exportId", "shotId"],
592
+ },
593
+ command: "project.fork-from-shot",
594
+ },
564
595
  {
565
596
  name: "project_open",
566
597
  description:
@@ -1730,7 +1761,7 @@ const TOOLS = [
1730
1761
  {
1731
1762
  name: "caption_set_template",
1732
1763
  description:
1733
- "Pick a caption template: classic, modern, minimal, bold, spotlight, boxed, neon, colored, texture, or editorial. `texture` fills large uppercase words with a flowing texture mask (lava/marble/metal/wood/concrete/rock) — pick the texture via caption_set_style `texture` (defaults to lava). `editorial` is a magazine-emphasis style: the word being spoken right now renders large (and takes an accent color) while the rest of the line shrinks, so one big word sweeps across the line in time with the speech.",
1764
+ "Pick a caption template: classic, modern, minimal, bold, spotlight, boxed, neon, colored, or editorial. `editorial` is a magazine-emphasis style: the word being spoken right now renders large (and takes an accent color) while the rest of the line shrinks, so one big word sweeps across the line in time with the speech.",
1734
1765
  inputSchema: {
1735
1766
  type: "object",
1736
1767
  properties: {
@@ -1747,7 +1778,6 @@ const TOOLS = [
1747
1778
  "boxed",
1748
1779
  "neon",
1749
1780
  "colored",
1750
- "texture",
1751
1781
  "editorial",
1752
1782
  ],
1753
1783
  },
@@ -1761,7 +1791,7 @@ const TOOLS = [
1761
1791
  {
1762
1792
  name: "caption_set_style",
1763
1793
  description:
1764
- "Override specific style properties of the caption overlay without changing the template. All fields are optional — pass only what you want to change. positionY controls vertical placement (0=top, 100=bottom, default 85). fontSize accepts CSS values like '28px' or '1.5em'.",
1794
+ "Override specific style properties of the caption overlay without changing the template. All fields are optional — pass only what you want to change. positionY controls vertical placement (0=top, 100=bottom, default 85). fontSize is in REM (e.g. '2.6rem'), matching the editor's Font size slider; it is clamped to 1.0–5.0rem (a px value is converted to rem), so you can't exceed the editor's max.",
1765
1795
  inputSchema: {
1766
1796
  type: "object",
1767
1797
  properties: {
@@ -1784,11 +1814,9 @@ const TOOLS = [
1784
1814
  },
1785
1815
  strokeColor: { type: "string", description: "Text stroke/outline color" },
1786
1816
  strokeWidth: { type: "number", description: "Text stroke width in px" },
1787
- fontSize: { type: "string", description: "CSS font-size value, e.g. '28px'" },
1788
- texture: {
1817
+ fontSize: {
1789
1818
  type: "string",
1790
- enum: ["lava", "marble", "metal", "wood", "concrete", "rock"],
1791
- description: "Texture for the 'texture' caption template. Ignored by other templates.",
1819
+ description: "Font size in REM, e.g. '2.6rem'. Clamped to 1.0–5.0rem (the editor's slider range).",
1792
1820
  },
1793
1821
  expectedRevision: { type: "number" },
1794
1822
  },
@@ -2372,7 +2400,7 @@ const TOOLS = [
2372
2400
  const server = new Server(
2373
2401
  {
2374
2402
  name: "pandastudio",
2375
- version: "1.66.0",
2403
+ version: "1.69.0",
2376
2404
  },
2377
2405
  {
2378
2406
  capabilities: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@writepanda/mcp",
3
- "version": "1.66.0",
3
+ "version": "1.69.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",