posterly-mcp-server 0.48.5 → 0.49.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 +9 -3
- package/dist/generated/platform-manifest.d.ts +3 -3
- package/dist/generated/platform-manifest.js +3 -2
- package/dist/lib/api-client.d.ts +80 -12
- package/dist/lib/api-client.js +40 -15
- package/dist/lib/format.d.ts +39 -2
- package/dist/lib/format.js +158 -0
- package/dist/lib/version.d.ts +1 -1
- package/dist/lib/version.js +1 -1
- package/dist/tools/audit-google-business-profile.d.ts +2 -2
- package/dist/tools/connect-account.d.ts +2 -2
- package/dist/tools/create-post.d.ts +12 -12
- package/dist/tools/create-posts-batch.d.ts +8 -8
- package/dist/tools/create-webhook.d.ts +2 -2
- package/dist/tools/disconnect-account.d.ts +2 -2
- package/dist/tools/find-slot.d.ts +2 -2
- package/dist/tools/get-updates.d.ts +4 -0
- package/dist/tools/get-updates.js +13 -1
- package/dist/tools/list-accounts.d.ts +2 -2
- package/dist/tools/list-activity.d.ts +4 -0
- package/dist/tools/list-activity.js +16 -3
- package/dist/tools/list-analytics.d.ts +2 -2
- package/dist/tools/list-analytics.js +1 -1
- package/dist/tools/list-comments.d.ts +2 -2
- package/dist/tools/list-conversations.d.ts +2 -2
- package/dist/tools/list-google-business-media.d.ts +2 -2
- package/dist/tools/list-google-business-reviews.d.ts +4 -4
- package/dist/tools/list-media.d.ts +4 -0
- package/dist/tools/list-media.js +22 -1
- package/dist/tools/list-platforms.d.ts +4 -4
- package/dist/tools/list-post-suggestions.d.ts +4 -0
- package/dist/tools/list-post-suggestions.js +16 -4
- package/dist/tools/list-posts.d.ts +35 -17
- package/dist/tools/list-posts.js +63 -33
- package/dist/tools/manage-comment.d.ts +2 -2
- package/dist/tools/manage-conversation.d.ts +4 -4
- package/dist/tools/manage-google-business-media.d.ts +8 -8
- package/dist/tools/manage-google-business-review.d.ts +10 -10
- package/dist/tools/manage-publishing-pause.d.ts +2 -2
- package/dist/tools/manage-webhook.d.ts +4 -4
- package/dist/tools/validate-post.d.ts +8 -8
- package/package.json +1 -1
- package/server.json +2 -2
- package/src/generated/platform-manifest.ts +3 -2
- package/src/lib/api-client.ts +94 -17
- package/src/lib/format.ts +201 -1
- package/src/lib/version.ts +1 -1
- package/src/tools/get-updates.ts +15 -1
- package/src/tools/list-activity.ts +18 -3
- package/src/tools/list-analytics.ts +1 -1
- package/src/tools/list-media.ts +23 -2
- package/src/tools/list-post-suggestions.ts +17 -4
- package/src/tools/list-posts.ts +74 -45
- package/tool-registry.json +110 -5
|
@@ -1293,9 +1293,9 @@ export declare const createPostPayloadInputSchema: z.ZodObject<{
|
|
|
1293
1293
|
workspace_id: z.ZodOptional<z.ZodString>;
|
|
1294
1294
|
}, "strip", z.ZodTypeAny, {
|
|
1295
1295
|
platform?: "instagram" | "instagram-standalone" | "facebook" | "tiktok" | "twitter" | "threads" | "linkedin" | "youtube" | "pinterest" | "google_business" | "x" | "telegram" | "bluesky" | "discord" | "wordpress" | "devto" | "hashnode" | "lemmy" | "slack" | "mastodon" | "gmb" | "google-business" | "google_business_profile" | undefined;
|
|
1296
|
-
username?: string | undefined;
|
|
1297
|
-
workspace_id?: string | undefined;
|
|
1298
1296
|
account_id?: string | undefined;
|
|
1297
|
+
workspace_id?: string | undefined;
|
|
1298
|
+
username?: string | undefined;
|
|
1299
1299
|
caption?: string | undefined;
|
|
1300
1300
|
scheduled_at?: string | undefined;
|
|
1301
1301
|
media_url?: string | undefined;
|
|
@@ -1494,9 +1494,9 @@ export declare const createPostPayloadInputSchema: z.ZodObject<{
|
|
|
1494
1494
|
}, z.ZodTypeAny, "passthrough"> | undefined;
|
|
1495
1495
|
}, {
|
|
1496
1496
|
platform?: "instagram" | "instagram-standalone" | "facebook" | "tiktok" | "twitter" | "threads" | "linkedin" | "youtube" | "pinterest" | "google_business" | "x" | "telegram" | "bluesky" | "discord" | "wordpress" | "devto" | "hashnode" | "lemmy" | "slack" | "mastodon" | "gmb" | "google-business" | "google_business_profile" | undefined;
|
|
1497
|
-
username?: string | undefined;
|
|
1498
|
-
workspace_id?: string | undefined;
|
|
1499
1497
|
account_id?: string | undefined;
|
|
1498
|
+
workspace_id?: string | undefined;
|
|
1499
|
+
username?: string | undefined;
|
|
1500
1500
|
caption?: string | undefined;
|
|
1501
1501
|
scheduled_at?: string | undefined;
|
|
1502
1502
|
media_url?: string | undefined;
|
|
@@ -2350,9 +2350,9 @@ export declare const createPostInputSchema: z.ZodObject<{
|
|
|
2350
2350
|
}, "strip", z.ZodTypeAny, {
|
|
2351
2351
|
confirm: true;
|
|
2352
2352
|
platform?: "instagram" | "instagram-standalone" | "facebook" | "tiktok" | "twitter" | "threads" | "linkedin" | "youtube" | "pinterest" | "google_business" | "x" | "telegram" | "bluesky" | "discord" | "wordpress" | "devto" | "hashnode" | "lemmy" | "slack" | "mastodon" | "gmb" | "google-business" | "google_business_profile" | undefined;
|
|
2353
|
-
username?: string | undefined;
|
|
2354
|
-
workspace_id?: string | undefined;
|
|
2355
2353
|
account_id?: string | undefined;
|
|
2354
|
+
workspace_id?: string | undefined;
|
|
2355
|
+
username?: string | undefined;
|
|
2356
2356
|
caption?: string | undefined;
|
|
2357
2357
|
scheduled_at?: string | undefined;
|
|
2358
2358
|
media_url?: string | undefined;
|
|
@@ -2552,9 +2552,9 @@ export declare const createPostInputSchema: z.ZodObject<{
|
|
|
2552
2552
|
}, {
|
|
2553
2553
|
confirm: true;
|
|
2554
2554
|
platform?: "instagram" | "instagram-standalone" | "facebook" | "tiktok" | "twitter" | "threads" | "linkedin" | "youtube" | "pinterest" | "google_business" | "x" | "telegram" | "bluesky" | "discord" | "wordpress" | "devto" | "hashnode" | "lemmy" | "slack" | "mastodon" | "gmb" | "google-business" | "google_business_profile" | undefined;
|
|
2555
|
-
username?: string | undefined;
|
|
2556
|
-
workspace_id?: string | undefined;
|
|
2557
2555
|
account_id?: string | undefined;
|
|
2556
|
+
workspace_id?: string | undefined;
|
|
2557
|
+
username?: string | undefined;
|
|
2558
2558
|
caption?: string | undefined;
|
|
2559
2559
|
scheduled_at?: string | undefined;
|
|
2560
2560
|
media_url?: string | undefined;
|
|
@@ -3437,9 +3437,9 @@ export declare const createPostTool: {
|
|
|
3437
3437
|
}, "strip", z.ZodTypeAny, {
|
|
3438
3438
|
confirm: true;
|
|
3439
3439
|
platform?: "instagram" | "instagram-standalone" | "facebook" | "tiktok" | "twitter" | "threads" | "linkedin" | "youtube" | "pinterest" | "google_business" | "x" | "telegram" | "bluesky" | "discord" | "wordpress" | "devto" | "hashnode" | "lemmy" | "slack" | "mastodon" | "gmb" | "google-business" | "google_business_profile" | undefined;
|
|
3440
|
-
username?: string | undefined;
|
|
3441
|
-
workspace_id?: string | undefined;
|
|
3442
3440
|
account_id?: string | undefined;
|
|
3441
|
+
workspace_id?: string | undefined;
|
|
3442
|
+
username?: string | undefined;
|
|
3443
3443
|
caption?: string | undefined;
|
|
3444
3444
|
scheduled_at?: string | undefined;
|
|
3445
3445
|
media_url?: string | undefined;
|
|
@@ -3639,9 +3639,9 @@ export declare const createPostTool: {
|
|
|
3639
3639
|
}, {
|
|
3640
3640
|
confirm: true;
|
|
3641
3641
|
platform?: "instagram" | "instagram-standalone" | "facebook" | "tiktok" | "twitter" | "threads" | "linkedin" | "youtube" | "pinterest" | "google_business" | "x" | "telegram" | "bluesky" | "discord" | "wordpress" | "devto" | "hashnode" | "lemmy" | "slack" | "mastodon" | "gmb" | "google-business" | "google_business_profile" | undefined;
|
|
3642
|
-
username?: string | undefined;
|
|
3643
|
-
workspace_id?: string | undefined;
|
|
3644
3642
|
account_id?: string | undefined;
|
|
3643
|
+
workspace_id?: string | undefined;
|
|
3644
|
+
username?: string | undefined;
|
|
3645
3645
|
caption?: string | undefined;
|
|
3646
3646
|
scheduled_at?: string | undefined;
|
|
3647
3647
|
media_url?: string | undefined;
|
|
@@ -658,9 +658,9 @@ export declare const createPostsBatchTool: {
|
|
|
658
658
|
workspace_id: z.ZodOptional<z.ZodString>;
|
|
659
659
|
}, "strip", z.ZodTypeAny, {
|
|
660
660
|
platform?: "instagram" | "instagram-standalone" | "facebook" | "tiktok" | "twitter" | "threads" | "linkedin" | "youtube" | "pinterest" | "google_business" | "x" | "telegram" | "bluesky" | "discord" | "wordpress" | "devto" | "hashnode" | "lemmy" | "slack" | "mastodon" | "gmb" | "google-business" | "google_business_profile" | undefined;
|
|
661
|
-
username?: string | undefined;
|
|
662
|
-
workspace_id?: string | undefined;
|
|
663
661
|
account_id?: string | undefined;
|
|
662
|
+
workspace_id?: string | undefined;
|
|
663
|
+
username?: string | undefined;
|
|
664
664
|
caption?: string | undefined;
|
|
665
665
|
scheduled_at?: string | undefined;
|
|
666
666
|
media_url?: string | undefined;
|
|
@@ -859,9 +859,9 @@ export declare const createPostsBatchTool: {
|
|
|
859
859
|
}, z.ZodTypeAny, "passthrough"> | undefined;
|
|
860
860
|
}, {
|
|
861
861
|
platform?: "instagram" | "instagram-standalone" | "facebook" | "tiktok" | "twitter" | "threads" | "linkedin" | "youtube" | "pinterest" | "google_business" | "x" | "telegram" | "bluesky" | "discord" | "wordpress" | "devto" | "hashnode" | "lemmy" | "slack" | "mastodon" | "gmb" | "google-business" | "google_business_profile" | undefined;
|
|
862
|
-
username?: string | undefined;
|
|
863
|
-
workspace_id?: string | undefined;
|
|
864
862
|
account_id?: string | undefined;
|
|
863
|
+
workspace_id?: string | undefined;
|
|
864
|
+
username?: string | undefined;
|
|
865
865
|
caption?: string | undefined;
|
|
866
866
|
scheduled_at?: string | undefined;
|
|
867
867
|
media_url?: string | undefined;
|
|
@@ -1064,9 +1064,9 @@ export declare const createPostsBatchTool: {
|
|
|
1064
1064
|
confirm: true;
|
|
1065
1065
|
posts: {
|
|
1066
1066
|
platform?: "instagram" | "instagram-standalone" | "facebook" | "tiktok" | "twitter" | "threads" | "linkedin" | "youtube" | "pinterest" | "google_business" | "x" | "telegram" | "bluesky" | "discord" | "wordpress" | "devto" | "hashnode" | "lemmy" | "slack" | "mastodon" | "gmb" | "google-business" | "google_business_profile" | undefined;
|
|
1067
|
-
username?: string | undefined;
|
|
1068
|
-
workspace_id?: string | undefined;
|
|
1069
1067
|
account_id?: string | undefined;
|
|
1068
|
+
workspace_id?: string | undefined;
|
|
1069
|
+
username?: string | undefined;
|
|
1070
1070
|
caption?: string | undefined;
|
|
1071
1071
|
scheduled_at?: string | undefined;
|
|
1072
1072
|
media_url?: string | undefined;
|
|
@@ -1268,9 +1268,9 @@ export declare const createPostsBatchTool: {
|
|
|
1268
1268
|
confirm: true;
|
|
1269
1269
|
posts: {
|
|
1270
1270
|
platform?: "instagram" | "instagram-standalone" | "facebook" | "tiktok" | "twitter" | "threads" | "linkedin" | "youtube" | "pinterest" | "google_business" | "x" | "telegram" | "bluesky" | "discord" | "wordpress" | "devto" | "hashnode" | "lemmy" | "slack" | "mastodon" | "gmb" | "google-business" | "google_business_profile" | undefined;
|
|
1271
|
-
username?: string | undefined;
|
|
1272
|
-
workspace_id?: string | undefined;
|
|
1273
1271
|
account_id?: string | undefined;
|
|
1272
|
+
workspace_id?: string | undefined;
|
|
1273
|
+
username?: string | undefined;
|
|
1274
1274
|
caption?: string | undefined;
|
|
1275
1275
|
scheduled_at?: string | undefined;
|
|
1276
1276
|
media_url?: string | undefined;
|
|
@@ -13,15 +13,15 @@ export declare const createWebhookTool: {
|
|
|
13
13
|
}, "strip", z.ZodTypeAny, {
|
|
14
14
|
confirm: true;
|
|
15
15
|
url: string;
|
|
16
|
-
description?: string | undefined;
|
|
17
16
|
workspace_id?: string | undefined;
|
|
17
|
+
description?: string | undefined;
|
|
18
18
|
is_active?: boolean | undefined;
|
|
19
19
|
events?: ("webhook.test" | "post.created" | "post.updated" | "post.deleted" | "post.publishing" | "post.published" | "post.failed" | "account.disconnected" | "analytics.synced" | "approval.requested" | "approval.approved" | "approval.changes_requested" | "approval.rejected" | "approval.commented")[] | undefined;
|
|
20
20
|
}, {
|
|
21
21
|
confirm: true;
|
|
22
22
|
url: string;
|
|
23
|
-
description?: string | undefined;
|
|
24
23
|
workspace_id?: string | undefined;
|
|
24
|
+
description?: string | undefined;
|
|
25
25
|
is_active?: boolean | undefined;
|
|
26
26
|
events?: ("webhook.test" | "post.created" | "post.updated" | "post.deleted" | "post.publishing" | "post.published" | "post.failed" | "account.disconnected" | "analytics.synced" | "approval.requested" | "approval.approved" | "approval.changes_requested" | "approval.rejected" | "approval.commented")[] | undefined;
|
|
27
27
|
}>;
|
|
@@ -7,11 +7,11 @@ export declare const disconnectAccountTool: {
|
|
|
7
7
|
account_id: z.ZodString;
|
|
8
8
|
confirm: z.ZodBoolean;
|
|
9
9
|
}, "strip", z.ZodTypeAny, {
|
|
10
|
-
confirm: boolean;
|
|
11
10
|
account_id: string;
|
|
12
|
-
}, {
|
|
13
11
|
confirm: boolean;
|
|
12
|
+
}, {
|
|
14
13
|
account_id: string;
|
|
14
|
+
confirm: boolean;
|
|
15
15
|
}>;
|
|
16
16
|
execute(client: PosterlyClient, input: {
|
|
17
17
|
account_id: string;
|
|
@@ -11,14 +11,14 @@ export declare const findSlotTool: {
|
|
|
11
11
|
strategy: z.ZodOptional<z.ZodEnum<["next_free", "best_engagement"]>>;
|
|
12
12
|
}, "strip", z.ZodTypeAny, {
|
|
13
13
|
workspace_id?: string | undefined;
|
|
14
|
-
account_ids?: string[] | undefined;
|
|
15
14
|
timezone?: string | undefined;
|
|
15
|
+
account_ids?: string[] | undefined;
|
|
16
16
|
count?: number | undefined;
|
|
17
17
|
strategy?: "next_free" | "best_engagement" | undefined;
|
|
18
18
|
}, {
|
|
19
19
|
workspace_id?: string | undefined;
|
|
20
|
-
account_ids?: string[] | undefined;
|
|
21
20
|
timezone?: string | undefined;
|
|
21
|
+
account_ids?: string[] | undefined;
|
|
22
22
|
count?: number | undefined;
|
|
23
23
|
strategy?: "next_free" | "best_engagement" | undefined;
|
|
24
24
|
}>;
|
|
@@ -5,19 +5,23 @@ export declare const getUpdatesTool: {
|
|
|
5
5
|
description: string;
|
|
6
6
|
inputSchema: z.ZodObject<{
|
|
7
7
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
8
|
+
offset: z.ZodOptional<z.ZodNumber>;
|
|
8
9
|
since: z.ZodOptional<z.ZodString>;
|
|
9
10
|
include_content: z.ZodOptional<z.ZodBoolean>;
|
|
10
11
|
}, "strip", z.ZodTypeAny, {
|
|
11
12
|
limit?: number | undefined;
|
|
13
|
+
offset?: number | undefined;
|
|
12
14
|
since?: string | undefined;
|
|
13
15
|
include_content?: boolean | undefined;
|
|
14
16
|
}, {
|
|
15
17
|
limit?: number | undefined;
|
|
18
|
+
offset?: number | undefined;
|
|
16
19
|
since?: string | undefined;
|
|
17
20
|
include_content?: boolean | undefined;
|
|
18
21
|
}>;
|
|
19
22
|
execute(client: PosterlyClient, input: {
|
|
20
23
|
limit?: number;
|
|
24
|
+
offset?: number;
|
|
21
25
|
since?: string;
|
|
22
26
|
include_content?: boolean;
|
|
23
27
|
}): Promise<string>;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatPagingNote } from '../lib/format.js';
|
|
2
3
|
export const getUpdatesTool = {
|
|
3
4
|
name: 'get_updates',
|
|
4
|
-
description: 'Get the latest posterly product updates and news from the updates feed: new features, improvements, and fixes. Requires an active posterly subscription.',
|
|
5
|
+
description: 'Get the latest posterly product updates and news from the updates feed: new features, improvements, and fixes, newest first. The output says whether more updates exist; page with offset or narrow with since. Requires an active posterly subscription.',
|
|
5
6
|
inputSchema: z.object({
|
|
6
7
|
limit: z.number().int().min(1).max(50).optional().describe('Number of updates to return. Default 10, max 50.'),
|
|
8
|
+
offset: z.number().int().min(0).optional().describe('How many updates to skip. Use the offset the previous page gives to get the next page.'),
|
|
7
9
|
since: z.string().optional().describe('ISO date. Return updates published on or after this date.'),
|
|
8
10
|
include_content: z.boolean().optional().describe('Include the full markdown body of each update. Defaults to false.'),
|
|
9
11
|
}),
|
|
@@ -24,6 +26,16 @@ export const getUpdatesTool = {
|
|
|
24
26
|
lines.push('', update.content.trim(), '');
|
|
25
27
|
}
|
|
26
28
|
}
|
|
29
|
+
lines.push('', formatPagingNote({
|
|
30
|
+
noun: 'updates',
|
|
31
|
+
tool: 'get_updates',
|
|
32
|
+
offset: result.offset ?? input.offset ?? 0,
|
|
33
|
+
count: result.updates.length,
|
|
34
|
+
total: result.total,
|
|
35
|
+
// An API older than has_more: a full page may mean more exist.
|
|
36
|
+
hasMore: result.has_more ?? result.updates.length >= (input.limit || 10),
|
|
37
|
+
nextOffset: result.next_offset,
|
|
38
|
+
}));
|
|
27
39
|
return lines.join('\n');
|
|
28
40
|
},
|
|
29
41
|
};
|
|
@@ -18,14 +18,14 @@ export declare const listAccountsTool: {
|
|
|
18
18
|
session_id: z.ZodOptional<z.ZodString>;
|
|
19
19
|
debug: z.ZodOptional<z.ZodBoolean>;
|
|
20
20
|
}, "strip", z.ZodTypeAny, {
|
|
21
|
-
workspace_id?: string | undefined;
|
|
22
21
|
account_id?: string | number | undefined;
|
|
22
|
+
workspace_id?: string | undefined;
|
|
23
23
|
view?: "accounts" | "learned_voice" | "performance_profile" | "connect_session" | undefined;
|
|
24
24
|
session_id?: string | undefined;
|
|
25
25
|
debug?: boolean | undefined;
|
|
26
26
|
}, {
|
|
27
|
-
workspace_id?: string | undefined;
|
|
28
27
|
account_id?: string | number | undefined;
|
|
28
|
+
workspace_id?: string | undefined;
|
|
29
29
|
view?: "accounts" | "learned_voice" | "performance_profile" | "connect_session" | undefined;
|
|
30
30
|
session_id?: string | undefined;
|
|
31
31
|
debug?: boolean | undefined;
|
|
@@ -9,16 +9,19 @@ export declare const listActivityTool: {
|
|
|
9
9
|
since: z.ZodOptional<z.ZodString>;
|
|
10
10
|
type: z.ZodOptional<z.ZodEnum<["all", "activity", "publish"]>>;
|
|
11
11
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
12
|
+
offset: z.ZodOptional<z.ZodNumber>;
|
|
12
13
|
}, "strip", z.ZodTypeAny, {
|
|
13
14
|
workspace_id?: string | undefined;
|
|
14
15
|
post_id?: number | undefined;
|
|
15
16
|
limit?: number | undefined;
|
|
17
|
+
offset?: number | undefined;
|
|
16
18
|
since?: string | undefined;
|
|
17
19
|
type?: "activity" | "publish" | "all" | undefined;
|
|
18
20
|
}, {
|
|
19
21
|
workspace_id?: string | undefined;
|
|
20
22
|
post_id?: number | undefined;
|
|
21
23
|
limit?: number | undefined;
|
|
24
|
+
offset?: number | undefined;
|
|
22
25
|
since?: string | undefined;
|
|
23
26
|
type?: "activity" | "publish" | "all" | undefined;
|
|
24
27
|
}>;
|
|
@@ -28,5 +31,6 @@ export declare const listActivityTool: {
|
|
|
28
31
|
since?: string;
|
|
29
32
|
type?: "all" | "activity" | "publish";
|
|
30
33
|
limit?: number;
|
|
34
|
+
offset?: number;
|
|
31
35
|
}): Promise<string>;
|
|
32
36
|
};
|
|
@@ -1,21 +1,25 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatPagingNote } from '../lib/format.js';
|
|
2
3
|
export const listActivityTool = {
|
|
3
4
|
name: 'list_activity',
|
|
4
|
-
description: 'List recent activity and publish events for posts, including status changes, publish attempts, failures, and retries. Use this as the agent notifications feed.',
|
|
5
|
+
description: 'List recent activity and publish events for posts, including status changes, publish attempts, failures, and retries, newest first. Use this as the agent notifications feed. The output says whether more events exist; page with offset (offset + limit up to 1000) or narrow with since or post_id before concluding nothing else happened.',
|
|
5
6
|
inputSchema: z.object({
|
|
6
7
|
workspace_id: z.string().optional().describe('Filter to a workspace ID from whoami.'),
|
|
7
8
|
post_id: z.number().int().positive().optional().describe('Filter to one post ID.'),
|
|
8
9
|
since: z.string().optional().describe('ISO datetime. Return events created at or after this time.'),
|
|
9
10
|
type: z.enum(['all', 'activity', 'publish']).optional().describe('Event source filter. Defaults to all.'),
|
|
10
11
|
limit: z.number().int().min(1).max(100).optional().describe('Number of items to return. Default 50, max 100.'),
|
|
12
|
+
offset: z.number().int().min(0).optional().describe('How many events to skip. Use the offset the previous page gives to get the next page.'),
|
|
11
13
|
}),
|
|
12
14
|
async execute(client, input) {
|
|
13
15
|
const result = await client.listActivity(input);
|
|
14
16
|
if (result.items.length === 0) {
|
|
15
|
-
return
|
|
17
|
+
return (input.offset ?? 0) > 0
|
|
18
|
+
? `No activity on this page: offset ${input.offset} is past the last matching event.`
|
|
19
|
+
: 'No activity found matching your filters.';
|
|
16
20
|
}
|
|
17
21
|
const lines = [
|
|
18
|
-
`Activity (${result.items.length}
|
|
22
|
+
`Activity (${result.items.length} on this page):`,
|
|
19
23
|
];
|
|
20
24
|
for (const item of result.items) {
|
|
21
25
|
const when = item.created_at ? new Date(item.created_at).toLocaleString() : 'unknown time';
|
|
@@ -30,6 +34,15 @@ export const listActivityTool = {
|
|
|
30
34
|
lines.push(`- [${when}] post #${item.post_id || '?'} ${label}`);
|
|
31
35
|
}
|
|
32
36
|
}
|
|
37
|
+
lines.push('', formatPagingNote({
|
|
38
|
+
noun: 'events',
|
|
39
|
+
tool: 'list_activity',
|
|
40
|
+
offset: result.offset ?? input.offset ?? 0,
|
|
41
|
+
count: result.items.length,
|
|
42
|
+
// An API older than has_more: a full page may mean more exist.
|
|
43
|
+
hasMore: result.has_more ?? result.items.length >= (result.limit || 50),
|
|
44
|
+
nextOffset: result.next_offset,
|
|
45
|
+
}));
|
|
33
46
|
return lines.join('\n');
|
|
34
47
|
},
|
|
35
48
|
};
|
|
@@ -29,7 +29,7 @@ export declare const listAnalyticsTool: {
|
|
|
29
29
|
checkpoint: z.ZodOptional<z.ZodEnum<["1h", "6h", "24h", "72h", "7d"]>>;
|
|
30
30
|
presentation: z.ZodOptional<z.ZodEnum<["compact", "table", "json"]>>;
|
|
31
31
|
}, "strip", z.ZodTypeAny, {
|
|
32
|
-
view: "
|
|
32
|
+
view: "posts" | "accounts" | "insights";
|
|
33
33
|
account_id?: string | number | undefined;
|
|
34
34
|
post_id?: number | undefined;
|
|
35
35
|
checkpoint?: "1h" | "6h" | "24h" | "72h" | "7d" | undefined;
|
|
@@ -39,7 +39,7 @@ export declare const listAnalyticsTool: {
|
|
|
39
39
|
to?: string | undefined;
|
|
40
40
|
presentation?: "compact" | "table" | "json" | undefined;
|
|
41
41
|
}, {
|
|
42
|
-
view: "
|
|
42
|
+
view: "posts" | "accounts" | "insights";
|
|
43
43
|
account_id?: string | number | undefined;
|
|
44
44
|
post_id?: number | undefined;
|
|
45
45
|
checkpoint?: "1h" | "6h" | "24h" | "72h" | "7d" | undefined;
|
|
@@ -4,7 +4,7 @@ import { validateArgs } from '../lib/tool-runtime.js';
|
|
|
4
4
|
const presentationSchema = z.enum(['compact', 'table', 'json']).optional();
|
|
5
5
|
export const listAnalyticsTool = {
|
|
6
6
|
name: 'list_analytics',
|
|
7
|
-
description: 'Analytics for connected social accounts (Instagram, Facebook, LinkedIn, Google Business Profile, Pinterest, YouTube, and Threads). view=accounts (account_id): daily snapshots and a period summary with platform-native display_metrics labels. Google Business Profile account analytics includes Calls, Website clicks, and Directions along with Profile Views, Search Views, Maps Views, Customer Actions, and Posts. view=posts (account_id): per-post likes, comments/replies, reach, impressions/views, saves, shares, reposts, quotes, plays, clicks, and watch time, most recent first, with limit/offset. view=insights: per-post feedback insights with a performance tier (great/good/mixed/poor), diagnosis, next action, and baseline, filtered by account_id, post_id, or checkpoint (1h, 6h, 24h, 72h, 7d); read-only, Pro plan or higher. presentation (accounts and posts): compact for Telegram/mobile, table for Markdown clients, json for custom chart/card renderers.',
|
|
7
|
+
description: 'Analytics for connected social accounts (Instagram, X, Facebook, LinkedIn, Google Business Profile, Pinterest, YouTube, and Threads). view=accounts (account_id): daily snapshots and a period summary with platform-native display_metrics labels. Google Business Profile account analytics includes Calls, Website clicks, and Directions along with Profile Views, Search Views, Maps Views, Customer Actions, and Posts. view=posts (account_id): per-post likes, comments/replies, reach, impressions/views, saves, shares, reposts, quotes, plays, clicks, and watch time, most recent first, with limit/offset. view=insights: per-post feedback insights with a performance tier (great/good/mixed/poor), diagnosis, next action, and baseline, filtered by account_id, post_id, or checkpoint (1h, 6h, 24h, 72h, 7d); read-only, Pro plan or higher. presentation (accounts and posts): compact for Telegram/mobile, table for Markdown clients, json for custom chart/card renderers.',
|
|
8
8
|
inputSchema: z.object({
|
|
9
9
|
view: z.enum(['accounts', 'posts', 'insights']).describe('accounts, posts, or insights.'),
|
|
10
10
|
account_id: z
|
|
@@ -25,8 +25,8 @@ export declare const listCommentsTool: {
|
|
|
25
25
|
offset: z.ZodOptional<z.ZodNumber>;
|
|
26
26
|
}, "strip", z.ZodTypeAny, {
|
|
27
27
|
platform?: "instagram" | "facebook" | "threads" | "linkedin" | undefined;
|
|
28
|
-
workspace_id?: string | undefined;
|
|
29
28
|
account_id?: number | undefined;
|
|
29
|
+
workspace_id?: string | undefined;
|
|
30
30
|
limit?: number | undefined;
|
|
31
31
|
offset?: number | undefined;
|
|
32
32
|
filter?: "all" | "unread" | "flagged" | undefined;
|
|
@@ -34,8 +34,8 @@ export declare const listCommentsTool: {
|
|
|
34
34
|
comment_id?: string | undefined;
|
|
35
35
|
}, {
|
|
36
36
|
platform?: "instagram" | "facebook" | "threads" | "linkedin" | undefined;
|
|
37
|
-
workspace_id?: string | undefined;
|
|
38
37
|
account_id?: number | undefined;
|
|
38
|
+
workspace_id?: string | undefined;
|
|
39
39
|
limit?: number | undefined;
|
|
40
40
|
offset?: number | undefined;
|
|
41
41
|
filter?: "all" | "unread" | "flagged" | undefined;
|
|
@@ -25,8 +25,8 @@ export declare const listConversationsTool: {
|
|
|
25
25
|
offset: z.ZodOptional<z.ZodNumber>;
|
|
26
26
|
}, "strip", z.ZodTypeAny, {
|
|
27
27
|
platform?: "instagram" | "facebook" | "threads" | undefined;
|
|
28
|
-
workspace_id?: string | undefined;
|
|
29
28
|
account_id?: number | undefined;
|
|
29
|
+
workspace_id?: string | undefined;
|
|
30
30
|
limit?: number | undefined;
|
|
31
31
|
offset?: number | undefined;
|
|
32
32
|
filter?: "all" | "unread" | "starred" | "archived" | undefined;
|
|
@@ -34,8 +34,8 @@ export declare const listConversationsTool: {
|
|
|
34
34
|
conversation_id?: string | undefined;
|
|
35
35
|
}, {
|
|
36
36
|
platform?: "instagram" | "facebook" | "threads" | undefined;
|
|
37
|
-
workspace_id?: string | undefined;
|
|
38
37
|
account_id?: number | undefined;
|
|
38
|
+
workspace_id?: string | undefined;
|
|
39
39
|
limit?: number | undefined;
|
|
40
40
|
offset?: number | undefined;
|
|
41
41
|
filter?: "all" | "unread" | "starred" | "archived" | undefined;
|
|
@@ -8,12 +8,12 @@ export declare const listGoogleBusinessMediaTool: {
|
|
|
8
8
|
account_id: z.ZodOptional<z.ZodNumber>;
|
|
9
9
|
location_id: z.ZodOptional<z.ZodString>;
|
|
10
10
|
}, "strip", z.ZodTypeAny, {
|
|
11
|
-
workspace_id?: string | undefined;
|
|
12
11
|
account_id?: number | undefined;
|
|
12
|
+
workspace_id?: string | undefined;
|
|
13
13
|
location_id?: string | undefined;
|
|
14
14
|
}, {
|
|
15
|
-
workspace_id?: string | undefined;
|
|
16
15
|
account_id?: number | undefined;
|
|
16
|
+
workspace_id?: string | undefined;
|
|
17
17
|
location_id?: string | undefined;
|
|
18
18
|
}>;
|
|
19
19
|
execute(client: PosterlyClient, input: {
|
|
@@ -24,8 +24,8 @@ export declare const listGoogleBusinessReviewsTool: {
|
|
|
24
24
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
25
25
|
offset: z.ZodOptional<z.ZodNumber>;
|
|
26
26
|
}, "strip", z.ZodTypeAny, {
|
|
27
|
-
workspace_id?: string | undefined;
|
|
28
27
|
account_id?: number | undefined;
|
|
28
|
+
workspace_id?: string | undefined;
|
|
29
29
|
limit?: number | undefined;
|
|
30
30
|
offset?: number | undefined;
|
|
31
31
|
location_id?: string | undefined;
|
|
@@ -33,8 +33,8 @@ export declare const listGoogleBusinessReviewsTool: {
|
|
|
33
33
|
unanswered?: boolean | undefined;
|
|
34
34
|
view?: "reviews" | "review_link" | undefined;
|
|
35
35
|
}, {
|
|
36
|
-
workspace_id?: string | undefined;
|
|
37
36
|
account_id?: number | undefined;
|
|
37
|
+
workspace_id?: string | undefined;
|
|
38
38
|
limit?: number | undefined;
|
|
39
39
|
offset?: number | undefined;
|
|
40
40
|
location_id?: string | undefined;
|
|
@@ -49,12 +49,12 @@ export declare const listGoogleBusinessReviewsTool: {
|
|
|
49
49
|
account_id: z.ZodOptional<z.ZodNumber>;
|
|
50
50
|
location_id: z.ZodOptional<z.ZodString>;
|
|
51
51
|
}, "strip", z.ZodTypeAny, {
|
|
52
|
-
workspace_id?: string | undefined;
|
|
53
52
|
account_id?: number | undefined;
|
|
53
|
+
workspace_id?: string | undefined;
|
|
54
54
|
location_id?: string | undefined;
|
|
55
55
|
}, {
|
|
56
|
-
workspace_id?: string | undefined;
|
|
57
56
|
account_id?: number | undefined;
|
|
57
|
+
workspace_id?: string | undefined;
|
|
58
58
|
location_id?: string | undefined;
|
|
59
59
|
}>;
|
|
60
60
|
};
|
|
@@ -5,16 +5,20 @@ export declare const listMediaTool: {
|
|
|
5
5
|
description: string;
|
|
6
6
|
inputSchema: z.ZodObject<{
|
|
7
7
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
8
|
+
offset: z.ZodOptional<z.ZodNumber>;
|
|
8
9
|
drop_session_id: z.ZodOptional<z.ZodString>;
|
|
9
10
|
}, "strip", z.ZodTypeAny, {
|
|
10
11
|
limit?: number | undefined;
|
|
12
|
+
offset?: number | undefined;
|
|
11
13
|
drop_session_id?: string | undefined;
|
|
12
14
|
}, {
|
|
13
15
|
limit?: number | undefined;
|
|
16
|
+
offset?: number | undefined;
|
|
14
17
|
drop_session_id?: string | undefined;
|
|
15
18
|
}>;
|
|
16
19
|
execute(client: PosterlyClient, input: {
|
|
17
20
|
limit?: number;
|
|
21
|
+
offset?: number;
|
|
18
22
|
drop_session_id?: string;
|
|
19
23
|
}): Promise<string>;
|
|
20
24
|
};
|
package/dist/tools/list-media.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatPagingNote } from '../lib/format.js';
|
|
2
3
|
export const listMediaTool = {
|
|
3
4
|
name: 'list_media',
|
|
4
|
-
description: 'List the newest media assets for the authenticated user. After create_media_drop, pass drop_session_id to see files the human uploaded on /drop/<token>. Use public_url with validate_post / create_post.',
|
|
5
|
+
description: 'List the newest media assets for the authenticated user. After create_media_drop, pass drop_session_id to see files the human uploaded on /drop/<token>. Use public_url with validate_post / create_post. The output says whether every matching file is shown; page with offset (offset + limit up to 1000) when it is not.',
|
|
5
6
|
inputSchema: z.object({
|
|
6
7
|
limit: z
|
|
7
8
|
.number()
|
|
@@ -10,6 +11,12 @@ export const listMediaTool = {
|
|
|
10
11
|
.max(50)
|
|
11
12
|
.optional()
|
|
12
13
|
.describe('Number of assets to return (default 10, max 50)'),
|
|
14
|
+
offset: z
|
|
15
|
+
.number()
|
|
16
|
+
.int()
|
|
17
|
+
.min(0)
|
|
18
|
+
.optional()
|
|
19
|
+
.describe('How many assets to skip. Use the offset the previous page gives to get the next page.'),
|
|
13
20
|
drop_session_id: z
|
|
14
21
|
.string()
|
|
15
22
|
.optional()
|
|
@@ -18,9 +25,13 @@ export const listMediaTool = {
|
|
|
18
25
|
async execute(client, input) {
|
|
19
26
|
const result = await client.listMedia({
|
|
20
27
|
limit: input.limit,
|
|
28
|
+
offset: input.offset,
|
|
21
29
|
dropSessionId: input.drop_session_id,
|
|
22
30
|
});
|
|
23
31
|
if (result.media.length === 0) {
|
|
32
|
+
if ((input.offset ?? 0) > 0 && result.total > 0) {
|
|
33
|
+
return `No media on this page: offset ${input.offset} is past the last of the ${result.total} matching files.`;
|
|
34
|
+
}
|
|
24
35
|
return 'No media found. If you just sent a drop URL, wait for the user to finish uploading, then call list_media again.';
|
|
25
36
|
}
|
|
26
37
|
const lines = result.media.map((item) => {
|
|
@@ -28,10 +39,20 @@ export const listMediaTool = {
|
|
|
28
39
|
const drop = item.drop_session_id ? ` drop=${item.drop_session_id}` : '';
|
|
29
40
|
return `• ${item.filename} (${item.mime || 'unknown'}, ${size})${drop}\n public_url: ${item.public_url}`;
|
|
30
41
|
});
|
|
42
|
+
const offset = result.offset ?? input.offset ?? 0;
|
|
31
43
|
return [
|
|
32
44
|
`Media (${result.media.length} of ${result.total}):`,
|
|
33
45
|
...lines,
|
|
34
46
|
'',
|
|
47
|
+
formatPagingNote({
|
|
48
|
+
noun: 'files',
|
|
49
|
+
tool: 'list_media',
|
|
50
|
+
offset,
|
|
51
|
+
count: result.media.length,
|
|
52
|
+
total: result.total,
|
|
53
|
+
hasMore: result.has_more ?? offset + result.media.length < result.total,
|
|
54
|
+
nextOffset: result.next_offset,
|
|
55
|
+
}),
|
|
35
56
|
'Pass public_url to validate_post / create_post. Do not invent URLs.',
|
|
36
57
|
].join('\n');
|
|
37
58
|
},
|
|
@@ -23,17 +23,17 @@ export declare const listPlatformsTool: {
|
|
|
23
23
|
debug: z.ZodOptional<z.ZodBoolean>;
|
|
24
24
|
}, "strip", z.ZodTypeAny, {
|
|
25
25
|
platform?: "instagram" | "instagram-standalone" | "facebook" | "tiktok" | "twitter" | "threads" | "linkedin" | "youtube" | "pinterest" | "google_business" | "medium" | "x" | "telegram" | "bluesky" | "discord" | "wordpress" | "devto" | "hashnode" | "lemmy" | "slack" | "mastodon" | "reddit" | "skool" | "whop" | "gmb" | "google-business" | "google_business_profile" | undefined;
|
|
26
|
+
account_id?: string | undefined;
|
|
26
27
|
workspace_id?: string | undefined;
|
|
27
28
|
include_planned?: boolean | undefined;
|
|
28
|
-
account_id?: string | undefined;
|
|
29
29
|
view?: "platforms" | "schema" | "connect_link" | undefined;
|
|
30
30
|
debug?: boolean | undefined;
|
|
31
31
|
target?: "meta" | "instagram_direct" | "instagram" | "instagram-standalone" | "facebook" | "tiktok" | "twitter" | "threads" | "linkedin" | "youtube" | "pinterest" | "google_business" | "medium" | "x" | "telegram" | "bluesky" | "discord" | "wordpress" | "devto" | "hashnode" | "lemmy" | "slack" | "mastodon" | "reddit" | "skool" | "whop" | "gmb" | "google-business" | "google_business_profile" | "linkedin_page" | "facebook_instagram" | "facebook_pages" | "linkedin-company" | "linkedin-page" | "linkedin_company" | "linkedin_personal" | "meta_business" | "x_twitter" | undefined;
|
|
32
32
|
}, {
|
|
33
33
|
platform?: "instagram" | "instagram-standalone" | "facebook" | "tiktok" | "twitter" | "threads" | "linkedin" | "youtube" | "pinterest" | "google_business" | "medium" | "x" | "telegram" | "bluesky" | "discord" | "wordpress" | "devto" | "hashnode" | "lemmy" | "slack" | "mastodon" | "reddit" | "skool" | "whop" | "gmb" | "google-business" | "google_business_profile" | undefined;
|
|
34
|
+
account_id?: string | undefined;
|
|
34
35
|
workspace_id?: string | undefined;
|
|
35
36
|
include_planned?: boolean | undefined;
|
|
36
|
-
account_id?: string | undefined;
|
|
37
37
|
view?: "platforms" | "schema" | "connect_link" | undefined;
|
|
38
38
|
debug?: boolean | undefined;
|
|
39
39
|
target?: "meta" | "instagram_direct" | "instagram" | "instagram-standalone" | "facebook" | "tiktok" | "twitter" | "threads" | "linkedin" | "youtube" | "pinterest" | "google_business" | "medium" | "x" | "telegram" | "bluesky" | "discord" | "wordpress" | "devto" | "hashnode" | "lemmy" | "slack" | "mastodon" | "reddit" | "skool" | "whop" | "gmb" | "google-business" | "google_business_profile" | "linkedin_page" | "facebook_instagram" | "facebook_pages" | "linkedin-company" | "linkedin-page" | "linkedin_company" | "linkedin_personal" | "meta_business" | "x_twitter" | undefined;
|
|
@@ -46,12 +46,12 @@ export declare const listPlatformsTool: {
|
|
|
46
46
|
include_planned: z.ZodOptional<z.ZodBoolean>;
|
|
47
47
|
}, "strip", z.ZodTypeAny, {
|
|
48
48
|
platform?: "instagram" | "instagram-standalone" | "facebook" | "tiktok" | "twitter" | "threads" | "linkedin" | "youtube" | "pinterest" | "google_business" | "medium" | "x" | "telegram" | "bluesky" | "discord" | "wordpress" | "devto" | "hashnode" | "lemmy" | "slack" | "mastodon" | "reddit" | "skool" | "whop" | "gmb" | "google-business" | "google_business_profile" | undefined;
|
|
49
|
-
include_planned?: boolean | undefined;
|
|
50
49
|
account_id?: string | undefined;
|
|
50
|
+
include_planned?: boolean | undefined;
|
|
51
51
|
}, {
|
|
52
52
|
platform?: "instagram" | "instagram-standalone" | "facebook" | "tiktok" | "twitter" | "threads" | "linkedin" | "youtube" | "pinterest" | "google_business" | "medium" | "x" | "telegram" | "bluesky" | "discord" | "wordpress" | "devto" | "hashnode" | "lemmy" | "slack" | "mastodon" | "reddit" | "skool" | "whop" | "gmb" | "google-business" | "google_business_profile" | undefined;
|
|
53
|
-
include_planned?: boolean | undefined;
|
|
54
53
|
account_id?: string | undefined;
|
|
54
|
+
include_planned?: boolean | undefined;
|
|
55
55
|
}>;
|
|
56
56
|
get_connect_link: z.ZodObject<{
|
|
57
57
|
platform: z.ZodOptional<z.ZodEnum<["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"]>>;
|
|
@@ -7,18 +7,22 @@ export declare const listPostSuggestionsTool: {
|
|
|
7
7
|
account_id: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>;
|
|
8
8
|
status: z.ZodOptional<z.ZodEnum<["pending", "scheduled", "dismissed"]>>;
|
|
9
9
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
10
|
+
offset: z.ZodOptional<z.ZodNumber>;
|
|
10
11
|
}, "strip", z.ZodTypeAny, {
|
|
11
12
|
status?: "pending" | "scheduled" | "dismissed" | undefined;
|
|
12
13
|
account_id?: string | number | undefined;
|
|
13
14
|
limit?: number | undefined;
|
|
15
|
+
offset?: number | undefined;
|
|
14
16
|
}, {
|
|
15
17
|
status?: "pending" | "scheduled" | "dismissed" | undefined;
|
|
16
18
|
account_id?: string | number | undefined;
|
|
17
19
|
limit?: number | undefined;
|
|
20
|
+
offset?: number | undefined;
|
|
18
21
|
}>;
|
|
19
22
|
execute(client: PosterlyClient, input: {
|
|
20
23
|
account_id?: string | number;
|
|
21
24
|
status?: "pending" | "scheduled" | "dismissed";
|
|
22
25
|
limit?: number;
|
|
26
|
+
offset?: number;
|
|
23
27
|
}): Promise<string>;
|
|
24
28
|
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { mdTitle, mdSection, mdKeyValue, mdEmpty, truncateText } from '../lib/format.js';
|
|
2
|
+
import { formatPagingNote, mdTitle, mdSection, mdKeyValue, mdEmpty, truncateText } from '../lib/format.js';
|
|
3
3
|
export const listPostSuggestionsTool = {
|
|
4
4
|
name: 'list_post_suggestions',
|
|
5
|
-
description: "List proactive post suggestions: evidence-based weekly drafts posterly writes in each account's learned voice, each with a rationale tying it back to what has performed well for that account. Filter by account_id and status (pending, scheduled, dismissed; default pending). Read-only; requires a Pro plan or higher. Use dismiss_suggestion to hide one.",
|
|
5
|
+
description: "List proactive post suggestions: evidence-based weekly drafts posterly writes in each account's learned voice, each with a rationale tying it back to what has performed well for that account. Filter by account_id and status (pending, scheduled, dismissed; default pending). The output says whether every matching suggestion is shown; page with offset until it does. Read-only; requires a Pro plan or higher. Use dismiss_suggestion to hide one.",
|
|
6
6
|
inputSchema: z.object({
|
|
7
7
|
account_id: z
|
|
8
8
|
.union([z.string(), z.number()])
|
|
@@ -13,9 +13,11 @@ export const listPostSuggestionsTool = {
|
|
|
13
13
|
.optional()
|
|
14
14
|
.describe('Suggestion status to list (default pending).'),
|
|
15
15
|
limit: z.number().int().min(1).max(100).optional().describe('Max suggestions to return (default 20).'),
|
|
16
|
+
offset: z.number().int().min(0).optional().describe('How many suggestions to skip. Use the offset the previous page gives to get the next page.'),
|
|
16
17
|
}),
|
|
17
18
|
async execute(client, input) {
|
|
18
|
-
const
|
|
19
|
+
const page = await client.listPostSuggestions(input);
|
|
20
|
+
const { suggestions } = page;
|
|
19
21
|
if (!suggestions.length) {
|
|
20
22
|
return mdEmpty('post suggestions', 'No proactive post suggestions match these filters. posterly generates fresh drafts weekly for accounts with a learned voice.');
|
|
21
23
|
}
|
|
@@ -31,6 +33,16 @@ export const listPostSuggestionsTool = {
|
|
|
31
33
|
['Rationale', suggestion.rationale ? truncateText(suggestion.rationale, 240) : undefined],
|
|
32
34
|
]));
|
|
33
35
|
});
|
|
34
|
-
|
|
36
|
+
const note = formatPagingNote({
|
|
37
|
+
noun: 'suggestions',
|
|
38
|
+
tool: 'list_post_suggestions',
|
|
39
|
+
offset: page.offset ?? input.offset ?? 0,
|
|
40
|
+
count: suggestions.length,
|
|
41
|
+
total: page.total,
|
|
42
|
+
// An API older than has_more: a full page may mean more exist.
|
|
43
|
+
hasMore: page.has_more ?? suggestions.length >= (input.limit || 20),
|
|
44
|
+
nextOffset: page.next_offset,
|
|
45
|
+
});
|
|
46
|
+
return [mdTitle(`Post suggestions (${suggestions.length})`), ...blocks, note].join('\n\n');
|
|
35
47
|
},
|
|
36
48
|
};
|