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.
- package/README.md +19 -3
- package/dist/generated/platform-manifest.d.ts +24 -24
- package/dist/generated/platform-manifest.js +30 -24
- package/dist/index.js +30 -0
- package/dist/lib/api-client.d.ts +60 -0
- package/dist/lib/api-client.js +17 -0
- package/dist/lib/version.d.ts +1 -1
- package/dist/lib/version.js +1 -1
- package/dist/tools/create-connect-session.d.ts +2 -2
- package/dist/tools/create-post.d.ts +45 -45
- package/dist/tools/create-post.js +7 -7
- package/dist/tools/create-posts-batch.d.ts +19 -19
- package/dist/tools/get-connect-link.d.ts +2 -2
- package/dist/tools/get-platform-schema.d.ts +2 -2
- package/dist/tools/get-updates.d.ts +24 -0
- package/dist/tools/get-updates.js +29 -0
- package/dist/tools/list-posts.d.ts +3 -3
- package/dist/tools/reply-google-business-review.d.ts +2 -2
- package/dist/tools/submit-agent-feedback.d.ts +108 -0
- package/dist/tools/submit-agent-feedback.js +32 -0
- package/dist/tools/trigger-platform-helper.d.ts +3 -3
- package/dist/tools/trigger-platform-helper.js +1 -1
- package/dist/tools/update-post.d.ts +16 -16
- package/dist/tools/update-post.js +7 -7
- package/dist/tools/validate-post.d.ts +1080 -0
- package/dist/tools/validate-post.js +28 -0
- package/package.json +3 -2
- package/server.json +38 -0
- package/src/generated/platform-manifest.ts +30 -24
- package/src/index.ts +45 -0
- package/src/lib/api-client.ts +74 -0
- package/src/lib/version.ts +1 -1
- package/src/tools/create-post.ts +7 -7
- package/src/tools/get-updates.ts +41 -0
- package/src/tools/submit-agent-feedback.ts +47 -0
- package/src/tools/trigger-platform-helper.ts +1 -1
- package/src/tools/update-post.ts +7 -7
- 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.
|
|
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
|
|
244
|
-
- works across all
|
|
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", "
|
|
5
|
-
readonly allPlatformIds: readonly ["instagram", "facebook", "tiktok", "twitter", "linkedin", "youtube", "pinterest", "threads", "google_business", "telegram", "bluesky", "discord", "mastodon", "devto", "hashnode", "wordpress", "lemmy", "reddit", "medium", "
|
|
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", "
|
|
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", "
|
|
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", "
|
|
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", "
|
|
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", "
|
|
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", "
|
|
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", "
|
|
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);
|
package/dist/lib/api-client.d.ts
CHANGED
|
@@ -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<{
|
package/dist/lib/api-client.js
CHANGED
|
@@ -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)
|
package/dist/lib/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const POSTERLY_MCP_VERSION = "0.
|
|
1
|
+
export declare const POSTERLY_MCP_VERSION = "0.27.0";
|
package/dist/lib/version.js
CHANGED
|
@@ -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.
|
|
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" | "
|
|
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" | "
|
|
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;
|