posterly-mcp-server 0.25.0 → 0.27.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 (38) hide show
  1. package/README.md +19 -3
  2. package/dist/generated/platform-manifest.d.ts +24 -24
  3. package/dist/generated/platform-manifest.js +30 -24
  4. package/dist/index.js +30 -0
  5. package/dist/lib/api-client.d.ts +60 -0
  6. package/dist/lib/api-client.js +17 -0
  7. package/dist/lib/version.d.ts +1 -1
  8. package/dist/lib/version.js +1 -1
  9. package/dist/tools/create-connect-session.d.ts +2 -2
  10. package/dist/tools/create-post.d.ts +45 -45
  11. package/dist/tools/create-post.js +7 -7
  12. package/dist/tools/create-posts-batch.d.ts +19 -19
  13. package/dist/tools/get-connect-link.d.ts +2 -2
  14. package/dist/tools/get-platform-schema.d.ts +2 -2
  15. package/dist/tools/get-updates.d.ts +24 -0
  16. package/dist/tools/get-updates.js +29 -0
  17. package/dist/tools/list-posts.d.ts +3 -3
  18. package/dist/tools/reply-google-business-review.d.ts +2 -2
  19. package/dist/tools/submit-agent-feedback.d.ts +108 -0
  20. package/dist/tools/submit-agent-feedback.js +32 -0
  21. package/dist/tools/trigger-platform-helper.d.ts +3 -3
  22. package/dist/tools/trigger-platform-helper.js +1 -1
  23. package/dist/tools/update-post.d.ts +16 -16
  24. package/dist/tools/update-post.js +7 -7
  25. package/dist/tools/validate-post.d.ts +1080 -0
  26. package/dist/tools/validate-post.js +28 -0
  27. package/package.json +3 -2
  28. package/server.json +38 -0
  29. package/src/generated/platform-manifest.ts +30 -24
  30. package/src/index.ts +45 -0
  31. package/src/lib/api-client.ts +74 -0
  32. package/src/lib/version.ts +1 -1
  33. package/src/tools/create-post.ts +7 -7
  34. package/src/tools/get-updates.ts +41 -0
  35. package/src/tools/submit-agent-feedback.ts +47 -0
  36. package/src/tools/trigger-platform-helper.ts +1 -1
  37. package/src/tools/update-post.ts +7 -7
  38. package/src/tools/validate-post.ts +41 -0
package/README.md CHANGED
@@ -16,6 +16,19 @@ This package gives Claude Desktop, Cursor, Windsurf, Cline, and other local MCP
16
16
 
17
17
  Posterly also exposes the same authenticated toolset over HTTP at [poster.ly/mcp](https://www.poster.ly/mcp), but this npm package is the local `stdio` connection for desktop AI clients.
18
18
 
19
+ ## Public discovery
20
+
21
+ - Hosted Streamable HTTP endpoint: `https://www.poster.ly/api/mcp`
22
+ - Server card: `https://www.poster.ly/.well-known/mcp/server-card.json`
23
+ - OpenAPI: `https://www.poster.ly/api/openapi`
24
+ - Agent skills: `https://www.poster.ly/.well-known/agent-skills/index.json`
25
+ - Agent reference: `https://www.poster.ly/llms-full.txt`
26
+ - Signup and API-key acquisition: `https://www.poster.ly/agents/signup`
27
+ - Source: `https://github.com/awpthorp/posterly/tree/main/mcp-server`
28
+
29
+ The official MCP Registry metadata is in `server.json`. Its canonical registry
30
+ name is `io.github.awpthorp/posterly`, matching this package's `mcpName`.
31
+
19
32
  ## Requirements
20
33
 
21
34
  - Node.js `20+`
@@ -108,7 +121,7 @@ Add the same server definition to your Cursor MCP settings:
108
121
 
109
122
  ## Available tools
110
123
 
111
- `posterly-mcp-server@0.25.0` exposes 72 tools.
124
+ `posterly-mcp-server@0.27.0` exposes 75 tools.
112
125
 
113
126
  Public setup tools work before `POSTERLY_API_KEY` exists:
114
127
 
@@ -149,6 +162,8 @@ Authenticated tools require `POSTERLY_API_KEY`:
149
162
  - `get_post_missing`
150
163
  - `ask_support` (authenticated docs-backed support with read-only account/post diagnostics; human tickets require explicit confirmation)
151
164
  - `create_post` (supports `thread_posts: string[]` for X / Threads reply chains, plus `platform_settings` for platform-specific composer controls)
165
+ - `validate_post` (checks and normalizes a post without creating it; call before requesting confirmation for `create_post`)
166
+ - `submit_agent_feedback` (writes bounded private operational telemetry after a real workflow outcome; never include secrets, prompts, captions, media URLs, or personal data)
152
167
  - `create_posts_batch` (create up to 25 confirmed posts in one API request)
153
168
  - `update_post` (also accepts `platform_settings`)
154
169
  - `update_post_status` (pause, resume, schedule, or draft a post after confirmation)
@@ -184,6 +199,7 @@ Authenticated tools require `POSTERLY_API_KEY`:
184
199
  > Google Business tip: pass `account_id` (the integer `id` from `list_accounts`) to every GBP tool. If you use `location_id` instead, it is the numeric `location_id` from `list_accounts` (the GBP location id), not the `ChIJ...` Place ID that `get_google_business_review_link` returns. Passing the Place ID resolves to no account and returns "Google Business Profile account not found".
185
200
 
186
201
  - `list_activity`
202
+ - `get_updates` (read the latest posterly product updates and news)
187
203
  - `list_webhooks`
188
204
  - `create_webhook` (create a webhook after explicit confirmation)
189
205
  - `update_webhook` (update a webhook after explicit confirmation)
@@ -240,8 +256,8 @@ This package uses the Posterly API/MCP add-on:
240
256
 
241
257
  - `$3/month` add-on
242
258
  - `100 create-post requests/hour` per API key, with separate media/read limits
243
- - user-created API keys per plan: Starter 1, Pro 2, Power User 3, Agency 4
244
- - works across all 17 supported platforms
259
+ - user-created API keys per plan: Starter 1, Pro 2, Power 3, Agency 4
260
+ - works across all 18 supported platforms: Instagram, Facebook, TikTok, X, LinkedIn, YouTube, Pinterest, Threads, Google Business, Telegram, Bluesky, Discord, Slack, Mastodon, Dev.to, Hashnode, WordPress, and Lemmy
245
261
 
246
262
  Each API call counts as one request, so use `create_posts_batch` when you need to schedule multiple posts in one confirmed operation.
247
263
 
@@ -1,9 +1,9 @@
1
1
  export declare const PLATFORM_MANIFEST: {
2
2
  readonly source: "lib/api-platform-registry.ts";
3
- readonly supportedPlatformIds: readonly ["instagram", "facebook", "tiktok", "twitter", "linkedin", "youtube", "pinterest", "threads", "google_business", "telegram", "bluesky", "discord", "mastodon", "devto", "hashnode", "wordpress", "lemmy"];
4
- readonly plannedPlatformIds: readonly ["reddit", "medium", "slack", "skool", "whop"];
5
- readonly allPlatformIds: readonly ["instagram", "facebook", "tiktok", "twitter", "linkedin", "youtube", "pinterest", "threads", "google_business", "telegram", "bluesky", "discord", "mastodon", "devto", "hashnode", "wordpress", "lemmy", "reddit", "medium", "slack", "skool", "whop"];
6
- readonly supportedPlatformInputs: readonly ["bluesky", "devto", "discord", "facebook", "gmb", "google-business", "google_business", "google_business_profile", "hashnode", "instagram", "instagram-standalone", "lemmy", "linkedin", "mastodon", "pinterest", "telegram", "threads", "tiktok", "twitter", "wordpress", "x", "youtube"];
3
+ readonly supportedPlatformIds: readonly ["instagram", "facebook", "tiktok", "twitter", "linkedin", "youtube", "pinterest", "threads", "google_business", "telegram", "bluesky", "discord", "slack", "mastodon", "devto", "hashnode", "wordpress", "lemmy"];
4
+ readonly plannedPlatformIds: readonly ["reddit", "medium", "skool", "whop"];
5
+ readonly allPlatformIds: readonly ["instagram", "facebook", "tiktok", "twitter", "linkedin", "youtube", "pinterest", "threads", "google_business", "telegram", "bluesky", "discord", "slack", "mastodon", "devto", "hashnode", "wordpress", "lemmy", "reddit", "medium", "skool", "whop"];
6
+ readonly supportedPlatformInputs: readonly ["bluesky", "devto", "discord", "facebook", "gmb", "google-business", "google_business", "google_business_profile", "hashnode", "instagram", "instagram-standalone", "lemmy", "linkedin", "mastodon", "pinterest", "slack", "telegram", "threads", "tiktok", "twitter", "wordpress", "x", "youtube"];
7
7
  readonly allPlatformInputs: readonly ["bluesky", "devto", "discord", "facebook", "gmb", "google-business", "google_business", "google_business_profile", "hashnode", "instagram", "instagram-standalone", "lemmy", "linkedin", "mastodon", "medium", "pinterest", "reddit", "skool", "slack", "telegram", "threads", "tiktok", "twitter", "whop", "wordpress", "x", "youtube"];
8
8
  readonly platformAliases: {
9
9
  readonly bluesky: "bluesky";
@@ -35,7 +35,7 @@ export declare const PLATFORM_MANIFEST: {
35
35
  };
36
36
  readonly helperNames: readonly ["linkedin.recent_mentions", "pinterest.boards", "tiktok.creator_info", "x.quota"];
37
37
  readonly analyticsPlatformIds: readonly ["instagram", "facebook", "linkedin", "youtube", "pinterest", "threads", "google_business"];
38
- readonly connectTargetIds: readonly ["instagram", "meta", "facebook", "youtube", "tiktok", "linkedin", "linkedin_page", "threads", "google_business", "pinterest", "twitter", "telegram", "bluesky", "discord", "mastodon", "devto", "hashnode", "wordpress", "lemmy", "reddit", "medium", "slack", "skool", "whop"];
38
+ readonly connectTargetIds: readonly ["instagram", "meta", "facebook", "youtube", "tiktok", "linkedin", "linkedin_page", "threads", "google_business", "pinterest", "twitter", "telegram", "bluesky", "discord", "slack", "mastodon", "devto", "hashnode", "wordpress", "lemmy", "reddit", "medium", "skool", "whop"];
39
39
  readonly connectInputs: readonly ["bluesky", "devto", "discord", "facebook", "facebook_instagram", "facebook_pages", "gmb", "google-business", "google_business", "google_business_profile", "hashnode", "instagram", "instagram-standalone", "instagram_direct", "lemmy", "linkedin", "linkedin-company", "linkedin-page", "linkedin_company", "linkedin_page", "linkedin_personal", "mastodon", "medium", "meta", "meta_business", "pinterest", "reddit", "skool", "slack", "telegram", "threads", "tiktok", "twitter", "whop", "wordpress", "x", "x_twitter", "youtube"];
40
40
  readonly connectAliases: {
41
41
  readonly bluesky: "bluesky";
@@ -170,6 +170,14 @@ export declare const PLATFORM_MANIFEST: {
170
170
  readonly postTypes: readonly ["text", "image", "video", "carousel"];
171
171
  readonly analyticsSupported: false;
172
172
  readonly helpers: readonly [];
173
+ }, {
174
+ readonly id: "slack";
175
+ readonly label: "Slack";
176
+ readonly status: "supported";
177
+ readonly aliases: readonly [];
178
+ readonly postTypes: readonly ["text", "image", "video", "carousel"];
179
+ readonly analyticsSupported: false;
180
+ readonly helpers: readonly [];
173
181
  }, {
174
182
  readonly id: "mastodon";
175
183
  readonly label: "Mastodon";
@@ -226,14 +234,6 @@ export declare const PLATFORM_MANIFEST: {
226
234
  readonly postTypes: readonly [];
227
235
  readonly analyticsSupported: false;
228
236
  readonly helpers: readonly [];
229
- }, {
230
- readonly id: "slack";
231
- readonly label: "Slack";
232
- readonly status: "planned";
233
- readonly aliases: readonly [];
234
- readonly postTypes: readonly [];
235
- readonly analyticsSupported: false;
236
- readonly helpers: readonly [];
237
237
  }, {
238
238
  readonly id: "skool";
239
239
  readonly label: "Skool";
@@ -335,6 +335,12 @@ export declare const PLATFORM_MANIFEST: {
335
335
  readonly status: "supported";
336
336
  readonly aliases: readonly [];
337
337
  readonly method: "manual_credentials";
338
+ }, {
339
+ readonly id: "slack";
340
+ readonly label: "Slack";
341
+ readonly status: "supported";
342
+ readonly aliases: readonly [];
343
+ readonly method: "dashboard_oauth";
338
344
  }, {
339
345
  readonly id: "mastodon";
340
346
  readonly label: "Mastodon";
@@ -377,12 +383,6 @@ export declare const PLATFORM_MANIFEST: {
377
383
  readonly status: "planned";
378
384
  readonly aliases: readonly [];
379
385
  readonly method: "planned";
380
- }, {
381
- readonly id: "slack";
382
- readonly label: "Slack";
383
- readonly status: "planned";
384
- readonly aliases: readonly [];
385
- readonly method: "planned";
386
386
  }, {
387
387
  readonly id: "skool";
388
388
  readonly label: "Skool";
@@ -397,12 +397,12 @@ export declare const PLATFORM_MANIFEST: {
397
397
  readonly method: "planned";
398
398
  }];
399
399
  };
400
- export declare const SUPPORTED_PLATFORM_IDS: readonly ["instagram", "facebook", "tiktok", "twitter", "linkedin", "youtube", "pinterest", "threads", "google_business", "telegram", "bluesky", "discord", "mastodon", "devto", "hashnode", "wordpress", "lemmy"];
401
- export declare const PLANNED_PLATFORM_IDS: readonly ["reddit", "medium", "slack", "skool", "whop"];
402
- export declare const ALL_PLATFORM_IDS: readonly ["instagram", "facebook", "tiktok", "twitter", "linkedin", "youtube", "pinterest", "threads", "google_business", "telegram", "bluesky", "discord", "mastodon", "devto", "hashnode", "wordpress", "lemmy", "reddit", "medium", "slack", "skool", "whop"];
403
- export declare const SUPPORTED_PLATFORM_INPUTS: readonly ["bluesky", "devto", "discord", "facebook", "gmb", "google-business", "google_business", "google_business_profile", "hashnode", "instagram", "instagram-standalone", "lemmy", "linkedin", "mastodon", "pinterest", "telegram", "threads", "tiktok", "twitter", "wordpress", "x", "youtube"];
400
+ export declare const SUPPORTED_PLATFORM_IDS: readonly ["instagram", "facebook", "tiktok", "twitter", "linkedin", "youtube", "pinterest", "threads", "google_business", "telegram", "bluesky", "discord", "slack", "mastodon", "devto", "hashnode", "wordpress", "lemmy"];
401
+ export declare const PLANNED_PLATFORM_IDS: readonly ["reddit", "medium", "skool", "whop"];
402
+ export declare const ALL_PLATFORM_IDS: readonly ["instagram", "facebook", "tiktok", "twitter", "linkedin", "youtube", "pinterest", "threads", "google_business", "telegram", "bluesky", "discord", "slack", "mastodon", "devto", "hashnode", "wordpress", "lemmy", "reddit", "medium", "skool", "whop"];
403
+ export declare const SUPPORTED_PLATFORM_INPUTS: readonly ["bluesky", "devto", "discord", "facebook", "gmb", "google-business", "google_business", "google_business_profile", "hashnode", "instagram", "instagram-standalone", "lemmy", "linkedin", "mastodon", "pinterest", "slack", "telegram", "threads", "tiktok", "twitter", "wordpress", "x", "youtube"];
404
404
  export declare const ALL_PLATFORM_INPUTS: readonly ["bluesky", "devto", "discord", "facebook", "gmb", "google-business", "google_business", "google_business_profile", "hashnode", "instagram", "instagram-standalone", "lemmy", "linkedin", "mastodon", "medium", "pinterest", "reddit", "skool", "slack", "telegram", "threads", "tiktok", "twitter", "whop", "wordpress", "x", "youtube"];
405
405
  export declare const PLATFORM_HELPER_NAMES: readonly ["linkedin.recent_mentions", "pinterest.boards", "tiktok.creator_info", "x.quota"];
406
- export declare const CONNECT_TARGET_IDS: readonly ["instagram", "meta", "facebook", "youtube", "tiktok", "linkedin", "linkedin_page", "threads", "google_business", "pinterest", "twitter", "telegram", "bluesky", "discord", "mastodon", "devto", "hashnode", "wordpress", "lemmy", "reddit", "medium", "slack", "skool", "whop"];
406
+ export declare const CONNECT_TARGET_IDS: readonly ["instagram", "meta", "facebook", "youtube", "tiktok", "linkedin", "linkedin_page", "threads", "google_business", "pinterest", "twitter", "telegram", "bluesky", "discord", "slack", "mastodon", "devto", "hashnode", "wordpress", "lemmy", "reddit", "medium", "skool", "whop"];
407
407
  export declare const CONNECT_INPUTS: readonly ["bluesky", "devto", "discord", "facebook", "facebook_instagram", "facebook_pages", "gmb", "google-business", "google_business", "google_business_profile", "hashnode", "instagram", "instagram-standalone", "instagram_direct", "lemmy", "linkedin", "linkedin-company", "linkedin-page", "linkedin_company", "linkedin_page", "linkedin_personal", "mastodon", "medium", "meta", "meta_business", "pinterest", "reddit", "skool", "slack", "telegram", "threads", "tiktok", "twitter", "whop", "wordpress", "x", "x_twitter", "youtube"];
408
408
  export declare const ANALYTICS_PLATFORM_IDS: readonly ["instagram", "facebook", "linkedin", "youtube", "pinterest", "threads", "google_business"];
@@ -14,6 +14,7 @@ export const PLATFORM_MANIFEST = {
14
14
  "telegram",
15
15
  "bluesky",
16
16
  "discord",
17
+ "slack",
17
18
  "mastodon",
18
19
  "devto",
19
20
  "hashnode",
@@ -23,7 +24,6 @@ export const PLATFORM_MANIFEST = {
23
24
  "plannedPlatformIds": [
24
25
  "reddit",
25
26
  "medium",
26
- "slack",
27
27
  "skool",
28
28
  "whop"
29
29
  ],
@@ -40,6 +40,7 @@ export const PLATFORM_MANIFEST = {
40
40
  "telegram",
41
41
  "bluesky",
42
42
  "discord",
43
+ "slack",
43
44
  "mastodon",
44
45
  "devto",
45
46
  "hashnode",
@@ -47,7 +48,6 @@ export const PLATFORM_MANIFEST = {
47
48
  "lemmy",
48
49
  "reddit",
49
50
  "medium",
50
- "slack",
51
51
  "skool",
52
52
  "whop"
53
53
  ],
@@ -67,6 +67,7 @@ export const PLATFORM_MANIFEST = {
67
67
  "linkedin",
68
68
  "mastodon",
69
69
  "pinterest",
70
+ "slack",
70
71
  "telegram",
71
72
  "threads",
72
73
  "tiktok",
@@ -162,6 +163,7 @@ export const PLATFORM_MANIFEST = {
162
163
  "telegram",
163
164
  "bluesky",
164
165
  "discord",
166
+ "slack",
165
167
  "mastodon",
166
168
  "devto",
167
169
  "hashnode",
@@ -169,7 +171,6 @@ export const PLATFORM_MANIFEST = {
169
171
  "lemmy",
170
172
  "reddit",
171
173
  "medium",
172
- "slack",
173
174
  "skool",
174
175
  "whop"
175
176
  ],
@@ -435,6 +436,20 @@ export const PLATFORM_MANIFEST = {
435
436
  "analyticsSupported": false,
436
437
  "helpers": []
437
438
  },
439
+ {
440
+ "id": "slack",
441
+ "label": "Slack",
442
+ "status": "supported",
443
+ "aliases": [],
444
+ "postTypes": [
445
+ "text",
446
+ "image",
447
+ "video",
448
+ "carousel"
449
+ ],
450
+ "analyticsSupported": false,
451
+ "helpers": []
452
+ },
438
453
  {
439
454
  "id": "mastodon",
440
455
  "label": "Mastodon",
@@ -515,15 +530,6 @@ export const PLATFORM_MANIFEST = {
515
530
  "analyticsSupported": false,
516
531
  "helpers": []
517
532
  },
518
- {
519
- "id": "slack",
520
- "label": "Slack",
521
- "status": "planned",
522
- "aliases": [],
523
- "postTypes": [],
524
- "analyticsSupported": false,
525
- "helpers": []
526
- },
527
533
  {
528
534
  "id": "skool",
529
535
  "label": "Skool",
@@ -663,6 +669,13 @@ export const PLATFORM_MANIFEST = {
663
669
  "aliases": [],
664
670
  "method": "manual_credentials"
665
671
  },
672
+ {
673
+ "id": "slack",
674
+ "label": "Slack",
675
+ "status": "supported",
676
+ "aliases": [],
677
+ "method": "dashboard_oauth"
678
+ },
666
679
  {
667
680
  "id": "mastodon",
668
681
  "label": "Mastodon",
@@ -712,13 +725,6 @@ export const PLATFORM_MANIFEST = {
712
725
  "aliases": [],
713
726
  "method": "planned"
714
727
  },
715
- {
716
- "id": "slack",
717
- "label": "Slack",
718
- "status": "planned",
719
- "aliases": [],
720
- "method": "planned"
721
- },
722
728
  {
723
729
  "id": "skool",
724
730
  "label": "Skool",
@@ -735,12 +741,12 @@ export const PLATFORM_MANIFEST = {
735
741
  }
736
742
  ]
737
743
  };
738
- export const SUPPORTED_PLATFORM_IDS = ["instagram", "facebook", "tiktok", "twitter", "linkedin", "youtube", "pinterest", "threads", "google_business", "telegram", "bluesky", "discord", "mastodon", "devto", "hashnode", "wordpress", "lemmy"];
739
- export const PLANNED_PLATFORM_IDS = ["reddit", "medium", "slack", "skool", "whop"];
740
- export const ALL_PLATFORM_IDS = ["instagram", "facebook", "tiktok", "twitter", "linkedin", "youtube", "pinterest", "threads", "google_business", "telegram", "bluesky", "discord", "mastodon", "devto", "hashnode", "wordpress", "lemmy", "reddit", "medium", "slack", "skool", "whop"];
741
- export const SUPPORTED_PLATFORM_INPUTS = ["bluesky", "devto", "discord", "facebook", "gmb", "google-business", "google_business", "google_business_profile", "hashnode", "instagram", "instagram-standalone", "lemmy", "linkedin", "mastodon", "pinterest", "telegram", "threads", "tiktok", "twitter", "wordpress", "x", "youtube"];
744
+ export const SUPPORTED_PLATFORM_IDS = ["instagram", "facebook", "tiktok", "twitter", "linkedin", "youtube", "pinterest", "threads", "google_business", "telegram", "bluesky", "discord", "slack", "mastodon", "devto", "hashnode", "wordpress", "lemmy"];
745
+ export const PLANNED_PLATFORM_IDS = ["reddit", "medium", "skool", "whop"];
746
+ export const ALL_PLATFORM_IDS = ["instagram", "facebook", "tiktok", "twitter", "linkedin", "youtube", "pinterest", "threads", "google_business", "telegram", "bluesky", "discord", "slack", "mastodon", "devto", "hashnode", "wordpress", "lemmy", "reddit", "medium", "skool", "whop"];
747
+ export const SUPPORTED_PLATFORM_INPUTS = ["bluesky", "devto", "discord", "facebook", "gmb", "google-business", "google_business", "google_business_profile", "hashnode", "instagram", "instagram-standalone", "lemmy", "linkedin", "mastodon", "pinterest", "slack", "telegram", "threads", "tiktok", "twitter", "wordpress", "x", "youtube"];
742
748
  export const ALL_PLATFORM_INPUTS = ["bluesky", "devto", "discord", "facebook", "gmb", "google-business", "google_business", "google_business_profile", "hashnode", "instagram", "instagram-standalone", "lemmy", "linkedin", "mastodon", "medium", "pinterest", "reddit", "skool", "slack", "telegram", "threads", "tiktok", "twitter", "whop", "wordpress", "x", "youtube"];
743
749
  export const PLATFORM_HELPER_NAMES = ["linkedin.recent_mentions", "pinterest.boards", "tiktok.creator_info", "x.quota"];
744
- export const CONNECT_TARGET_IDS = ["instagram", "meta", "facebook", "youtube", "tiktok", "linkedin", "linkedin_page", "threads", "google_business", "pinterest", "twitter", "telegram", "bluesky", "discord", "mastodon", "devto", "hashnode", "wordpress", "lemmy", "reddit", "medium", "slack", "skool", "whop"];
750
+ export const CONNECT_TARGET_IDS = ["instagram", "meta", "facebook", "youtube", "tiktok", "linkedin", "linkedin_page", "threads", "google_business", "pinterest", "twitter", "telegram", "bluesky", "discord", "slack", "mastodon", "devto", "hashnode", "wordpress", "lemmy", "reddit", "medium", "skool", "whop"];
745
751
  export const CONNECT_INPUTS = ["bluesky", "devto", "discord", "facebook", "facebook_instagram", "facebook_pages", "gmb", "google-business", "google_business", "google_business_profile", "hashnode", "instagram", "instagram-standalone", "instagram_direct", "lemmy", "linkedin", "linkedin-company", "linkedin-page", "linkedin_company", "linkedin_page", "linkedin_personal", "mastodon", "medium", "meta", "meta_business", "pinterest", "reddit", "skool", "slack", "telegram", "threads", "tiktok", "twitter", "whop", "wordpress", "x", "x_twitter", "youtube"];
746
752
  export const ANALYTICS_PLATFORM_IDS = ["instagram", "facebook", "linkedin", "youtube", "pinterest", "threads", "google_business"];
package/dist/index.js CHANGED
@@ -19,6 +19,8 @@ import { getPostInsightsTool } from './tools/get-post-insights.js';
19
19
  import { listPostSuggestionsTool } from './tools/list-post-suggestions.js';
20
20
  import { dismissSuggestionTool } from './tools/dismiss-suggestion.js';
21
21
  import { createPostTool } from './tools/create-post.js';
22
+ import { validatePostTool } from './tools/validate-post.js';
23
+ import { submitAgentFeedbackTool } from './tools/submit-agent-feedback.js';
22
24
  import { createPostsBatchTool } from './tools/create-posts-batch.js';
23
25
  import { findSlotTool } from './tools/find-slot.js';
24
26
  import { listPostsTool } from './tools/list-posts.js';
@@ -50,6 +52,7 @@ import { listGoogleBusinessMediaTool } from './tools/list-google-business-media.
50
52
  import { addGoogleBusinessMediaTool } from './tools/add-google-business-media.js';
51
53
  import { deleteGoogleBusinessMediaTool } from './tools/delete-google-business-media.js';
52
54
  import { listActivityTool } from './tools/list-activity.js';
55
+ import { getUpdatesTool } from './tools/get-updates.js';
53
56
  import { listWebhooksTool } from './tools/list-webhooks.js';
54
57
  import { createWebhookTool } from './tools/create-webhook.js';
55
58
  import { updateWebhookTool } from './tools/update-webhook.js';
@@ -378,6 +381,24 @@ server.tool(dismissSuggestionTool.name, dismissSuggestionTool.description, dismi
378
381
  return { content: [{ type: 'text', text: `Error: ${err.message}` }], isError: true };
379
382
  }
380
383
  });
384
+ server.tool(submitAgentFeedbackTool.name, submitAgentFeedbackTool.description, submitAgentFeedbackTool.inputSchema.shape, async (input) => {
385
+ try {
386
+ const text = await submitAgentFeedbackTool.execute(client, input);
387
+ return { content: [{ type: 'text', text }] };
388
+ }
389
+ catch (err) {
390
+ return { content: [{ type: 'text', text: `Error: ${err.message}` }], isError: true };
391
+ }
392
+ });
393
+ server.tool(validatePostTool.name, validatePostTool.description, validatePostTool.inputSchema.shape, async (input) => {
394
+ try {
395
+ const text = await validatePostTool.execute(client, input);
396
+ return { content: [{ type: 'text', text }] };
397
+ }
398
+ catch (err) {
399
+ return { content: [{ type: 'text', text: `Error: ${err.message}` }], isError: true };
400
+ }
401
+ });
381
402
  server.tool(createPostTool.name, createPostTool.description, createPostTool.inputSchema.shape, async (input) => {
382
403
  try {
383
404
  const text = await createPostTool.execute(client, input);
@@ -675,6 +696,15 @@ server.tool(listActivityTool.name, listActivityTool.description, listActivityToo
675
696
  return { content: [{ type: 'text', text: `Error: ${err.message}` }], isError: true };
676
697
  }
677
698
  });
699
+ server.tool(getUpdatesTool.name, getUpdatesTool.description, getUpdatesTool.inputSchema.shape, async (input) => {
700
+ try {
701
+ const text = await getUpdatesTool.execute(client, input);
702
+ return { content: [{ type: 'text', text }] };
703
+ }
704
+ catch (err) {
705
+ return { content: [{ type: 'text', text: `Error: ${err.message}` }], isError: true };
706
+ }
707
+ });
678
708
  server.tool(listWebhooksTool.name, listWebhooksTool.description, listWebhooksTool.inputSchema.shape, async (input) => {
679
709
  try {
680
710
  const text = await listWebhooksTool.execute(client, input);
@@ -182,6 +182,43 @@ export type CreatePostResponse = {
182
182
  resolved_from: 'explicit' | 'account' | 'personal';
183
183
  };
184
184
  };
185
+ export type ValidatePostResponse = {
186
+ dry_run: true;
187
+ valid: true;
188
+ normalized: {
189
+ account_id: number;
190
+ platform: string;
191
+ post_type: string;
192
+ scheduled_at: string;
193
+ workspace_id: string | null;
194
+ };
195
+ warnings: Array<{
196
+ code: string;
197
+ message: string;
198
+ }>;
199
+ would_create: {
200
+ status: string;
201
+ };
202
+ };
203
+ export type AgentFeedbackPayload = {
204
+ source: 'mcp' | 'cli' | 'rest' | 'skill';
205
+ tool: string;
206
+ outcome: 'success' | 'error' | 'abandoned';
207
+ error_code?: string;
208
+ client?: string;
209
+ comment?: string;
210
+ context?: {
211
+ request_id?: string;
212
+ http_status?: number;
213
+ latency_ms?: number;
214
+ attempt?: number;
215
+ };
216
+ };
217
+ export type AgentFeedbackResponse = {
218
+ accepted: true;
219
+ feedback_id: string;
220
+ request_id: string;
221
+ };
185
222
  export type BatchCreatePostsResponse = {
186
223
  posts: Array<CreatePostResponse & {
187
224
  index: number;
@@ -539,6 +576,22 @@ export interface ActivityResponse {
539
576
  total: number;
540
577
  limit: number;
541
578
  }
579
+ export interface UpdateEntry {
580
+ slug: string;
581
+ title: string;
582
+ date: string;
583
+ version: string;
584
+ summary: string;
585
+ type: string | null;
586
+ areas: string[];
587
+ url: string;
588
+ image?: string;
589
+ video?: string;
590
+ content?: string;
591
+ }
592
+ export interface UpdatesResponse {
593
+ updates: UpdateEntry[];
594
+ }
542
595
  export interface ApiWebhook {
543
596
  id: string;
544
597
  workspace_id: string | null;
@@ -830,6 +883,8 @@ export declare class PosterlyClient {
830
883
  total: number;
831
884
  }>;
832
885
  createPost(data: CreatePostPayload): Promise<CreatePostResponse>;
886
+ validatePost(data: CreatePostPayload): Promise<ValidatePostResponse>;
887
+ submitAgentFeedback(data: AgentFeedbackPayload): Promise<AgentFeedbackResponse>;
833
888
  createPostsBatch(data: {
834
889
  posts: CreatePostPayload[];
835
890
  }): Promise<BatchCreatePostsResponse>;
@@ -1006,6 +1061,11 @@ export declare class PosterlyClient {
1006
1061
  type?: 'all' | 'activity' | 'publish';
1007
1062
  limit?: number;
1008
1063
  }): Promise<ActivityResponse>;
1064
+ getUpdates(params?: {
1065
+ limit?: number;
1066
+ since?: string;
1067
+ include_content?: boolean;
1068
+ }): Promise<UpdatesResponse>;
1009
1069
  listWebhooks(params?: {
1010
1070
  workspace_id?: string;
1011
1071
  }): Promise<{
@@ -250,6 +250,12 @@ export class PosterlyClient {
250
250
  async createPost(data) {
251
251
  return this.request('POST', '/posts', data);
252
252
  }
253
+ async validatePost(data) {
254
+ return this.request('POST', '/posts', { ...data, dry_run: true });
255
+ }
256
+ async submitAgentFeedback(data) {
257
+ return this.request('POST', '/agent-feedback', data);
258
+ }
253
259
  async createPostsBatch(data) {
254
260
  return this.request('POST', '/posts/batch', data);
255
261
  }
@@ -416,6 +422,17 @@ export class PosterlyClient {
416
422
  const qs = searchParams.toString();
417
423
  return this.request('GET', `/activity${qs ? `?${qs}` : ''}`);
418
424
  }
425
+ async getUpdates(params) {
426
+ const searchParams = new URLSearchParams();
427
+ if (params?.limit)
428
+ searchParams.set('limit', String(params.limit));
429
+ if (params?.since)
430
+ searchParams.set('since', params.since);
431
+ if (params?.include_content)
432
+ searchParams.set('include_content', 'true');
433
+ const qs = searchParams.toString();
434
+ return this.request('GET', `/updates${qs ? `?${qs}` : ''}`);
435
+ }
419
436
  async listWebhooks(params) {
420
437
  const searchParams = new URLSearchParams();
421
438
  if (params?.workspace_id)
@@ -1 +1 @@
1
- export declare const POSTERLY_MCP_VERSION = "0.25.0";
1
+ export declare const POSTERLY_MCP_VERSION = "0.27.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.25.0';
8
+ export const POSTERLY_MCP_VERSION = '0.27.0';
@@ -9,12 +9,12 @@ export declare const createConnectSessionTool: {
9
9
  auto_start: z.ZodOptional<z.ZodBoolean>;
10
10
  debug: z.ZodOptional<z.ZodBoolean>;
11
11
  }, "strip", z.ZodTypeAny, {
12
- platform: "instagram" | "instagram-standalone" | "facebook" | "tiktok" | "twitter" | "threads" | "linkedin" | "youtube" | "pinterest" | "google_business" | "telegram" | "bluesky" | "discord" | "mastodon" | "devto" | "hashnode" | "wordpress" | "lemmy" | "reddit" | "medium" | "slack" | "skool" | "whop" | "gmb" | "google-business" | "google_business_profile" | "x" | "meta" | "linkedin_page" | "facebook_instagram" | "facebook_pages" | "instagram_direct" | "linkedin-company" | "linkedin-page" | "linkedin_company" | "linkedin_personal" | "meta_business" | "x_twitter";
12
+ platform: "instagram" | "instagram-standalone" | "facebook" | "tiktok" | "twitter" | "threads" | "linkedin" | "youtube" | "pinterest" | "google_business" | "telegram" | "bluesky" | "discord" | "slack" | "mastodon" | "devto" | "hashnode" | "wordpress" | "lemmy" | "reddit" | "medium" | "skool" | "whop" | "gmb" | "google-business" | "google_business_profile" | "x" | "meta" | "linkedin_page" | "facebook_instagram" | "facebook_pages" | "instagram_direct" | "linkedin-company" | "linkedin-page" | "linkedin_company" | "linkedin_personal" | "meta_business" | "x_twitter";
13
13
  workspace_id?: string | undefined;
14
14
  auto_start?: boolean | undefined;
15
15
  debug?: boolean | undefined;
16
16
  }, {
17
- platform: "instagram" | "instagram-standalone" | "facebook" | "tiktok" | "twitter" | "threads" | "linkedin" | "youtube" | "pinterest" | "google_business" | "telegram" | "bluesky" | "discord" | "mastodon" | "devto" | "hashnode" | "wordpress" | "lemmy" | "reddit" | "medium" | "slack" | "skool" | "whop" | "gmb" | "google-business" | "google_business_profile" | "x" | "meta" | "linkedin_page" | "facebook_instagram" | "facebook_pages" | "instagram_direct" | "linkedin-company" | "linkedin-page" | "linkedin_company" | "linkedin_personal" | "meta_business" | "x_twitter";
17
+ platform: "instagram" | "instagram-standalone" | "facebook" | "tiktok" | "twitter" | "threads" | "linkedin" | "youtube" | "pinterest" | "google_business" | "telegram" | "bluesky" | "discord" | "slack" | "mastodon" | "devto" | "hashnode" | "wordpress" | "lemmy" | "reddit" | "medium" | "skool" | "whop" | "gmb" | "google-business" | "google_business_profile" | "x" | "meta" | "linkedin_page" | "facebook_instagram" | "facebook_pages" | "instagram_direct" | "linkedin-company" | "linkedin-page" | "linkedin_company" | "linkedin_personal" | "meta_business" | "x_twitter";
18
18
  workspace_id?: string | undefined;
19
19
  auto_start?: boolean | undefined;
20
20
  debug?: boolean | undefined;