@writepanda/mcp 1.57.0 → 1.62.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 +81 -4
  2. package/package.json +43 -43
package/bin/server.mjs CHANGED
@@ -646,6 +646,12 @@ const TOOLS = [
646
646
  description:
647
647
  "Optional CSS color string composited over the blurred backdrop. Editor default: 'rgba(10,10,10,0.18)' (slight dark glass). Only applied when backdropBlurStrength > 0.",
648
648
  },
649
+ layer: {
650
+ type: "string",
651
+ enum: ["overlay", "background"],
652
+ description:
653
+ "'background' renders this full-frame graphic BEHIND the camera (graphic-background + talking-head-card layout) — pair it with a CARD camera clip-transform (cam-right-portrait / cam-bottom-right-quarter) over the same span. The camera card composites on top in preview AND export. Default 'overlay' (on top).",
654
+ },
649
655
  expectedRevision: { type: "number" },
650
656
  },
651
657
  required: ["durationMs"],
@@ -986,7 +992,7 @@ const TOOLS = [
986
992
  {
987
993
  name: "project_add_clip_transform_region",
988
994
  description:
989
- "Time-bounded transform on the main video clip — between startMs and endMs the clip renders inside a sub-rect of the canvas (per the chosen preset), freeing the rest for motion graphics. Outside the region, the clip renders full-frame. Renderer interpolates over `transitionMs` (default 320ms) at each boundary so the camera smoothly slides + scales. **Use ONLY on camera-only / user-uploaded recordings — for screen recordings, use cursor-telemetry zooms instead.** Typical pattern: agent finds an emphasis moment in the transcript, places a `cam-bottom-half` (9:16) or `cam-right-portrait` (16:9) transform region, and adds a motion graphic in the freed space. When the region ends, the camera returns to full-frame.",
995
+ "Time-bounded transform on the main video clip between startMs and endMs. TWO families of preset: (1) cam-* render the single clip inside a sub-rect of the canvas, freeing the rest for motion graphics (use ONLY on camera-only / user-uploaded recordings; for screen recordings use cursor-telemetry zooms). (2) layout-* swap the WHOLE podcast composite for the window — this is how you change a PODCAST's layout over time WITHIN ONE recording (e.g. side-by-side intro, then host-only while they talk, then back). Outside the region the clip renders with its natural layout. Renderer interpolates over `transitionMs` (default 320ms) at each boundary so the camera/tiles smoothly resize.",
990
996
  inputSchema: {
991
997
  type: "object",
992
998
  required: ["startMs", "endMs", "preset"],
@@ -1001,12 +1007,21 @@ const TOOLS = [
1001
1007
  "cam-bottom-half",
1002
1008
  "cam-top-half",
1003
1009
  "cam-right-portrait",
1010
+ "cam-right-portrait-sm",
1004
1011
  "cam-left-portrait",
1005
1012
  "cam-bottom-right-quarter",
1006
1013
  "cam-bottom-left-quarter",
1014
+ "cam-right-55",
1015
+ "cam-left-55",
1016
+ "cam-right-50",
1017
+ "cam-left-50",
1018
+ "layout-side-by-side",
1019
+ "layout-podcast",
1020
+ "layout-host-full",
1021
+ "layout-guest-full",
1007
1022
  ],
1008
1023
  description:
1009
- "cam-bottom-half / cam-top-half — for 9:16 (camera fills half, other half open for motion graphics). cam-right-portrait / cam-left-portrait — for 16:9 (camera ~35% of canvas in a portrait card on the chosen side, other ~65% open). cam-bottom-right-quarter / cam-bottom-left-quarter — small corner card; rest of canvas open.",
1024
+ "cam-* (camera reposition into a sub-rect): cam-bottom-half / cam-top-half (9:16); cam-right-portrait / cam-left-portrait (16:9 ~35% card); cam-right-portrait-sm (small ~25% host card — for a full-frame graphic background); cam-bottom-right-quarter / cam-bottom-left-quarter (corner card); cam-right-55/left-55/right-50/left-50 (designed splits). layout-* (PODCAST ONLY — whole-composite swap over time): layout-side-by-side, layout-podcast (two equal tiles), layout-host-full (speaker 1 only), layout-guest-full (speaker 2 only). IMPORTANT: layout-* presets only do anything on a PODCAST clip (kind='podcast' — a clip with BOTH a host and a guest source). On any other clip there is no second speaker, so they are a no-op; use cam-* there. Check clip.kind via project_read before using layout-*.",
1010
1025
  },
1011
1026
  transitionMs: {
1012
1027
  type: "number",
@@ -1498,6 +1513,31 @@ const TOOLS = [
1498
1513
  },
1499
1514
  command: "project.set-clip-layout",
1500
1515
  },
1516
+ {
1517
+ name: "project_set_clip_style",
1518
+ description:
1519
+ "Set ONE clip's framing style — padding, borderRadius (roundness), and/or shadowIntensity (each 0–100) — overriding the project-level values for just that clip. Use in a multi-clip project to frame sources differently: e.g. a full-bleed camera clip (padding 0, borderRadius 0, shadowIntensity 0) next to a padded, rounded podcast clip. Pass a field as null to CLEAR its override (inherit project); omit a field to leave it unchanged. Project-level equivalents are project_set_style. Honored in preview + export.",
1520
+ inputSchema: {
1521
+ type: "object",
1522
+ properties: {
1523
+ id: { type: "string" },
1524
+ path: { type: "string" },
1525
+ clipId: { type: "string", description: "Clip id to style" },
1526
+ padding: { type: "number", description: "Padding 0–100; null clears, omit leaves as-is." },
1527
+ borderRadius: {
1528
+ type: "number",
1529
+ description: "Roundness 0–100; null clears, omit leaves as-is.",
1530
+ },
1531
+ shadowIntensity: {
1532
+ type: "number",
1533
+ description: "Shadow 0–100; null clears, omit leaves as-is.",
1534
+ },
1535
+ expectedRevision: { type: "number" },
1536
+ },
1537
+ required: ["clipId"],
1538
+ },
1539
+ command: "project.set-clip-style",
1540
+ },
1501
1541
 
1502
1542
  // ── transcript-based editing ────────────────────────────────────
1503
1543
  {
@@ -1810,7 +1850,7 @@ const TOOLS = [
1810
1850
  slots: {
1811
1851
  type: "object",
1812
1852
  description:
1813
- "Editable values keyed by slot key (see motion_list / the SKILL catalog): text strings, color hex strings, or list arrays. Omitted slots fall back to the template default.",
1853
+ "Editable values keyed by slot key (see motion_list / the SKILL catalog): text strings, color hex strings, or list arrays. An 'image'-typed slot (see its `type` in motion_list) takes an ABSOLUTE FILE PATH to an image — the server stages the file into the render, so you can pass a project-media path or a generated image (e.g. from media_generate_image). Omitted slots fall back to the template default.",
1814
1854
  },
1815
1855
  aspectRatio: {
1816
1856
  type: "string",
@@ -1829,6 +1869,43 @@ const TOOLS = [
1829
1869
  },
1830
1870
  command: "motion.generate",
1831
1871
  },
1872
+ // Video templates ("storyboards") — multi-scene, parameterized videos that
1873
+ // render several templates and concatenate them into one finished clip.
1874
+ {
1875
+ name: "motion_list_storyboards",
1876
+ description:
1877
+ "List the bundled VIDEO templates (storyboards). Unlike single-scene templates (motion_list), a storyboard is a whole short video: an ordered set of scenes plus a `params` brief you fill in once. Returns each storyboard's id, name, audience (youtube|podcaster|course), description, aspectRatios, and `params` (the brief: key, label, type string|color|asset, required, default — color params default to the workspace brand kit via brand.* sentinels). Use a storyboard when the user wants a finished intro/outro/episode-open/lesson-open rather than a single overlay. Render one with motion_generate_storyboard.",
1878
+ inputSchema: { type: "object", properties: {} },
1879
+ command: "motion.list-storyboards",
1880
+ },
1881
+ {
1882
+ name: "motion_generate_storyboard",
1883
+ description:
1884
+ "Render a multi-scene VIDEO template (storyboard) by id. Fill the brief via `params`; missing color params fall back to the workspace brand kit, missing required text params fail fast. The server renders each scene and concatenates them into one MP4. Async — returns { jobId, outputPath, sceneCount }; call job_wait, then pass that jobId as `fromJob` to project_add_motion_graphic. Discover storyboards + their params with motion_list_storyboards.",
1885
+ inputSchema: {
1886
+ type: "object",
1887
+ properties: {
1888
+ storyboardId: {
1889
+ type: "string",
1890
+ description:
1891
+ "Storyboard id from motion_list_storyboards (e.g. youtube-creator-intro, podcast-episode-open, course-lesson-open).",
1892
+ },
1893
+ params: {
1894
+ type: "object",
1895
+ description:
1896
+ "The brief, keyed by param key (see motion_list_storyboards). Text and color values. Omitted color params fall back to the workspace brand kit; omitted required text params cause a fast failure.",
1897
+ },
1898
+ aspectRatio: {
1899
+ type: "string",
1900
+ enum: ["16:9", "9:16", "1:1"],
1901
+ description: "Defaults to the storyboard's first listed aspect.",
1902
+ },
1903
+ outputName: { type: "string", description: "Optional filename stem (no extension)." },
1904
+ },
1905
+ required: ["storyboardId"],
1906
+ },
1907
+ command: "motion.generate-storyboard",
1908
+ },
1832
1909
  // Custom HTML authoring path is `motion_render_html` (for briefs no
1833
1910
  // bundled template fits).
1834
1911
  {
@@ -2271,7 +2348,7 @@ const TOOLS = [
2271
2348
  const server = new Server(
2272
2349
  {
2273
2350
  name: "pandastudio",
2274
- version: "1.57.0",
2351
+ version: "1.58.0",
2275
2352
  },
2276
2353
  {
2277
2354
  capabilities: {
package/package.json CHANGED
@@ -1,45 +1,45 @@
1
1
  {
2
- "name": "@writepanda/mcp",
3
- "version": "1.57.0",
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
- "keywords": [
6
- "pandastudio",
7
- "mcp",
8
- "model-context-protocol",
9
- "video-editor",
10
- "agent",
11
- "cursor",
12
- "continue",
13
- "cline",
14
- "claude-desktop"
15
- ],
16
- "author": "Kamala Kannan Sankarraj",
17
- "license": "MIT",
18
- "homepage": "https://www.writepanda.ai/cli",
19
- "repository": {
20
- "type": "git",
21
- "url": "git+https://github.com/kamskans/openscreen.git",
22
- "directory": "packages/mcp"
23
- },
24
- "bugs": {
25
- "url": "https://github.com/kamskans/openscreen/issues"
26
- },
27
- "type": "module",
28
- "engines": {
29
- "node": ">=18"
30
- },
31
- "bin": {
32
- "writepanda-mcp": "./bin/server.mjs"
33
- },
34
- "files": [
35
- "bin",
36
- "README.md",
37
- "LICENSE"
38
- ],
39
- "dependencies": {
40
- "@modelcontextprotocol/sdk": "^1.0.4"
41
- },
42
- "publishConfig": {
43
- "access": "public"
44
- }
2
+ "name": "@writepanda/mcp",
3
+ "version": "1.62.0",
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
+ "keywords": [
6
+ "pandastudio",
7
+ "mcp",
8
+ "model-context-protocol",
9
+ "video-editor",
10
+ "agent",
11
+ "cursor",
12
+ "continue",
13
+ "cline",
14
+ "claude-desktop"
15
+ ],
16
+ "author": "Kamala Kannan Sankarraj",
17
+ "license": "MIT",
18
+ "homepage": "https://www.writepanda.ai/cli",
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/kamskans/openscreen.git",
22
+ "directory": "packages/mcp"
23
+ },
24
+ "bugs": {
25
+ "url": "https://github.com/kamskans/openscreen/issues"
26
+ },
27
+ "type": "module",
28
+ "engines": {
29
+ "node": ">=18"
30
+ },
31
+ "bin": {
32
+ "writepanda-mcp": "./bin/server.mjs"
33
+ },
34
+ "files": [
35
+ "bin",
36
+ "README.md",
37
+ "LICENSE"
38
+ ],
39
+ "dependencies": {
40
+ "@modelcontextprotocol/sdk": "^1.0.4"
41
+ },
42
+ "publishConfig": {
43
+ "access": "public"
44
+ }
45
45
  }