@writepanda/mcp 1.205.0 → 1.207.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 +64 -6
  2. package/package.json +1 -1
package/bin/server.mjs CHANGED
@@ -577,7 +577,7 @@ const MOTION_ELEMENT_PROPS = {
577
577
  content: {
578
578
  type: ["object", "string", "array"],
579
579
  description:
580
- 'keyword/chip/stamp/slam/behind/highlight { text } (or a bare string); count { value, to?, prefix?, suffix?, label?, decimals? } (value "20-30" = range); steps { items[], cues? (ms offsets from start) }; lowerThird { title, subtitle? (<=320 chars, wraps), look?: plate|plain|typewriter }; endCard { lines: [a, b] }; progress { label?, fromMs?, toMs? }; iconPop { emoji } | { icon }; frame { look: viewfinder | selection | corners, label? }; sticker { image: transparent PNG path, label? }; ticker { text (one story per line, <=2000 chars), label?, speed? (40-600 px/s) }; credits { title?, entries: [{ role?, name }] | "Role: Name" strings (<=200) }; crawl { title?, text (<=6000 chars), tilt? (0-80), turn? (-60..60) }. Any script, symbols and emoji draw.',
580
+ 'keyword/chip/stamp/slam/behind/highlight { text } (or a bare string); count { value, to?, prefix?, suffix?, label?, decimals? } (value "20-30" = range); steps { items[], cues? (ms offsets from start) }; lowerThird { title, subtitle? (<=320 chars, wraps), look?: plate|plain|typewriter, typeSpeed? (typewriter pace, 5-80 chars/s, default ~22) }; endCard { lines: [a, b] }; progress { label?, fromMs?, toMs? }; iconPop { emoji } | { icon }; frame { look: viewfinder | selection | corners, label? }; sticker { image: transparent PNG path, label? }; ticker { text (one story per line, <=2000 chars), label?, speed? (40-600 px/s) }; credits { title?, entries: [{ role?, name }] | "Role: Name" strings (<=200) }; crawl { title?, text (<=6000 chars), tilt? (0-80), turn? (-60..60) }. Any script, symbols and emoji draw.',
581
581
  },
582
582
  atMs: { type: "number", description: "Start, edited ms. Or wordId." },
583
583
  wordId: {
@@ -635,7 +635,7 @@ const TOOLS = [
635
635
  {
636
636
  name: "system_status",
637
637
  description:
638
- "App version and license; automationGated true = trial expired, every other tool fails; license.socialPublishing.allowed false = the plan has no Instagram/TikTok/social publishing (Creator, Team, Pro only). Call first.",
638
+ "App version and license; automationGated true = trial expired, or the Solo plan (license.agentEditing.allowed false: no agent editing, relay license.agentEditing.message to the user), and every other tool fails; license.socialPublishing.allowed false = the plan has no Instagram/TikTok/social publishing (Creator, Team, Pro only). Call first.",
639
639
  inputSchema: { type: "object", properties: {} },
640
640
  command: "system.status",
641
641
  },
@@ -1300,7 +1300,8 @@ const TOOLS = [
1300
1300
  },
1301
1301
  {
1302
1302
  name: "project_current",
1303
- description: "The project open in the editor, or null.",
1303
+ description:
1304
+ "The project open in the editor, or null, plus the editor's LIVE playhead read at call time: playhead { ms, timeBase: 'edited', durationMs, inCut, playing } (null + playheadNote when unavailable). playhead.ms is EDITED (output) ms, what add-* atMs takes. Call it when the user says 'here' / 'at the playhead' / 'now': the chat context's playhead is from when the message was sent.",
1304
1305
  inputSchema: { type: "object", properties: {} },
1305
1306
  command: "project.current",
1306
1307
  },
@@ -1560,7 +1561,7 @@ const TOOLS = [
1560
1561
  {
1561
1562
  name: "project_add_designed_segment",
1562
1563
  description:
1563
- "Designed segment: host live on one half, a graphic panel on the other, in one call. The panel is a full-frame transparent render with the camera's half left empty (skill 'Designed segments').",
1564
+ "Designed segment: host live on one half, a graphic panel on the other, in one call. The panel is a full-frame transparent render with the camera's half left empty (skill_read file='motion-templates' section='designed segments').",
1564
1565
  inputSchema: {
1565
1566
  type: "object",
1566
1567
  properties: {
@@ -4520,6 +4521,24 @@ const TOOLS = [
4520
4521
  },
4521
4522
  command: "recipe.list",
4522
4523
  },
4524
+ {
4525
+ name: "recipe_prepare_reference",
4526
+ description:
4527
+ "Prepare evidence for learning a reference video's editing style, without editing any project. Async job: whole-video contact sheets, dense motion samples, transition candidates and mixed-audio excerpts. Inspect the evidence and save a portable reference-specific recipe; do not assume generic effects or exact source sound files.",
4528
+ inputSchema: {
4529
+ type: "object",
4530
+ properties: {
4531
+ file: {
4532
+ type: "string",
4533
+ description: "Absolute local video path (download links with media_download_url first).",
4534
+ },
4535
+ title: { type: "string" },
4536
+ sourceUrl: { type: "string" },
4537
+ },
4538
+ required: ["file"],
4539
+ },
4540
+ command: "recipe.prepare-reference",
4541
+ },
4523
4542
  {
4524
4543
  name: "recipe_pick",
4525
4544
  description:
@@ -4732,7 +4751,8 @@ const TOOLS = [
4732
4751
  },
4733
4752
  {
4734
4753
  name: "motion_craft",
4735
- description: "Launch / promo motion craft library: no id lists topics; id returns the doc.",
4754
+ description:
4755
+ "Launch / promo film craft library (story arcs, blueprints, GSAP rules, design presets): no id lists topics; id returns the doc. An unknown id fails with the closest ids and every valid id. Not the custom motion-graphic HTML contract: that is skill_read section='custom motion graphics'.",
4736
4756
  inputSchema: {
4737
4757
  type: "object",
4738
4758
  properties: {
@@ -4782,7 +4802,7 @@ const TOOLS = [
4782
4802
  {
4783
4803
  name: "motion_render_html",
4784
4804
  description:
4785
- "Render custom HTML to video when no template fits. Contract (skill 'Custom motion graphics'): a paused GSAP timeline at window.__timelines[<data-composition-id>] and a root with data-composition-id / width / height / duration. Lint and STATIC_RENDER failures must be fixed, never placed. ASYNC: { jobId }.",
4805
+ "Render custom HTML to video when no template fits. Contract (skill_read section='custom motion graphics'; render details in skill_read file='custom-html'): a paused GSAP timeline at window.__timelines[<data-composition-id>] and a root with data-composition-id / width / height / duration. Lint and STATIC_RENDER failures must be fixed, never placed. ASYNC: { jobId }.",
4786
4806
  inputSchema: {
4787
4807
  type: "object",
4788
4808
  properties: {
@@ -4862,6 +4882,44 @@ const TOOLS = [
4862
4882
  },
4863
4883
 
4864
4884
  // ── assets ──────────────────────────────────────────────────────
4885
+ {
4886
+ name: "asset_list_sound_patterns",
4887
+ description:
4888
+ "List shared motion sound recipes: counted entrances, scroll ratchets, slides, swipes and presses. Use asset_plan_sound_pattern with actual animation timings.",
4889
+ inputSchema: { type: "object", properties: { query: { type: "string" } } },
4890
+ command: "asset.list-sound-patterns",
4891
+ },
4892
+ {
4893
+ name: "asset_plan_sound_pattern",
4894
+ description:
4895
+ "Plan motion-synced sounds without writing a project. Returns cues for project_add_sound_cues; use a unique group per animation. One cue per actual event, variant rotation, quiet starting gain, tails bounded by settle. Preview below narration.",
4896
+ inputSchema: {
4897
+ type: "object",
4898
+ properties: {
4899
+ pattern: { type: "string", description: "Id from asset_list_sound_patterns." },
4900
+ atMs: { type: "integer", minimum: 0, description: "Edited-timeline motion start." },
4901
+ endMs: { type: "integer", description: "Edited-timeline motion end/settle." },
4902
+ eventOffsetsMs: {
4903
+ type: "array",
4904
+ items: { type: "integer", minimum: 0 },
4905
+ minItems: 1,
4906
+ maxItems: 500,
4907
+ description:
4908
+ "Actual entrance/crossing/gesture offsets relative to atMs; strictly increasing. Follow easing, not an assumed uniform stagger.",
4909
+ },
4910
+ volume: { type: "number", minimum: 0, maximum: 2 },
4911
+ sounds: {
4912
+ type: "array",
4913
+ items: { type: "string" },
4914
+ minItems: 1,
4915
+ maxItems: 500,
4916
+ description: "Optional alternate ids/paths, rotated.",
4917
+ },
4918
+ },
4919
+ required: ["pattern", "atMs", "endMs", "eventOffsetsMs"],
4920
+ },
4921
+ command: "asset.plan-sound-pattern",
4922
+ },
4865
4923
  {
4866
4924
  name: "asset_list_emoji",
4867
4925
  description: "List animated emoji for project_add_emoji.",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@writepanda/mcp",
3
- "version": "1.205.0",
3
+ "version": "1.207.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",