@post-ripple/mcp 0.10.0 → 0.12.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/README.md +2 -2
- package/dist/index.js +21 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -60,7 +60,7 @@ env = { POSTRIPPLE_API_KEY = "pr_..." }
|
|
|
60
60
|
| `list_slideshows` | read | Photo-carousel slideshows |
|
|
61
61
|
| `list_slideshow_templates` | read | Slideshow layout templates, fonts, and text treatments |
|
|
62
62
|
| `get_slideshow` | read | One slideshow with per-slide render state and progress |
|
|
63
|
-
| `list_posts` | read | Posts with status, approval state, schedule, and errors |
|
|
63
|
+
| `list_posts` | read | Posts with status, approval state (including rejection), schedule, and errors |
|
|
64
64
|
| `list_reviews` | read | Posts waiting for team approval or changes |
|
|
65
65
|
| `get_post_metrics` | read | Per-post engagement time series |
|
|
66
66
|
| `get_account_metrics` | read | Follower growth history |
|
|
@@ -80,7 +80,7 @@ env = { POSTRIPPLE_API_KEY = "pr_..." }
|
|
|
80
80
|
|
|
81
81
|
Notes for agents:
|
|
82
82
|
|
|
83
|
-
- `schedule_post` and `publish_slideshow` publish to **real** social accounts when the workspace allows direct publishing. If the team has enabled approval, these tools submit review items instead and return `submittedForReview: true`; use `list_reviews` to inspect them, and have an owner/admin approve
|
|
83
|
+
- `schedule_post` and `publish_slideshow` publish to **real** social accounts when the workspace allows direct publishing. If the team has enabled approval, these tools submit review items instead and return `submittedForReview: true`; use `list_reviews` to inspect them, and have an owner/admin approve, reject, or request changes from the Post Ripple Review page. Always pass `idempotencyKey`, and pass `tiktokSettings` if the post should be public on TikTok (the default is private/`SELF_ONLY`).
|
|
84
84
|
- The typical slideshow flow: `import_image_from_url` (or `get_image_upload_url` + PUT) per image → `create_slideshow` → poll `get_slideshow` until `ready` (template slides render server-side) → `publish_slideshow`. Pre-rendered JPEG slideshows are ready instantly.
|
|
85
85
|
- TikTok `settings.postMode: "inbox"` sends the photo post to the account's TikTok app drafts inbox instead of publishing directly — useful when a human finishes posts from a real device.
|
|
86
86
|
- Imports and publishes are asynchronous. Poll `list_videos` / `list_posts` to observe progress.
|
package/dist/index.js
CHANGED
|
@@ -223,13 +223,13 @@ register("get_creation", "Get the render status of a video created with create_v
|
|
|
223
223
|
register("list_slideshows", "List photo-carousel slideshows with status ('draft' = still being composed, 'ready' = publishable) and a signed coverUrl thumbnail (first rendered slide, or a background for drafts).", { ...orgParam, limit: z.number().min(1).max(200).optional() });
|
|
224
224
|
register("list_slideshow_templates", "List the slideshow layout templates: canvas size, each template's text slots with exact geometry (x/y anchor, maxWidth, fontSize, lineHeight — all normalized to the canvas) and defaults (font, color, treatment), the template's default overlay scrim, available fonts and text treatments, and the max slide count. Call before create_slideshow when composing template-based slides — use the slot geometry rather than inventing your own placement.", {});
|
|
225
225
|
register("get_slideshow", "Get one slideshow in full detail: per-slide render state, each text field's text AND its style overrides (font, color, treatment, fontScale, x/y position, maxWidth, align, rotation — null style means the template slot defaults apply), the slide's overlay scrim, and signed image URLs (renderedUrl = the finished slide, backgroundUrl = the photo behind it; both expire in ~1h). Use it to study how existing slides are actually styled before composing new ones, or poll it after create_slideshow returns status 'rendering' — publish once status is 'ready'.", { ...orgParam, slideshowId: z.string() });
|
|
226
|
-
register("list_posts", "List posts (including review drafts, scheduled, publishing, published, failed, and canceled), newest first. Review posts include approvalStatus, submittedByName, and reviewNote; scheduled posts include scheduledFor; published posts include platformPostId and publishedAt.", {
|
|
226
|
+
register("list_posts", "List posts (including review drafts, rejected posts, scheduled, publishing, published, failed, and canceled), newest first. Review posts include approvalStatus, submittedByName, and reviewNote; scheduled posts include scheduledFor; published posts include platformPostId and publishedAt.", {
|
|
227
227
|
...orgParam,
|
|
228
228
|
status: postStatusEnum.optional(),
|
|
229
229
|
platform: platformEnum.optional(),
|
|
230
230
|
limit: z.number().min(1).max(200).optional(),
|
|
231
231
|
});
|
|
232
|
-
register("list_reviews", "List posts waiting for team review. When approval is required, schedule_post and publish_slideshow submit work here instead of publishing or scheduling it. Use this to see approvalStatus, reviewer notes, target account, planned publish time, and a preview URL.
|
|
232
|
+
register("list_reviews", "List posts waiting for team review. When approval is required, schedule_post and publish_slideshow submit work here instead of publishing or scheduling it. Use this to see approvalStatus, reviewer notes, target account, planned publish time, and a preview URL. Owners and admins approve, reject, or request changes from Post Ripple's Review page; terminal decisions remain visible through list_posts.", {
|
|
233
233
|
...orgParam,
|
|
234
234
|
status: z
|
|
235
235
|
.enum(["in_review", "changes_requested"])
|
|
@@ -352,7 +352,19 @@ const captionStyleSchema = z
|
|
|
352
352
|
y: z.number().min(0).max(1).optional(),
|
|
353
353
|
})
|
|
354
354
|
.describe("Caption styling; defaults to white TikTok-bold text with a black outline");
|
|
355
|
-
|
|
355
|
+
const clipTrimSchema = z.object({
|
|
356
|
+
startMs: z
|
|
357
|
+
.number()
|
|
358
|
+
.min(0)
|
|
359
|
+
.optional()
|
|
360
|
+
.describe("In-point, ms into the source clip (omit = clip start)"),
|
|
361
|
+
endMs: z
|
|
362
|
+
.number()
|
|
363
|
+
.positive()
|
|
364
|
+
.optional()
|
|
365
|
+
.describe("Out-point, ms into the source clip (omit = clip end)"),
|
|
366
|
+
});
|
|
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.", {
|
|
356
368
|
...orgParam,
|
|
357
369
|
type: z.enum(["hook_demo", "green_screen_meme"]),
|
|
358
370
|
title: z.string().optional().describe("Library title for the finished video"),
|
|
@@ -370,6 +382,12 @@ register("create_video", "Render a short-form (9:16) video from library ingredie
|
|
|
370
382
|
.describe("hook_demo: raw uploaded file key from get_video_upload_url (alternative to demoVideoId)"),
|
|
371
383
|
musicId: z.string().optional().describe("hook_demo: optional background track from list_music"),
|
|
372
384
|
soundId: z.string().optional().describe("hook_demo: optional org-uploaded sound id (alternative to musicId)"),
|
|
385
|
+
hookTrim: clipTrimSchema
|
|
386
|
+
.optional()
|
|
387
|
+
.describe("hook_demo: play only this window of the hook clip (ms into the source; clamped to the real clip length). list_hooks returns durationMs — e.g. last 4s of a 9s hook: {startMs: 5000}"),
|
|
388
|
+
demoTrim: clipTrimSchema
|
|
389
|
+
.optional()
|
|
390
|
+
.describe("hook_demo: play only this window of the demo clip (requires a demo)"),
|
|
373
391
|
greenScreenId: z.string().optional().describe("green_screen_meme: clip id from list_green_screens (required)"),
|
|
374
392
|
backgroundId: z.string().optional().describe("green_screen_meme: image id from list_backgrounds (required)"),
|
|
375
393
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@post-ripple/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.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": {
|