postfast-mcp 0.1.23 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/README.md +11 -5
  4. package/dist/core/backend-port.d.ts +97 -0
  5. package/dist/core/backend-port.js +2 -0
  6. package/dist/core/backend-port.js.map +1 -0
  7. package/dist/core/build-tools.d.ts +32 -0
  8. package/dist/core/build-tools.js +73 -0
  9. package/dist/core/build-tools.js.map +1 -0
  10. package/dist/core/index.d.ts +12 -0
  11. package/dist/core/index.js +12 -0
  12. package/dist/core/index.js.map +1 -0
  13. package/dist/core/instructions.d.ts +3 -0
  14. package/dist/core/instructions.js +63 -0
  15. package/dist/core/instructions.js.map +1 -0
  16. package/dist/core/shared.d.ts +21 -0
  17. package/dist/core/shared.js +58 -0
  18. package/dist/core/shared.js.map +1 -0
  19. package/dist/core/tool-def.d.ts +47 -0
  20. package/dist/core/tool-def.js +2 -0
  21. package/dist/core/tool-def.js.map +1 -0
  22. package/dist/core/tools/accounts.d.ts +2 -0
  23. package/dist/core/tools/accounts.js +112 -0
  24. package/dist/core/tools/accounts.js.map +1 -0
  25. package/dist/core/tools/index.d.ts +7 -0
  26. package/dist/core/tools/index.js +16 -0
  27. package/dist/core/tools/index.js.map +1 -0
  28. package/dist/core/tools/posts.d.ts +2 -0
  29. package/dist/core/tools/posts.js +264 -0
  30. package/dist/core/tools/posts.js.map +1 -0
  31. package/dist/core/tools/uploads.d.ts +8 -0
  32. package/dist/core/tools/uploads.js +102 -0
  33. package/dist/core/tools/uploads.js.map +1 -0
  34. package/dist/core/tools/workspaces.d.ts +2 -0
  35. package/dist/core/tools/workspaces.js +15 -0
  36. package/dist/core/tools/workspaces.js.map +1 -0
  37. package/dist/{types.d.ts → core/types.d.ts} +7 -1
  38. package/dist/core/types.js.map +1 -0
  39. package/dist/stdio/index.js +15 -0
  40. package/dist/stdio/index.js.map +1 -0
  41. package/dist/stdio/rest-adapter.d.ts +27 -0
  42. package/dist/stdio/rest-adapter.js +170 -0
  43. package/dist/stdio/rest-adapter.js.map +1 -0
  44. package/package.json +22 -8
  45. package/skills/social-media-post/SKILL.md +1 -0
  46. package/dist/client.d.ts +0 -9
  47. package/dist/client.js +0 -57
  48. package/dist/client.js.map +0 -1
  49. package/dist/index.js +0 -18
  50. package/dist/index.js.map +0 -1
  51. package/dist/tools/accounts.d.ts +0 -3
  52. package/dist/tools/accounts.js +0 -118
  53. package/dist/tools/accounts.js.map +0 -1
  54. package/dist/tools/files.d.ts +0 -3
  55. package/dist/tools/files.js +0 -87
  56. package/dist/tools/files.js.map +0 -1
  57. package/dist/tools/posts.d.ts +0 -3
  58. package/dist/tools/posts.js +0 -228
  59. package/dist/tools/posts.js.map +0 -1
  60. package/dist/types.js.map +0 -1
  61. /package/dist/{types.js → core/types.js} +0 -0
  62. /package/dist/{index.d.ts → stdio/index.d.ts} +0 -0
@@ -0,0 +1,112 @@
1
+ import { z } from 'zod';
2
+ import { dataListOutputSchema } from '../shared.js';
3
+ export const accountTools = [
4
+ {
5
+ name: 'list_accounts',
6
+ binding: 'both',
7
+ title: 'List Accounts',
8
+ description: 'List all social media accounts connected to the workspace. Each account includes connectionStatus (CONNECTED or DISABLED) and disabledReason (null unless DISABLED), plus followerCount (latest stored snapshot, a string; absent for platforms without follower data), followerCountUpdatedAt, and inboxCapable (whether the account can appear in the social inbox, i.e. comment ingestion is supported). A DISABLED account will not publish until the user reconnects it — pre-check before scheduling. For a follower trend over time, use get_follower_history.',
9
+ inputSchema: {},
10
+ outputSchema: dataListOutputSchema,
11
+ annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false },
12
+ run: (port, _args, workspaceId) => port.listAccounts(workspaceId),
13
+ },
14
+ {
15
+ name: 'list_pinterest_boards',
16
+ binding: 'both',
17
+ title: 'List Pinterest Boards',
18
+ description: 'List Pinterest boards for a connected Pinterest account (pass its socialMediaId). Use a returned board’s boardId field as controls.pinterestBoardId in create_posts.',
19
+ inputSchema: {
20
+ socialMediaId: z.uuid().describe('Pinterest account id (from list_accounts)'),
21
+ },
22
+ outputSchema: dataListOutputSchema,
23
+ annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: true },
24
+ run: (port, args, workspaceId) => port.listPinterestBoards(args.socialMediaId, workspaceId),
25
+ },
26
+ {
27
+ name: 'list_youtube_playlists',
28
+ binding: 'both',
29
+ title: 'List YouTube Playlists',
30
+ description: 'List YouTube playlists for a connected YouTube account (pass its socialMediaId). Use a returned playlist’s playlistId field as controls.youtubePlaylistId in create_posts.',
31
+ inputSchema: {
32
+ socialMediaId: z.uuid().describe('YouTube account id (from list_accounts)'),
33
+ },
34
+ outputSchema: dataListOutputSchema,
35
+ annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: true },
36
+ run: (port, args, workspaceId) => port.listYoutubePlaylists(args.socialMediaId, workspaceId),
37
+ },
38
+ {
39
+ name: 'list_gbp_locations',
40
+ binding: 'both',
41
+ title: 'List Google Business Profile Locations',
42
+ description: 'List Google Business Profile locations for a connected GBP account (pass its socialMediaId). Use a returned location’s locationId field as controls.gbpLocationId in create_posts.',
43
+ inputSchema: {
44
+ socialMediaId: z.uuid().describe('GBP account id (from list_accounts)'),
45
+ },
46
+ outputSchema: dataListOutputSchema,
47
+ annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: true },
48
+ run: (port, args, workspaceId) => port.listGbpLocations(args.socialMediaId, workspaceId),
49
+ },
50
+ {
51
+ name: 'get_follower_history',
52
+ binding: 'both',
53
+ title: 'Get Follower History',
54
+ description: 'Daily follower-count snapshots for one connected account (pass its socialMediaId from list_accounts). Returns currentFollowerCount, delta (current − first snapshot in range), trackingStartedAt (when PostFast began recording this account), and a series of { capturedAt, followerCount } points. All counts are strings (bigint); currentFollowerCount, delta, and trackingStartedAt may be absent until the account has its first snapshot. Optional from/to bound the range (ISO 8601; default last 90 days, capped at 365). Snapshots are forward-only — no data before trackingStartedAt. Coverage: Facebook Pages, Instagram, YouTube, Pinterest, Threads, Bluesky, Telegram, LinkedIn company pages, and TikTok. Not available: X, personal Facebook.',
55
+ inputSchema: {
56
+ socialMediaId: z.uuid().describe('Account id (from list_accounts)'),
57
+ from: z
58
+ .string()
59
+ .optional()
60
+ .describe('Range start (ISO 8601, e.g. 2026-03-01T00:00:00.000Z). Defaults to 90 days ago.'),
61
+ to: z
62
+ .string()
63
+ .optional()
64
+ .describe('Range end (ISO 8601). Defaults to now; range is capped at 365 days.'),
65
+ },
66
+ outputSchema: {
67
+ socialMediaId: z.string().optional(),
68
+ series: z.array(z.unknown()).optional(),
69
+ currentFollowerCount: z.string().optional(),
70
+ delta: z.string().optional(),
71
+ trackingStartedAt: z.string().optional(),
72
+ },
73
+ annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false },
74
+ run: (port, args, workspaceId) => port.getFollowerHistory(args, workspaceId),
75
+ },
76
+ {
77
+ name: 'search_places',
78
+ binding: 'both',
79
+ title: 'Search Places',
80
+ description: 'Search for a place to geotag a post. Pass free text (min 2 chars, e.g. a venue name or address); returns matching places, each with an id that works as BOTH controls.facebookPlaceId (Facebook feed posts) and controls.instagramLocationId (Instagram single-media posts). Only Facebook Pages that carry location data are returned.',
81
+ inputSchema: {
82
+ query: z.string().min(2).describe('Place search text, min 2 characters (e.g. "eiffel tower")'),
83
+ },
84
+ outputSchema: dataListOutputSchema,
85
+ annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: true },
86
+ run: (port, args, workspaceId) => port.searchPlaces(args.query, workspaceId),
87
+ },
88
+ {
89
+ name: 'generate_connect_link',
90
+ binding: 'both',
91
+ title: 'Generate Connect Link',
92
+ description: 'Generate a shareable link for external clients to connect their social accounts to the workspace.',
93
+ inputSchema: {
94
+ expiryDays: z
95
+ .number()
96
+ .int()
97
+ .min(1)
98
+ .max(30)
99
+ .default(7)
100
+ .describe('Link expiry in days (1-30, default 7)'),
101
+ sendEmail: z.boolean().default(false).describe('Send the link via email'),
102
+ email: z
103
+ .email()
104
+ .optional()
105
+ .describe('Recipient email (required when sendEmail is true)'),
106
+ },
107
+ outputSchema: { connectUrl: z.string().optional() },
108
+ annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },
109
+ run: (port, args, workspaceId) => port.generateConnectLink(args, workspaceId),
110
+ },
111
+ ];
112
+ //# sourceMappingURL=accounts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../src/core/tools/accounts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ToolDef } from '../tool-def.js';
2
+ /**
3
+ * Every PostFast tool, in registration order. The order filtered to the stdio
4
+ * binding must stay exactly the published bin's tools/list order — clients and
5
+ * their prompts see it.
6
+ */
7
+ export declare const ALL_TOOLS: ToolDef[];
@@ -0,0 +1,16 @@
1
+ import { accountTools } from './accounts.js';
2
+ import { postTools } from './posts.js';
3
+ import { uploadTools } from './uploads.js';
4
+ import { workspaceTools } from './workspaces.js';
5
+ /**
6
+ * Every PostFast tool, in registration order. The order filtered to the stdio
7
+ * binding must stay exactly the published bin's tools/list order — clients and
8
+ * their prompts see it.
9
+ */
10
+ export const ALL_TOOLS = [
11
+ ...postTools,
12
+ ...accountTools,
13
+ ...workspaceTools,
14
+ ...uploadTools,
15
+ ];
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAc;IAClC,GAAG,SAAS;IACZ,GAAG,YAAY;IACf,GAAG,cAAc;IACjB,GAAG,WAAW;CACf,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ToolDef } from '../tool-def.js';
2
+ export declare const postTools: ToolDef[];
@@ -0,0 +1,264 @@
1
+ import { z } from 'zod';
2
+ import { CREATE_APPROVAL_STATUSES, CREATE_STATUSES, PLATFORMS, POST_STATUSES, SET_APPROVAL_STATUSES, dataListOutputSchema, jsonParse, } from '../shared.js';
3
+ /** The upload tools available on each binding, for prose that names them. */
4
+ const UPLOAD_TOOLS = {
5
+ stdio: 'upload_media / get_upload_urls',
6
+ remote: 'upload_from_url / upload_media',
7
+ };
8
+ const mediaItemSchema = (binding) => z.object({
9
+ key: z
10
+ .string()
11
+ .describe(`Media key from ${UPLOAD_TOOLS[binding]} (e.g. image/<uuid>.jpg)`),
12
+ type: z.enum(['IMAGE', 'VIDEO']),
13
+ sortOrder: z.number().int().min(0),
14
+ coverImageKey: z
15
+ .string()
16
+ .optional()
17
+ .describe('Media key of a custom cover/thumbnail for video posts. Supported on Instagram Reels, Facebook Reels, Pinterest video pins.'),
18
+ coverTimestamp: z
19
+ .string()
20
+ .optional()
21
+ .describe('Video cover timestamp in milliseconds (e.g. "5000" = 5s). Fallback when coverImageKey is also provided.'),
22
+ });
23
+ const postItemSchema = (binding) => z.object({
24
+ content: z.string().describe('Post text content'),
25
+ firstComment: z
26
+ .string()
27
+ .optional()
28
+ .describe('First comment posted automatically after publishing. Supported on X, Instagram, Facebook, YouTube, Threads, and TikTok (TikTok: Business accounts only, max 150 chars, comments must be enabled).'),
29
+ mediaItems: z
30
+ .array(mediaItemSchema(binding))
31
+ .optional()
32
+ .describe('Media attachments'),
33
+ scheduledAt: z
34
+ .string()
35
+ .optional()
36
+ .describe('Schedule time (ISO 8601). Required when status is SCHEDULED.'),
37
+ socialMediaId: z.uuid().describe('Target social account id (from list_accounts)'),
38
+ });
39
+ /** Platform-specific controls — shared across every post in the batch. */
40
+ const controlsSchema = z.object({
41
+ // X/Twitter
42
+ xRetweetUrl: z.string().optional(),
43
+ // TikTok
44
+ tiktokPrivacy: z
45
+ .enum(['PUBLIC', 'MUTUAL_FRIENDS', 'FOLLOWER_OF_CREATOR', 'ONLY_ME'])
46
+ .optional()
47
+ .describe('Deprecated. TikTok videos use the account default privacy (no per-post control) and photos default to public; use a draft for private posts.'),
48
+ tiktokIsDraft: z.boolean().optional(),
49
+ tiktokAllowComments: z.boolean().optional(),
50
+ tiktokAllowDuet: z.boolean().optional(),
51
+ tiktokAllowStitch: z.boolean().optional(),
52
+ tiktokBrandOrganic: z.boolean().optional(),
53
+ tiktokBrandContent: z.boolean().optional(),
54
+ tiktokAutoAddMusic: z.boolean().optional(),
55
+ tiktokIsAigc: z.boolean().optional().describe('Declare video as AI-generated content'),
56
+ tiktokTitle: z
57
+ .string()
58
+ .max(90)
59
+ .optional()
60
+ .describe('Title for TikTok photo posts (max 90 chars; photo posts only). When set, the full post content becomes the description; without it, content auto-splits on the first newline into title + description.'),
61
+ // Instagram
62
+ instagramPostToGrid: z.boolean().optional(),
63
+ instagramPublishType: z.enum(['TIMELINE', 'STORY', 'REEL']).optional(),
64
+ instagramCollaborators: z.array(z.string()).optional(),
65
+ instagramLocationId: z
66
+ .string()
67
+ .optional()
68
+ .describe('Geotag a single-media IG post — a numeric Facebook Page id with location data from search_places (same id as facebookPlaceId). Image/video/reel/story only, NOT carousels.'),
69
+ instagramLocationName: z
70
+ .string()
71
+ .max(255)
72
+ .optional()
73
+ .describe('Display-only place label from search_places (stored for your portal; never sent to Meta)'),
74
+ // YouTube
75
+ youtubePrivacy: z.enum(['PUBLIC', 'PRIVATE', 'UNLISTED']).optional(),
76
+ youtubeTags: z.array(z.string()).optional(),
77
+ youtubeCategoryId: z.string().optional(),
78
+ youtubeIsShort: z.boolean().optional(),
79
+ youtubeMadeForKids: z.boolean().optional(),
80
+ youtubeTitle: z.string().optional(),
81
+ youtubePlaylistId: z
82
+ .string()
83
+ .optional()
84
+ .describe('YouTube playlist id — the playlistId field from list_youtube_playlists'),
85
+ youtubeThumbnailKey: z
86
+ .string()
87
+ .optional()
88
+ .describe('Media key for a custom YouTube thumbnail (image, max 2MB, min 640px wide, 1280x720 recommended)'),
89
+ // Facebook
90
+ facebookContentType: z.enum(['POST', 'REEL', 'STORY']).optional(),
91
+ facebookAllowComments: z.boolean().optional(),
92
+ facebookPrivacy: z
93
+ .enum(['PUBLIC', 'FRIENDS_OF_FRIENDS', 'FRIENDS', 'SELF'])
94
+ .optional(),
95
+ facebookCarouselMainLink: z.string().optional(),
96
+ facebookCarouselShowEndCard: z.boolean().optional(),
97
+ facebookReelsCollaborators: z.array(z.string()).optional(),
98
+ facebookTargetCountries: z
99
+ .array(z.string().length(2))
100
+ .max(25)
101
+ .optional()
102
+ .describe('Limit who can see a Facebook FEED post by country — ISO 3166-1 alpha-2 codes (case-insensitive), max 25. Audience gating (hidden from everyone else), feed posts only — not Reels/Stories/video.'),
103
+ facebookPlaceId: z
104
+ .string()
105
+ .optional()
106
+ .describe('Geotag a Facebook FEED post — a numeric Facebook Page id with location data from search_places (same id as instagramLocationId). Feed posts only (text/photo/carousel) — not Reels/Stories/video.'),
107
+ facebookPlaceName: z
108
+ .string()
109
+ .max(255)
110
+ .optional()
111
+ .describe('Display-only place label from search_places (stored for your portal; never sent to Meta)'),
112
+ // Google Business Profile
113
+ gbpLocationId: z
114
+ .string()
115
+ .optional()
116
+ .describe('GBP location resource name — the locationId field from list_gbp_locations'),
117
+ gbpTopicType: z.enum(['STANDARD', 'EVENT', 'OFFER']).optional().describe('Post type'),
118
+ gbpCallToActionType: z
119
+ .enum(['BOOK', 'ORDER', 'LEARN_MORE', 'SIGN_UP', 'CALL', 'SHOP'])
120
+ .optional(),
121
+ gbpCallToActionUrl: z
122
+ .string()
123
+ .optional()
124
+ .describe('CTA button URL (not needed for CALL, ignored for OFFER)'),
125
+ gbpEventTitle: z.string().optional().describe('Title for EVENT/OFFER posts (max 58 chars)'),
126
+ gbpEventStartDate: z.string().optional().describe('Start date for EVENT/OFFER (ISO 8601)'),
127
+ gbpEventEndDate: z.string().optional().describe('End date for EVENT/OFFER (ISO 8601)'),
128
+ gbpOfferCouponCode: z.string().optional().describe('Coupon code (OFFER only)'),
129
+ gbpOfferRedeemUrl: z.string().optional().describe('Redemption URL (OFFER only)'),
130
+ gbpOfferTerms: z.string().optional().describe('Terms and conditions (OFFER only)'),
131
+ // Pinterest
132
+ pinterestBoardId: z
133
+ .string()
134
+ .optional()
135
+ .describe("Pinterest board id — the boardId field from list_pinterest_boards (NOT the account's socialMediaId)"),
136
+ pinterestLink: z.string().optional(),
137
+ // LinkedIn
138
+ linkedinAttachmentKey: z.string().optional(),
139
+ linkedinAttachmentTitle: z.string().optional(),
140
+ });
141
+ export const postTools = [
142
+ {
143
+ name: 'list_posts',
144
+ binding: 'both',
145
+ title: 'List Posts',
146
+ description: 'List social media posts with optional filters for specific IDs, platform, status, and date range. Failed or missed posts carry a lastError { message, code }; codes include MISSED_DISCONNECTED (the account was disconnected when the post was due — reconnect, then retry) and MISSED_NOT_PUBLISHED (passed its scheduled time plus a 2h grace window without publishing).',
147
+ inputSchema: {
148
+ page: z.number().int().min(0).default(0).describe('Page number (0-based)'),
149
+ limit: z
150
+ .number()
151
+ .int()
152
+ .min(1)
153
+ .max(50)
154
+ .default(20)
155
+ .describe('Posts per page (max 50)'),
156
+ ids: z
157
+ .array(z.uuid())
158
+ .max(100)
159
+ .optional()
160
+ .describe('Fetch only these post ids (workspace-scoped; max 100; AND-ed with other filters)'),
161
+ platforms: z.array(z.enum(PLATFORMS)).optional().describe('Filter by platforms'),
162
+ statuses: z
163
+ .array(z.enum(POST_STATUSES))
164
+ .optional()
165
+ .describe('Filter by post statuses'),
166
+ from: z
167
+ .string()
168
+ .optional()
169
+ .describe('Start date filter (ISO 8601, e.g. 2026-01-01T00:00:00.000Z)'),
170
+ to: z
171
+ .string()
172
+ .optional()
173
+ .describe('End date filter (ISO 8601, e.g. 2026-01-31T23:59:59.999Z)'),
174
+ },
175
+ outputSchema: {
176
+ data: z.array(z.unknown()).optional(),
177
+ totalCount: z.unknown().optional(),
178
+ pageInfo: z.unknown().optional(),
179
+ },
180
+ annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false },
181
+ run: (port, args, workspaceId) => port.listPosts(args, workspaceId),
182
+ },
183
+ {
184
+ name: 'create_posts',
185
+ binding: 'both',
186
+ title: 'Create Posts',
187
+ description: (binding) => 'Create and schedule social media posts (batch up to 15). Each post targets one social account (socialMediaId from list_accounts). SCHEDULED requires scheduledAt on every post; DRAFT must omit scheduledAt. Scheduling to a disconnected account (connectionStatus DISABLED in list_accounts) is rejected with HTTP 400 "socialMediaDisconnected" — pre-check connectionStatus before calling. Saving as DRAFT to a disconnected account is allowed. TikTok, Instagram, YouTube, Pinterest, and Google Business Profile require at least one media item EVEN FOR DRAFTS — attach media first (ask the user for an image/video, or generate+upload one, if none was provided). Attach media via the key returned by ' +
188
+ `${UPLOAD_TOOLS[binding]}.`,
189
+ inputSchema: (binding) => ({
190
+ posts: jsonParse(z
191
+ .array(postItemSchema(binding))
192
+ .min(1)
193
+ .max(15)
194
+ .describe('Array of posts to create (1-15)')),
195
+ status: z
196
+ .enum(CREATE_STATUSES)
197
+ .default('SCHEDULED')
198
+ .describe('Post status. SCHEDULED requires scheduledAt on every post.'),
199
+ approvalStatus: z
200
+ .enum(CREATE_APPROVAL_STATUSES)
201
+ .default('APPROVED')
202
+ .describe('Approval workflow status'),
203
+ controls: jsonParse(controlsSchema
204
+ .optional()
205
+ .describe('Platform-specific controls (shared across all posts in the batch)')),
206
+ }),
207
+ outputSchema: { postIds: z.array(z.string()).optional() },
208
+ annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },
209
+ run: (port, args, workspaceId) => port.createPosts(args, workspaceId),
210
+ },
211
+ {
212
+ name: 'approve_posts',
213
+ binding: 'remote',
214
+ title: 'Approve Posts',
215
+ description: 'Set the approval status of one or more posts (approval workflow). Typically used to move posts to APPROVED so they can publish, or to PENDING_APPROVAL / REJECTED / NEEDS_WORK.',
216
+ inputSchema: {
217
+ postIds: z.array(z.uuid()).min(1).describe('Post ids to update'),
218
+ approvalStatus: z.enum(SET_APPROVAL_STATUSES).describe('New approval status'),
219
+ },
220
+ outputSchema: { success: z.boolean().optional() },
221
+ annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },
222
+ run: (port, args, workspaceId) => port.approvePosts(args, workspaceId),
223
+ },
224
+ {
225
+ name: 'delete_post',
226
+ binding: 'both',
227
+ title: 'Delete Post',
228
+ description: 'Delete a social media post by id.',
229
+ inputSchema: {
230
+ id: z.uuid().describe('Post id to delete'),
231
+ },
232
+ outputSchema: { deleted: z.boolean().optional() },
233
+ annotations: {
234
+ readOnlyHint: false,
235
+ destructiveHint: true,
236
+ idempotentHint: true,
237
+ openWorldHint: true,
238
+ },
239
+ run: (port, args, workspaceId) => port.deletePost(args.id, workspaceId),
240
+ },
241
+ {
242
+ name: 'get_post_analytics',
243
+ binding: 'both',
244
+ title: 'Get Post Analytics',
245
+ description: 'Fetch published posts with their latest performance metrics (impressions, reach, likes, comments, shares). Only returns published posts that have a platform post ID. LinkedIn personal accounts are excluded. Supported: Instagram, Facebook, TikTok, Threads, YouTube, LinkedIn (company pages), Pinterest (Business accounts). Metric counts are returned as strings. Pinterest extras include pin_clicks, outbound_clicks, saves_90d, save_rate_90d (saves are 90-day rolling because Pinterest API does not expose lifetime totals); video pins additionally surface mrc_views, views_10s, avg_watch_time, v50_watch_time, video_starts, quartile_95_views. Video posts also include normalized watch-time on latestMetric: avgWatchTimeSeconds, totalWatchTimeSeconds, videoViews (Facebook, Instagram Reels, YouTube, Pinterest, LinkedIn company pages, TikTok). Instagram posts also include on latestMetric: saveRate (saves / reach as a percentage, rounded to 2 decimals — on IG feed posts, reels, and carousels with metrics) and reelsSkipRate (Instagram Reels only — percentage of viewers who skipped the reel in the first 3 seconds, as reported by Instagram, rounded to 2 decimals; may be absent on low-view reels or until metrics refresh). TikTok also exposes total_time_watched, average_time_watched, and full_video_watched_rate in metric.extras.',
246
+ inputSchema: {
247
+ startDate: z
248
+ .string()
249
+ .describe('Start of date range (ISO 8601, e.g. 2026-01-01T00:00:00.000Z)'),
250
+ endDate: z
251
+ .string()
252
+ .describe('End of date range (ISO 8601, e.g. 2026-01-31T23:59:59.999Z)'),
253
+ platforms: z.array(z.enum(PLATFORMS)).optional().describe('Filter by platforms'),
254
+ socialMediaIds: z
255
+ .array(z.uuid())
256
+ .optional()
257
+ .describe('Filter by specific social media account ids'),
258
+ },
259
+ outputSchema: dataListOutputSchema,
260
+ annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: true },
261
+ run: (port, args, workspaceId) => port.getPostAnalytics(args, workspaceId),
262
+ },
263
+ ];
264
+ //# sourceMappingURL=posts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"posts.js","sourceRoot":"","sources":["../../../src/core/tools/posts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { ToolDef } from '../tool-def.js';
2
+ /**
3
+ * `upload_media` exists on BOTH bindings but is a different tool on each:
4
+ * the stdio bin reads a local file from disk (only possible on the user's
5
+ * machine), while the remote host ingests a conversation-attached file or
6
+ * base64 bytes. They share the name, not the schema — hence two defs.
7
+ */
8
+ export declare const uploadTools: ToolDef[];
@@ -0,0 +1,102 @@
1
+ import { z } from 'zod';
2
+ import { IMAGE_MIME_TYPES, VIDEO_MIME_TYPES, dataListOutputSchema, } from '../shared.js';
3
+ const SUPPORTED_MIME_TYPES = [...IMAGE_MIME_TYPES, ...VIDEO_MIME_TYPES].join(', ');
4
+ /**
5
+ * `upload_media` exists on BOTH bindings but is a different tool on each:
6
+ * the stdio bin reads a local file from disk (only possible on the user's
7
+ * machine), while the remote host ingests a conversation-attached file or
8
+ * base64 bytes. They share the name, not the schema — hence two defs.
9
+ */
10
+ export const uploadTools = [
11
+ {
12
+ name: 'get_upload_urls',
13
+ binding: 'stdio',
14
+ title: 'Get Upload URLs',
15
+ description: 'Get signed upload URLs for media files. Upload your file to the returned URL via PUT, then use the key in create_posts mediaItems.',
16
+ inputSchema: {
17
+ contentType: z
18
+ .string()
19
+ .describe(`MIME type of the file. Supported: ${SUPPORTED_MIME_TYPES}`),
20
+ count: z
21
+ .number()
22
+ .int()
23
+ .min(1)
24
+ .max(8)
25
+ .default(1)
26
+ .describe('Number of upload URLs (1-8 for images, 1 for videos)'),
27
+ },
28
+ outputSchema: dataListOutputSchema,
29
+ annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },
30
+ run: (port, args, workspaceId) => port.getUploadUrls(args, workspaceId),
31
+ },
32
+ {
33
+ name: 'upload_media',
34
+ binding: 'stdio',
35
+ title: 'Upload Media',
36
+ description: 'Upload a local file to PostFast and get back a media key for use in create_posts. Handles the full flow: detects content type, gets a signed URL, uploads the file, and returns the key and type.',
37
+ inputSchema: {
38
+ filePath: z
39
+ .string()
40
+ .describe('Absolute path to the local file (e.g. /Users/me/photo.jpg)'),
41
+ },
42
+ outputSchema: {
43
+ key: z.string().optional(),
44
+ type: z.string().optional(),
45
+ contentType: z.string().optional(),
46
+ },
47
+ annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },
48
+ run: (port, args) => port.uploadLocalFile(args.filePath),
49
+ },
50
+ {
51
+ name: 'upload_from_url',
52
+ binding: 'remote',
53
+ title: 'Upload Media From URL',
54
+ description: 'Fetch media from a public https URL and store it for use in create_posts. Returns { media_id, type }; pass media_id as a mediaItems[].key. Ideal for ChatGPT/Claude-generated image URLs and remote CDN media. Redirects are followed (each hop is SSRF-validated); the URL must be public https and within the size limit. Supported types: image/jpeg, image/png, image/gif, image/webp, video/mp4, video/webm, video/quicktime.',
55
+ inputSchema: {
56
+ sourceUrl: z.url().describe('Public https URL of the media to upload'),
57
+ contentType: z
58
+ .string()
59
+ .optional()
60
+ .describe("MIME type override. If omitted, the source's Content-Type is used."),
61
+ },
62
+ outputSchema: {
63
+ media_id: z.string().optional(),
64
+ type: z.string().optional(),
65
+ },
66
+ annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },
67
+ run: (port, args, workspaceId) => port.uploadFromUrl(args, workspaceId),
68
+ },
69
+ {
70
+ name: 'upload_media',
71
+ binding: 'remote',
72
+ title: 'Upload Media',
73
+ description: 'Upload an image/video that is present in this conversation, for use in create_posts. Pass EITHER a ChatGPT-attached or model-generated file (the `file` argument — ChatGPT fills this automatically) OR base64 bytes (`data` + `contentType`). Returns { media_id, type }; use media_id as a mediaItems[].key. For large or remote media, prefer upload_from_url. Supported types: image/jpeg, image/png, image/gif, image/webp, video/mp4, video/webm, video/quicktime.',
74
+ inputSchema: {
75
+ file: z
76
+ .object({
77
+ download_url: z.url().describe('Temporary URL to fetch the file'),
78
+ file_id: z.string(),
79
+ mime_type: z.string().optional(),
80
+ file_name: z.string().optional(),
81
+ })
82
+ .optional()
83
+ .describe('A ChatGPT-provided file (attached or generated). Filled in automatically by ChatGPT.'),
84
+ data: z
85
+ .string()
86
+ .optional()
87
+ .describe('Base64-encoded file bytes (alternative to file; no data: prefix)'),
88
+ contentType: z
89
+ .string()
90
+ .optional()
91
+ .describe('MIME type for base64 data (e.g. image/png). Required with data.'),
92
+ },
93
+ outputSchema: {
94
+ media_id: z.string().optional(),
95
+ type: z.string().optional(),
96
+ },
97
+ annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },
98
+ _meta: { 'openai/fileParams': ['file'] },
99
+ run: (port, args, workspaceId) => port.uploadMedia(args, workspaceId),
100
+ },
101
+ ];
102
+ //# sourceMappingURL=uploads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploads.js","sourceRoot":"","sources":["../../../src/core/tools/uploads.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ToolDef } from '../tool-def.js';
2
+ export declare const workspaceTools: ToolDef[];
@@ -0,0 +1,15 @@
1
+ import { dataListOutputSchema } from '../shared.js';
2
+ export const workspaceTools = [
3
+ {
4
+ name: 'list_workspaces',
5
+ binding: 'remote',
6
+ title: 'List Workspaces',
7
+ description: 'List the workspaces this connection can act in. Use a workspace id as the optional workspaceId argument on other tools to operate across multiple workspaces (the default workspace is used when omitted).',
8
+ inputSchema: {},
9
+ outputSchema: dataListOutputSchema,
10
+ annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false },
11
+ workspaceScoped: false,
12
+ run: (port) => port.listWorkspaces(),
13
+ },
14
+ ];
15
+ //# sourceMappingURL=workspaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaces.js","sourceRoot":"","sources":["../../../src/core/tools/workspaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGpD,MAAM,CAAC,MAAM,cAAc,GAAc;IACvC;QACE,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,QAAQ;QACjB,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,4MAA4M;QAC9M,WAAW,EAAE,EAAE;QACf,YAAY,EAAE,oBAAoB;QAClC,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE;QACjF,eAAe,EAAE,KAAK;QACtB,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE;KACrC;CACF,CAAC"}
@@ -59,6 +59,12 @@ export interface SocialAccount {
59
59
  connectionStatus: ConnectionStatus;
60
60
  /** Non-null only when connectionStatus is DISABLED. */
61
61
  disabledReason: DisabledReason | null;
62
+ /** Whether the account can appear in the social inbox (comment ingestion). */
63
+ inboxCapable: boolean;
64
+ /** Latest stored follower snapshot (string bigint); absent for platforms without follower data. */
65
+ followerCount?: string;
66
+ /** When the follower snapshot was captured (ISO 8601); absent when followerCount is. */
67
+ followerCountUpdatedAt?: string;
62
68
  }
63
69
  export interface PinterestBoard {
64
70
  id: string;
@@ -159,6 +165,7 @@ export interface PostControls {
159
165
  tiktokBrandContent?: boolean;
160
166
  tiktokAutoAddMusic?: boolean;
161
167
  tiktokIsAigc?: boolean;
168
+ tiktokTitle?: string;
162
169
  instagramPostToGrid?: boolean;
163
170
  instagramPublishType?: 'TIMELINE' | 'STORY' | 'REEL';
164
171
  instagramCollaborators?: string[];
@@ -177,7 +184,6 @@ export interface PostControls {
177
184
  facebookPrivacy?: 'PUBLIC' | 'FRIENDS_OF_FRIENDS' | 'FRIENDS' | 'SELF';
178
185
  facebookCarouselMainLink?: string;
179
186
  facebookCarouselShowEndCard?: boolean;
180
- facebookReelsCoverImageKey?: string;
181
187
  facebookReelsCollaborators?: string[];
182
188
  facebookTargetCountries?: string[];
183
189
  facebookPlaceId?: string;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { registerCatalogTools } from '../core/build-tools.js';
5
+ import { instructionsFor } from '../core/instructions.js';
6
+ import { RestAdapter } from './rest-adapter.js';
7
+ const server = new McpServer({
8
+ name: 'postfast',
9
+ version: '0.2.0',
10
+ }, { instructions: instructionsFor('stdio') });
11
+ const port = new RestAdapter();
12
+ registerCatalogTools(server, { binding: 'stdio', port });
13
+ const transport = new StdioServerTransport();
14
+ await server.connect(transport);
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/stdio/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;IACE,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,OAAO;CACjB,EACD,EAAE,YAAY,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,CAC3C,CAAC;AAEF,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;AAE/B,oBAAoB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AAEzD,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}