@writepanda/mcp 1.86.0 → 1.90.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 +172 -3
- package/package.json +1 -1
package/bin/server.mjs
CHANGED
|
@@ -444,6 +444,54 @@ const TOOLS = [
|
|
|
444
444
|
},
|
|
445
445
|
command: "export.publish-youtube",
|
|
446
446
|
},
|
|
447
|
+
{
|
|
448
|
+
name: "instagram_connect",
|
|
449
|
+
description:
|
|
450
|
+
"Start connecting an Instagram account. Opens the user's browser to the Instagram consent page and returns `{ connectionId, redirectUrl }`. INTERACTIVE: the user must finish consent in the browser, then poll `instagram_status` until active before publishing. Only Business/Creator accounts can publish (a Meta restriction). Requires an activated PandaStudio license.",
|
|
451
|
+
inputSchema: { type: "object", properties: {} },
|
|
452
|
+
command: "instagram.connect",
|
|
453
|
+
},
|
|
454
|
+
{
|
|
455
|
+
name: "instagram_status",
|
|
456
|
+
description:
|
|
457
|
+
"Check whether the Instagram connection is active yet. Returns `{ status, active }`. Poll after `instagram_connect` until `active` is true.",
|
|
458
|
+
inputSchema: {
|
|
459
|
+
type: "object",
|
|
460
|
+
properties: {
|
|
461
|
+
connectionId: { type: "string", description: "From instagram_connect (optional)." },
|
|
462
|
+
},
|
|
463
|
+
},
|
|
464
|
+
command: "instagram.status",
|
|
465
|
+
},
|
|
466
|
+
{
|
|
467
|
+
name: "instagram_account",
|
|
468
|
+
description:
|
|
469
|
+
"Read the connected Instagram account: `username`, `account_type`, and `publishable` (true only for Business/Creator accounts). Call before `export_publish_instagram` to warn the user if their account type can't publish.",
|
|
470
|
+
inputSchema: { type: "object", properties: {} },
|
|
471
|
+
command: "instagram.account",
|
|
472
|
+
},
|
|
473
|
+
{
|
|
474
|
+
name: "instagram_disconnect",
|
|
475
|
+
description:
|
|
476
|
+
"Disconnect the user's Instagram account. Already-published Reels stay on Instagram.",
|
|
477
|
+
inputSchema: { type: "object", properties: {} },
|
|
478
|
+
command: "instagram.disconnect",
|
|
479
|
+
},
|
|
480
|
+
{
|
|
481
|
+
name: "export_publish_instagram",
|
|
482
|
+
description:
|
|
483
|
+
"Publish an export-library entry to Instagram as a Reel. The video uploads directly to Composio storage (never through our server) and publishes via the broker. Returns `{ mediaId, permalink }`. LONG-RUNNING: Instagram processes the Reel for ~30-120 s before it goes live. Requires a connected Business/Creator account (check `instagram_account` first). Instagram only accepts short-form video — export a 9:16 clip up to ~90 s.",
|
|
484
|
+
inputSchema: {
|
|
485
|
+
type: "object",
|
|
486
|
+
properties: {
|
|
487
|
+
id: { type: "string", description: "Export entry id." },
|
|
488
|
+
caption: { type: "string", description: "Reel caption, max 2200 chars; hashtags go here." },
|
|
489
|
+
shareToFeed: { type: "boolean", description: "Also show in the feed grid. Default true." },
|
|
490
|
+
},
|
|
491
|
+
required: ["id"],
|
|
492
|
+
},
|
|
493
|
+
command: "export.publish-instagram",
|
|
494
|
+
},
|
|
447
495
|
{
|
|
448
496
|
name: "export_list_youtube",
|
|
449
497
|
description:
|
|
@@ -668,13 +716,18 @@ const TOOLS = [
|
|
|
668
716
|
{
|
|
669
717
|
name: "project_add_clip",
|
|
670
718
|
description:
|
|
671
|
-
"Append (or insert) a video clip into the project's main track. Probes duration via FFmpeg.",
|
|
719
|
+
"Append (or insert) a video clip into the project's main track. Probes duration via FFmpeg. Pass `webcam` (a second, separately-recorded source) to make the clip a two-speaker podcast composite (media=host, webcam=guest, kind=podcast) — for 3+ speakers or audio auto-sync use project_add_podcast_clip instead.",
|
|
672
720
|
inputSchema: {
|
|
673
721
|
type: "object",
|
|
674
722
|
properties: {
|
|
675
723
|
id: { type: "string" },
|
|
676
724
|
path: { type: "string" },
|
|
677
|
-
media: { type: "string", description: "Absolute path to video file" },
|
|
725
|
+
media: { type: "string", description: "Absolute path to video file (the host source)" },
|
|
726
|
+
webcam: {
|
|
727
|
+
type: "string",
|
|
728
|
+
description:
|
|
729
|
+
"Optional absolute path to a SECOND, separately-recorded source (the guest). When set, the clip becomes a two-speaker podcast composite. Use project_add_podcast_clip for 3+ participants or audio auto-sync.",
|
|
730
|
+
},
|
|
678
731
|
atIndex: {
|
|
679
732
|
type: "number",
|
|
680
733
|
description: "Insert before this zero-based clip index. Omit to append at the end.",
|
|
@@ -685,6 +738,83 @@ const TOOLS = [
|
|
|
685
738
|
},
|
|
686
739
|
command: "project.add-clip",
|
|
687
740
|
},
|
|
741
|
+
{
|
|
742
|
+
name: "project_add_podcast_clip",
|
|
743
|
+
description:
|
|
744
|
+
"Assemble 2-4 separately-recorded sources (e.g. host + guest exported from Zoom/Riverside) into ONE podcast composite clip — the import equivalent of an in-app/remote podcast recording. media=host (the authoritative clock); guests=ordered guest paths (1-3). Speakers are assigned host/guest/guest-2/guest-3 and stored as participants[]. By default auto-syncs each guest to the host via audio cross-correlation (set autoSync=false to skip); fine-tune later with project_set_participant_offset. After this, run transcript_transcribe (it transcribes each speaker separately and merges into one speaker-attributed transcript), then edit by transcript exactly like a recorded podcast. Preview + export render every participant via the existing N-party podcast layout.",
|
|
745
|
+
inputSchema: {
|
|
746
|
+
type: "object",
|
|
747
|
+
properties: {
|
|
748
|
+
id: { type: "string" },
|
|
749
|
+
path: { type: "string" },
|
|
750
|
+
media: { type: "string", description: "Absolute path to the HOST video (reference clock)" },
|
|
751
|
+
guests: {
|
|
752
|
+
type: "array",
|
|
753
|
+
items: { type: "string" },
|
|
754
|
+
description:
|
|
755
|
+
"Absolute paths to the 1-3 guest videos in participant order (guest, guest-2, guest-3).",
|
|
756
|
+
},
|
|
757
|
+
labels: {
|
|
758
|
+
type: "array",
|
|
759
|
+
items: { type: "string" },
|
|
760
|
+
description:
|
|
761
|
+
"Optional display names parallel to [host, ...guests] (index 0 = host). Falls back to the speaker id.",
|
|
762
|
+
},
|
|
763
|
+
autoSync: {
|
|
764
|
+
type: "boolean",
|
|
765
|
+
description:
|
|
766
|
+
"Audio-align each guest to the host before assembling (default true). Set false to assemble with zero offsets.",
|
|
767
|
+
},
|
|
768
|
+
atIndex: {
|
|
769
|
+
type: "number",
|
|
770
|
+
description: "0-based insert position in the clips array. Omit to append.",
|
|
771
|
+
},
|
|
772
|
+
expectedRevision: { type: "number" },
|
|
773
|
+
},
|
|
774
|
+
required: ["media", "guests"],
|
|
775
|
+
},
|
|
776
|
+
command: "project.add-podcast-clip",
|
|
777
|
+
},
|
|
778
|
+
{
|
|
779
|
+
name: "project_set_participant_offset",
|
|
780
|
+
description:
|
|
781
|
+
"Fine-tune ONE participant's A/V sync on a multi-party podcast composite. speaker = guest | guest-2 | guest-3 (the host is the reference clock and can't be offset). offsetMs shifts that participant's video AND audio vs the host: positive delays, negative advances, 0 clears (±10000). The N-party analogue of project_set_webcam_offset (which only reaches guest-1). Honored in preview + export.",
|
|
782
|
+
inputSchema: {
|
|
783
|
+
type: "object",
|
|
784
|
+
properties: {
|
|
785
|
+
id: { type: "string" },
|
|
786
|
+
path: { type: "string" },
|
|
787
|
+
clipId: { type: "string", description: "Clip id of the podcast composite" },
|
|
788
|
+
speaker: {
|
|
789
|
+
type: "string",
|
|
790
|
+
description: "Which participant to nudge: guest | guest-2 | guest-3",
|
|
791
|
+
},
|
|
792
|
+
offsetMs: {
|
|
793
|
+
type: "number",
|
|
794
|
+
description: "Time nudge in ms (±10000). Positive delays this guest; 0 clears.",
|
|
795
|
+
},
|
|
796
|
+
expectedRevision: { type: "number" },
|
|
797
|
+
},
|
|
798
|
+
required: ["clipId", "speaker", "offsetMs"],
|
|
799
|
+
},
|
|
800
|
+
command: "project.set-participant-offset",
|
|
801
|
+
},
|
|
802
|
+
{
|
|
803
|
+
name: "project_auto_sync_podcast",
|
|
804
|
+
description:
|
|
805
|
+
"Re-run audio auto-sync on an existing podcast composite clip: cross-correlates each guest's audio against the host and stores the resulting offset on each participant. Use after project_add_podcast_clip with autoSync=false, or to re-align if a manual nudge drifted. Returns the per-guest offsets + confidence; fine-tune afterward with project_set_participant_offset.",
|
|
806
|
+
inputSchema: {
|
|
807
|
+
type: "object",
|
|
808
|
+
properties: {
|
|
809
|
+
id: { type: "string" },
|
|
810
|
+
path: { type: "string" },
|
|
811
|
+
clipId: { type: "string", description: "Clip id of the podcast composite" },
|
|
812
|
+
expectedRevision: { type: "number" },
|
|
813
|
+
},
|
|
814
|
+
required: ["clipId"],
|
|
815
|
+
},
|
|
816
|
+
command: "project.auto-sync-podcast",
|
|
817
|
+
},
|
|
688
818
|
{
|
|
689
819
|
name: "project_add_motion_graphic",
|
|
690
820
|
description:
|
|
@@ -2188,6 +2318,31 @@ const TOOLS = [
|
|
|
2188
2318
|
},
|
|
2189
2319
|
command: "media.generate-narration",
|
|
2190
2320
|
},
|
|
2321
|
+
{
|
|
2322
|
+
name: "media_generate_music",
|
|
2323
|
+
description:
|
|
2324
|
+
"Generate an original instrumental background-music track via Replicate (Google Lyria-2). Project-agnostic; writes audio to <userData>/generated-music/ and returns { audioPath, durationMs, model, predictionId }. Canonical workflow: media_generate_music → project_add_audio (place at startMs, pass the returned durationMs so the overlay is sized). The bundled library (asset_list_music) is the faster default for common moods — reach for generation when the user wants something specific/custom the library doesn't cover. Describe the music in `prompt` (genre, mood, instruments, tempo, use-case). Lyria-2 is instrumental only (~30s clips, 48kHz stereo) — loop for longer videos. Requires the user's Replicate API key (Settings → Integrations).",
|
|
2325
|
+
inputSchema: {
|
|
2326
|
+
type: "object",
|
|
2327
|
+
properties: {
|
|
2328
|
+
prompt: {
|
|
2329
|
+
type: "string",
|
|
2330
|
+
description:
|
|
2331
|
+
"What the music should sound like — genre, mood, instruments, tempo, use-case. e.g. 'upbeat lo-fi hip hop with mellow piano, relaxed, for a coding montage'.",
|
|
2332
|
+
},
|
|
2333
|
+
negativePrompt: {
|
|
2334
|
+
type: "string",
|
|
2335
|
+
description: "Optional — qualities to steer AWAY from, e.g. 'vocals, drums, harsh'.",
|
|
2336
|
+
},
|
|
2337
|
+
seed: {
|
|
2338
|
+
type: "number",
|
|
2339
|
+
description: "Optional integer seed for reproducible output.",
|
|
2340
|
+
},
|
|
2341
|
+
},
|
|
2342
|
+
required: ["prompt"],
|
|
2343
|
+
},
|
|
2344
|
+
command: "media.generate-music",
|
|
2345
|
+
},
|
|
2191
2346
|
// `motion_generate` removed in v1.31.0 — see comment above the
|
|
2192
2347
|
// motion-graphics section.
|
|
2193
2348
|
{
|
|
@@ -2472,6 +2627,20 @@ const TOOLS = [
|
|
|
2472
2627
|
},
|
|
2473
2628
|
command: "llm.generate-description",
|
|
2474
2629
|
},
|
|
2630
|
+
{
|
|
2631
|
+
name: "llm_generate_caption",
|
|
2632
|
+
description:
|
|
2633
|
+
"Generate an Instagram Reel caption (1-3 punchy sentences + a few hashtags) from the merged transcript, on the local model. Feed the result into export_publish_instagram's caption.",
|
|
2634
|
+
inputSchema: {
|
|
2635
|
+
type: "object",
|
|
2636
|
+
properties: {
|
|
2637
|
+
id: { type: "string" },
|
|
2638
|
+
path: { type: "string" },
|
|
2639
|
+
maxChars: { type: "number", description: "Default 2200" },
|
|
2640
|
+
},
|
|
2641
|
+
},
|
|
2642
|
+
command: "llm.generate-caption",
|
|
2643
|
+
},
|
|
2475
2644
|
{
|
|
2476
2645
|
name: "llm_generate_timestamps",
|
|
2477
2646
|
description: "Generate YouTube-style chapter timestamps from the merged transcript.",
|
|
@@ -2735,7 +2904,7 @@ const TOOLS = [
|
|
|
2735
2904
|
const server = new Server(
|
|
2736
2905
|
{
|
|
2737
2906
|
name: "pandastudio",
|
|
2738
|
-
version: "1.
|
|
2907
|
+
version: "1.71.0",
|
|
2739
2908
|
},
|
|
2740
2909
|
{
|
|
2741
2910
|
capabilities: {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@writepanda/mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.90.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",
|