postfast-mcp 0.1.18 → 0.1.20

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.
@@ -11,7 +11,7 @@
11
11
  {
12
12
  "name": "postfast",
13
13
  "description": "Schedule, manage, and analyze social media posts via PostFast. Supports Facebook, Instagram, X, TikTok, LinkedIn, YouTube, BlueSky, Threads, Pinterest, Telegram, and Google Business Profile.",
14
- "version": "0.1.18",
14
+ "version": "0.1.20",
15
15
  "author": {
16
16
  "name": "PostFast",
17
17
  "email": "me@peturgeorgievv.com"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "postfast",
3
3
  "description": "Schedule, manage, and analyze social media posts via PostFast. Supports Facebook, Instagram, X, TikTok, LinkedIn, YouTube, BlueSky, Threads, Pinterest, Telegram, and Google Business Profile. After installing, tell Cowork: 'Set my PostFast API key' — get your key at https://app.postfa.st/dashboard → API.",
4
- "version": "0.1.18",
4
+ "version": "0.1.20",
5
5
  "author": {
6
6
  "name": "PostFast",
7
7
  "email": "me@peturgeorgievv.com"
package/README.md CHANGED
@@ -2,6 +2,18 @@
2
2
 
3
3
  MCP server for the [PostFast](https://postfa.st) API — schedule and manage social media posts via AI tools like Claude, Cursor, VS Code, and more.
4
4
 
5
+ ## Hosted connector (no install)
6
+
7
+ Prefer not to run anything locally? Connect to the hosted endpoint and authenticate with OAuth — no npx, no API key to manage:
8
+
9
+ ```
10
+ https://mcp.postfa.st/mcp
11
+ ```
12
+
13
+ Add it as a remote/streamable-HTTP MCP server in any client that supports OAuth (e.g. ChatGPT, Claude). You'll be prompted to sign in to PostFast and authorize access on first use.
14
+
15
+ Want to run the server yourself instead? Use the npx + API-key setup in **Quick Start** below.
16
+
5
17
  ## Quick Start
6
18
 
7
19
  ### 1. Get your API key
@@ -119,6 +131,7 @@ Ask your AI assistant things like:
119
131
  | `search_places` | Find a place to tag posts (the `id` works for both `facebookPlaceId` and `instagramLocationId`) |
120
132
  | `generate_connect_link` | Generate a link for clients to connect accounts |
121
133
  | `get_post_analytics` | Fetch published posts with performance metrics — Instagram, Facebook, TikTok, Threads, YouTube, LinkedIn (company pages), Pinterest (Business accounts) |
134
+ | `get_follower_history` | Daily follower-count history for an account (current count + `delta` over a date range) — Facebook Pages, Instagram, YouTube, Pinterest, Threads, Bluesky, Telegram, LinkedIn (company pages) |
122
135
 
123
136
  ## Supported Platforms
124
137
 
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ import { registerAccountTools } from './tools/accounts.js';
7
7
  import { registerFileTools } from './tools/files.js';
8
8
  const server = new McpServer({
9
9
  name: 'postfast',
10
- version: '0.1.18',
10
+ version: '0.1.20',
11
11
  });
12
12
  const client = new PostFastClient();
13
13
  registerPostTools(server, client);
@@ -1,49 +1,82 @@
1
1
  import { z } from 'zod';
2
2
  export function registerAccountTools(server, client) {
3
- server.tool('list_accounts', 'List all social media accounts connected to the workspace. Each account includes connectionStatus (CONNECTED or DISABLED) and disabledReason (null unless DISABLED). If connectionStatus is DISABLED, the account will not publish until the user reconnects it.', {}, async () => {
3
+ server.registerTool('list_accounts', {
4
+ description: 'List all social media accounts connected to the workspace. Each account includes connectionStatus (CONNECTED or DISABLED) and disabledReason (null unless DISABLED). If connectionStatus is DISABLED, the account will not publish until the user reconnects it.',
5
+ inputSchema: {},
6
+ }, async () => {
4
7
  const data = await client.get('/social-media/my-social-accounts');
5
8
  return {
6
9
  content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
7
10
  };
8
11
  });
9
- server.tool('list_pinterest_boards', 'List Pinterest boards for a connected Pinterest account', {
10
- socialMediaId: z
11
- .string()
12
- .uuid()
13
- .describe('Pinterest account ID (from list_accounts)'),
12
+ server.registerTool('list_pinterest_boards', {
13
+ description: 'List Pinterest boards for a connected Pinterest account',
14
+ inputSchema: {
15
+ socialMediaId: z
16
+ .uuid()
17
+ .describe('Pinterest account ID (from list_accounts)'),
18
+ },
14
19
  }, async (input) => {
15
20
  const data = await client.get(`/social-media/${input.socialMediaId}/pinterest-boards`);
16
21
  return {
17
22
  content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
18
23
  };
19
24
  });
20
- server.tool('list_youtube_playlists', 'List YouTube playlists for a connected YouTube account', {
21
- socialMediaId: z
22
- .string()
23
- .uuid()
24
- .describe('YouTube account ID (from list_accounts)'),
25
+ server.registerTool('list_youtube_playlists', {
26
+ description: 'List YouTube playlists for a connected YouTube account',
27
+ inputSchema: {
28
+ socialMediaId: z
29
+ .uuid()
30
+ .describe('YouTube account ID (from list_accounts)'),
31
+ },
25
32
  }, async (input) => {
26
33
  const data = await client.get(`/social-media/${input.socialMediaId}/youtube-playlists`);
27
34
  return {
28
35
  content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
29
36
  };
30
37
  });
31
- server.tool('list_gbp_locations', 'List Google Business Profile locations for a connected GBP account', {
32
- socialMediaId: z
33
- .string()
34
- .uuid()
35
- .describe('GBP account ID (from list_accounts)'),
38
+ server.registerTool('list_gbp_locations', {
39
+ description: 'List Google Business Profile locations for a connected GBP account',
40
+ inputSchema: {
41
+ socialMediaId: z
42
+ .uuid()
43
+ .describe('GBP account ID (from list_accounts)'),
44
+ },
36
45
  }, async (input) => {
37
46
  const data = await client.get(`/social-media/${input.socialMediaId}/gbp-locations`);
38
47
  return {
39
48
  content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
40
49
  };
41
50
  });
42
- server.tool('search_places', 'Find a place to tag. The returned id works for both facebookPlaceId and instagramLocationId.', {
43
- query: z
44
- .string()
45
- .min(2)
46
- .describe('Place name to search, e.g. "Eiffel Tower"'),
51
+ server.registerTool('get_follower_history', {
52
+ description: 'Daily follower-count snapshots for a connected account, plus the current count (currentFollowerCount) and the net change (delta) over the range. Date range via from/to (ISO 8601); defaults to the last 90 days, capped at 365. Tracking is forward-only: data starts at trackingStartedAt (when PostFast began recording this account), with no snapshots before then. All counts are strings (bigint); currentFollowerCount, delta, and trackingStartedAt may be absent until the account has its first snapshot. Coverage: Facebook Pages, Instagram, YouTube, Pinterest, Threads, Bluesky, Telegram, LinkedIn company pages. Not available: X, TikTok, personal Facebook.',
53
+ inputSchema: {
54
+ socialMediaId: z
55
+ .uuid()
56
+ .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
+ }, async (input) => {
67
+ const data = await client.get(`/social-media/${input.socialMediaId}/follower-history`, { from: input.from, to: input.to });
68
+ return {
69
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
70
+ };
71
+ });
72
+ server.registerTool('search_places', {
73
+ description: 'Find a place to tag. The returned id works for both facebookPlaceId and instagramLocationId.',
74
+ inputSchema: {
75
+ query: z
76
+ .string()
77
+ .min(2)
78
+ .describe('Place name to search, e.g. "Eiffel Tower"'),
79
+ },
47
80
  }, async (input) => {
48
81
  const data = await client.get('/social-media/search-places', {
49
82
  q: input.query,
@@ -52,23 +85,25 @@ export function registerAccountTools(server, client) {
52
85
  content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
53
86
  };
54
87
  });
55
- server.tool('generate_connect_link', 'Generate a shareable link for external clients to connect their social accounts to the workspace', {
56
- expiryDays: z
57
- .number()
58
- .int()
59
- .min(1)
60
- .max(30)
61
- .default(7)
62
- .describe('Link expiry in days (1-30, default 7)'),
63
- sendEmail: z
64
- .boolean()
65
- .default(false)
66
- .describe('Send the link via email'),
67
- email: z
68
- .string()
69
- .email()
70
- .optional()
71
- .describe('Recipient email (required if sendEmail is true)'),
88
+ server.registerTool('generate_connect_link', {
89
+ description: 'Generate a shareable link for external clients to connect their social accounts to the workspace',
90
+ inputSchema: {
91
+ expiryDays: z
92
+ .number()
93
+ .int()
94
+ .min(1)
95
+ .max(30)
96
+ .default(7)
97
+ .describe('Link expiry in days (1-30, default 7)'),
98
+ sendEmail: z
99
+ .boolean()
100
+ .default(false)
101
+ .describe('Send the link via email'),
102
+ email: z
103
+ .email()
104
+ .optional()
105
+ .describe('Recipient email (required if sendEmail is true)'),
106
+ },
72
107
  }, async (input) => {
73
108
  const data = await client.post('/social-media/connect-link', {
74
109
  expiryDays: input.expiryDays,
@@ -1 +1 @@
1
- {"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../src/tools/accounts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,MAAM,UAAU,oBAAoB,CAClC,MAAiB,EACjB,MAAsB;IAEtB,MAAM,CAAC,IAAI,CACT,eAAe,EACf,kQAAkQ,EAClQ,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC3B,kCAAkC,CACnC,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SAC1E,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,yDAAyD,EACzD;QACE,aAAa,EAAE,CAAC;aACb,MAAM,EAAE;aACR,IAAI,EAAE;aACN,QAAQ,CAAC,2CAA2C,CAAC;KACzD,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;QACd,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC3B,iBAAiB,KAAK,CAAC,aAAa,mBAAmB,CACxD,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SAC1E,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,wBAAwB,EACxB,wDAAwD,EACxD;QACE,aAAa,EAAE,CAAC;aACb,MAAM,EAAE;aACR,IAAI,EAAE;aACN,QAAQ,CAAC,yCAAyC,CAAC;KACvD,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;QACd,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC3B,iBAAiB,KAAK,CAAC,aAAa,oBAAoB,CACzD,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SAC1E,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,oEAAoE,EACpE;QACE,aAAa,EAAE,CAAC;aACb,MAAM,EAAE;aACR,IAAI,EAAE;aACN,QAAQ,CAAC,qCAAqC,CAAC;KACnD,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;QACd,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC3B,iBAAiB,KAAK,CAAC,aAAa,gBAAgB,CACrD,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SAC1E,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,eAAe,EACf,8FAA8F,EAC9F;QACE,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,QAAQ,CAAC,2CAA2C,CAAC;KACzD,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;QACd,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAU,6BAA6B,EAAE;YACpE,CAAC,EAAE,KAAK,CAAC,KAAK;SACf,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SAC1E,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,kGAAkG,EAClG;QACE,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,GAAG,EAAE;aACL,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,EAAE,CAAC;aACP,OAAO,CAAC,CAAC,CAAC;aACV,QAAQ,CAAC,uCAAuC,CAAC;QACpD,SAAS,EAAE,CAAC;aACT,OAAO,EAAE;aACT,OAAO,CAAC,KAAK,CAAC;aACd,QAAQ,CAAC,yBAAyB,CAAC;QACtC,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,KAAK,EAAE;aACP,QAAQ,EAAE;aACV,QAAQ,CAAC,iDAAiD,CAAC;KAC/D,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;QACd,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAC5B,4BAA4B,EAC5B;YACE,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB,CACF,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SAC1E,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../src/tools/accounts.ts"],"names":[],"mappings":"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"}
@@ -27,17 +27,20 @@ function detectContentType(filePath) {
27
27
  return mime;
28
28
  }
29
29
  export function registerFileTools(server, client) {
30
- server.tool('get_upload_urls', 'Get signed upload URLs for media files. Upload your file to the returned URL via PUT, then use the key in create_posts mediaItems.', {
31
- contentType: z
32
- .string()
33
- .describe(`MIME type of the file. Supported: ${[...IMAGE_TYPES, ...VIDEO_TYPES].join(', ')}`),
34
- count: z
35
- .number()
36
- .int()
37
- .min(1)
38
- .max(8)
39
- .default(1)
40
- .describe('Number of upload URLs (1-8 for images, 1 for videos)'),
30
+ server.registerTool('get_upload_urls', {
31
+ 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.',
32
+ inputSchema: {
33
+ contentType: z
34
+ .string()
35
+ .describe(`MIME type of the file. Supported: ${[...IMAGE_TYPES, ...VIDEO_TYPES].join(', ')}`),
36
+ count: z
37
+ .number()
38
+ .int()
39
+ .min(1)
40
+ .max(8)
41
+ .default(1)
42
+ .describe('Number of upload URLs (1-8 for images, 1 for videos)'),
43
+ },
41
44
  }, async (input) => {
42
45
  const data = await client.post('/file/get-signed-upload-urls', {
43
46
  contentType: input.contentType,
@@ -49,10 +52,13 @@ export function registerFileTools(server, client) {
49
52
  ],
50
53
  };
51
54
  });
52
- server.tool('upload_media', '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.', {
53
- filePath: z
54
- .string()
55
- .describe('Absolute path to the local file (e.g. /Users/me/photo.jpg)'),
55
+ server.registerTool('upload_media', {
56
+ 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.',
57
+ inputSchema: {
58
+ filePath: z
59
+ .string()
60
+ .describe('Absolute path to the local file (e.g. /Users/me/photo.jpg)'),
61
+ },
56
62
  }, async (input) => {
57
63
  const contentType = detectContentType(input.filePath);
58
64
  const isVideo = contentType.startsWith('video/');
@@ -1 +1 @@
1
- {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/tools/files.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/tools/files.ts"],"names":[],"mappings":"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"}
@@ -28,36 +28,39 @@ function jsonParse(schema) {
28
28
  }, schema);
29
29
  }
30
30
  export function registerPostTools(server, client) {
31
- server.tool('list_posts', '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).', {
32
- page: z.number().int().min(0).default(0).describe('Page number (0-based)'),
33
- limit: z
34
- .number()
35
- .int()
36
- .min(1)
37
- .max(50)
38
- .default(20)
39
- .describe('Posts per page (max 50)'),
40
- ids: z
41
- .array(z.string().uuid())
42
- .max(100)
43
- .optional()
44
- .describe('Fetch only these post IDs (workspace-scoped; max 100)'),
45
- platforms: z
46
- .array(z.enum(PLATFORMS))
47
- .optional()
48
- .describe('Filter by platforms'),
49
- statuses: z
50
- .array(z.enum(STATUSES))
51
- .optional()
52
- .describe('Filter by post statuses'),
53
- from: z
54
- .string()
55
- .optional()
56
- .describe('Start date filter (ISO 8601, e.g. 2025-01-01T00:00:00.000Z)'),
57
- to: z
58
- .string()
59
- .optional()
60
- .describe('End date filter (ISO 8601, e.g. 2025-01-31T23:59:59.999Z)'),
31
+ server.registerTool('list_posts', {
32
+ 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).',
33
+ inputSchema: {
34
+ page: z.number().int().min(0).default(0).describe('Page number (0-based)'),
35
+ limit: z
36
+ .number()
37
+ .int()
38
+ .min(1)
39
+ .max(50)
40
+ .default(20)
41
+ .describe('Posts per page (max 50)'),
42
+ ids: z
43
+ .array(z.uuid())
44
+ .max(100)
45
+ .optional()
46
+ .describe('Fetch only these post IDs (workspace-scoped; max 100)'),
47
+ platforms: z
48
+ .array(z.enum(PLATFORMS))
49
+ .optional()
50
+ .describe('Filter by platforms'),
51
+ statuses: z
52
+ .array(z.enum(STATUSES))
53
+ .optional()
54
+ .describe('Filter by post statuses'),
55
+ from: z
56
+ .string()
57
+ .optional()
58
+ .describe('Start date filter (ISO 8601, e.g. 2025-01-01T00:00:00.000Z)'),
59
+ to: z
60
+ .string()
61
+ .optional()
62
+ .describe('End date filter (ISO 8601, e.g. 2025-01-31T23:59:59.999Z)'),
63
+ },
61
64
  }, async (input) => {
62
65
  const data = await client.get('/social-posts', {
63
66
  page: String(input.page),
@@ -72,102 +75,104 @@ export function registerPostTools(server, client) {
72
75
  content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
73
76
  };
74
77
  });
75
- server.tool('create_posts', 'Create and schedule social media posts. Supports batch creation (up to 15 posts). Each post targets a specific social account. 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.', {
76
- posts: jsonParse(z
77
- .array(z.object({
78
- content: z.string().describe('Post text content'),
79
- firstComment: z.string().optional().describe('First comment to add after publishing'),
80
- mediaItems: z
78
+ server.registerTool('create_posts', {
79
+ description: 'Create and schedule social media posts. Supports batch creation (up to 15 posts). Each post targets a specific social account. 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.',
80
+ inputSchema: {
81
+ posts: jsonParse(z
81
82
  .array(z.object({
82
- key: z.string().describe('S3 media key from get_upload_urls'),
83
- type: z.enum(['IMAGE', 'VIDEO']),
84
- sortOrder: z.number().int().min(0),
85
- coverImageKey: z.string().optional().describe('S3 key of a custom cover/thumbnail image for video posts (upload via get_upload_urls first). Supported on Instagram Reels, Facebook Reels, Pinterest video pins.'),
86
- coverTimestamp: z.string().optional().describe('Video cover timestamp in milliseconds (e.g. "5000" = 5s). Fallback when coverImageKey is also provided.'),
83
+ content: z.string().describe('Post text content'),
84
+ firstComment: z.string().optional().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).'),
85
+ mediaItems: z
86
+ .array(z.object({
87
+ key: z.string().describe('S3 media key from get_upload_urls'),
88
+ type: z.enum(['IMAGE', 'VIDEO']),
89
+ sortOrder: z.number().int().min(0),
90
+ coverImageKey: z.string().optional().describe('S3 key of a custom cover/thumbnail image for video posts (upload via get_upload_urls first). Supported on Instagram Reels, Facebook Reels, Pinterest video pins.'),
91
+ coverTimestamp: z.string().optional().describe('Video cover timestamp in milliseconds (e.g. "5000" = 5s). Fallback when coverImageKey is also provided.'),
92
+ }))
93
+ .optional()
94
+ .describe('Media attachments'),
95
+ scheduledAt: z
96
+ .string()
97
+ .optional()
98
+ .describe('Schedule time (ISO 8601). Required when status is SCHEDULED.'),
99
+ socialMediaId: z
100
+ .uuid()
101
+ .describe('Target social account ID (from list_accounts)'),
87
102
  }))
103
+ .min(1)
104
+ .max(15)
105
+ .describe('Array of posts to create')),
106
+ status: z
107
+ .enum(['DRAFT', 'SCHEDULED'])
108
+ .default('SCHEDULED')
109
+ .describe('Post status. SCHEDULED requires scheduledAt on all posts.'),
110
+ approvalStatus: z
111
+ .enum(['PENDING_APPROVAL', 'APPROVED'])
112
+ .default('APPROVED')
113
+ .describe('Approval workflow status'),
114
+ controls: jsonParse(z.object({
115
+ // X/Twitter
116
+ xRetweetUrl: z.string().optional(),
117
+ // TikTok
118
+ tiktokPrivacy: z.enum(['PUBLIC', 'MUTUAL_FRIENDS', 'FOLLOWER_OF_CREATOR', 'ONLY_ME']).optional().describe('Deprecated. TikTok videos use the account default privacy (no per-post control) and photos default to public; use a draft for private posts.'),
119
+ tiktokIsDraft: z.boolean().optional(),
120
+ tiktokAllowComments: z.boolean().optional(),
121
+ tiktokAllowDuet: z.boolean().optional(),
122
+ tiktokAllowStitch: z.boolean().optional(),
123
+ tiktokBrandOrganic: z.boolean().optional(),
124
+ tiktokBrandContent: z.boolean().optional(),
125
+ tiktokAutoAddMusic: z.boolean().optional(),
126
+ tiktokIsAigc: z.boolean().optional().describe('Declare video as AI-generated content'),
127
+ // Instagram
128
+ instagramPostToGrid: z.boolean().optional(),
129
+ instagramPublishType: z.enum(['TIMELINE', 'STORY', 'REEL']).optional(),
130
+ instagramCollaborators: z.array(z.string()).optional(),
131
+ instagramLocationId: z.string().optional().describe('Geotag: same FB Page id from search_places. Single media only, not carousels.'),
132
+ instagramLocationName: z.string().optional().describe('Display-only location name (not sent to Meta).'),
133
+ // YouTube
134
+ youtubePrivacy: z.enum(['PUBLIC', 'PRIVATE', 'UNLISTED']).optional(),
135
+ youtubeTags: z.array(z.string()).optional(),
136
+ youtubeCategoryId: z.string().optional(),
137
+ youtubeIsShort: z.boolean().optional(),
138
+ youtubeMadeForKids: z.boolean().optional(),
139
+ youtubeTitle: z.string().optional(),
140
+ youtubePlaylistId: z.string().optional(),
141
+ youtubeThumbnailKey: z.string().optional().describe('S3 media key for custom YouTube video thumbnail (image, max 2MB, min 640px wide, 1280x720 recommended)'),
142
+ // Facebook
143
+ facebookContentType: z.enum(['POST', 'REEL', 'STORY']).optional(),
144
+ facebookAllowComments: z.boolean().optional(),
145
+ facebookPrivacy: z
146
+ .enum(['PUBLIC', 'FRIENDS_OF_FRIENDS', 'FRIENDS', 'SELF'])
147
+ .optional(),
148
+ facebookCarouselMainLink: z.string().optional(),
149
+ facebookCarouselShowEndCard: z.boolean().optional(),
150
+ facebookReelsCoverImageKey: z.string().optional(),
151
+ facebookReelsCollaborators: z.array(z.string()).optional(),
152
+ facebookTargetCountries: z.array(z.string()).optional().describe('Facebook only: ISO 3166-1 alpha-2 codes (max 25). Limits who can see the post; also hidden from logged-out viewers. Feed posts only, not Reels/Stories.'),
153
+ facebookPlaceId: z.string().optional().describe('Geotag: FB Page id (with location) from search_places. Feed posts only.'),
154
+ facebookPlaceName: z.string().optional().describe('Display-only place name (not sent to Meta).'),
155
+ // Google Business Profile
156
+ gbpLocationId: z.string().optional().describe('GBP location resource name (from list_gbp_locations)'),
157
+ gbpTopicType: z.enum(['STANDARD', 'EVENT', 'OFFER']).optional().describe('Post type'),
158
+ gbpCallToActionType: z.enum(['BOOK', 'ORDER', 'LEARN_MORE', 'SIGN_UP', 'CALL', 'SHOP']).optional(),
159
+ gbpCallToActionUrl: z.string().optional().describe('CTA button URL (not needed for CALL, ignored for OFFER)'),
160
+ gbpEventTitle: z.string().optional().describe('Title for EVENT/OFFER posts (max 58 chars)'),
161
+ gbpEventStartDate: z.string().optional().describe('Start date for EVENT/OFFER (ISO 8601)'),
162
+ gbpEventEndDate: z.string().optional().describe('End date for EVENT/OFFER (ISO 8601)'),
163
+ gbpOfferCouponCode: z.string().optional().describe('Coupon code (OFFER only)'),
164
+ gbpOfferRedeemUrl: z.string().optional().describe('Redemption URL (OFFER only)'),
165
+ gbpOfferTerms: z.string().optional().describe('Terms and conditions (OFFER only)'),
166
+ // Pinterest
167
+ pinterestBoardId: z.string().optional(),
168
+ pinterestLink: z.string().optional(),
169
+ // LinkedIn
170
+ linkedinAttachmentKey: z.string().optional(),
171
+ linkedinAttachmentTitle: z.string().optional(),
172
+ })
88
173
  .optional()
89
- .describe('Media attachments'),
90
- scheduledAt: z
91
- .string()
92
- .optional()
93
- .describe('Schedule time (ISO 8601). Required when status is SCHEDULED.'),
94
- socialMediaId: z
95
- .string()
96
- .uuid()
97
- .describe('Target social account ID (from list_accounts)'),
98
- }))
99
- .min(1)
100
- .max(15)
101
- .describe('Array of posts to create')),
102
- status: z
103
- .enum(['DRAFT', 'SCHEDULED'])
104
- .default('SCHEDULED')
105
- .describe('Post status. SCHEDULED requires scheduledAt on all posts.'),
106
- approvalStatus: z
107
- .enum(['PENDING_APPROVAL', 'APPROVED'])
108
- .default('APPROVED')
109
- .describe('Approval workflow status'),
110
- controls: jsonParse(z.object({
111
- // X/Twitter
112
- xRetweetUrl: z.string().optional(),
113
- // TikTok
114
- tiktokPrivacy: z.enum(['PUBLIC', 'MUTUAL_FRIENDS', 'FOLLOWER_OF_CREATOR', 'ONLY_ME']).optional(),
115
- tiktokIsDraft: z.boolean().optional(),
116
- tiktokAllowComments: z.boolean().optional(),
117
- tiktokAllowDuet: z.boolean().optional(),
118
- tiktokAllowStitch: z.boolean().optional(),
119
- tiktokBrandOrganic: z.boolean().optional(),
120
- tiktokBrandContent: z.boolean().optional(),
121
- tiktokAutoAddMusic: z.boolean().optional(),
122
- tiktokIsAigc: z.boolean().optional().describe('Declare video as AI-generated content'),
123
- // Instagram
124
- instagramPostToGrid: z.boolean().optional(),
125
- instagramPublishType: z.enum(['TIMELINE', 'STORY', 'REEL']).optional(),
126
- instagramCollaborators: z.array(z.string()).optional(),
127
- instagramLocationId: z.string().optional().describe('Geotag: same FB Page id from search_places. Single media only, not carousels.'),
128
- instagramLocationName: z.string().optional().describe('Display-only location name (not sent to Meta).'),
129
- // YouTube
130
- youtubePrivacy: z.enum(['PUBLIC', 'PRIVATE', 'UNLISTED']).optional(),
131
- youtubeTags: z.array(z.string()).optional(),
132
- youtubeCategoryId: z.string().optional(),
133
- youtubeIsShort: z.boolean().optional(),
134
- youtubeMadeForKids: z.boolean().optional(),
135
- youtubeTitle: z.string().optional(),
136
- youtubePlaylistId: z.string().optional(),
137
- youtubeThumbnailKey: z.string().optional().describe('S3 media key for custom YouTube video thumbnail (image, max 2MB, min 640px wide, 1280x720 recommended)'),
138
- // Facebook
139
- facebookContentType: z.enum(['POST', 'REEL', 'STORY']).optional(),
140
- facebookAllowComments: z.boolean().optional(),
141
- facebookPrivacy: z
142
- .enum(['PUBLIC', 'FRIENDS_OF_FRIENDS', 'FRIENDS', 'SELF'])
143
- .optional(),
144
- facebookCarouselMainLink: z.string().optional(),
145
- facebookCarouselShowEndCard: z.boolean().optional(),
146
- facebookReelsCoverImageKey: z.string().optional(),
147
- facebookReelsCollaborators: z.array(z.string()).optional(),
148
- facebookTargetCountries: z.array(z.string()).optional().describe('Facebook only: ISO 3166-1 alpha-2 codes (max 25). Limits who can see the post; also hidden from logged-out viewers. Feed posts only, not Reels/Stories.'),
149
- facebookPlaceId: z.string().optional().describe('Geotag: FB Page id (with location) from search_places. Feed posts only.'),
150
- facebookPlaceName: z.string().optional().describe('Display-only place name (not sent to Meta).'),
151
- // Google Business Profile
152
- gbpLocationId: z.string().optional().describe('GBP location resource name (from list_gbp_locations)'),
153
- gbpTopicType: z.enum(['STANDARD', 'EVENT', 'OFFER']).optional().describe('Post type'),
154
- gbpCallToActionType: z.enum(['BOOK', 'ORDER', 'LEARN_MORE', 'SIGN_UP', 'CALL', 'SHOP']).optional(),
155
- gbpCallToActionUrl: z.string().optional().describe('CTA button URL (not needed for CALL, ignored for OFFER)'),
156
- gbpEventTitle: z.string().optional().describe('Title for EVENT/OFFER posts (max 58 chars)'),
157
- gbpEventStartDate: z.string().optional().describe('Start date for EVENT/OFFER (ISO 8601)'),
158
- gbpEventEndDate: z.string().optional().describe('End date for EVENT/OFFER (ISO 8601)'),
159
- gbpOfferCouponCode: z.string().optional().describe('Coupon code (OFFER only)'),
160
- gbpOfferRedeemUrl: z.string().optional().describe('Redemption URL (OFFER only)'),
161
- gbpOfferTerms: z.string().optional().describe('Terms and conditions (OFFER only)'),
162
- // Pinterest
163
- pinterestBoardId: z.string().optional(),
164
- pinterestLink: z.string().optional(),
165
- // LinkedIn
166
- linkedinAttachmentKey: z.string().optional(),
167
- linkedinAttachmentTitle: z.string().optional(),
168
- })
169
- .optional()
170
- .describe('Platform-specific controls (shared across all posts in the batch)')),
174
+ .describe('Platform-specific controls (shared across all posts in the batch)')),
175
+ },
171
176
  }, async (input) => {
172
177
  const data = await client.post('/social-posts', {
173
178
  posts: input.posts,
@@ -179,29 +184,35 @@ export function registerPostTools(server, client) {
179
184
  content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
180
185
  };
181
186
  });
182
- server.tool('delete_post', 'Delete a social media post by ID', {
183
- id: z.string().uuid().describe('Post ID to delete'),
187
+ server.registerTool('delete_post', {
188
+ description: 'Delete a social media post by ID',
189
+ inputSchema: {
190
+ id: z.uuid().describe('Post ID to delete'),
191
+ },
184
192
  }, async (input) => {
185
193
  const data = await client.delete(`/social-posts/${input.id}`);
186
194
  return {
187
195
  content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
188
196
  };
189
197
  });
190
- server.tool('get_post_analytics', '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). 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.', {
191
- startDate: z
192
- .string()
193
- .describe('Start of date range (ISO 8601, e.g. 2026-01-01T00:00:00.000Z)'),
194
- endDate: z
195
- .string()
196
- .describe('End of date range (ISO 8601, e.g. 2026-01-31T23:59:59.999Z)'),
197
- platforms: z
198
- .array(z.enum(PLATFORMS))
199
- .optional()
200
- .describe('Filter by platforms'),
201
- socialMediaIds: z
202
- .array(z.string().uuid())
203
- .optional()
204
- .describe('Filter by specific social media account IDs'),
198
+ server.registerTool('get_post_analytics', {
199
+ 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). 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). TikTok also exposes total_time_watched, average_time_watched, and full_video_watched_rate in metric.extras.',
200
+ inputSchema: {
201
+ startDate: z
202
+ .string()
203
+ .describe('Start of date range (ISO 8601, e.g. 2026-01-01T00:00:00.000Z)'),
204
+ endDate: z
205
+ .string()
206
+ .describe('End of date range (ISO 8601, e.g. 2026-01-31T23:59:59.999Z)'),
207
+ platforms: z
208
+ .array(z.enum(PLATFORMS))
209
+ .optional()
210
+ .describe('Filter by platforms'),
211
+ socialMediaIds: z
212
+ .array(z.uuid())
213
+ .optional()
214
+ .describe('Filter by specific social media account IDs'),
215
+ },
205
216
  }, async (input) => {
206
217
  const data = await client.get('/social-posts/analytics', {
207
218
  startDate: input.startDate,
@@ -1 +1 @@
1
- {"version":3,"file":"posts.js","sourceRoot":"","sources":["../../src/tools/posts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"posts.js","sourceRoot":"","sources":["../../src/tools/posts.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -106,6 +106,9 @@ export interface PostMetric {
106
106
  totalInteractions: string;
107
107
  fetchedAt: string;
108
108
  extras: Record<string, unknown>;
109
+ avgWatchTimeSeconds?: number;
110
+ totalWatchTimeSeconds?: number;
111
+ videoViews?: number;
109
112
  }
110
113
  export interface AnalyticsPost {
111
114
  id: string;
@@ -118,6 +121,24 @@ export interface AnalyticsPost {
118
121
  export interface AnalyticsResponse {
119
122
  data: AnalyticsPost[];
120
123
  }
124
+ export interface FollowerSnapshot {
125
+ /** Day of the snapshot (ISO 8601). */
126
+ capturedAt: string;
127
+ /** Follower count on that day (string bigint); absent for a gap day. */
128
+ followerCount?: string;
129
+ }
130
+ /** Daily follower-count history for one social account, from get_follower_history. */
131
+ export interface FollowerHistory {
132
+ socialMediaId: string;
133
+ /** Daily snapshots, oldest first (may be empty). */
134
+ series: FollowerSnapshot[];
135
+ /** Most recent follower count (string bigint); absent until the first snapshot exists. */
136
+ currentFollowerCount?: string;
137
+ /** Net change across the returned series, signed, e.g. "+57" or "-12"; absent with no baseline. */
138
+ delta?: string;
139
+ /** When follower tracking began for this account (ISO 8601); absent until tracking starts. */
140
+ trackingStartedAt?: string;
141
+ }
121
142
  export interface CreatePostInput {
122
143
  content: string;
123
144
  firstComment?: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "postfast-mcp",
3
- "version": "0.1.18",
3
+ "version": "0.1.20",
4
4
  "mcpName": "io.github.peturgeorgievv-factory/postfast-mcp",
5
5
  "description": "MCP server for the PostFast API — schedule and manage social media posts via AI tools",
6
6
  "type": "module",
@@ -101,7 +101,8 @@ If any PostFast tool call fails with an authentication/401 error, tell the user:
101
101
  ## Other Actions
102
102
 
103
103
  - **View posts**: `list_posts` — filter by `platforms` (comma-separated), `statuses` (DRAFT, SCHEDULED, PUBLISHED, FAILED), `from`/`to` dates, with pagination (`page`, `limit` up to 50). Failed or missed posts include a `lastError` with a `code` — e.g. `MISSED_DISCONNECTED` (the account was disconnected when the post was due) or `MISSED_NOT_PUBLISHED` (missed its slot by more than the 2h grace window)
104
- - **Post analytics**: `get_post_analytics` — fetch published posts with performance metrics. Requires `startDate` and `endDate` (ISO 8601). Optional filters: `platforms`, `socialMediaIds`. Returns impressions, reach, likes, comments, shares, totalInteractions, plus an `extras` object with platform-specific metrics. Supported: Instagram, Facebook, TikTok, Threads, YouTube, LinkedIn (company pages), Pinterest (Business accounts). Pinterest `extras` include `pin_clicks`, `outbound_clicks`, `saves_90d`, `save_rate_90d`; video pins also surface `mrc_views`, `views_10s`, `avg_watch_time`, `v50_watch_time`, `video_starts`, `quartile_95_views`. Note: LinkedIn personal accounts are excluded; Pinterest saves are reported as a rolling 90-day window because Pinterest's API does not expose lifetime save totals (all other Pinterest metrics are lifetime); `latestMetric` is null if metrics haven't been fetched yet; metric values are strings (bigint). Keep date ranges reasonable as there's no pagination.
104
+ - **Post analytics**: `get_post_analytics` — fetch published posts with performance metrics. Requires `startDate` and `endDate` (ISO 8601). Optional filters: `platforms`, `socialMediaIds`. Returns impressions, reach, likes, comments, shares, totalInteractions, plus an `extras` object with platform-specific metrics. Supported: Instagram, Facebook, TikTok, Threads, YouTube, LinkedIn (company pages), Pinterest (Business accounts). Pinterest `extras` include `pin_clicks`, `outbound_clicks`, `saves_90d`, `save_rate_90d`; video pins also 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). Note: LinkedIn personal accounts are excluded; Pinterest saves are reported as a rolling 90-day window because Pinterest's API does not expose lifetime save totals (all other Pinterest metrics are lifetime); `latestMetric` is null if metrics haven't been fetched yet; metric values are strings (bigint). Keep date ranges reasonable as there's no pagination.
105
+ - **Follower history**: `get_follower_history` — daily follower-count snapshots for one account (`socialMediaId`), plus `currentFollowerCount` and a signed `delta` over the range. Optional `from`/`to` (ISO 8601); defaults to the last 90 days, capped at 365. Tracking is forward-only — `trackingStartedAt` marks when recording began, with no data before it; counts are strings (bigint). Coverage: Facebook Pages, Instagram, YouTube, Pinterest, Threads, Bluesky, Telegram, LinkedIn company pages (not X, TikTok, or personal Facebook)
105
106
  - **Delete a post**: `delete_post` with the post ID
106
107
  - **Connect new accounts**: `generate_connect_link` — creates a secure URL to share with clients/collaborators to connect their accounts. Set `expiryDays` (1-30) and optionally `sendEmail` with an `email` address
107
108
  - **Pinterest boards**: `list_pinterest_boards` — get board IDs before creating Pinterest posts