@writepanda/mcp 1.22.0 → 1.22.2

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 +71 -0
  2. package/package.json +1 -1
package/bin/server.mjs CHANGED
@@ -480,6 +480,16 @@ const TOOLS = [
480
480
  type: "number",
481
481
  description: "Sound volume 0–1. Default 1 when soundUrl is set.",
482
482
  },
483
+ anchorSourceMs: {
484
+ type: "number",
485
+ description:
486
+ "Anchor the motion graphic to a SOURCE-time moment (raw recording time). Pass this whenever atMs was derived from a transcript word's startMs — the region will then re-anchor automatically when subsequent transcript edits (remove-fillers, remove-silences, delete-words) shift the edited-time map. Without it, the motion graphic drifts silently. Omit for free-floating placement.",
487
+ },
488
+ anchorSourceEndMs: {
489
+ type: "number",
490
+ description:
491
+ "Optional anchor end (source ms) for ranged anchoring — the region's duration tracks the source-time span instead of preserving its visible duration.",
492
+ },
483
493
  expectedRevision: { type: "number" },
484
494
  },
485
495
  required: ["file", "durationMs"],
@@ -545,6 +555,15 @@ const TOOLS = [
545
555
  type: "number",
546
556
  description: "Sound volume 0–1. Default 0.8.",
547
557
  },
558
+ anchorSourceMs: {
559
+ type: "number",
560
+ description:
561
+ "Anchor the lower third to a SOURCE-time moment. Pass when atMs was derived from a transcript word's startMs — the lower third re-anchors automatically on subsequent transcript edits. Without it, the lower third drifts after any trim. Omit for free-floating placement.",
562
+ },
563
+ anchorSourceEndMs: {
564
+ type: "number",
565
+ description: "Optional anchor end (source ms) for ranged anchoring.",
566
+ },
548
567
  expectedRevision: { type: "number" },
549
568
  },
550
569
  required: ["content", "atMs"],
@@ -676,6 +695,15 @@ const TOOLS = [
676
695
  y: { type: "number", description: "Vertical center, percent 0-100. Default 50." },
677
696
  width: { type: "number", description: "Width, percent 0-100. Default 30." },
678
697
  height: { type: "number", description: "Height, percent 0-100. Default 20." },
698
+ anchorSourceMs: {
699
+ type: "number",
700
+ description:
701
+ "Anchor the annotation to a SOURCE-time moment (raw recording time). Pass when startMs was derived from a transcript word's startMs — the annotation re-anchors automatically on subsequent transcript edits. Without it, the annotation drifts after any trim. Omit for free-floating placement.",
702
+ },
703
+ anchorSourceEndMs: {
704
+ type: "number",
705
+ description: "Optional anchor end (source ms) for ranged anchoring.",
706
+ },
679
707
  expectedRevision: { type: "number" },
680
708
  },
681
709
  required: ["startMs", "endMs", "type"],
@@ -996,6 +1024,16 @@ const TOOLS = [
996
1024
  description:
997
1025
  "[Legacy] Sets endMs = startMs + maxDurationMs when endMs is absent. Prefer endMs.",
998
1026
  },
1027
+ anchorSourceMs: {
1028
+ type: "number",
1029
+ description:
1030
+ "Anchor an SFX overlay to a SOURCE-time moment (e.g. a punchline word). Pass when startMs was derived from a transcript word's source-time — the overlay re-anchors automatically on subsequent transcript edits. DO NOT pass for background music tracks; those should stay free-floating (they cover a fixed slot of the edited timeline regardless of content edits).",
1031
+ },
1032
+ anchorSourceEndMs: {
1033
+ type: "number",
1034
+ description:
1035
+ "Optional anchor end (source ms). When set, the overlay's edited duration tracks the source-time span between anchorSourceMs and anchorSourceEndMs.",
1036
+ },
999
1037
  expectedRevision: { type: "number" },
1000
1038
  },
1001
1039
  required: ["audioPath"],
@@ -1378,6 +1416,39 @@ const TOOLS = [
1378
1416
  },
1379
1417
  command: "motion.concat",
1380
1418
  },
1419
+ {
1420
+ name: "motion_verify_frames",
1421
+ description:
1422
+ "Extract PNG frames at given timestamps from a rendered video so the agent can VISUALLY verify the motion graphics landed. This operationalises the 'lint passing ≠ design working — VIEW THE FRAMES' rule in reference/motion-philosophy.md §4. Call this after motion_render_html or export.start and BEFORE declaring a motion-graphics deliverable done. Pass either entryId (export-library entry) or videoPath (arbitrary MP4). Timestamps are in seconds, typically 8-15 spread across hero moments. Returns { frames: [{timestampSeconds, path}...] } — the agent must then Read each path as an image (multimodal) and confirm no cropped faces / text overflow / blank frames / forbidden-zone occlusion / flat-white headlines.",
1423
+ inputSchema: {
1424
+ type: "object",
1425
+ required: ["timestamps"],
1426
+ properties: {
1427
+ entryId: {
1428
+ type: "string",
1429
+ description:
1430
+ "Export library entry id. Mutually exclusive with videoPath — one must be provided.",
1431
+ },
1432
+ videoPath: {
1433
+ type: "string",
1434
+ description:
1435
+ "Absolute path to an MP4 (e.g. a motion.render-html intermediate output). Mutually exclusive with entryId.",
1436
+ },
1437
+ timestamps: {
1438
+ type: "array",
1439
+ items: { type: "number" },
1440
+ description:
1441
+ "Timestamps in seconds to extract frames at (e.g. [0.5, 1.5, 3.0, 5.0, 7.5, 10.0, 12.5, 15.0]). Max 30 per call.",
1442
+ },
1443
+ outputName: {
1444
+ type: "string",
1445
+ description:
1446
+ "Optional subdir stem for the output PNGs. Defaults to verify-<rand>. Frames land in RECORDINGS_DIR/<stem>/frame-<ms>.png.",
1447
+ },
1448
+ },
1449
+ },
1450
+ command: "motion.verify-frames",
1451
+ },
1381
1452
 
1382
1453
  // ── assets ──────────────────────────────────────────────────────
1383
1454
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@writepanda/mcp",
3
- "version": "1.22.0",
3
+ "version": "1.22.2",
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",