@post-ripple/mcp 0.3.0 → 0.5.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/dist/index.js +53 -9
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -45,7 +45,7 @@ function toEpochMs(value, field) {
|
|
|
45
45
|
}
|
|
46
46
|
return parsed;
|
|
47
47
|
}
|
|
48
|
-
const server = new McpServer({ name: "postripple", version: "0.
|
|
48
|
+
const server = new McpServer({ name: "postripple", version: "0.5.0" });
|
|
49
49
|
function register(name, description, shape, transform) {
|
|
50
50
|
server.tool(name, description, shape, async (args) => {
|
|
51
51
|
try {
|
|
@@ -143,14 +143,18 @@ const slideTextStyleSchema = z
|
|
|
143
143
|
})
|
|
144
144
|
.describe("Optional per-field style overrides; anything omitted uses the template slot's defaults");
|
|
145
145
|
const slideSchema = z.object({
|
|
146
|
+
imageId: z
|
|
147
|
+
.string()
|
|
148
|
+
.optional()
|
|
149
|
+
.describe("A library image (from list_images / register_uploaded_image / import_image_from_url) used as the slide background; text is rendered on top server-side. Provide exactly one of imageId, prerenderedFileId, or backgroundFileId per slide."),
|
|
146
150
|
prerenderedFileId: z
|
|
147
151
|
.string()
|
|
148
152
|
.optional()
|
|
149
|
-
.describe("A finished slide image (from get_image_upload_url or
|
|
153
|
+
.describe("A finished slide image (a fileId from get_image_upload_url, import_image_from_url, or list_images) used as-is. JPEG at 1080x1350 recommended — other formats are re-encoded and cover-cropped to the canvas."),
|
|
150
154
|
backgroundFileId: z
|
|
151
155
|
.string()
|
|
152
156
|
.optional()
|
|
153
|
-
.describe("Background image for a template slide; text is rendered on top server-side."),
|
|
157
|
+
.describe("Background image (raw fileId) for a template slide; text is rendered on top server-side. Prefer imageId when the image is in the library."),
|
|
154
158
|
textFields: z
|
|
155
159
|
.array(z.object({
|
|
156
160
|
key: z
|
|
@@ -180,9 +184,24 @@ register("list_videos", "List videos in the workspace library, newest first. Vid
|
|
|
180
184
|
});
|
|
181
185
|
register("list_video_groups", "List video groups (rotation playlists that auto-post on a schedule) with video/account counts and status.", { ...orgParam });
|
|
182
186
|
register("get_video_group", "Get one video group in detail: its videos and the per-account posting rules (posts per day, posting windows, next scheduled post).", { ...orgParam, groupId: z.string() });
|
|
183
|
-
register("
|
|
184
|
-
|
|
185
|
-
|
|
187
|
+
register("list_images", "List/search the workspace's image library, newest first (relevance order when text is passed). Every image ever uploaded, imported, or generated lives here until deleted — CHECK THIS BEFORE generating or re-uploading images; reusing an existing image is free and instant. Each result has an imageId (pass to create_slideshow slides), its raw fileId, a signed preview url (~1h), and its title/description/tags/prompt metadata.", {
|
|
188
|
+
...orgParam,
|
|
189
|
+
text: z
|
|
190
|
+
.string()
|
|
191
|
+
.optional()
|
|
192
|
+
.describe("Free-text search over title, description, tags, and generation prompt"),
|
|
193
|
+
tags: z
|
|
194
|
+
.array(z.string())
|
|
195
|
+
.optional()
|
|
196
|
+
.describe("Only images carrying ALL of these tags"),
|
|
197
|
+
source: z
|
|
198
|
+
.enum(["upload", "agent_upload", "agent_import", "generated"])
|
|
199
|
+
.optional(),
|
|
200
|
+
limit: z.number().min(1).max(200).optional().describe("Default 100, max 200"),
|
|
201
|
+
});
|
|
202
|
+
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() });
|
|
203
|
+
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.", {});
|
|
204
|
+
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() });
|
|
186
205
|
register("list_posts", "List posts (scheduled, publishing, published, failed, canceled), newest first. Scheduled posts include scheduledFor; published posts include platformPostId and publishedAt.", {
|
|
187
206
|
...orgParam,
|
|
188
207
|
status: postStatusEnum.optional(),
|
|
@@ -240,9 +259,34 @@ register("update_group_schedule", "Attach a social account to a group or update
|
|
|
240
259
|
status: z.enum(["active", "paused"]).optional(),
|
|
241
260
|
postingWindows: z.array(postingWindowSchema).optional(),
|
|
242
261
|
});
|
|
243
|
-
register("get_image_upload_url", "Get a presigned upload URL for pushing
|
|
244
|
-
register("
|
|
245
|
-
|
|
262
|
+
register("get_image_upload_url", "Get a presigned upload URL for pushing an image into the workspace library. PUT the raw image bytes to the returned uploadUrl with a Content-Type header, then call register_uploaded_image with the returned fileId (plus a title/tags so the image is findable later). JPEG at 1080x1350 (4:5) strongly recommended.", { ...orgParam });
|
|
263
|
+
register("register_uploaded_image", "Register an image after uploading its bytes to a presigned URL from get_image_upload_url. This saves it to the workspace image library — it persists until deleted and can be reused in any slideshow (via list_images). Give it a descriptive title and tags so it's easy to find again.", {
|
|
264
|
+
...orgParam,
|
|
265
|
+
fileId: z.string().describe("The fileId returned by get_image_upload_url"),
|
|
266
|
+
title: z.string().optional().describe("Descriptive title — strongly recommended for later discovery"),
|
|
267
|
+
description: z.string().optional(),
|
|
268
|
+
tags: z.array(z.string()).optional().describe("Lowercase keywords for filtering in list_images"),
|
|
269
|
+
});
|
|
270
|
+
register("import_image_from_url", "Import an image into the workspace library from a public URL (synchronous — the returned imageId/fileId are immediately usable in create_slideshow, and the image persists in the library for reuse via list_images). Accepts JPEG/PNG/WebP up to 15MB; JPEG is recommended since other formats get re-encoded and cover-cropped to the 1080x1350 canvas. Give it a title/tags so it's findable later.", {
|
|
271
|
+
...orgParam,
|
|
272
|
+
url: z.string().url(),
|
|
273
|
+
title: z.string().optional().describe("Descriptive title — strongly recommended for later discovery"),
|
|
274
|
+
description: z.string().optional(),
|
|
275
|
+
tags: z.array(z.string()).optional().describe("Lowercase keywords for filtering in list_images"),
|
|
276
|
+
});
|
|
277
|
+
register("update_image", "Update a library image's title, description, or tags (e.g. to make older images easier to rediscover via list_images).", {
|
|
278
|
+
...orgParam,
|
|
279
|
+
imageId: z.string(),
|
|
280
|
+
title: z.string().optional(),
|
|
281
|
+
description: z.string().optional(),
|
|
282
|
+
tags: z.array(z.string()).optional().describe("Replaces the existing tag list"),
|
|
283
|
+
});
|
|
284
|
+
register("delete_image", "Delete a library image and its stored file. If the image is still used as a slide background or character thumbnail, the call returns the references instead of deleting; retry with force: true to delete anyway (those draft slides lose their background). Images that ARE a slideshow's final rendered content can't be deleted at all — delete the slideshow first.", {
|
|
285
|
+
...orgParam,
|
|
286
|
+
imageId: z.string(),
|
|
287
|
+
force: z.boolean().optional(),
|
|
288
|
+
});
|
|
289
|
+
register("create_slideshow", "Create a photo slideshow (1-10 slides). Each slide is EXACTLY ONE OF: {imageId} — a library image (see list_images) as the background, optionally with textFields/overlay; {prerenderedFileId} — a finished image you composed, used as-is; or {backgroundFileId, textFields, overlay} rendered server-side using templateId's layout. Reuse library images via list_images before generating or uploading new ones. Pre-rendered JPEG slides are ready instantly; other slides return status 'rendering' — poll get_slideshow until 'ready', then call publish_slideshow. Requires the slideshows plan feature.", {
|
|
246
290
|
...orgParam,
|
|
247
291
|
title: z.string().optional(),
|
|
248
292
|
templateId: z
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@post-ripple/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.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": {
|