@writepanda/mcp 1.74.0 → 1.76.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 +50 -9
  2. package/package.json +43 -43
package/bin/server.mjs CHANGED
@@ -379,8 +379,12 @@ const TOOLS = [
379
379
  id: { type: "string", description: "Export entry id." },
380
380
  accountId: { type: "string" },
381
381
  channelId: { type: "string" },
382
- title: { type: "string" },
383
- description: { type: "string" },
382
+ title: { type: "string", description: "Max 100 chars; < and > are stripped (YouTube rejects them)." },
383
+ description: {
384
+ type: "string",
385
+ description:
386
+ "Plain text, line breaks OK. < and > are stripped automatically and the text is clamped to 5000 chars, so a stray angle bracket (common in AI-written copy) no longer fails the upload.",
387
+ },
384
388
  tags: { type: "array", items: { type: "string" } },
385
389
  categoryId: { type: "string" },
386
390
  privacyStatus: {
@@ -416,8 +420,12 @@ const TOOLS = [
416
420
  properties: {
417
421
  accountId: { type: "string" },
418
422
  videoId: { type: "string" },
419
- title: { type: "string" },
420
- description: { type: "string" },
423
+ title: { type: "string", description: "Max 100 chars; < and > are stripped (YouTube rejects them)." },
424
+ description: {
425
+ type: "string",
426
+ description:
427
+ "Plain text, line breaks OK. < and > are stripped automatically and the text is clamped to 5000 chars, so a stray angle bracket (common in AI-written copy) no longer fails the upload.",
428
+ },
421
429
  tags: { type: "array", items: { type: "string" } },
422
430
  categoryId: { type: "string" },
423
431
  privacyStatus: { type: "string" },
@@ -911,8 +919,13 @@ const TOOLS = [
911
919
  description:
912
920
  "1 (mild) - 6 (extreme). Default 2 (1.5×) — soft, modern feel. Use 3-4 for emphasis beats, 5-6 for dramatic punch-ins.",
913
921
  },
914
- focusX: { type: "number", description: "Normalised 0-1 horizontal center. Default 0.5" },
915
- focusY: { type: "number", description: "Normalised 0-1 vertical center. Default 0.5" },
922
+ focusX: { type: "number", description: "Normalised 0-1 horizontal center. Default 0.5. Ignored when followCursor is true." },
923
+ focusY: { type: "number", description: "Normalised 0-1 vertical center. Default 0.5. Ignored when followCursor is true." },
924
+ followCursor: {
925
+ type: "boolean",
926
+ description:
927
+ "When true, the zoom continuously pans to follow the recorded mouse cursor (smoothed) for its duration — the Screen-Studio-style cursor-follow camera. Requires cursor telemetry (screen recordings); falls back to static focus otherwise. Ideal for screen-recording walkthroughs. Default false.",
928
+ },
916
929
  soundUrl: {
917
930
  type: "string",
918
931
  description:
@@ -1228,7 +1241,7 @@ const TOOLS = [
1228
1241
  {
1229
1242
  name: "project_update_region",
1230
1243
  description:
1231
- "Patch fields on an existing region without replacing it. Accepts any subset of the region's own properties — only the supplied fields are changed, everything else is preserved. Works on zoom (depth, focusX, focusY), trim (startMs, endMs), speed (startMs, endMs, speed), fx (atMs, durationMs, opacity, blendMode, speed), annotation, overlay, clip-transform (startMs, endMs, preset, transitionMs), and audio-overlay (startMs, endMs, sourceStartMs, volume — lets you drag-trim an audio overlay without removing it). Time shifts on a link-grouped region (e.g. one half of a designed segment) propagate to every peer in the group so the pair stays coherent.",
1244
+ "Patch fields on an existing region without replacing it. Accepts any subset of the region's own properties — only the supplied fields are changed, everything else is preserved. Works on zoom (depth, focusX, focusY, focusMode: 'static'|'auto' — set 'auto' for the cursor-follow camera), trim (startMs, endMs), speed (startMs, endMs, speed), fx (atMs, durationMs, opacity, blendMode, speed), annotation, overlay, clip-transform (startMs, endMs, preset, transitionMs), and audio-overlay (startMs, endMs, sourceStartMs, volume — lets you drag-trim an audio overlay without removing it). Time shifts on a link-grouped region (e.g. one half of a designed segment) propagate to every peer in the group so the pair stays coherent.",
1232
1245
  inputSchema: {
1233
1246
  type: "object",
1234
1247
  properties: {
@@ -1310,6 +1323,24 @@ const TOOLS = [
1310
1323
  },
1311
1324
  command: "project.set-crop",
1312
1325
  },
1326
+ {
1327
+ name: "project_set_screen_transform",
1328
+ description:
1329
+ "Move and/or scale the MAIN video within the frame — the automation equivalent of dragging or resizing the main clip on the canvas. Distinct from project_set_crop (which trims SOURCE pixels): this repositions and zooms the WHOLE video inside the frame. `scale` is a uniform multiplier (0.1-5; >1 zooms in and the overflow is clipped to the canvas, <1 shrinks it so the wallpaper shows around it). `x`/`y` shift the center as a fraction of canvas width/height (-2..2; 0 = centered). Omitted fields keep their current value. Pass reset:true (or no x/y/scale) to clear it back to the natural layout. Global (whole timeline); preview and export honor it identically.",
1330
+ inputSchema: {
1331
+ type: "object",
1332
+ properties: {
1333
+ id: { type: "string" },
1334
+ path: { type: "string" },
1335
+ x: { type: "number", description: "Center X offset, fraction of canvas width (-2..2)." },
1336
+ y: { type: "number", description: "Center Y offset, fraction of canvas height (-2..2)." },
1337
+ scale: { type: "number", description: "Uniform scale multiplier (0.1..5). 1 = natural." },
1338
+ reset: { type: "boolean", description: "Clear the transform (back to natural layout)." },
1339
+ expectedRevision: { type: "number" },
1340
+ },
1341
+ },
1342
+ command: "project.set-screen-transform",
1343
+ },
1313
1344
  {
1314
1345
  name: "project_set_focal_point",
1315
1346
  description:
@@ -1369,7 +1400,7 @@ const TOOLS = [
1369
1400
  {
1370
1401
  name: "project_set_aspect_ratio",
1371
1402
  description:
1372
- "Change the project's output aspect ratio. Affects the canvas size and how the video is cropped/letterboxed on export. Pick based on the target platform: 16:9 for YouTube/desktop, 9:16 for Shorts/Reels/TikTok, 1:1 for Instagram feed.",
1403
+ "Change the project's output aspect ratio. Affects the canvas size and how the video is cropped/letterboxed on export. Pick based on the target platform: 16:9 for YouTube/desktop, 9:16 for Shorts/Reels/TikTok, 1:1 for Instagram feed. A camera-only project whose source aspect differs from the new ratio is auto cover-cropped (centered) to fill the frame instead of letterboxing.",
1373
1404
  inputSchema: {
1374
1405
  type: "object",
1375
1406
  properties: {
@@ -1421,6 +1452,11 @@ const TOOLS = [
1421
1452
  type: "boolean",
1422
1453
  description: "Whether to show a blurred background behind the recording.",
1423
1454
  },
1455
+ cursorScale: {
1456
+ type: "number",
1457
+ description:
1458
+ "Custom-cursor overlay size. 0 = off (no synthetic cursor). >0 (e.g. 1.5) draws an enlarged cursor that tracks the recording's cursor telemetry. Screen recordings only. 0-5.",
1459
+ },
1424
1460
  expectedRevision: { type: "number" },
1425
1461
  },
1426
1462
  },
@@ -1816,7 +1852,7 @@ const TOOLS = [
1816
1852
  {
1817
1853
  name: "caption_set_style",
1818
1854
  description:
1819
- "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.",
1855
+ "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). fontFamily sets the caption font (a system font like 'Georgia' or a loaded custom font; unloaded fonts fall back). 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.",
1820
1856
  inputSchema: {
1821
1857
  type: "object",
1822
1858
  properties: {
@@ -1827,6 +1863,11 @@ const TOOLS = [
1827
1863
  description: "Max words shown at once. Default varies by template.",
1828
1864
  },
1829
1865
  positionY: { type: "number", description: "Vertical position 0-100. Default 85." },
1866
+ fontFamily: {
1867
+ type: "string",
1868
+ description:
1869
+ "Caption font family, e.g. 'Inter', 'Georgia', or a loaded custom font name. Fonts not loaded in the app fall back to a system default.",
1870
+ },
1830
1871
  color: { type: "string", description: "Caption text color (hex/CSS)" },
1831
1872
  backgroundColor: { type: "string", description: "Caption background color" },
1832
1873
  highlightColor: {
package/package.json CHANGED
@@ -1,45 +1,45 @@
1
1
  {
2
- "name": "@writepanda/mcp",
3
- "version": "1.74.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.76.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
  }