posterly-mcp-server 0.40.0 → 0.43.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.
@@ -43,6 +43,22 @@ export declare const validatePostInputSchema: import("zod").ZodObject<{
43
43
  }>]>, "many">>;
44
44
  first_comment: import("zod").ZodOptional<import("zod").ZodString>;
45
45
  media_alt_texts: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
46
+ media_accessibility: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
47
+ index: import("zod").ZodNumber;
48
+ asset_id: import("zod").ZodOptional<import("zod").ZodString>;
49
+ source_url: import("zod").ZodOptional<import("zod").ZodString>;
50
+ alt_text: import("zod").ZodString;
51
+ }, "strip", import("zod").ZodTypeAny, {
52
+ index: number;
53
+ alt_text: string;
54
+ asset_id?: string | undefined;
55
+ source_url?: string | undefined;
56
+ }, {
57
+ index: number;
58
+ alt_text: string;
59
+ asset_id?: string | undefined;
60
+ source_url?: string | undefined;
61
+ }>, "many">>;
46
62
  reel_cover_url: import("zod").ZodOptional<import("zod").ZodString>;
47
63
  reel_thumb_offset: import("zod").ZodOptional<import("zod").ZodNumber>;
48
64
  is_ai_generated: import("zod").ZodOptional<import("zod").ZodBoolean>;
@@ -66,6 +82,12 @@ export declare const validatePostInputSchema: import("zod").ZodObject<{
66
82
  })[] | undefined;
67
83
  first_comment?: string | undefined;
68
84
  media_alt_texts?: Record<string, string> | undefined;
85
+ media_accessibility?: {
86
+ index: number;
87
+ alt_text: string;
88
+ asset_id?: string | undefined;
89
+ source_url?: string | undefined;
90
+ }[] | undefined;
69
91
  is_ai_generated?: boolean | undefined;
70
92
  audio_id?: string | undefined;
71
93
  }, {
@@ -87,6 +109,12 @@ export declare const validatePostInputSchema: import("zod").ZodObject<{
87
109
  })[] | undefined;
88
110
  first_comment?: string | undefined;
89
111
  media_alt_texts?: Record<string, string> | undefined;
112
+ media_accessibility?: {
113
+ index: number;
114
+ alt_text: string;
115
+ asset_id?: string | undefined;
116
+ source_url?: string | undefined;
117
+ }[] | undefined;
90
118
  is_ai_generated?: boolean | undefined;
91
119
  audio_id?: string | undefined;
92
120
  }>>;
@@ -95,6 +123,22 @@ export declare const validatePostInputSchema: import("zod").ZodObject<{
95
123
  post_type: import("zod").ZodOptional<import("zod").ZodString>;
96
124
  content_type: import("zod").ZodOptional<import("zod").ZodString>;
97
125
  media_alt_texts: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
126
+ media_accessibility: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
127
+ index: import("zod").ZodNumber;
128
+ asset_id: import("zod").ZodOptional<import("zod").ZodString>;
129
+ source_url: import("zod").ZodOptional<import("zod").ZodString>;
130
+ alt_text: import("zod").ZodString;
131
+ }, "strip", import("zod").ZodTypeAny, {
132
+ index: number;
133
+ alt_text: string;
134
+ asset_id?: string | undefined;
135
+ source_url?: string | undefined;
136
+ }, {
137
+ index: number;
138
+ alt_text: string;
139
+ asset_id?: string | undefined;
140
+ source_url?: string | undefined;
141
+ }>, "many">>;
98
142
  reel_cover_url: import("zod").ZodOptional<import("zod").ZodString>;
99
143
  reel_thumb_offset: import("zod").ZodOptional<import("zod").ZodNumber>;
100
144
  reply_settings: import("zod").ZodOptional<import("zod").ZodEnum<["everyone", "following", "mentionedUsers", "subscribers", "verified"]>>;
@@ -202,6 +246,22 @@ export declare const validatePostInputSchema: import("zod").ZodObject<{
202
246
  post_type: import("zod").ZodOptional<import("zod").ZodString>;
203
247
  content_type: import("zod").ZodOptional<import("zod").ZodString>;
204
248
  media_alt_texts: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
249
+ media_accessibility: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
250
+ index: import("zod").ZodNumber;
251
+ asset_id: import("zod").ZodOptional<import("zod").ZodString>;
252
+ source_url: import("zod").ZodOptional<import("zod").ZodString>;
253
+ alt_text: import("zod").ZodString;
254
+ }, "strip", import("zod").ZodTypeAny, {
255
+ index: number;
256
+ alt_text: string;
257
+ asset_id?: string | undefined;
258
+ source_url?: string | undefined;
259
+ }, {
260
+ index: number;
261
+ alt_text: string;
262
+ asset_id?: string | undefined;
263
+ source_url?: string | undefined;
264
+ }>, "many">>;
205
265
  reel_cover_url: import("zod").ZodOptional<import("zod").ZodString>;
206
266
  reel_thumb_offset: import("zod").ZodOptional<import("zod").ZodNumber>;
207
267
  reply_settings: import("zod").ZodOptional<import("zod").ZodEnum<["everyone", "following", "mentionedUsers", "subscribers", "verified"]>>;
@@ -309,6 +369,22 @@ export declare const validatePostInputSchema: import("zod").ZodObject<{
309
369
  post_type: import("zod").ZodOptional<import("zod").ZodString>;
310
370
  content_type: import("zod").ZodOptional<import("zod").ZodString>;
311
371
  media_alt_texts: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
372
+ media_accessibility: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
373
+ index: import("zod").ZodNumber;
374
+ asset_id: import("zod").ZodOptional<import("zod").ZodString>;
375
+ source_url: import("zod").ZodOptional<import("zod").ZodString>;
376
+ alt_text: import("zod").ZodString;
377
+ }, "strip", import("zod").ZodTypeAny, {
378
+ index: number;
379
+ alt_text: string;
380
+ asset_id?: string | undefined;
381
+ source_url?: string | undefined;
382
+ }, {
383
+ index: number;
384
+ alt_text: string;
385
+ asset_id?: string | undefined;
386
+ source_url?: string | undefined;
387
+ }>, "many">>;
312
388
  reel_cover_url: import("zod").ZodOptional<import("zod").ZodString>;
313
389
  reel_thumb_offset: import("zod").ZodOptional<import("zod").ZodNumber>;
314
390
  reply_settings: import("zod").ZodOptional<import("zod").ZodEnum<["everyone", "following", "mentionedUsers", "subscribers", "verified"]>>;
@@ -443,6 +519,12 @@ export declare const validatePostInputSchema: import("zod").ZodObject<{
443
519
  })[] | undefined;
444
520
  first_comment?: string | undefined;
445
521
  media_alt_texts?: Record<string, string> | undefined;
522
+ media_accessibility?: {
523
+ index: number;
524
+ alt_text: string;
525
+ asset_id?: string | undefined;
526
+ source_url?: string | undefined;
527
+ }[] | undefined;
446
528
  is_ai_generated?: boolean | undefined;
447
529
  audio_id?: string | undefined;
448
530
  } | undefined;
@@ -451,6 +533,22 @@ export declare const validatePostInputSchema: import("zod").ZodObject<{
451
533
  post_type: import("zod").ZodOptional<import("zod").ZodString>;
452
534
  content_type: import("zod").ZodOptional<import("zod").ZodString>;
453
535
  media_alt_texts: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
536
+ media_accessibility: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
537
+ index: import("zod").ZodNumber;
538
+ asset_id: import("zod").ZodOptional<import("zod").ZodString>;
539
+ source_url: import("zod").ZodOptional<import("zod").ZodString>;
540
+ alt_text: import("zod").ZodString;
541
+ }, "strip", import("zod").ZodTypeAny, {
542
+ index: number;
543
+ alt_text: string;
544
+ asset_id?: string | undefined;
545
+ source_url?: string | undefined;
546
+ }, {
547
+ index: number;
548
+ alt_text: string;
549
+ asset_id?: string | undefined;
550
+ source_url?: string | undefined;
551
+ }>, "many">>;
454
552
  reel_cover_url: import("zod").ZodOptional<import("zod").ZodString>;
455
553
  reel_thumb_offset: import("zod").ZodOptional<import("zod").ZodNumber>;
456
554
  reply_settings: import("zod").ZodOptional<import("zod").ZodEnum<["everyone", "following", "mentionedUsers", "subscribers", "verified"]>>;
@@ -584,6 +682,12 @@ export declare const validatePostInputSchema: import("zod").ZodObject<{
584
682
  })[] | undefined;
585
683
  first_comment?: string | undefined;
586
684
  media_alt_texts?: Record<string, string> | undefined;
685
+ media_accessibility?: {
686
+ index: number;
687
+ alt_text: string;
688
+ asset_id?: string | undefined;
689
+ source_url?: string | undefined;
690
+ }[] | undefined;
587
691
  is_ai_generated?: boolean | undefined;
588
692
  audio_id?: string | undefined;
589
693
  } | undefined;
@@ -592,6 +696,22 @@ export declare const validatePostInputSchema: import("zod").ZodObject<{
592
696
  post_type: import("zod").ZodOptional<import("zod").ZodString>;
593
697
  content_type: import("zod").ZodOptional<import("zod").ZodString>;
594
698
  media_alt_texts: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
699
+ media_accessibility: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
700
+ index: import("zod").ZodNumber;
701
+ asset_id: import("zod").ZodOptional<import("zod").ZodString>;
702
+ source_url: import("zod").ZodOptional<import("zod").ZodString>;
703
+ alt_text: import("zod").ZodString;
704
+ }, "strip", import("zod").ZodTypeAny, {
705
+ index: number;
706
+ alt_text: string;
707
+ asset_id?: string | undefined;
708
+ source_url?: string | undefined;
709
+ }, {
710
+ index: number;
711
+ alt_text: string;
712
+ asset_id?: string | undefined;
713
+ source_url?: string | undefined;
714
+ }>, "many">>;
595
715
  reel_cover_url: import("zod").ZodOptional<import("zod").ZodString>;
596
716
  reel_thumb_offset: import("zod").ZodOptional<import("zod").ZodNumber>;
597
717
  reply_settings: import("zod").ZodOptional<import("zod").ZodEnum<["everyone", "following", "mentionedUsers", "subscribers", "verified"]>>;
@@ -743,6 +863,22 @@ export declare const validatePostTool: {
743
863
  }>]>, "many">>;
744
864
  first_comment: import("zod").ZodOptional<import("zod").ZodString>;
745
865
  media_alt_texts: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
866
+ media_accessibility: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
867
+ index: import("zod").ZodNumber;
868
+ asset_id: import("zod").ZodOptional<import("zod").ZodString>;
869
+ source_url: import("zod").ZodOptional<import("zod").ZodString>;
870
+ alt_text: import("zod").ZodString;
871
+ }, "strip", import("zod").ZodTypeAny, {
872
+ index: number;
873
+ alt_text: string;
874
+ asset_id?: string | undefined;
875
+ source_url?: string | undefined;
876
+ }, {
877
+ index: number;
878
+ alt_text: string;
879
+ asset_id?: string | undefined;
880
+ source_url?: string | undefined;
881
+ }>, "many">>;
746
882
  reel_cover_url: import("zod").ZodOptional<import("zod").ZodString>;
747
883
  reel_thumb_offset: import("zod").ZodOptional<import("zod").ZodNumber>;
748
884
  is_ai_generated: import("zod").ZodOptional<import("zod").ZodBoolean>;
@@ -766,6 +902,12 @@ export declare const validatePostTool: {
766
902
  })[] | undefined;
767
903
  first_comment?: string | undefined;
768
904
  media_alt_texts?: Record<string, string> | undefined;
905
+ media_accessibility?: {
906
+ index: number;
907
+ alt_text: string;
908
+ asset_id?: string | undefined;
909
+ source_url?: string | undefined;
910
+ }[] | undefined;
769
911
  is_ai_generated?: boolean | undefined;
770
912
  audio_id?: string | undefined;
771
913
  }, {
@@ -787,6 +929,12 @@ export declare const validatePostTool: {
787
929
  })[] | undefined;
788
930
  first_comment?: string | undefined;
789
931
  media_alt_texts?: Record<string, string> | undefined;
932
+ media_accessibility?: {
933
+ index: number;
934
+ alt_text: string;
935
+ asset_id?: string | undefined;
936
+ source_url?: string | undefined;
937
+ }[] | undefined;
790
938
  is_ai_generated?: boolean | undefined;
791
939
  audio_id?: string | undefined;
792
940
  }>>;
@@ -795,6 +943,22 @@ export declare const validatePostTool: {
795
943
  post_type: import("zod").ZodOptional<import("zod").ZodString>;
796
944
  content_type: import("zod").ZodOptional<import("zod").ZodString>;
797
945
  media_alt_texts: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
946
+ media_accessibility: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
947
+ index: import("zod").ZodNumber;
948
+ asset_id: import("zod").ZodOptional<import("zod").ZodString>;
949
+ source_url: import("zod").ZodOptional<import("zod").ZodString>;
950
+ alt_text: import("zod").ZodString;
951
+ }, "strip", import("zod").ZodTypeAny, {
952
+ index: number;
953
+ alt_text: string;
954
+ asset_id?: string | undefined;
955
+ source_url?: string | undefined;
956
+ }, {
957
+ index: number;
958
+ alt_text: string;
959
+ asset_id?: string | undefined;
960
+ source_url?: string | undefined;
961
+ }>, "many">>;
798
962
  reel_cover_url: import("zod").ZodOptional<import("zod").ZodString>;
799
963
  reel_thumb_offset: import("zod").ZodOptional<import("zod").ZodNumber>;
800
964
  reply_settings: import("zod").ZodOptional<import("zod").ZodEnum<["everyone", "following", "mentionedUsers", "subscribers", "verified"]>>;
@@ -902,6 +1066,22 @@ export declare const validatePostTool: {
902
1066
  post_type: import("zod").ZodOptional<import("zod").ZodString>;
903
1067
  content_type: import("zod").ZodOptional<import("zod").ZodString>;
904
1068
  media_alt_texts: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
1069
+ media_accessibility: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
1070
+ index: import("zod").ZodNumber;
1071
+ asset_id: import("zod").ZodOptional<import("zod").ZodString>;
1072
+ source_url: import("zod").ZodOptional<import("zod").ZodString>;
1073
+ alt_text: import("zod").ZodString;
1074
+ }, "strip", import("zod").ZodTypeAny, {
1075
+ index: number;
1076
+ alt_text: string;
1077
+ asset_id?: string | undefined;
1078
+ source_url?: string | undefined;
1079
+ }, {
1080
+ index: number;
1081
+ alt_text: string;
1082
+ asset_id?: string | undefined;
1083
+ source_url?: string | undefined;
1084
+ }>, "many">>;
905
1085
  reel_cover_url: import("zod").ZodOptional<import("zod").ZodString>;
906
1086
  reel_thumb_offset: import("zod").ZodOptional<import("zod").ZodNumber>;
907
1087
  reply_settings: import("zod").ZodOptional<import("zod").ZodEnum<["everyone", "following", "mentionedUsers", "subscribers", "verified"]>>;
@@ -1009,6 +1189,22 @@ export declare const validatePostTool: {
1009
1189
  post_type: import("zod").ZodOptional<import("zod").ZodString>;
1010
1190
  content_type: import("zod").ZodOptional<import("zod").ZodString>;
1011
1191
  media_alt_texts: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
1192
+ media_accessibility: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
1193
+ index: import("zod").ZodNumber;
1194
+ asset_id: import("zod").ZodOptional<import("zod").ZodString>;
1195
+ source_url: import("zod").ZodOptional<import("zod").ZodString>;
1196
+ alt_text: import("zod").ZodString;
1197
+ }, "strip", import("zod").ZodTypeAny, {
1198
+ index: number;
1199
+ alt_text: string;
1200
+ asset_id?: string | undefined;
1201
+ source_url?: string | undefined;
1202
+ }, {
1203
+ index: number;
1204
+ alt_text: string;
1205
+ asset_id?: string | undefined;
1206
+ source_url?: string | undefined;
1207
+ }>, "many">>;
1012
1208
  reel_cover_url: import("zod").ZodOptional<import("zod").ZodString>;
1013
1209
  reel_thumb_offset: import("zod").ZodOptional<import("zod").ZodNumber>;
1014
1210
  reply_settings: import("zod").ZodOptional<import("zod").ZodEnum<["everyone", "following", "mentionedUsers", "subscribers", "verified"]>>;
@@ -1143,6 +1339,12 @@ export declare const validatePostTool: {
1143
1339
  })[] | undefined;
1144
1340
  first_comment?: string | undefined;
1145
1341
  media_alt_texts?: Record<string, string> | undefined;
1342
+ media_accessibility?: {
1343
+ index: number;
1344
+ alt_text: string;
1345
+ asset_id?: string | undefined;
1346
+ source_url?: string | undefined;
1347
+ }[] | undefined;
1146
1348
  is_ai_generated?: boolean | undefined;
1147
1349
  audio_id?: string | undefined;
1148
1350
  } | undefined;
@@ -1151,6 +1353,22 @@ export declare const validatePostTool: {
1151
1353
  post_type: import("zod").ZodOptional<import("zod").ZodString>;
1152
1354
  content_type: import("zod").ZodOptional<import("zod").ZodString>;
1153
1355
  media_alt_texts: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
1356
+ media_accessibility: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
1357
+ index: import("zod").ZodNumber;
1358
+ asset_id: import("zod").ZodOptional<import("zod").ZodString>;
1359
+ source_url: import("zod").ZodOptional<import("zod").ZodString>;
1360
+ alt_text: import("zod").ZodString;
1361
+ }, "strip", import("zod").ZodTypeAny, {
1362
+ index: number;
1363
+ alt_text: string;
1364
+ asset_id?: string | undefined;
1365
+ source_url?: string | undefined;
1366
+ }, {
1367
+ index: number;
1368
+ alt_text: string;
1369
+ asset_id?: string | undefined;
1370
+ source_url?: string | undefined;
1371
+ }>, "many">>;
1154
1372
  reel_cover_url: import("zod").ZodOptional<import("zod").ZodString>;
1155
1373
  reel_thumb_offset: import("zod").ZodOptional<import("zod").ZodNumber>;
1156
1374
  reply_settings: import("zod").ZodOptional<import("zod").ZodEnum<["everyone", "following", "mentionedUsers", "subscribers", "verified"]>>;
@@ -1284,6 +1502,12 @@ export declare const validatePostTool: {
1284
1502
  })[] | undefined;
1285
1503
  first_comment?: string | undefined;
1286
1504
  media_alt_texts?: Record<string, string> | undefined;
1505
+ media_accessibility?: {
1506
+ index: number;
1507
+ alt_text: string;
1508
+ asset_id?: string | undefined;
1509
+ source_url?: string | undefined;
1510
+ }[] | undefined;
1287
1511
  is_ai_generated?: boolean | undefined;
1288
1512
  audio_id?: string | undefined;
1289
1513
  } | undefined;
@@ -1292,6 +1516,22 @@ export declare const validatePostTool: {
1292
1516
  post_type: import("zod").ZodOptional<import("zod").ZodString>;
1293
1517
  content_type: import("zod").ZodOptional<import("zod").ZodString>;
1294
1518
  media_alt_texts: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
1519
+ media_accessibility: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
1520
+ index: import("zod").ZodNumber;
1521
+ asset_id: import("zod").ZodOptional<import("zod").ZodString>;
1522
+ source_url: import("zod").ZodOptional<import("zod").ZodString>;
1523
+ alt_text: import("zod").ZodString;
1524
+ }, "strip", import("zod").ZodTypeAny, {
1525
+ index: number;
1526
+ alt_text: string;
1527
+ asset_id?: string | undefined;
1528
+ source_url?: string | undefined;
1529
+ }, {
1530
+ index: number;
1531
+ alt_text: string;
1532
+ asset_id?: string | undefined;
1533
+ source_url?: string | undefined;
1534
+ }>, "many">>;
1295
1535
  reel_cover_url: import("zod").ZodOptional<import("zod").ZodString>;
1296
1536
  reel_thumb_offset: import("zod").ZodOptional<import("zod").ZodNumber>;
1297
1537
  reply_settings: import("zod").ZodOptional<import("zod").ZodEnum<["everyone", "following", "mentionedUsers", "subscribers", "verified"]>>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "posterly-mcp-server",
3
- "version": "0.40.0",
3
+ "version": "0.43.0",
4
4
  "mcpName": "io.github.awpthorp/posterly",
5
5
  "description": "MCP server for posterly: schedule and publish social media posts across 18 platforms from any MCP client (Claude, ChatGPT, Cursor, Windsurf, Cline, and more)",
6
6
  "license": "MIT",
package/server.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "name": "io.github.awpthorp/posterly",
4
4
  "title": "posterly",
5
5
  "description": "Validate, schedule, publish, and analyze social content across 18 platforms with posterly.",
6
- "version": "0.40.0",
6
+ "version": "0.43.0",
7
7
  "websiteUrl": "https://www.poster.ly/mcp",
8
8
  "repository": {
9
9
  "url": "https://github.com/awpthorp/posterly",
@@ -14,7 +14,7 @@
14
14
  {
15
15
  "registryType": "npm",
16
16
  "identifier": "posterly-mcp-server",
17
- "version": "0.40.0",
17
+ "version": "0.43.0",
18
18
  "transport": {
19
19
  "type": "stdio"
20
20
  },
package/src/index.ts CHANGED
@@ -39,6 +39,7 @@ import { deletePostGroupTool } from './tools/delete-post-group.js';
39
39
  import { whoamiTool } from './tools/whoami.js';
40
40
  import { generateCaptionsTool } from './tools/generate-captions.js';
41
41
  import { generateImageTool } from './tools/generate-image.js';
42
+ import { getImageJobTool } from './tools/get-image-job.js';
42
43
  import { getVideoOptionsTool } from './tools/get-video-options.js';
43
44
  import { runVideoFunctionTool } from './tools/run-video-function.js';
44
45
  import { generateVideoTool } from './tools/generate-video.js';
@@ -898,6 +899,21 @@ server.tool(
898
899
  }
899
900
  );
900
901
 
902
+ server.tool(
903
+ getImageJobTool.name,
904
+ getImageJobTool.description,
905
+ getImageJobTool.inputSchema.shape,
906
+ getToolAnnotations(getImageJobTool.name),
907
+ async (input) => {
908
+ try {
909
+ const text = await getImageJobTool.execute(client, input as any);
910
+ return { content: [{ type: 'text' as const, text }] };
911
+ } catch (err: any) {
912
+ return { content: [{ type: 'text' as const, text: `Error: ${err.message}` }], isError: true };
913
+ }
914
+ }
915
+ );
916
+
901
917
  server.tool(
902
918
  getPostTool.name,
903
919
  getPostTool.description,
@@ -165,6 +165,7 @@ export interface InstagramPostSettings {
165
165
  user_tags?: Array<string | { username?: string; label?: string; handle?: string }>;
166
166
  first_comment?: string;
167
167
  media_alt_texts?: Record<string, string>;
168
+ media_accessibility?: Array<{ index: number; asset_id?: string; source_url?: string; alt_text: string }>;
168
169
  reel_cover_url?: string;
169
170
  reel_thumb_offset?: number;
170
171
  }
@@ -893,6 +894,25 @@ export interface PublicSignupSessionResponse {
893
894
  signup_session: PublicSignupSession;
894
895
  }
895
896
 
897
+ export interface ImageJob {
898
+ id: string;
899
+ status: string;
900
+ provider: 'google' | 'xai';
901
+ prompt: string;
902
+ model: string;
903
+ resolution: string;
904
+ quality?: string | null;
905
+ thinking_level?: string | null;
906
+ variations: number;
907
+ urls: string[];
908
+ images: Array<{ url: string; filename?: string; path?: string }>;
909
+ error_message?: string | null;
910
+ credit_cost: number;
911
+ created_at: string;
912
+ started_at?: string | null;
913
+ completed_at?: string | null;
914
+ }
915
+
896
916
  export interface VideoJob {
897
917
  id: string;
898
918
  status: string;
@@ -1028,6 +1048,7 @@ export class PosterlyClient {
1028
1048
  const url = `${this.baseUrl}/api/v1${path}`;
1029
1049
  const headers: Record<string, string> = {
1030
1050
  Authorization: `Bearer ${this.apiKey}`,
1051
+ 'X-Posterly-Source': 'mcp_stdio',
1031
1052
  };
1032
1053
 
1033
1054
  const init: RequestInit = { method, headers };
@@ -1368,20 +1389,24 @@ export class PosterlyClient {
1368
1389
  provider?: 'google' | 'xai';
1369
1390
  model?: 'lite' | 'flash' | 'pro';
1370
1391
  resolution?: '512' | '1K' | '2K' | '4K';
1371
- quality?: 'low' | 'medium';
1392
+ quality?: 'low' | 'medium' | 'high';
1393
+ thinking_level?: 'minimal' | 'high';
1394
+ reference_image_urls?: string[];
1372
1395
  }): Promise<{
1373
- urls: string[];
1374
- images: Array<{ url: string; filename: string; path: string }>;
1396
+ job_id: string;
1397
+ status: string;
1398
+ message?: string;
1375
1399
  model: string;
1376
1400
  provider: 'google' | 'xai';
1401
+ resolution?: string;
1402
+ thinking_level?: 'minimal' | 'high' | null;
1377
1403
  credits_used: number;
1378
- warnings?: string[];
1379
- usage: {
1404
+ usage?: {
1380
1405
  used: number | null;
1381
1406
  limit: number | null;
1382
1407
  period: string | null;
1383
1408
  tier: string | null;
1384
- billed_from: 'plan_quota' | 'credits';
1409
+ billed_from: string;
1385
1410
  };
1386
1411
  }> {
1387
1412
  return this.request('POST', '/ai/generate-image', data);
@@ -1431,6 +1456,21 @@ export class PosterlyClient {
1431
1456
  return this.request('GET', `/ai/video-jobs${qs ? `?${qs}` : ''}`);
1432
1457
  }
1433
1458
 
1459
+ async getImageJob(params?: {
1460
+ job_id?: string;
1461
+ status?: string;
1462
+ limit?: number;
1463
+ }): Promise<{ job?: ImageJob; jobs?: ImageJob[] }> {
1464
+ if (params?.job_id) {
1465
+ return this.request('GET', `/ai/image-jobs/${encodeURIComponent(params.job_id)}`);
1466
+ }
1467
+ const searchParams = new URLSearchParams();
1468
+ if (params?.status) searchParams.set('status', params.status);
1469
+ if (params?.limit) searchParams.set('limit', String(params.limit));
1470
+ const qs = searchParams.toString();
1471
+ return this.request('GET', `/ai/image-jobs${qs ? `?${qs}` : ''}`);
1472
+ }
1473
+
1434
1474
  async findAvailableSlots(params?: {
1435
1475
  account_ids?: string[];
1436
1476
  timezone?: string;
@@ -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.40.0';
8
+ export const POSTERLY_MCP_VERSION = '0.43.0';
@@ -3,6 +3,13 @@ import type { PosterlyClient } from '../lib/api-client.js';
3
3
  import { dashboardUrlForPost, formatLocalDateTime } from '../lib/format.js';
4
4
  import { SUPPORTED_PLATFORM_INPUTS, SUPPORTED_PLATFORM_IDS } from '../generated/platform-manifest.js';
5
5
 
6
+ const mediaAccessibilitySchema = z.array(z.object({
7
+ index: z.number().int().nonnegative(),
8
+ asset_id: z.string().optional(),
9
+ source_url: z.string().url().optional(),
10
+ alt_text: z.string(),
11
+ })).describe('Preferred ordered media alt text. Identity follows index/asset_id through platform media preparation; media_alt_texts remains the legacy URL-map form.');
12
+
6
13
  export const instagramSettingsSchema = z.object({
7
14
  __type: z.enum(['instagram', 'instagram-standalone']).optional(),
8
15
  post_type: z.enum(['post', 'feed', 'story', 'reel', 'carousel']).optional(),
@@ -19,6 +26,7 @@ export const instagramSettingsSchema = z.object({
19
26
  .describe('Native clickable media tags, not caption @mentions. Supported by eligible direct Instagram and Meta-linked connections; feed images, Reels/video, and Stories. Tags apply to each carousel item and the first Story in a Story Series.'),
20
27
  first_comment: z.string().optional(),
21
28
  media_alt_texts: z.record(z.string(), z.string()).optional(),
29
+ media_accessibility: mediaAccessibilitySchema.optional(),
22
30
  reel_cover_url: z.string().optional(),
23
31
  reel_thumb_offset: z.number().nonnegative().optional(),
24
32
  is_ai_generated: z.boolean().optional().describe('Label the parent Instagram media container as AI-generated. For carousels, set on the parent only.'),
@@ -30,6 +38,7 @@ export const platformSettingsSchema = z.object({
30
38
  post_type: z.string().optional(),
31
39
  content_type: z.string().optional(),
32
40
  media_alt_texts: z.record(z.string(), z.string()).optional(),
41
+ media_accessibility: mediaAccessibilitySchema.optional(),
33
42
  reel_cover_url: z.string().optional(),
34
43
  reel_thumb_offset: z.number().nonnegative().optional(),
35
44
  // X
@@ -1,12 +1,12 @@
1
1
  import { z } from 'zod';
2
2
  import type { PosterlyClient } from '../lib/api-client.js';
3
- import { mdBullets, mdKeyValue, mdSection, mdTable, mdTitle } from '../lib/format.js';
3
+ import { mdKeyValue, mdTitle } from '../lib/format.js';
4
4
 
5
5
  export const generateImageTool = {
6
6
  name: 'generate_image',
7
7
  description:
8
- 'Generate an AI image via Posterly using Nano Banana (Gemini) or Grok Imagine Image 2.0 (xAI). The image is saved to the user\'s media storage and the returned URL can be passed to `create_post` as `media_url`.\n\n' +
9
- 'COSTS CREDITS. Every call consumes part of the user\'s monthly AI image quota (or purchased credits once the quota is exhausted). Do NOT call speculatively - always describe the image you\'re about to generate (subject, style, aspect ratio) to the user and get confirmation before calling.\n\n' +
8
+ 'Queue an AI image job via Posterly using Nano Banana (Gemini) or Grok Imagine Image 2.0 (xAI). Returns job_id. Poll get_image_job until status is completed, then pass urls to create_post as media_url / media_urls. Gemini thinking high does not change the credit price.\n\n' +
9
+ 'COSTS CREDITS. Every call consumes part of the user\'s monthly AI image quota (or purchased credits once the quota is exhausted). Do NOT call speculatively - always describe the image you\'re about to generate (subject, style, aspect ratio, quality/thinking, resolution) to the user and get confirmation before calling.\n\n' +
10
10
  'If the user is over their plan limit and has no credits, this tool returns a 402 with upgrade info. Surface that message verbatim - do not retry.\n\n' +
11
11
  'Common aspect ratios by platform:\n' +
12
12
  ' • Instagram feed / LinkedIn: 1:1 (square) or 4:5 (portrait)\n' +
@@ -53,10 +53,19 @@ export const generateImageTool = {
53
53
  .optional()
54
54
  .describe('Output resolution. Default 1K. xAI supports 1K/2K only. Google flash: 10/15/23/35 credits at 512/1K/2K/4K; pro: 30 at 1K-2K, 55 at 4K.'),
55
55
  quality: z
56
- .enum(['low', 'medium'])
56
+ .enum(['low', 'medium', 'high'])
57
57
  .optional()
58
- .describe('xAI only. Low costs 9/14 credits at 1K/2K; medium (default) costs 14/18 credits and gives better quality.'),
59
- confirm: z.literal(true).describe('Must be true after explicit user confirmation of subject, style, aspect ratio, and credit use.'),
58
+ .describe('Google: high turns on Gemini thinking (dashboard thinkingLevel=high). low/medium leave thinking minimal unless thinking_level is set. xAI: low or medium credit tiers; high is invalid.'),
59
+ thinking_level: z
60
+ .enum(['minimal', 'high'])
61
+ .optional()
62
+ .describe('Google flash/lite only. Gemini image quality control. minimal is fastest; high is for infographics, grounded scenes, and harder layouts. Pro reasons automatically. Overrides quality when both are set.'),
63
+ reference_image_urls: z
64
+ .array(z.string().url())
65
+ .max(14)
66
+ .optional()
67
+ .describe('Google only. Up to 14 HTTPS image URLs used as references (logo, product, style lock). Same as dashboard reference images.'),
68
+ confirm: z.literal(true).describe('Must be true after explicit user confirmation of subject, style, aspect ratio, quality, and credit use.'),
60
69
  }),
61
70
 
62
71
  async execute(
@@ -69,7 +78,9 @@ export const generateImageTool = {
69
78
  provider?: 'google' | 'xai';
70
79
  model?: 'lite' | 'flash' | 'pro';
71
80
  resolution?: '512' | '1K' | '2K' | '4K';
72
- quality?: 'low' | 'medium';
81
+ quality?: 'low' | 'medium' | 'high';
82
+ thinking_level?: 'minimal' | 'high';
83
+ reference_image_urls?: string[];
73
84
  confirm: true;
74
85
  }
75
86
  ) {
@@ -80,23 +91,16 @@ export const generateImageTool = {
80
91
  const result = await client.generateImage(payload);
81
92
 
82
93
  return [
83
- mdTitle(`✅ Generated ${result.images.length} image${result.images.length === 1 ? '' : 's'}`, `Model: ${result.model}`),
84
- mdTable(
85
- ['#', 'Image URL', 'Filename'],
86
- result.images.map((img, index) => [
87
- index + 1,
88
- img.url,
89
- img.filename,
90
- ]),
91
- ),
94
+ mdTitle('Image job queued', `Job: ${result.job_id}`),
92
95
  mdKeyValue([
93
- ['Billed from', result.usage.billed_from],
96
+ ['Status', result.status],
97
+ ['Model', result.model],
98
+ ['Resolution', result.resolution],
99
+ ['Thinking', result.thinking_level || undefined],
94
100
  ['Credits used', result.credits_used],
95
- ['Plan usage', result.usage.limit != null ? `${result.usage.used ?? 0}/${result.usage.limit} this ${result.usage.period || 'period'}` : undefined],
96
- ['Plan tier', result.usage.tier || undefined],
101
+ ['Billed from', result.usage?.billed_from],
97
102
  ]),
98
- result.warnings?.length ? mdSection('Warnings', mdBullets(result.warnings)) : '',
99
- '**Next step:** Pass any URL above to `create_post` as `media_url`, or use multiple as `media_urls` for a carousel.',
103
+ result.message || 'Poll get_image_job with this job_id until status is completed, then pass urls to create_post.',
100
104
  ].filter(Boolean).join('\n\n');
101
105
  },
102
106
  };