posterly-mcp-server 0.37.0 → 0.38.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 CHANGED
@@ -122,7 +122,7 @@ Add the same server definition to your Cursor MCP settings:
122
122
 
123
123
  ## Available tools
124
124
 
125
- `posterly-mcp-server@0.37.0` exposes 86 tools.
125
+ `posterly-mcp-server@0.38.0` exposes 87 tools.
126
126
 
127
127
  Public setup tools work before `POSTERLY_API_KEY` exists:
128
128
 
@@ -197,6 +197,7 @@ Authenticated tools require `POSTERLY_API_KEY`:
197
197
  - `get_comment`
198
198
  - `reply_to_comment` (comment reply after explicit confirmation)
199
199
  - `update_comment` (hide/unhide or mark read; hide is reversible)
200
+ - `delete_comment` (delete an Instagram or Facebook comment after confirmation; Threads replies cannot be deleted)
200
201
  - `sync_inbox` (pull latest inbox data for one account; 30-second cooldown)
201
202
  - `list_google_business_reviews`
202
203
  - `get_google_business_review_link`
package/dist/index.js CHANGED
@@ -60,6 +60,7 @@ import { listCommentsTool } from './tools/list-comments.js';
60
60
  import { getCommentTool } from './tools/get-comment.js';
61
61
  import { replyToCommentTool } from './tools/reply-to-comment.js';
62
62
  import { updateCommentTool } from './tools/update-comment.js';
63
+ import { deleteCommentTool } from './tools/delete-comment.js';
63
64
  import { syncInboxTool } from './tools/sync-inbox.js';
64
65
  import { listActivityTool } from './tools/list-activity.js';
65
66
  import { getUpdatesTool } from './tools/get-updates.js';
@@ -789,6 +790,15 @@ server.tool(updateCommentTool.name, updateCommentTool.description, updateComment
789
790
  return { content: [{ type: 'text', text: `Error: ${err.message}` }], isError: true };
790
791
  }
791
792
  });
793
+ server.tool(deleteCommentTool.name, deleteCommentTool.description, deleteCommentTool.inputSchema.shape, getToolAnnotations(deleteCommentTool.name), async (input) => {
794
+ try {
795
+ const text = await deleteCommentTool.execute(client, input);
796
+ return { content: [{ type: 'text', text }] };
797
+ }
798
+ catch (err) {
799
+ return { content: [{ type: 'text', text: `Error: ${err.message}` }], isError: true };
800
+ }
801
+ });
792
802
  server.tool(syncInboxTool.name, syncInboxTool.description, syncInboxTool.inputSchema.shape, getToolAnnotations(syncInboxTool.name), async (input) => {
793
803
  try {
794
804
  const text = await syncInboxTool.execute(client, input);
@@ -1311,6 +1311,9 @@ export declare class PosterlyClient {
1311
1311
  is_read?: boolean;
1312
1312
  workspace_id?: string;
1313
1313
  }): Promise<InboxCommentResponse>;
1314
+ deleteComment(id: string, workspaceId?: string): Promise<{
1315
+ success: true;
1316
+ }>;
1314
1317
  syncInbox(data: {
1315
1318
  account_id: number;
1316
1319
  sync_type?: 'all' | 'dm' | 'comments';
@@ -623,6 +623,13 @@ export class PosterlyClient {
623
623
  body.workspace_id = data.workspace_id;
624
624
  return this.request('PATCH', `/inbox/comments/${encodeURIComponent(data.comment_id)}`, body);
625
625
  }
626
+ async deleteComment(id, workspaceId) {
627
+ const searchParams = new URLSearchParams();
628
+ if (workspaceId)
629
+ searchParams.set('workspace_id', workspaceId);
630
+ const qs = searchParams.toString();
631
+ return this.request('DELETE', `/inbox/comments/${encodeURIComponent(id)}${qs ? `?${qs}` : ''}`);
632
+ }
626
633
  async syncInbox(data) {
627
634
  return this.request('POST', '/inbox/sync', data);
628
635
  }
@@ -1 +1 @@
1
- export declare const POSTERLY_MCP_VERSION = "0.37.0";
1
+ export declare const POSTERLY_MCP_VERSION = "0.38.0";
@@ -5,4 +5,4 @@
5
5
  // tool set (minus the intentional pre-auth signup tools that only this stdio
6
6
  // package exposes). `npm run check:mcp-parity` enforces both the version match
7
7
  // and the tool-list match, and runs in the pre-commit hook.
8
- export const POSTERLY_MCP_VERSION = '0.37.0';
8
+ export const POSTERLY_MCP_VERSION = '0.38.0';
@@ -0,0 +1,24 @@
1
+ import { z } from 'zod';
2
+ import type { PosterlyClient } from '../lib/api-client.js';
3
+ export declare const deleteCommentTool: {
4
+ name: string;
5
+ description: string;
6
+ inputSchema: z.ZodObject<{
7
+ comment_id: z.ZodString;
8
+ workspace_id: z.ZodOptional<z.ZodString>;
9
+ confirm: z.ZodLiteral<true>;
10
+ }, "strip", z.ZodTypeAny, {
11
+ confirm: true;
12
+ comment_id: string;
13
+ workspace_id?: string | undefined;
14
+ }, {
15
+ confirm: true;
16
+ comment_id: string;
17
+ workspace_id?: string | undefined;
18
+ }>;
19
+ execute(client: PosterlyClient, input: {
20
+ comment_id: string;
21
+ workspace_id?: string;
22
+ confirm: true;
23
+ }): Promise<string>;
24
+ };
@@ -0,0 +1,22 @@
1
+ import { z } from 'zod';
2
+ export const deleteCommentTool = {
3
+ name: 'delete_comment',
4
+ description: 'Delete an Instagram or Facebook Page inbox comment. DESTRUCTIVE and IRREVERSIBLE. Threads replies cannot be deleted; hide them with update_comment instead. Requires a Pro plan or higher, posts:write, and admin workspace access. Fetch with get_comment first and pass confirm=true only after explicit user confirmation.',
5
+ inputSchema: z.object({
6
+ comment_id: z.string().min(1).describe('Comment ID from list_comments or get_comment.'),
7
+ workspace_id: z.string().optional().describe('Workspace ID from whoami.'),
8
+ confirm: z.literal(true).describe('Must be true after explicit user confirmation of the comment deletion.'),
9
+ }),
10
+ async execute(client, input) {
11
+ if (input.confirm !== true) {
12
+ throw new Error('Refusing to delete comment without confirm=true after explicit user confirmation.');
13
+ }
14
+ await client.deleteComment(input.comment_id, input.workspace_id);
15
+ return [
16
+ `Comment ${input.comment_id} deleted successfully.`,
17
+ 'It has been deleted from the posterly inbox. On Instagram or Facebook it is also removed on the network when the platform call succeeds.',
18
+ '',
19
+ 'Next step for the AI agent: tell the user the comment is gone. Threads replies cannot be deleted; hide them with update_comment instead.',
20
+ ].join('\n');
21
+ },
22
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "posterly-mcp-server",
3
- "version": "0.37.0",
3
+ "version": "0.38.0",
4
4
  "mcpName": "io.github.awpthorp/posterly",
5
5
  "description": "MCP server for posterly: schedule and publish social media posts across 18 platforms from any MCP client (Claude, ChatGPT, Cursor, Windsurf, Cline, and more)",
6
6
  "license": "MIT",
package/server.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "name": "io.github.awpthorp/posterly",
4
4
  "title": "posterly",
5
5
  "description": "Validate, schedule, publish, and analyze social content across 18 platforms with posterly.",
6
- "version": "0.37.0",
6
+ "version": "0.38.0",
7
7
  "websiteUrl": "https://www.poster.ly/mcp",
8
8
  "repository": {
9
9
  "url": "https://github.com/awpthorp/posterly",
@@ -14,7 +14,7 @@
14
14
  {
15
15
  "registryType": "npm",
16
16
  "identifier": "posterly-mcp-server",
17
- "version": "0.37.0",
17
+ "version": "0.38.0",
18
18
  "transport": {
19
19
  "type": "stdio"
20
20
  },
package/src/index.ts CHANGED
@@ -61,6 +61,7 @@ import { listCommentsTool } from './tools/list-comments.js';
61
61
  import { getCommentTool } from './tools/get-comment.js';
62
62
  import { replyToCommentTool } from './tools/reply-to-comment.js';
63
63
  import { updateCommentTool } from './tools/update-comment.js';
64
+ import { deleteCommentTool } from './tools/delete-comment.js';
64
65
  import { syncInboxTool } from './tools/sync-inbox.js';
65
66
  import { listActivityTool } from './tools/list-activity.js';
66
67
  import { getUpdatesTool } from './tools/get-updates.js';
@@ -1255,6 +1256,21 @@ server.tool(
1255
1256
  }
1256
1257
  );
1257
1258
 
1259
+ server.tool(
1260
+ deleteCommentTool.name,
1261
+ deleteCommentTool.description,
1262
+ deleteCommentTool.inputSchema.shape,
1263
+ getToolAnnotations(deleteCommentTool.name),
1264
+ async (input) => {
1265
+ try {
1266
+ const text = await deleteCommentTool.execute(client, input as any);
1267
+ return { content: [{ type: 'text' as const, text }] };
1268
+ } catch (err: any) {
1269
+ return { content: [{ type: 'text' as const, text: `Error: ${err.message}` }], isError: true };
1270
+ }
1271
+ }
1272
+ );
1273
+
1258
1274
  server.tool(
1259
1275
  syncInboxTool.name,
1260
1276
  syncInboxTool.description,
@@ -1862,6 +1862,13 @@ export class PosterlyClient {
1862
1862
  return this.request('PATCH', `/inbox/comments/${encodeURIComponent(data.comment_id)}`, body);
1863
1863
  }
1864
1864
 
1865
+ async deleteComment(id: string, workspaceId?: string): Promise<{ success: true }> {
1866
+ const searchParams = new URLSearchParams();
1867
+ if (workspaceId) searchParams.set('workspace_id', workspaceId);
1868
+ const qs = searchParams.toString();
1869
+ return this.request('DELETE', `/inbox/comments/${encodeURIComponent(id)}${qs ? `?${qs}` : ''}`);
1870
+ }
1871
+
1865
1872
  async syncInbox(data: {
1866
1873
  account_id: number;
1867
1874
  sync_type?: 'all' | 'dm' | 'comments';
@@ -5,4 +5,4 @@
5
5
  // tool set (minus the intentional pre-auth signup tools that only this stdio
6
6
  // package exposes). `npm run check:mcp-parity` enforces both the version match
7
7
  // and the tool-list match, and runs in the pre-commit hook.
8
- export const POSTERLY_MCP_VERSION = '0.37.0';
8
+ export const POSTERLY_MCP_VERSION = '0.38.0';
@@ -0,0 +1,29 @@
1
+ import { z } from 'zod';
2
+ import type { PosterlyClient } from '../lib/api-client.js';
3
+
4
+ export const deleteCommentTool = {
5
+ name: 'delete_comment',
6
+ description:
7
+ 'Delete an Instagram or Facebook Page inbox comment. DESTRUCTIVE and IRREVERSIBLE. Threads replies cannot be deleted; hide them with update_comment instead. Requires a Pro plan or higher, posts:write, and admin workspace access. Fetch with get_comment first and pass confirm=true only after explicit user confirmation.',
8
+ inputSchema: z.object({
9
+ comment_id: z.string().min(1).describe('Comment ID from list_comments or get_comment.'),
10
+ workspace_id: z.string().optional().describe('Workspace ID from whoami.'),
11
+ confirm: z.literal(true).describe('Must be true after explicit user confirmation of the comment deletion.'),
12
+ }),
13
+
14
+ async execute(
15
+ client: PosterlyClient,
16
+ input: { comment_id: string; workspace_id?: string; confirm: true },
17
+ ) {
18
+ if (input.confirm !== true) {
19
+ throw new Error('Refusing to delete comment without confirm=true after explicit user confirmation.');
20
+ }
21
+ await client.deleteComment(input.comment_id, input.workspace_id);
22
+ return [
23
+ `Comment ${input.comment_id} deleted successfully.`,
24
+ 'It has been deleted from the posterly inbox. On Instagram or Facebook it is also removed on the network when the platform call succeeds.',
25
+ '',
26
+ 'Next step for the AI agent: tell the user the comment is gone. Threads replies cannot be deleted; hide them with update_comment instead.',
27
+ ].join('\n');
28
+ },
29
+ };
@@ -58,6 +58,7 @@
58
58
  "update_post_status",
59
59
  "update_post_release_id",
60
60
  "delete_post",
61
+ "delete_comment",
61
62
  "delete_post_group",
62
63
  "get_account_analytics",
63
64
  "get_post_analytics",
@@ -143,6 +144,7 @@
143
144
  "update_post",
144
145
  "update_post_status",
145
146
  "delete_post",
147
+ "delete_comment",
146
148
  "delete_post_group",
147
149
  "reply_google_business_review",
148
150
  "delete_google_business_review_reply",
@@ -165,6 +167,7 @@
165
167
  "update_post_status",
166
168
  "update_post_release_id",
167
169
  "delete_post",
170
+ "delete_comment",
168
171
  "delete_post_group",
169
172
  "reply_google_business_review",
170
173
  "delete_google_business_review_reply",
@@ -218,6 +221,7 @@
218
221
  "send_message",
219
222
  "reply_to_comment",
220
223
  "update_comment",
224
+ "delete_comment",
221
225
  "sync_inbox"
222
226
  ]
223
227
  }