@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.
- package/bin/server.mjs +81 -4
- 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
|
|
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
|
|
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.
|
|
2351
|
+
version: "1.58.0",
|
|
2275
2352
|
},
|
|
2276
2353
|
{
|
|
2277
2354
|
capabilities: {
|
package/package.json
CHANGED
|
@@ -1,45 +1,45 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
}
|