posterly-mcp-server 0.50.5 → 0.51.1

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
@@ -123,7 +123,7 @@ Add the same server definition to your Cursor MCP settings:
123
123
 
124
124
  ## Available tools
125
125
 
126
- `posterly-mcp-server@0.50.5` exposes 64 tools covering 100 actions. The hosted HTTP endpoint exposes the same catalog minus the three signup tools: 61 tools covering 97 actions.
126
+ `posterly-mcp-server@0.51.1` exposes 64 tools covering 100 actions. The hosted HTTP endpoint exposes the same catalog minus the three signup tools: 61 tools covering 97 actions.
127
127
 
128
128
  Many tools pick what to do with one parameter: `view` (reads), `action` (writes), or `type`. A few pick their mode from which parameters you pass (for example `update_post` with `status` changes the status instead of editing). Every tool description names all of its views and actions.
129
129
 
@@ -154,10 +154,20 @@ export interface ApiPostApproval {
154
154
  requested_at: string | null;
155
155
  completed_at: string | null;
156
156
  }
157
+ /** Who or what created a post. Any field is null when it was never recorded. */
158
+ export interface ApiPostCreator {
159
+ user_id: string | null;
160
+ name: string | null;
161
+ source: string | null;
162
+ source_label: string | null;
163
+ }
157
164
  export interface Post {
158
165
  id: number;
159
166
  content: string;
160
167
  scheduled_at: string;
168
+ created_at?: string | null;
169
+ updated_at?: string | null;
170
+ created_by?: ApiPostCreator | null;
161
171
  social_account_id: string;
162
172
  media_url?: string;
163
173
  media_urls?: string[];
@@ -68,6 +68,10 @@ export declare function formatCalendarDay(day: string): string;
68
68
  * day before); anything else reads as "from X up to Y".
69
69
  */
70
70
  export declare function formatPostRange(range: PostListRange): string;
71
+ /** ISO 8601 in UTC to the second ("2026-10-07T07:32:54Z"); "unknown" when missing. */
72
+ export declare function formatIsoTimestamp(value: string | null | undefined): string;
73
+ /** "Georgia via Dashboard"; whichever half was never recorded reads as unknown. */
74
+ export declare function formatPostCreator(creator: Post['created_by']): string;
71
75
  /**
72
76
  * One page of list_posts. Always says whether every matching post is shown,
73
77
  * and when it is not, exactly which offset to call next, so an agent never
@@ -304,6 +304,27 @@ export function formatPostRange(range) {
304
304
  const to = range.to ? `up to ${formatDateTimeInZone(range.to, tz)}` : '';
305
305
  return `${[from, to].filter(Boolean).join(' ')} (${tz})`;
306
306
  }
307
+ /** ISO 8601 in UTC to the second ("2026-10-07T07:32:54Z"); "unknown" when missing. */
308
+ export function formatIsoTimestamp(value) {
309
+ if (!value)
310
+ return 'unknown';
311
+ const date = new Date(value);
312
+ if (Number.isNaN(date.getTime()))
313
+ return value;
314
+ return date.toISOString().replace(/\.\d{3}Z$/, 'Z');
315
+ }
316
+ /** "Georgia via Dashboard"; whichever half was never recorded reads as unknown. */
317
+ export function formatPostCreator(creator) {
318
+ const who = creator?.name || (creator?.user_id ? `user ${creator.user_id}` : null);
319
+ const via = creator?.source_label || null;
320
+ if (who && via)
321
+ return `${who} via ${via}`;
322
+ if (who)
323
+ return `${who} (source unknown)`;
324
+ if (via)
325
+ return `via ${via} (account unknown)`;
326
+ return 'unknown';
327
+ }
307
328
  function approvalCell(post) {
308
329
  if (!post.approval || post.approval.status === 'none')
309
330
  return 'none';
@@ -340,7 +361,7 @@ export function formatPostListPage(data, options) {
340
361
  : first === 1
341
362
  ? `**Complete: all ${total} matching posts are shown.**`
342
363
  : `**Complete: this is the last page (posts ${first}-${last} of ${total}).**`;
343
- const table = mdTable(['Status', 'Post ID', `Scheduled (${tz})`, 'Type', 'Account ID', 'Brand ID', 'Approval', 'Caption'],
364
+ const table = mdTable(['Status', 'Post ID', `Scheduled (${tz})`, 'Type', 'Account ID', 'Brand ID', 'Approval', 'Created', 'Created by', 'Caption'],
344
365
  // The API post row carries account and brand IDs only (no joined names);
345
366
  // list_accounts and list_brands, or view=counts, resolve them.
346
367
  posts.map((post) => [
@@ -351,6 +372,8 @@ export function formatPostListPage(data, options) {
351
372
  post.social_account_id != null ? String(post.social_account_id) : 'n/a',
352
373
  post.brand_id || 'none',
353
374
  approvalCell(post),
375
+ formatIsoTimestamp(post.created_at),
376
+ formatPostCreator(post.created_by),
354
377
  compactText(post.content, 80) || '(empty)',
355
378
  ]));
356
379
  return [
@@ -1 +1 @@
1
- export declare const POSTERLY_MCP_VERSION = "0.50.5";
1
+ export declare const POSTERLY_MCP_VERSION = "0.51.1";
@@ -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.50.5';
8
+ export const POSTERLY_MCP_VERSION = '0.51.1';
@@ -265,6 +265,16 @@ export declare const platformSettingsSchema: z.ZodObject<{
265
265
  question?: string | undefined;
266
266
  allows_multiple_answers?: boolean | undefined;
267
267
  }>>;
268
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
269
+ title: z.ZodString;
270
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
271
+ }, "strip", z.ZodTypeAny, {
272
+ title: string;
273
+ cover?: "none" | "first_image" | undefined;
274
+ }, {
275
+ title: string;
276
+ cover?: "none" | "first_image" | undefined;
277
+ }>>>;
268
278
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
269
279
  topic_tag: z.ZodOptional<z.ZodString>;
270
280
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -404,6 +414,16 @@ export declare const platformSettingsSchema: z.ZodObject<{
404
414
  question?: string | undefined;
405
415
  allows_multiple_answers?: boolean | undefined;
406
416
  }>>;
417
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
418
+ title: z.ZodString;
419
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
420
+ }, "strip", z.ZodTypeAny, {
421
+ title: string;
422
+ cover?: "none" | "first_image" | undefined;
423
+ }, {
424
+ title: string;
425
+ cover?: "none" | "first_image" | undefined;
426
+ }>>>;
407
427
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
408
428
  topic_tag: z.ZodOptional<z.ZodString>;
409
429
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -543,6 +563,16 @@ export declare const platformSettingsSchema: z.ZodObject<{
543
563
  question?: string | undefined;
544
564
  allows_multiple_answers?: boolean | undefined;
545
565
  }>>;
566
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
567
+ title: z.ZodString;
568
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
569
+ }, "strip", z.ZodTypeAny, {
570
+ title: string;
571
+ cover?: "none" | "first_image" | undefined;
572
+ }, {
573
+ title: string;
574
+ cover?: "none" | "first_image" | undefined;
575
+ }>>>;
546
576
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
547
577
  topic_tag: z.ZodOptional<z.ZodString>;
548
578
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -915,6 +945,16 @@ export declare const createPostPayloadInputSchema: z.ZodObject<{
915
945
  question?: string | undefined;
916
946
  allows_multiple_answers?: boolean | undefined;
917
947
  }>>;
948
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
949
+ title: z.ZodString;
950
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
951
+ }, "strip", z.ZodTypeAny, {
952
+ title: string;
953
+ cover?: "none" | "first_image" | undefined;
954
+ }, {
955
+ title: string;
956
+ cover?: "none" | "first_image" | undefined;
957
+ }>>>;
918
958
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
919
959
  topic_tag: z.ZodOptional<z.ZodString>;
920
960
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -1054,6 +1094,16 @@ export declare const createPostPayloadInputSchema: z.ZodObject<{
1054
1094
  question?: string | undefined;
1055
1095
  allows_multiple_answers?: boolean | undefined;
1056
1096
  }>>;
1097
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
1098
+ title: z.ZodString;
1099
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
1100
+ }, "strip", z.ZodTypeAny, {
1101
+ title: string;
1102
+ cover?: "none" | "first_image" | undefined;
1103
+ }, {
1104
+ title: string;
1105
+ cover?: "none" | "first_image" | undefined;
1106
+ }>>>;
1057
1107
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
1058
1108
  topic_tag: z.ZodOptional<z.ZodString>;
1059
1109
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -1193,6 +1243,16 @@ export declare const createPostPayloadInputSchema: z.ZodObject<{
1193
1243
  question?: string | undefined;
1194
1244
  allows_multiple_answers?: boolean | undefined;
1195
1245
  }>>;
1246
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
1247
+ title: z.ZodString;
1248
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
1249
+ }, "strip", z.ZodTypeAny, {
1250
+ title: string;
1251
+ cover?: "none" | "first_image" | undefined;
1252
+ }, {
1253
+ title: string;
1254
+ cover?: "none" | "first_image" | undefined;
1255
+ }>>>;
1196
1256
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
1197
1257
  topic_tag: z.ZodOptional<z.ZodString>;
1198
1258
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -1395,6 +1455,16 @@ export declare const createPostPayloadInputSchema: z.ZodObject<{
1395
1455
  question?: string | undefined;
1396
1456
  allows_multiple_answers?: boolean | undefined;
1397
1457
  }>>;
1458
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
1459
+ title: z.ZodString;
1460
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
1461
+ }, "strip", z.ZodTypeAny, {
1462
+ title: string;
1463
+ cover?: "none" | "first_image" | undefined;
1464
+ }, {
1465
+ title: string;
1466
+ cover?: "none" | "first_image" | undefined;
1467
+ }>>>;
1398
1468
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
1399
1469
  topic_tag: z.ZodOptional<z.ZodString>;
1400
1470
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -1596,6 +1666,16 @@ export declare const createPostPayloadInputSchema: z.ZodObject<{
1596
1666
  question?: string | undefined;
1597
1667
  allows_multiple_answers?: boolean | undefined;
1598
1668
  }>>;
1669
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
1670
+ title: z.ZodString;
1671
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
1672
+ }, "strip", z.ZodTypeAny, {
1673
+ title: string;
1674
+ cover?: "none" | "first_image" | undefined;
1675
+ }, {
1676
+ title: string;
1677
+ cover?: "none" | "first_image" | undefined;
1678
+ }>>>;
1599
1679
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
1600
1680
  topic_tag: z.ZodOptional<z.ZodString>;
1601
1681
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -1969,6 +2049,16 @@ export declare const createPostInputSchema: z.ZodObject<{
1969
2049
  question?: string | undefined;
1970
2050
  allows_multiple_answers?: boolean | undefined;
1971
2051
  }>>;
2052
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
2053
+ title: z.ZodString;
2054
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
2055
+ }, "strip", z.ZodTypeAny, {
2056
+ title: string;
2057
+ cover?: "none" | "first_image" | undefined;
2058
+ }, {
2059
+ title: string;
2060
+ cover?: "none" | "first_image" | undefined;
2061
+ }>>>;
1972
2062
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
1973
2063
  topic_tag: z.ZodOptional<z.ZodString>;
1974
2064
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -2108,6 +2198,16 @@ export declare const createPostInputSchema: z.ZodObject<{
2108
2198
  question?: string | undefined;
2109
2199
  allows_multiple_answers?: boolean | undefined;
2110
2200
  }>>;
2201
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
2202
+ title: z.ZodString;
2203
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
2204
+ }, "strip", z.ZodTypeAny, {
2205
+ title: string;
2206
+ cover?: "none" | "first_image" | undefined;
2207
+ }, {
2208
+ title: string;
2209
+ cover?: "none" | "first_image" | undefined;
2210
+ }>>>;
2111
2211
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
2112
2212
  topic_tag: z.ZodOptional<z.ZodString>;
2113
2213
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -2247,6 +2347,16 @@ export declare const createPostInputSchema: z.ZodObject<{
2247
2347
  question?: string | undefined;
2248
2348
  allows_multiple_answers?: boolean | undefined;
2249
2349
  }>>;
2350
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
2351
+ title: z.ZodString;
2352
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
2353
+ }, "strip", z.ZodTypeAny, {
2354
+ title: string;
2355
+ cover?: "none" | "first_image" | undefined;
2356
+ }, {
2357
+ title: string;
2358
+ cover?: "none" | "first_image" | undefined;
2359
+ }>>>;
2250
2360
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
2251
2361
  topic_tag: z.ZodOptional<z.ZodString>;
2252
2362
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -2452,6 +2562,16 @@ export declare const createPostInputSchema: z.ZodObject<{
2452
2562
  question?: string | undefined;
2453
2563
  allows_multiple_answers?: boolean | undefined;
2454
2564
  }>>;
2565
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
2566
+ title: z.ZodString;
2567
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
2568
+ }, "strip", z.ZodTypeAny, {
2569
+ title: string;
2570
+ cover?: "none" | "first_image" | undefined;
2571
+ }, {
2572
+ title: string;
2573
+ cover?: "none" | "first_image" | undefined;
2574
+ }>>>;
2455
2575
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
2456
2576
  topic_tag: z.ZodOptional<z.ZodString>;
2457
2577
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -2654,6 +2774,16 @@ export declare const createPostInputSchema: z.ZodObject<{
2654
2774
  question?: string | undefined;
2655
2775
  allows_multiple_answers?: boolean | undefined;
2656
2776
  }>>;
2777
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
2778
+ title: z.ZodString;
2779
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
2780
+ }, "strip", z.ZodTypeAny, {
2781
+ title: string;
2782
+ cover?: "none" | "first_image" | undefined;
2783
+ }, {
2784
+ title: string;
2785
+ cover?: "none" | "first_image" | undefined;
2786
+ }>>>;
2657
2787
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
2658
2788
  topic_tag: z.ZodOptional<z.ZodString>;
2659
2789
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -3056,6 +3186,16 @@ export declare const createPostTool: {
3056
3186
  question?: string | undefined;
3057
3187
  allows_multiple_answers?: boolean | undefined;
3058
3188
  }>>;
3189
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
3190
+ title: z.ZodString;
3191
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
3192
+ }, "strip", z.ZodTypeAny, {
3193
+ title: string;
3194
+ cover?: "none" | "first_image" | undefined;
3195
+ }, {
3196
+ title: string;
3197
+ cover?: "none" | "first_image" | undefined;
3198
+ }>>>;
3059
3199
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
3060
3200
  topic_tag: z.ZodOptional<z.ZodString>;
3061
3201
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -3195,6 +3335,16 @@ export declare const createPostTool: {
3195
3335
  question?: string | undefined;
3196
3336
  allows_multiple_answers?: boolean | undefined;
3197
3337
  }>>;
3338
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
3339
+ title: z.ZodString;
3340
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
3341
+ }, "strip", z.ZodTypeAny, {
3342
+ title: string;
3343
+ cover?: "none" | "first_image" | undefined;
3344
+ }, {
3345
+ title: string;
3346
+ cover?: "none" | "first_image" | undefined;
3347
+ }>>>;
3198
3348
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
3199
3349
  topic_tag: z.ZodOptional<z.ZodString>;
3200
3350
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -3334,6 +3484,16 @@ export declare const createPostTool: {
3334
3484
  question?: string | undefined;
3335
3485
  allows_multiple_answers?: boolean | undefined;
3336
3486
  }>>;
3487
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
3488
+ title: z.ZodString;
3489
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
3490
+ }, "strip", z.ZodTypeAny, {
3491
+ title: string;
3492
+ cover?: "none" | "first_image" | undefined;
3493
+ }, {
3494
+ title: string;
3495
+ cover?: "none" | "first_image" | undefined;
3496
+ }>>>;
3337
3497
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
3338
3498
  topic_tag: z.ZodOptional<z.ZodString>;
3339
3499
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -3539,6 +3699,16 @@ export declare const createPostTool: {
3539
3699
  question?: string | undefined;
3540
3700
  allows_multiple_answers?: boolean | undefined;
3541
3701
  }>>;
3702
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
3703
+ title: z.ZodString;
3704
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
3705
+ }, "strip", z.ZodTypeAny, {
3706
+ title: string;
3707
+ cover?: "none" | "first_image" | undefined;
3708
+ }, {
3709
+ title: string;
3710
+ cover?: "none" | "first_image" | undefined;
3711
+ }>>>;
3542
3712
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
3543
3713
  topic_tag: z.ZodOptional<z.ZodString>;
3544
3714
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -3741,6 +3911,16 @@ export declare const createPostTool: {
3741
3911
  question?: string | undefined;
3742
3912
  allows_multiple_answers?: boolean | undefined;
3743
3913
  }>>;
3914
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
3915
+ title: z.ZodString;
3916
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
3917
+ }, "strip", z.ZodTypeAny, {
3918
+ title: string;
3919
+ cover?: "none" | "first_image" | undefined;
3920
+ }, {
3921
+ title: string;
3922
+ cover?: "none" | "first_image" | undefined;
3923
+ }>>>;
3744
3924
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
3745
3925
  topic_tag: z.ZodOptional<z.ZodString>;
3746
3926
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -71,6 +71,10 @@ export const platformSettingsSchema = z.object({
71
71
  duration: z.enum(['ONE_DAY', 'THREE_DAYS', 'SEVEN_DAYS', 'FOURTEEN_DAYS']).optional(), // LinkedIn poll length
72
72
  allows_multiple_answers: z.boolean().optional(), // Telegram poll: allow multiple selections
73
73
  }).optional(),
74
+ article: z.object({
75
+ title: z.string(), // X Article title (required)
76
+ cover: z.enum(['first_image', 'none']).optional(), // Use the first attached image as the cover (default) or none
77
+ }).nullable().optional(), // X Article (needs X Premium): the caption is the Markdown body. null turns Article mode off
74
78
  // Threads
75
79
  reply_control: z.enum(['everyone', 'accounts_you_follow', 'mentioned_only', 'followers_only', 'parent_post_author_only']).optional(),
76
80
  topic_tag: z.string().optional(), // Threads single discovery topic tag
@@ -322,6 +326,7 @@ export const createPostTool = {
322
326
  'Provide either account_id OR username+platform to identify the account. If scheduled_at is omitted, the post publishes immediately. If workspace_id is omitted, the server resolves one from the social account, falling back to the caller\'s default (personal) workspace - pass workspace_id explicitly if the user has more than one workspace.\n\n' +
323
327
  'MEDIA URLS: Posterly storage URLs are used as-is. Third-party HTTP(S) media URLs are copied into posterly storage before the post is saved, so API-created posts do not later fail on expired signed URLs. Short-lived signed URLs must still be live when this tool runs. You can also call `upload_media` with `url` first if you want to upload once and reuse the returned posterly URL across posts.\n\n' +
324
328
  'THREADS: Pass `thread_posts` (an array of 2+ strings) to schedule a multi-post thread on X (Twitter) or Threads (Meta). The first entry is the lead post; the rest are published as replies in the same chain. X entries are capped at 280 characters each (4000 for verified, 25000 for organization accounts); Threads entries are capped at 500 characters each. When `thread_posts` is set, `caption` is ignored.\n\n' +
329
+ 'X ARTICLES: To publish on X as a long-form Article, pass `platform_settings.article` ({ title, cover?: "first_image" | "none" }) for an X account. The caption becomes the Article body and is written as Markdown (headings, bold, italic, lists, quotes, code blocks, tables, dividers). Reference attached images with `![caption](media:1)`. Needs an X Premium account; polls, threads, paid partnership, video, and GIFs are not allowed with an Article.\n\n' +
325
330
  'PLATFORM SETTINGS: Pass `platform_settings` for composer-equivalent controls: Facebook story/reel/backgrounds, YouTube title/privacy/thumbnail/brandPartner, LinkedIn document titles/mentions/polls/content_call_to_action_label (including BUY_NOW and SHOP_NOW), TikTok direct-post privacy/toggles/commercial disclosure, Pinterest board/title/link/product_tags, GBP event/offer/CTA/recurrence, X reply settings/polls/paid_partnership, Threads reply controls/text attachments/ghost posts/spoilers/reply approvals/GIPHY, Telegram polls/buttons/video cover/live photo, Slack markdown/blocks, Mastodon visibility/quote/poll (media+poll allowed), and Instagram feed/story/reel/carousel/native media tags/collaborators/first comments/trial Reels/is_ai_generated/audio_id/caption add-ons. Instagram caption add-ons (`caption_addon`, or `poll_attachment` / `is_comment_prompt_used`) need a Facebook Login account, a non-empty caption, and a feed photo, Reel, or carousel parent. Stories are rejected. A poll and a comment prompt cannot be combined. For Instagram, @username in caption is only a caption mention; `user_tags` creates native media tags and `collaborators` sends co-author invitations only when the selected Meta-linked account reports those capabilities. Call `list_platforms` with `view: "schema"` and the account ID first. `instagram_settings` remains as a backwards-compatible alias.\n\n' +
326
331
  'TIKTOK MEDIA: TikTok supports a single video or a photo slideshow of 1 to 35 images, never multiple videos. Image media auto-detects as a slideshow, so you usually do not set post_type or media_type for photos and every image is posted. Pass `platform_settings.media_type: "PHOTO"` to force a slideshow explicitly.',
327
332
  inputSchema: createPostInputSchema,
@@ -280,6 +280,16 @@ export declare const createPostsBatchTool: {
280
280
  question?: string | undefined;
281
281
  allows_multiple_answers?: boolean | undefined;
282
282
  }>>;
283
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
284
+ title: z.ZodString;
285
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
286
+ }, "strip", z.ZodTypeAny, {
287
+ title: string;
288
+ cover?: "none" | "first_image" | undefined;
289
+ }, {
290
+ title: string;
291
+ cover?: "none" | "first_image" | undefined;
292
+ }>>>;
283
293
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
284
294
  topic_tag: z.ZodOptional<z.ZodString>;
285
295
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -419,6 +429,16 @@ export declare const createPostsBatchTool: {
419
429
  question?: string | undefined;
420
430
  allows_multiple_answers?: boolean | undefined;
421
431
  }>>;
432
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
433
+ title: z.ZodString;
434
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
435
+ }, "strip", z.ZodTypeAny, {
436
+ title: string;
437
+ cover?: "none" | "first_image" | undefined;
438
+ }, {
439
+ title: string;
440
+ cover?: "none" | "first_image" | undefined;
441
+ }>>>;
422
442
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
423
443
  topic_tag: z.ZodOptional<z.ZodString>;
424
444
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -558,6 +578,16 @@ export declare const createPostsBatchTool: {
558
578
  question?: string | undefined;
559
579
  allows_multiple_answers?: boolean | undefined;
560
580
  }>>;
581
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
582
+ title: z.ZodString;
583
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
584
+ }, "strip", z.ZodTypeAny, {
585
+ title: string;
586
+ cover?: "none" | "first_image" | undefined;
587
+ }, {
588
+ title: string;
589
+ cover?: "none" | "first_image" | undefined;
590
+ }>>>;
561
591
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
562
592
  topic_tag: z.ZodOptional<z.ZodString>;
563
593
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -760,6 +790,16 @@ export declare const createPostsBatchTool: {
760
790
  question?: string | undefined;
761
791
  allows_multiple_answers?: boolean | undefined;
762
792
  }>>;
793
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
794
+ title: z.ZodString;
795
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
796
+ }, "strip", z.ZodTypeAny, {
797
+ title: string;
798
+ cover?: "none" | "first_image" | undefined;
799
+ }, {
800
+ title: string;
801
+ cover?: "none" | "first_image" | undefined;
802
+ }>>>;
763
803
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
764
804
  topic_tag: z.ZodOptional<z.ZodString>;
765
805
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -961,6 +1001,16 @@ export declare const createPostsBatchTool: {
961
1001
  question?: string | undefined;
962
1002
  allows_multiple_answers?: boolean | undefined;
963
1003
  }>>;
1004
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
1005
+ title: z.ZodString;
1006
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
1007
+ }, "strip", z.ZodTypeAny, {
1008
+ title: string;
1009
+ cover?: "none" | "first_image" | undefined;
1010
+ }, {
1011
+ title: string;
1012
+ cover?: "none" | "first_image" | undefined;
1013
+ }>>>;
964
1014
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
965
1015
  topic_tag: z.ZodOptional<z.ZodString>;
966
1016
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -1166,6 +1216,16 @@ export declare const createPostsBatchTool: {
1166
1216
  question?: string | undefined;
1167
1217
  allows_multiple_answers?: boolean | undefined;
1168
1218
  }>>;
1219
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
1220
+ title: z.ZodString;
1221
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
1222
+ }, "strip", z.ZodTypeAny, {
1223
+ title: string;
1224
+ cover?: "none" | "first_image" | undefined;
1225
+ }, {
1226
+ title: string;
1227
+ cover?: "none" | "first_image" | undefined;
1228
+ }>>>;
1169
1229
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
1170
1230
  topic_tag: z.ZodOptional<z.ZodString>;
1171
1231
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -1370,6 +1430,16 @@ export declare const createPostsBatchTool: {
1370
1430
  question?: string | undefined;
1371
1431
  allows_multiple_answers?: boolean | undefined;
1372
1432
  }>>;
1433
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
1434
+ title: z.ZodString;
1435
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
1436
+ }, "strip", z.ZodTypeAny, {
1437
+ title: string;
1438
+ cover?: "none" | "first_image" | undefined;
1439
+ }, {
1440
+ title: string;
1441
+ cover?: "none" | "first_image" | undefined;
1442
+ }>>>;
1373
1443
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
1374
1444
  topic_tag: z.ZodOptional<z.ZodString>;
1375
1445
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -1,9 +1,9 @@
1
1
  import { z } from 'zod';
2
- import { dashboardUrlForPost, formatLocalDateTime } from '../lib/format.js';
2
+ import { dashboardUrlForPost, formatIsoTimestamp, formatLocalDateTime, formatPostCreator } from '../lib/format.js';
3
3
  import { validateArgs } from '../lib/tool-runtime.js';
4
4
  export const getPostTool = {
5
5
  name: 'get_post',
6
- description: 'One post by ID. view=post (default): caption, status, scheduled time, media, and platform info. view=missing: whether the post is missing required content, media, account, platform settings, or metadata before it can publish; use it to repair failed or imported posts.',
6
+ description: 'One post by ID. view=post (default): caption, status, scheduled time, when it was created and by whom (account and channel, such as dashboard, API, or MCP), media, and platform info. view=missing: whether the post is missing required content, media, account, platform settings, or metadata before it can publish; use it to repair failed or imported posts.',
7
7
  inputSchema: z.object({
8
8
  post_id: z.number().describe('The post ID to look up'),
9
9
  view: z.enum(['post', 'missing']).optional().describe('post (default) or missing.'),
@@ -28,8 +28,14 @@ async function post(client, input) {
28
28
  `• Caption: ${p.content || '(empty)'}`,
29
29
  `• Type: ${p.post_type || 'unknown'}`,
30
30
  `• Scheduled: ${formatLocalDateTime(p.scheduled_at)}`,
31
- `• View in posterly: ${dashboardUrlForPost({ id: p.id, scheduled_at: p.scheduled_at })}`,
32
31
  ];
32
+ if ('created_at' in p)
33
+ lines.push(`• Created: ${formatIsoTimestamp(p.created_at)}`);
34
+ if ('created_by' in p)
35
+ lines.push(`• Created by: ${formatPostCreator(p.created_by)}`);
36
+ if ('updated_at' in p)
37
+ lines.push(`• Last updated: ${formatIsoTimestamp(p.updated_at)}`);
38
+ lines.push(`• View in posterly: ${dashboardUrlForPost({ id: p.id, scheduled_at: p.scheduled_at })}`);
33
39
  if (p.platform_post_url)
34
40
  lines.push(`• Published URL: ${p.platform_post_url}`);
35
41
  if (p.media_url)
@@ -40,7 +40,7 @@ export const manageGoogleBusinessMediaTool = {
40
40
  workspace_id: z.string().optional().describe('Filter to a workspace ID from whoami.'),
41
41
  account_id: z.number().int().positive().optional().describe('Google Business account ID from list_accounts.'),
42
42
  location_id: z.string().optional().describe(LOCATION_ID_DESCRIPTION),
43
- source_url: z.string().url().optional().describe('add: public https URL of the photo or video (from upload_media).'),
43
+ source_url: z.string().url().optional().describe('add: public https URL of the photo or video (from upload_media). Photos must be JPG or PNG, 10 KB to 5 MB.'),
44
44
  category: z.enum(CATEGORIES).optional().describe('add: which gallery category to add the media to.'),
45
45
  media_format: z.enum(['PHOTO', 'VIDEO']).optional().describe('add: defaults to PHOTO. Use VIDEO for videos (Google caps profile videos at 30s / 75MB).'),
46
46
  media_name: z.string().min(1).optional().describe('delete: full media resource name from list_google_business_media (accounts/.../locations/.../media/...).'),
@@ -270,6 +270,16 @@ declare const platformSettingsSchema: z.ZodObject<{
270
270
  question?: string | undefined;
271
271
  allows_multiple_answers?: boolean | undefined;
272
272
  }>>;
273
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
274
+ title: z.ZodString;
275
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
276
+ }, "strip", z.ZodTypeAny, {
277
+ title: string;
278
+ cover?: "none" | "first_image" | undefined;
279
+ }, {
280
+ title: string;
281
+ cover?: "none" | "first_image" | undefined;
282
+ }>>>;
273
283
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
274
284
  topic_tag: z.ZodOptional<z.ZodString>;
275
285
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -409,6 +419,16 @@ declare const platformSettingsSchema: z.ZodObject<{
409
419
  question?: string | undefined;
410
420
  allows_multiple_answers?: boolean | undefined;
411
421
  }>>;
422
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
423
+ title: z.ZodString;
424
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
425
+ }, "strip", z.ZodTypeAny, {
426
+ title: string;
427
+ cover?: "none" | "first_image" | undefined;
428
+ }, {
429
+ title: string;
430
+ cover?: "none" | "first_image" | undefined;
431
+ }>>>;
412
432
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
413
433
  topic_tag: z.ZodOptional<z.ZodString>;
414
434
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -548,6 +568,16 @@ declare const platformSettingsSchema: z.ZodObject<{
548
568
  question?: string | undefined;
549
569
  allows_multiple_answers?: boolean | undefined;
550
570
  }>>;
571
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
572
+ title: z.ZodString;
573
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
574
+ }, "strip", z.ZodTypeAny, {
575
+ title: string;
576
+ cover?: "none" | "first_image" | undefined;
577
+ }, {
578
+ title: string;
579
+ cover?: "none" | "first_image" | undefined;
580
+ }>>>;
551
581
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
552
582
  topic_tag: z.ZodOptional<z.ZodString>;
553
583
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -945,6 +975,16 @@ export declare const updatePostTool: {
945
975
  question?: string | undefined;
946
976
  allows_multiple_answers?: boolean | undefined;
947
977
  }>>;
978
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
979
+ title: z.ZodString;
980
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
981
+ }, "strip", z.ZodTypeAny, {
982
+ title: string;
983
+ cover?: "none" | "first_image" | undefined;
984
+ }, {
985
+ title: string;
986
+ cover?: "none" | "first_image" | undefined;
987
+ }>>>;
948
988
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
949
989
  topic_tag: z.ZodOptional<z.ZodString>;
950
990
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -1084,6 +1124,16 @@ export declare const updatePostTool: {
1084
1124
  question?: string | undefined;
1085
1125
  allows_multiple_answers?: boolean | undefined;
1086
1126
  }>>;
1127
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
1128
+ title: z.ZodString;
1129
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
1130
+ }, "strip", z.ZodTypeAny, {
1131
+ title: string;
1132
+ cover?: "none" | "first_image" | undefined;
1133
+ }, {
1134
+ title: string;
1135
+ cover?: "none" | "first_image" | undefined;
1136
+ }>>>;
1087
1137
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
1088
1138
  topic_tag: z.ZodOptional<z.ZodString>;
1089
1139
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -1223,6 +1273,16 @@ export declare const updatePostTool: {
1223
1273
  question?: string | undefined;
1224
1274
  allows_multiple_answers?: boolean | undefined;
1225
1275
  }>>;
1276
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
1277
+ title: z.ZodString;
1278
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
1279
+ }, "strip", z.ZodTypeAny, {
1280
+ title: string;
1281
+ cover?: "none" | "first_image" | undefined;
1282
+ }, {
1283
+ title: string;
1284
+ cover?: "none" | "first_image" | undefined;
1285
+ }>>>;
1226
1286
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
1227
1287
  topic_tag: z.ZodOptional<z.ZodString>;
1228
1288
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -1433,6 +1493,16 @@ export declare const updatePostTool: {
1433
1493
  question?: string | undefined;
1434
1494
  allows_multiple_answers?: boolean | undefined;
1435
1495
  }>>;
1496
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
1497
+ title: z.ZodString;
1498
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
1499
+ }, "strip", z.ZodTypeAny, {
1500
+ title: string;
1501
+ cover?: "none" | "first_image" | undefined;
1502
+ }, {
1503
+ title: string;
1504
+ cover?: "none" | "first_image" | undefined;
1505
+ }>>>;
1436
1506
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
1437
1507
  topic_tag: z.ZodOptional<z.ZodString>;
1438
1508
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -1641,6 +1711,16 @@ export declare const updatePostTool: {
1641
1711
  question?: string | undefined;
1642
1712
  allows_multiple_answers?: boolean | undefined;
1643
1713
  }>>;
1714
+ article: z.ZodOptional<z.ZodNullable<z.ZodObject<{
1715
+ title: z.ZodString;
1716
+ cover: z.ZodOptional<z.ZodEnum<["first_image", "none"]>>;
1717
+ }, "strip", z.ZodTypeAny, {
1718
+ title: string;
1719
+ cover?: "none" | "first_image" | undefined;
1720
+ }, {
1721
+ title: string;
1722
+ cover?: "none" | "first_image" | undefined;
1723
+ }>>>;
1644
1724
  reply_control: z.ZodOptional<z.ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
1645
1725
  topic_tag: z.ZodOptional<z.ZodString>;
1646
1726
  share_to_instagram: z.ZodOptional<z.ZodBoolean>;
@@ -66,6 +66,7 @@ const platformSettingsSchema = z.object({
66
66
  reel_thumb_offset: z.number().nonnegative().optional(),
67
67
  reply_settings: z.enum(['everyone', 'following', 'mentionedUsers', 'subscribers', 'verified']).optional(),
68
68
  poll: z.object({ options: z.array(z.string()), duration_minutes: z.number().positive().optional(), question: z.string().optional(), duration: z.enum(['ONE_DAY', 'THREE_DAYS', 'SEVEN_DAYS', 'FOURTEEN_DAYS']).optional(), allows_multiple_answers: z.boolean().optional() }).optional(),
69
+ article: z.object({ title: z.string(), cover: z.enum(['first_image', 'none']).optional() }).nullable().optional(),
69
70
  reply_control: z.enum(['everyone', 'accounts_you_follow', 'mentioned_only', 'followers_only', 'parent_post_author_only']).optional(),
70
71
  topic_tag: z.string().optional(),
71
72
  share_to_instagram: z.boolean().optional(), // Threads: also share the published post to the linked Instagram account as a Story
@@ -275,6 +275,16 @@ export declare const validatePostInputSchema: import("zod").ZodObject<{
275
275
  question?: string | undefined;
276
276
  allows_multiple_answers?: boolean | undefined;
277
277
  }>>;
278
+ article: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
279
+ title: import("zod").ZodString;
280
+ cover: import("zod").ZodOptional<import("zod").ZodEnum<["first_image", "none"]>>;
281
+ }, "strip", import("zod").ZodTypeAny, {
282
+ title: string;
283
+ cover?: "none" | "first_image" | undefined;
284
+ }, {
285
+ title: string;
286
+ cover?: "none" | "first_image" | undefined;
287
+ }>>>;
278
288
  reply_control: import("zod").ZodOptional<import("zod").ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
279
289
  topic_tag: import("zod").ZodOptional<import("zod").ZodString>;
280
290
  share_to_instagram: import("zod").ZodOptional<import("zod").ZodBoolean>;
@@ -414,6 +424,16 @@ export declare const validatePostInputSchema: import("zod").ZodObject<{
414
424
  question?: string | undefined;
415
425
  allows_multiple_answers?: boolean | undefined;
416
426
  }>>;
427
+ article: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
428
+ title: import("zod").ZodString;
429
+ cover: import("zod").ZodOptional<import("zod").ZodEnum<["first_image", "none"]>>;
430
+ }, "strip", import("zod").ZodTypeAny, {
431
+ title: string;
432
+ cover?: "none" | "first_image" | undefined;
433
+ }, {
434
+ title: string;
435
+ cover?: "none" | "first_image" | undefined;
436
+ }>>>;
417
437
  reply_control: import("zod").ZodOptional<import("zod").ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
418
438
  topic_tag: import("zod").ZodOptional<import("zod").ZodString>;
419
439
  share_to_instagram: import("zod").ZodOptional<import("zod").ZodBoolean>;
@@ -553,6 +573,16 @@ export declare const validatePostInputSchema: import("zod").ZodObject<{
553
573
  question?: string | undefined;
554
574
  allows_multiple_answers?: boolean | undefined;
555
575
  }>>;
576
+ article: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
577
+ title: import("zod").ZodString;
578
+ cover: import("zod").ZodOptional<import("zod").ZodEnum<["first_image", "none"]>>;
579
+ }, "strip", import("zod").ZodTypeAny, {
580
+ title: string;
581
+ cover?: "none" | "first_image" | undefined;
582
+ }, {
583
+ title: string;
584
+ cover?: "none" | "first_image" | undefined;
585
+ }>>>;
556
586
  reply_control: import("zod").ZodOptional<import("zod").ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
557
587
  topic_tag: import("zod").ZodOptional<import("zod").ZodString>;
558
588
  share_to_instagram: import("zod").ZodOptional<import("zod").ZodBoolean>;
@@ -755,6 +785,16 @@ export declare const validatePostInputSchema: import("zod").ZodObject<{
755
785
  question?: string | undefined;
756
786
  allows_multiple_answers?: boolean | undefined;
757
787
  }>>;
788
+ article: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
789
+ title: import("zod").ZodString;
790
+ cover: import("zod").ZodOptional<import("zod").ZodEnum<["first_image", "none"]>>;
791
+ }, "strip", import("zod").ZodTypeAny, {
792
+ title: string;
793
+ cover?: "none" | "first_image" | undefined;
794
+ }, {
795
+ title: string;
796
+ cover?: "none" | "first_image" | undefined;
797
+ }>>>;
758
798
  reply_control: import("zod").ZodOptional<import("zod").ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
759
799
  topic_tag: import("zod").ZodOptional<import("zod").ZodString>;
760
800
  share_to_instagram: import("zod").ZodOptional<import("zod").ZodBoolean>;
@@ -956,6 +996,16 @@ export declare const validatePostInputSchema: import("zod").ZodObject<{
956
996
  question?: string | undefined;
957
997
  allows_multiple_answers?: boolean | undefined;
958
998
  }>>;
999
+ article: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
1000
+ title: import("zod").ZodString;
1001
+ cover: import("zod").ZodOptional<import("zod").ZodEnum<["first_image", "none"]>>;
1002
+ }, "strip", import("zod").ZodTypeAny, {
1003
+ title: string;
1004
+ cover?: "none" | "first_image" | undefined;
1005
+ }, {
1006
+ title: string;
1007
+ cover?: "none" | "first_image" | undefined;
1008
+ }>>>;
959
1009
  reply_control: import("zod").ZodOptional<import("zod").ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
960
1010
  topic_tag: import("zod").ZodOptional<import("zod").ZodString>;
961
1011
  share_to_instagram: import("zod").ZodOptional<import("zod").ZodBoolean>;
@@ -1333,6 +1383,16 @@ export declare const validatePostTool: {
1333
1383
  question?: string | undefined;
1334
1384
  allows_multiple_answers?: boolean | undefined;
1335
1385
  }>>;
1386
+ article: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
1387
+ title: import("zod").ZodString;
1388
+ cover: import("zod").ZodOptional<import("zod").ZodEnum<["first_image", "none"]>>;
1389
+ }, "strip", import("zod").ZodTypeAny, {
1390
+ title: string;
1391
+ cover?: "none" | "first_image" | undefined;
1392
+ }, {
1393
+ title: string;
1394
+ cover?: "none" | "first_image" | undefined;
1395
+ }>>>;
1336
1396
  reply_control: import("zod").ZodOptional<import("zod").ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
1337
1397
  topic_tag: import("zod").ZodOptional<import("zod").ZodString>;
1338
1398
  share_to_instagram: import("zod").ZodOptional<import("zod").ZodBoolean>;
@@ -1472,6 +1532,16 @@ export declare const validatePostTool: {
1472
1532
  question?: string | undefined;
1473
1533
  allows_multiple_answers?: boolean | undefined;
1474
1534
  }>>;
1535
+ article: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
1536
+ title: import("zod").ZodString;
1537
+ cover: import("zod").ZodOptional<import("zod").ZodEnum<["first_image", "none"]>>;
1538
+ }, "strip", import("zod").ZodTypeAny, {
1539
+ title: string;
1540
+ cover?: "none" | "first_image" | undefined;
1541
+ }, {
1542
+ title: string;
1543
+ cover?: "none" | "first_image" | undefined;
1544
+ }>>>;
1475
1545
  reply_control: import("zod").ZodOptional<import("zod").ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
1476
1546
  topic_tag: import("zod").ZodOptional<import("zod").ZodString>;
1477
1547
  share_to_instagram: import("zod").ZodOptional<import("zod").ZodBoolean>;
@@ -1611,6 +1681,16 @@ export declare const validatePostTool: {
1611
1681
  question?: string | undefined;
1612
1682
  allows_multiple_answers?: boolean | undefined;
1613
1683
  }>>;
1684
+ article: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
1685
+ title: import("zod").ZodString;
1686
+ cover: import("zod").ZodOptional<import("zod").ZodEnum<["first_image", "none"]>>;
1687
+ }, "strip", import("zod").ZodTypeAny, {
1688
+ title: string;
1689
+ cover?: "none" | "first_image" | undefined;
1690
+ }, {
1691
+ title: string;
1692
+ cover?: "none" | "first_image" | undefined;
1693
+ }>>>;
1614
1694
  reply_control: import("zod").ZodOptional<import("zod").ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
1615
1695
  topic_tag: import("zod").ZodOptional<import("zod").ZodString>;
1616
1696
  share_to_instagram: import("zod").ZodOptional<import("zod").ZodBoolean>;
@@ -1813,6 +1893,16 @@ export declare const validatePostTool: {
1813
1893
  question?: string | undefined;
1814
1894
  allows_multiple_answers?: boolean | undefined;
1815
1895
  }>>;
1896
+ article: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
1897
+ title: import("zod").ZodString;
1898
+ cover: import("zod").ZodOptional<import("zod").ZodEnum<["first_image", "none"]>>;
1899
+ }, "strip", import("zod").ZodTypeAny, {
1900
+ title: string;
1901
+ cover?: "none" | "first_image" | undefined;
1902
+ }, {
1903
+ title: string;
1904
+ cover?: "none" | "first_image" | undefined;
1905
+ }>>>;
1816
1906
  reply_control: import("zod").ZodOptional<import("zod").ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
1817
1907
  topic_tag: import("zod").ZodOptional<import("zod").ZodString>;
1818
1908
  share_to_instagram: import("zod").ZodOptional<import("zod").ZodBoolean>;
@@ -2014,6 +2104,16 @@ export declare const validatePostTool: {
2014
2104
  question?: string | undefined;
2015
2105
  allows_multiple_answers?: boolean | undefined;
2016
2106
  }>>;
2107
+ article: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
2108
+ title: import("zod").ZodString;
2109
+ cover: import("zod").ZodOptional<import("zod").ZodEnum<["first_image", "none"]>>;
2110
+ }, "strip", import("zod").ZodTypeAny, {
2111
+ title: string;
2112
+ cover?: "none" | "first_image" | undefined;
2113
+ }, {
2114
+ title: string;
2115
+ cover?: "none" | "first_image" | undefined;
2116
+ }>>>;
2017
2117
  reply_control: import("zod").ZodOptional<import("zod").ZodEnum<["everyone", "accounts_you_follow", "mentioned_only", "followers_only", "parent_post_author_only"]>>;
2018
2118
  topic_tag: import("zod").ZodOptional<import("zod").ZodString>;
2019
2119
  share_to_instagram: import("zod").ZodOptional<import("zod").ZodBoolean>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "posterly-mcp-server",
3
- "version": "0.50.5",
3
+ "version": "0.51.1",
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.50.5",
6
+ "version": "0.51.1",
7
7
  "websiteUrl": "https://www.poster.ly/mcp",
8
8
  "repository": {
9
9
  "url": "https://github.com/awpthorp/posterly-mcp-server",
@@ -13,7 +13,7 @@
13
13
  {
14
14
  "registryType": "npm",
15
15
  "identifier": "posterly-mcp-server",
16
- "version": "0.50.5",
16
+ "version": "0.51.1",
17
17
  "transport": {
18
18
  "type": "stdio"
19
19
  },