@writepanda/mcp 1.14.1 → 1.17.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 +55 -14
- package/package.json +1 -1
package/bin/server.mjs
CHANGED
|
@@ -242,8 +242,7 @@ const TOOLS = [
|
|
|
242
242
|
media: { type: "string", description: "Absolute path to video file" },
|
|
243
243
|
atIndex: {
|
|
244
244
|
type: "number",
|
|
245
|
-
description:
|
|
246
|
-
"Insert before this zero-based clip index. Omit to append at the end.",
|
|
245
|
+
description: "Insert before this zero-based clip index. Omit to append at the end.",
|
|
247
246
|
},
|
|
248
247
|
expectedRevision: { type: "number" },
|
|
249
248
|
},
|
|
@@ -305,7 +304,7 @@ const TOOLS = [
|
|
|
305
304
|
designType: {
|
|
306
305
|
type: "string",
|
|
307
306
|
description:
|
|
308
|
-
"
|
|
307
|
+
"slash-reveal | center-stack | split-horizontal | name-bar | border-frame | minimal-underline | box-reveal | corner-brackets. Default: slash-reveal.",
|
|
309
308
|
},
|
|
310
309
|
accentColor: { type: "string", description: "Hex accent/background color" },
|
|
311
310
|
textColor: { type: "string", description: "Hex text color. Default #ffffff" },
|
|
@@ -605,8 +604,7 @@ const TOOLS = [
|
|
|
605
604
|
},
|
|
606
605
|
resolution: {
|
|
607
606
|
type: "string",
|
|
608
|
-
description:
|
|
609
|
-
"Output resolution: 4k | 1080p | 720p | 480p | source. Default source.",
|
|
607
|
+
description: "Output resolution: 4k | 1080p | 720p | 480p | source. Default source.",
|
|
610
608
|
},
|
|
611
609
|
gifFrameRate: {
|
|
612
610
|
type: "number",
|
|
@@ -614,8 +612,7 @@ const TOOLS = [
|
|
|
614
612
|
},
|
|
615
613
|
gifSize: {
|
|
616
614
|
type: "string",
|
|
617
|
-
description:
|
|
618
|
-
"GIF size preset: small | medium | large. Only used when format is gif.",
|
|
615
|
+
description: "GIF size preset: small | medium | large. Only used when format is gif.",
|
|
619
616
|
},
|
|
620
617
|
expectedRevision: { type: "number" },
|
|
621
618
|
},
|
|
@@ -731,6 +728,31 @@ const TOOLS = [
|
|
|
731
728
|
},
|
|
732
729
|
command: "project.remove-audio",
|
|
733
730
|
},
|
|
731
|
+
{
|
|
732
|
+
name: "project_set_clip_lut",
|
|
733
|
+
description:
|
|
734
|
+
"Apply a color-grade LUT preset to a specific clip. Use asset_list_luts to browse available presets. The grade is applied in preview (CSS filter) and export (FFmpeg eq/hue chain). Pass 'none' to clear. Returns { clipId, lutPreset, lutIntensity }.",
|
|
735
|
+
inputSchema: {
|
|
736
|
+
type: "object",
|
|
737
|
+
properties: {
|
|
738
|
+
id: { type: "string" },
|
|
739
|
+
path: { type: "string" },
|
|
740
|
+
clipId: { type: "string", description: "Clip id from project_read mainTrack.clips[n].id" },
|
|
741
|
+
lutPreset: {
|
|
742
|
+
type: "string",
|
|
743
|
+
description:
|
|
744
|
+
"Preset id. none | cinematicTealOrange | cinematicShadowBlue | filmNoir | vintageKodak | modernVibrant | moodyDark | warmSunset | coolNordic | bleachBypass | vintagePolaroid | naturalEnhanced",
|
|
745
|
+
},
|
|
746
|
+
lutIntensity: {
|
|
747
|
+
type: "number",
|
|
748
|
+
description: "Blend strength 0–1. Defaults to 1 (full effect).",
|
|
749
|
+
},
|
|
750
|
+
expectedRevision: { type: "number" },
|
|
751
|
+
},
|
|
752
|
+
required: ["clipId", "lutPreset"],
|
|
753
|
+
},
|
|
754
|
+
command: "project.set-clip-lut",
|
|
755
|
+
},
|
|
734
756
|
|
|
735
757
|
// ── transcript-based editing ────────────────────────────────────
|
|
736
758
|
{
|
|
@@ -932,7 +954,7 @@ const TOOLS = [
|
|
|
932
954
|
{
|
|
933
955
|
name: "motion_list",
|
|
934
956
|
description:
|
|
935
|
-
"List every motion-graphic template (id, name, slots, defaults, aspectRatios).
|
|
957
|
+
"List every motion-graphic template (id, name, slots, defaults, aspectRatios). 20 templates ship today, including youtube-lower-third for YouTube-style name plates.",
|
|
936
958
|
inputSchema: { type: "object", properties: {} },
|
|
937
959
|
command: "motion.list",
|
|
938
960
|
},
|
|
@@ -946,7 +968,7 @@ const TOOLS = [
|
|
|
946
968
|
{
|
|
947
969
|
name: "motion_generate",
|
|
948
970
|
description:
|
|
949
|
-
"Render a motion graphic asynchronously. Returns { jobId, outputPath }; call job_wait. Output is an MP4 you can pass to project_add_motion_graphic.",
|
|
971
|
+
"Render a motion graphic asynchronously. Returns { jobId, outputPath }; call job_wait. Output is an MP4 you can pass to project_add_motion_graphic. Use templateId=youtube-lower-third (slots: channelName, handle, accentColor) for YouTube-style name plates with avatar + Subscribe button.",
|
|
950
972
|
inputSchema: {
|
|
951
973
|
type: "object",
|
|
952
974
|
properties: {
|
|
@@ -962,7 +984,7 @@ const TOOLS = [
|
|
|
962
984
|
{
|
|
963
985
|
name: "motion_render_html",
|
|
964
986
|
description:
|
|
965
|
-
"Render arbitrary HTML/CSS/JS to
|
|
987
|
+
"Render arbitrary HTML/CSS/JS to video. Use this when the bundled motion-graphic templates don't fit the brief — you write the HTML, the Chromium → capturePage → FFmpeg pipeline does the rest. Pass either inline `html` or a `htmlPath`. Animations should auto-start on DOMContentLoaded. Set `transparent: true` to get a WebM with alpha channel for overlays (lower thirds, watermarks, name plates) that composite over existing video. IMPORTANT: renders are sequential — call job_wait to completion before starting another render, or you'll get a RENDER_BUSY error. Async — returns { jobId, outputPath }; poll job_wait for the final file.",
|
|
966
988
|
inputSchema: {
|
|
967
989
|
type: "object",
|
|
968
990
|
properties: {
|
|
@@ -986,7 +1008,7 @@ const TOOLS = [
|
|
|
986
1008
|
audioPath: {
|
|
987
1009
|
type: "string",
|
|
988
1010
|
description:
|
|
989
|
-
"Absolute path to an audio file (mp3, wav, aac, m4a) to mux into the MP4. Without this the output is silent.",
|
|
1011
|
+
"Absolute path to an audio file (mp3, wav, aac, m4a) to mux into the MP4. Without this the output is silent. Ignored when transparent: true.",
|
|
990
1012
|
},
|
|
991
1013
|
audioVolume: {
|
|
992
1014
|
type: "number",
|
|
@@ -996,7 +1018,12 @@ const TOOLS = [
|
|
|
996
1018
|
type: "array",
|
|
997
1019
|
items: { type: "string" },
|
|
998
1020
|
description:
|
|
999
|
-
|
|
1021
|
+
'Absolute paths to local files to stage alongside inline HTML. Reference them by basename: pass ["/path/logo.png"] and use <img src="logo.png"> in the HTML. Avoids base64-encoding large images.',
|
|
1022
|
+
},
|
|
1023
|
+
transparent: {
|
|
1024
|
+
type: "boolean",
|
|
1025
|
+
description:
|
|
1026
|
+
"Render with a transparent background (VP9/yuva420p WebM instead of H.264 MP4). Use for overlays — lower thirds, watermarks, bug logos, name plates — anything that composites on top of existing video without a white/black fill. The returned outputPath will have a .webm extension. Note: audioPath is ignored in transparent mode.",
|
|
1000
1027
|
},
|
|
1001
1028
|
},
|
|
1002
1029
|
},
|
|
@@ -1073,6 +1100,20 @@ const TOOLS = [
|
|
|
1073
1100
|
inputSchema: { type: "object", properties: {} },
|
|
1074
1101
|
command: "asset.list-fx",
|
|
1075
1102
|
},
|
|
1103
|
+
{
|
|
1104
|
+
name: "asset_list_music",
|
|
1105
|
+
description:
|
|
1106
|
+
"List every bundled background music track (id, title, category, mood, durationMs, absolutePath). Use absolutePath with project_add_audio to attach a track to a project.",
|
|
1107
|
+
inputSchema: { type: "object", properties: {} },
|
|
1108
|
+
command: "asset.list-music",
|
|
1109
|
+
},
|
|
1110
|
+
{
|
|
1111
|
+
name: "asset_list_luts",
|
|
1112
|
+
description:
|
|
1113
|
+
"List all available LUT color-grade presets (id, label, category). Pass the id to project_set_clip_lut. Categories: natural | cinematic | dramatic | vintage | modern.",
|
|
1114
|
+
inputSchema: { type: "object", properties: {} },
|
|
1115
|
+
command: "asset.list-luts",
|
|
1116
|
+
},
|
|
1076
1117
|
|
|
1077
1118
|
// ── project-aware LLM ──────────────────────────────────────────
|
|
1078
1119
|
{
|
|
@@ -1120,7 +1161,7 @@ const TOOLS = [
|
|
|
1120
1161
|
{
|
|
1121
1162
|
name: "export_start",
|
|
1122
1163
|
description:
|
|
1123
|
-
"Render the project to MP4 via the same Skia native render-helper the editor's Export button uses. ASYNC — returns { jobId, outputPath }; call job_wait. Honours every region/style/caption/FX/lower-third/motion-graphic.",
|
|
1164
|
+
"Render the project to MP4 via the same Skia native render-helper the editor's Export button uses. ASYNC — returns { jobId, outputPath }; call job_wait. Honours every region/style/caption/FX/lower-third/motion-graphic. Video overlays (motion graphics added via project_add_motion_graphic) are automatically composited in a post-process FFmpeg pass — both opaque MP4 and transparent WebM/VP9+alpha overlays are supported; no extra call needed.",
|
|
1124
1165
|
inputSchema: {
|
|
1125
1166
|
type: "object",
|
|
1126
1167
|
properties: {
|
|
@@ -1226,7 +1267,7 @@ const TOOLS = [
|
|
|
1226
1267
|
const server = new Server(
|
|
1227
1268
|
{
|
|
1228
1269
|
name: "pandastudio",
|
|
1229
|
-
version: "1.
|
|
1270
|
+
version: "1.15.0",
|
|
1230
1271
|
},
|
|
1231
1272
|
{
|
|
1232
1273
|
capabilities: {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@writepanda/mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.17.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",
|