@writepanda/mcp 1.72.0 → 1.75.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 -10
  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
  },
@@ -1719,7 +1755,11 @@ const TOOLS = [
1719
1755
  properties: {
1720
1756
  id: { type: "string" },
1721
1757
  path: { type: "string" },
1722
- find: { type: "string", description: "Phrase to search for (case-insensitive)" },
1758
+ find: {
1759
+ type: "string",
1760
+ description:
1761
+ "Phrase to search for. Case-insensitive; digits and punctuation are ignored on both sides, so \"than60\" and \"than\" both match the word \"than60\". A pure-number/punctuation phrase can't be targeted (it normalizes to empty) — include a letter word.",
1762
+ },
1723
1763
  replace: { type: "string", description: "Replacement text (replaces the whole phrase)" },
1724
1764
  expectedRevision: { type: "number" },
1725
1765
  },
@@ -1730,7 +1770,7 @@ const TOOLS = [
1730
1770
  {
1731
1771
  name: "transcript_remove_silences",
1732
1772
  description:
1733
- "Detect and trim silent gaps in the recording — leading silence before the first word, trailing silence after the last word, and inter-word gaps longer than `thresholdMs`. Bulk-creates trim regions. Returns { removed, totalTrimmedMs }.",
1773
+ "Detect and trim silent sections — the SAME two passes as the UI Remove Silences button, unioned: (1) transcript word-gaps (leading, inter-word, trailing) longer than `thresholdMs`; (2) ffmpeg audio-level silencedetect on each clip's media, catching real dead air the transcript misses (speech-to-text invents phantom words over quiet stretches). Bulk-creates trim regions. Returns { removedCount, totalTrimmedMs, audioDetectionFailed }.",
1734
1774
  inputSchema: {
1735
1775
  type: "object",
1736
1776
  properties: {
package/package.json CHANGED
@@ -1,45 +1,45 @@
1
1
  {
2
- "name": "@writepanda/mcp",
3
- "version": "1.72.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.75.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
  }