@writepanda/mcp 1.69.0 → 1.74.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 +33 -8
- package/package.json +1 -1
package/bin/server.mjs
CHANGED
|
@@ -564,7 +564,7 @@ const TOOLS = [
|
|
|
564
564
|
{
|
|
565
565
|
name: "project_fork_from_shot",
|
|
566
566
|
description:
|
|
567
|
-
"Fork an exported video's AI-generated shot into a new 9:16 project. Carries forward the source project's timing surgery (trim regions, transcript edits, speed regions, per-clip transcribed/audioCleaned status) but STRIPS every overlay row — zooms, FX, motion graphics, captions, transitions, lower thirds, annotations, clip-transforms, background music — because those were sized for 16:9 and don't fit a vertical short. The new project is cropped to the shot's [startMs, endMs] range, switched to 9:16, and ready to receive Shorts-native graphics/captions on top. Pass exportId + shotId from export.list (the shot lives under `entry.generatedShots[]`); the verb looks up the source project path, runs the fork, writes the new file, and returns its id + path. If the source project has been edited since export (revision drift) the verb returns `revision_mismatch` with the live revision; confirm with the user and retry with `force: true`. Returns { id, path, name, aspectRatio, sourceProjectPath, sourceProjectRevision, liveRevision, project }.",
|
|
567
|
+
"Fork an exported video's AI-generated shot into a new 9:16 project. Carries forward the source project's timing surgery (trim regions, transcript edits, speed regions, per-clip transcribed/audioCleaned status) but STRIPS every overlay row — zooms, FX, motion graphics, captions, transitions, lower thirds, annotations, clip-transforms, background music — because those were sized for 16:9 and don't fit a vertical short. The new project is cropped to the shot's [startMs, endMs] range, switched to 9:16 with a centered cover-crop so the landscape source FILLS the vertical frame (not letterboxed), and ready to receive Shorts-native graphics/captions on top. Pass exportId + shotId from export.list (the shot lives under `entry.generatedShots[]`); the verb looks up the source project path, runs the fork, writes the new file, and returns its id + path. If the source project has been edited since export (revision drift) the verb returns `revision_mismatch` with the live revision; confirm with the user and retry with `force: true`. Returns { id, path, name, aspectRatio, sourceProjectPath, sourceProjectRevision, liveRevision, project }.",
|
|
568
568
|
inputSchema: {
|
|
569
569
|
type: "object",
|
|
570
570
|
properties: {
|
|
@@ -692,7 +692,7 @@ const TOOLS = [
|
|
|
692
692
|
{
|
|
693
693
|
name: "project_add_designed_segment",
|
|
694
694
|
description:
|
|
695
|
-
"Create a 'designed segment' — the
|
|
695
|
+
"Create a 'designed segment' — the split where the host stays LIVE on one half and a motion-graphic panel fills the other. 16:9: host right / panel left, like a Vox or MKBHD explainer beat. 9:16 SHORTS: host in a top/bottom band, panel in the other band (cameraSide top|bottom). ONE atomic call places both pieces over the same time range with the same transition and source anchor, so they can't drift or mismatch: the camera is repositioned + cover-cropped into its half (a full-bleed split clip-transform) and a full-frame transparent panel graphic is composited on top. Stays in the live compositor — camera is full-quality and scrubbable, nothing baked. IMPORTANT: author the panel graphic as a FULL-FRAME TRANSPARENT render at the project aspect via motion_render_html --transparent (1920x1080 for 16:9, 1080x1920 for 9:16; the premium `paper-panel` and `vox-side-panel` templates are aspect-aware — render either at 9:16 and it reflows into a top/bottom band) — paint the opaque panel + content on the panel side, leave the camera's half fully transparent (it reveals the repositioned host). See SKILL.md 'Designed segments' and 'Editing a Short'.",
|
|
696
696
|
inputSchema: {
|
|
697
697
|
type: "object",
|
|
698
698
|
properties: {
|
|
@@ -712,15 +712,15 @@ const TOOLS = [
|
|
|
712
712
|
atMs: { type: "number", description: "Default: end of timeline" },
|
|
713
713
|
cameraSide: {
|
|
714
714
|
type: "string",
|
|
715
|
-
enum: ["left", "right"],
|
|
715
|
+
enum: ["left", "right", "top", "bottom"],
|
|
716
716
|
description:
|
|
717
|
-
"Which half the CAMERA fills; the panel graphic fills the opposite half. 'right' is the canonical reference
|
|
717
|
+
"Which half the CAMERA fills; the panel graphic fills the opposite half. 16:9: 'left'/'right' ('right' is the canonical reference — host right, panel left). 9:16 SHORTS: 'top'/'bottom' — the camera fills a horizontal band and the panel covers the other band (render a premium panel like `paper-panel` or `vox-side-panel` at 9:16; both reflow into a top/bottom band).",
|
|
718
718
|
},
|
|
719
719
|
cameraRatio: {
|
|
720
720
|
type: "number",
|
|
721
721
|
enum: [50, 55],
|
|
722
722
|
description:
|
|
723
|
-
"Camera's share of the
|
|
723
|
+
"Camera's share of the split axis (width for left/right, height for top/bottom): 55 (default for 16:9) or 50 (balanced — pair the 9:16 shorts template with 50). Panel gets the rest. Author the panel's opaque band to match (e.g. left 45% for cameraSide=right ratio=55; bottom 50% for cameraSide=top ratio=50).",
|
|
724
724
|
},
|
|
725
725
|
transitionMs: {
|
|
726
726
|
type: "number",
|
|
@@ -1310,6 +1310,27 @@ const TOOLS = [
|
|
|
1310
1310
|
},
|
|
1311
1311
|
command: "project.set-crop",
|
|
1312
1312
|
},
|
|
1313
|
+
{
|
|
1314
|
+
name: "project_set_focal_point",
|
|
1315
|
+
description:
|
|
1316
|
+
"Set or clear a clip's FACE FOCAL POINT (source-normalised 0-1, origin top-left). When set, cover-cropped layouts — a 9:16 fill or a top/bottom designed-segment band — bias toward this point instead of centering geometrically, so the face stays in frame. Omit clipId to apply to ALL clips (single-clip shorts). Pass clear=true (or omit x/y) to reset to centered. NOTE: the editor AUTO-DETECTS this for vertical talking-head clips when they open, so you rarely need this — use it to override the auto framing or when building a short fully headless.",
|
|
1317
|
+
inputSchema: {
|
|
1318
|
+
type: "object",
|
|
1319
|
+
properties: {
|
|
1320
|
+
id: { type: "string" },
|
|
1321
|
+
path: { type: "string" },
|
|
1322
|
+
clipId: {
|
|
1323
|
+
type: "string",
|
|
1324
|
+
description: "Target clip id (from project.read clipStates). Omit to apply to all clips.",
|
|
1325
|
+
},
|
|
1326
|
+
x: { type: "number", description: "Face center X, 0-1. Omit (with y) to clear." },
|
|
1327
|
+
y: { type: "number", description: "Face center Y, 0-1. Omit (with x) to clear." },
|
|
1328
|
+
clear: { type: "boolean", description: "Reset the focal point to geometric centering." },
|
|
1329
|
+
expectedRevision: { type: "number" },
|
|
1330
|
+
},
|
|
1331
|
+
},
|
|
1332
|
+
command: "project.set-focal-point",
|
|
1333
|
+
},
|
|
1313
1334
|
{
|
|
1314
1335
|
name: "project_set_export_settings",
|
|
1315
1336
|
description:
|
|
@@ -1698,7 +1719,11 @@ const TOOLS = [
|
|
|
1698
1719
|
properties: {
|
|
1699
1720
|
id: { type: "string" },
|
|
1700
1721
|
path: { type: "string" },
|
|
1701
|
-
find: {
|
|
1722
|
+
find: {
|
|
1723
|
+
type: "string",
|
|
1724
|
+
description:
|
|
1725
|
+
"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.",
|
|
1726
|
+
},
|
|
1702
1727
|
replace: { type: "string", description: "Replacement text (replaces the whole phrase)" },
|
|
1703
1728
|
expectedRevision: { type: "number" },
|
|
1704
1729
|
},
|
|
@@ -1709,7 +1734,7 @@ const TOOLS = [
|
|
|
1709
1734
|
{
|
|
1710
1735
|
name: "transcript_remove_silences",
|
|
1711
1736
|
description:
|
|
1712
|
-
"Detect and trim silent
|
|
1737
|
+
"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 }.",
|
|
1713
1738
|
inputSchema: {
|
|
1714
1739
|
type: "object",
|
|
1715
1740
|
properties: {
|
|
@@ -2400,7 +2425,7 @@ const TOOLS = [
|
|
|
2400
2425
|
const server = new Server(
|
|
2401
2426
|
{
|
|
2402
2427
|
name: "pandastudio",
|
|
2403
|
-
version: "1.
|
|
2428
|
+
version: "1.70.0",
|
|
2404
2429
|
},
|
|
2405
2430
|
{
|
|
2406
2431
|
capabilities: {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@writepanda/mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.74.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",
|