@post-ripple/mcp 0.13.0 → 0.15.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/dist/index.js +25 -3
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -255,7 +255,14 @@ register("get_account_metrics", "Get follower/profile growth history (daily snap
255
255
  .optional()
256
256
  .describe("Max series points per account, default 50"),
257
257
  });
258
- register("get_engagement_summary", "Get an org-wide engagement overview for the last N days: totals, per-platform breakdown, top 5 posts by views, and current follower counts per account. The best starting point for 'how is content performing?'", { ...orgParam, days: z.number().min(1).max(90).optional().describe("Window in days, default 30") });
258
+ register("get_engagement_summary", "Get an engagement overview for the last N days: totals, per-platform breakdown, top 5 posts by views, and a per-account breakdown (follower count + posts/views/likes/comments/shares in the window). Pass accountId to scope the whole summary — totals and top posts included — to one connected account. The best starting point for 'how is content performing?' or 'how is this account doing?'", {
259
+ ...orgParam,
260
+ days: z.number().min(1).max(90).optional().describe("Window in days, default 30"),
261
+ accountId: z
262
+ .string()
263
+ .optional()
264
+ .describe("Scope the summary to one connected account (from list_social_accounts)"),
265
+ });
259
266
  // ---- content:write tools ----
260
267
  register("import_video_from_url", "Import a video into the library from a public URL (e.g. a TikTok/Instagram/YouTube link or a direct file URL). Download happens asynchronously — poll list_videos until its status is 'completed' before scheduling it.", {
261
268
  ...orgParam,
@@ -364,13 +371,16 @@ const clipTrimSchema = z.object({
364
371
  .optional()
365
372
  .describe("Out-point, ms into the source clip (omit = clip end)"),
366
373
  });
367
- register("create_video", "Render a short-form (9:16) video from library ingredients. Two types: 'hook_demo' takes a hook clip (list_hooks) and either stitches it in front of your demo/product video (a completed library video via demoVideoId, or a raw upload via demoFileId from get_video_upload_url) or — when BOTH demo params are omitted — renders the hook clip ALONE with the caption and/or hookTrim applied (at least one required in that mode; useful for posting a library clip with on-video text or a shortened cut). Both clips can be trimmed to a window of the source via hookTrim/demoTrim. Optional background music via musicId from list_music. 'green_screen_meme' composites a green-screen clip (list_green_screens) over a background image (list_backgrounds). Both take an optional caption with styling. Rendering is asynchronous — poll get_creation with the returned creationId until 'completed', then publish resultVideoId with schedule_post. Uses one 'creations' credit from the plan.", {
374
+ register("create_video", "Render a short-form (9:16) video from library ingredients. Two types: 'hook_demo' takes a hook clip (list_hooks) and either stitches it in front of your demo/product video (a completed library video via demoVideoId, or a raw upload via demoFileId from get_video_upload_url) or — when BOTH demo params are omitted — renders the hook clip ALONE with the caption and/or hookTrim applied (at least one required in that mode; useful for posting a library clip with on-video text or a shortened cut). Both clips can be trimmed via hookTrim/demoTrim, and captionWindow selects exactly when text is visible on the final video (including the whole video). Optional background music via musicId from list_music. 'green_screen_meme' composites a green-screen clip (list_green_screens) over a background image (list_backgrounds). Both take an optional caption with styling. Rendering is asynchronous — poll get_creation with the returned creationId until 'completed', then publish resultVideoId with schedule_post. Uses one 'creations' credit from the plan.", {
368
375
  ...orgParam,
369
376
  type: z.enum(["hook_demo", "green_screen_meme"]),
370
377
  title: z.string().optional().describe("Library title for the finished video"),
371
- caption: z.string().optional().describe("Text overlaid on the video (over the hook part when a demo follows; over the whole clip in hook-only mode, where it is required)"),
378
+ caption: z.string().optional().describe("Text overlaid on the video. For hook_demo, captionWindow controls when it is visible; omitting captionWindow preserves hook-only visibility."),
372
379
  captionPosition: z.enum(["top", "middle", "bottom"]).optional(),
373
380
  captionStyle: captionStyleSchema.optional(),
381
+ captionWindow: clipTrimSchema
382
+ .optional()
383
+ .describe("hook_demo: visibility window in ms on the FINAL stitched video timeline. Omit for legacy hook-only visibility; use {startMs: 0} for the whole video, or set both bounds for any interval."),
374
384
  hookId: z.string().optional().describe("hook_demo: hook clip id from list_hooks (required)"),
375
385
  demoVideoId: z
376
386
  .string()
@@ -393,6 +403,18 @@ register("create_video", "Render a short-form (9:16) video from library ingredie
393
403
  .min(0)
394
404
  .optional()
395
405
  .describe("hook_demo: start the background track this many ms in (default 0). The played length always equals the video's duration; clamped so the window fits the track."),
406
+ audioVolume: z
407
+ .number()
408
+ .min(0)
409
+ .max(1)
410
+ .optional()
411
+ .describe("hook_demo: mix level of the background track, 0..1 (default 0.3). Requires musicId/soundId."),
412
+ originalVolume: z
413
+ .number()
414
+ .min(0)
415
+ .max(1)
416
+ .optional()
417
+ .describe("hook_demo: mix level of the clips' own audio, 0..1 (default 1). Use 0 to replace the original sound with the background track entirely."),
396
418
  greenScreenId: z.string().optional().describe("green_screen_meme: clip id from list_green_screens (required)"),
397
419
  backgroundId: z.string().optional().describe("green_screen_meme: image id from list_backgrounds (required)"),
398
420
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@post-ripple/mcp",
3
- "version": "0.13.0",
3
+ "version": "0.15.0",
4
4
  "description": "MCP server that lets AI agents (Claude Code, Codex, opencode) manage a Post Ripple workspace: content, scheduling, publishing, and analytics.",
5
5
  "type": "module",
6
6
  "bin": {