posterly-mcp-server 0.20.5 → 0.20.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -108,7 +108,7 @@ Add the same server definition to your Cursor MCP settings:
108
108
 
109
109
  ## Available tools
110
110
 
111
- `posterly-mcp-server@0.20.5` exposes 59 tools.
111
+ `posterly-mcp-server@0.20.7` exposes 58 tools.
112
112
 
113
113
  Public setup tools work before `POSTERLY_API_KEY` exists:
114
114
 
@@ -141,7 +141,6 @@ Authenticated tools require `POSTERLY_API_KEY`:
141
141
  - `get_post`
142
142
  - `get_post_missing`
143
143
  - `ask_support` (authenticated docs-backed support with read-only account/post diagnostics; human tickets require explicit confirmation)
144
- - `get_support` (alias for `ask_support` for agents that look for get-style support tools)
145
144
  - `create_post` (supports `thread_posts: string[]` for X / Threads reply chains, plus `platform_settings` for platform-specific composer controls)
146
145
  - `create_posts_batch` (create up to 25 confirmed posts in one API request)
147
146
  - `update_post` (also accepts `platform_settings`)
package/dist/index.js CHANGED
@@ -20,7 +20,7 @@ import { listPostsTool } from './tools/list-posts.js';
20
20
  import { uploadMediaTool } from './tools/upload-media.js';
21
21
  import { getPostTool } from './tools/get-post.js';
22
22
  import { getPostMissingTool } from './tools/get-post-missing.js';
23
- import { askSupportTool, getSupportTool } from './tools/ask-support.js';
23
+ import { askSupportTool } from './tools/ask-support.js';
24
24
  import { updatePostTool } from './tools/update-post.js';
25
25
  import { updatePostStatusTool } from './tools/update-post-status.js';
26
26
  import { updatePostReleaseIdTool } from './tools/update-post-release-id.js';
@@ -409,15 +409,6 @@ server.tool(askSupportTool.name, askSupportTool.description, askSupportTool.inpu
409
409
  return { content: [{ type: 'text', text: `Error: ${err.message}` }], isError: true };
410
410
  }
411
411
  });
412
- server.tool(getSupportTool.name, getSupportTool.description, getSupportTool.inputSchema.shape, async (input) => {
413
- try {
414
- const text = await getSupportTool.execute(client, input);
415
- return { content: [{ type: 'text', text }] };
416
- }
417
- catch (err) {
418
- return { content: [{ type: 'text', text: `Error: ${err.message}` }], isError: true };
419
- }
420
- });
421
412
  server.tool(updatePostTool.name, updatePostTool.description, updatePostTool.inputSchema.shape, async (input) => {
422
413
  try {
423
414
  const text = await updatePostTool.execute(client, input);
@@ -1 +1 @@
1
- export declare const POSTERLY_MCP_VERSION = "0.20.5";
1
+ export declare const POSTERLY_MCP_VERSION = "0.20.7";
@@ -1 +1 @@
1
- export const POSTERLY_MCP_VERSION = '0.20.5';
1
+ export const POSTERLY_MCP_VERSION = '0.20.7';
@@ -34,37 +34,4 @@ export declare const askSupportTool: {
34
34
  }>;
35
35
  execute: typeof executeSupport;
36
36
  };
37
- export declare const getSupportTool: {
38
- name: string;
39
- description: string;
40
- inputSchema: z.ZodObject<{
41
- question: z.ZodString;
42
- workspace_id: z.ZodOptional<z.ZodString>;
43
- conversation_id: z.ZodOptional<z.ZodString>;
44
- page_url: z.ZodOptional<z.ZodString>;
45
- post_id: z.ZodOptional<z.ZodNumber>;
46
- referenced_post_ids: z.ZodOptional<z.ZodArray<z.ZodNumber, "many">>;
47
- request_human: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
48
- confirm_escalation: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
49
- }, "strip", z.ZodTypeAny, {
50
- question: string;
51
- workspace_id?: string | undefined;
52
- post_id?: number | undefined;
53
- conversation_id?: string | undefined;
54
- page_url?: string | undefined;
55
- referenced_post_ids?: number[] | undefined;
56
- request_human?: boolean | undefined;
57
- confirm_escalation?: boolean | undefined;
58
- }, {
59
- question: string;
60
- workspace_id?: string | undefined;
61
- post_id?: number | undefined;
62
- conversation_id?: string | undefined;
63
- page_url?: string | undefined;
64
- referenced_post_ids?: number[] | undefined;
65
- request_human?: boolean | undefined;
66
- confirm_escalation?: boolean | undefined;
67
- }>;
68
- execute: typeof executeSupport;
69
- };
70
37
  export {};
@@ -46,9 +46,3 @@ export const askSupportTool = {
46
46
  inputSchema: supportInputSchema,
47
47
  execute: executeSupport,
48
48
  };
49
- export const getSupportTool = {
50
- name: 'get_support',
51
- description: 'Alias for ask_support. Ask Posterly Support AI an authenticated question using Posterly docs plus read-only account/post diagnostics. Human tickets require request_human=true and confirm_escalation=true after explicit user confirmation.',
52
- inputSchema: supportInputSchema,
53
- execute: executeSupport,
54
- };
@@ -82,11 +82,11 @@ export const createPostPayloadInputSchema = z.object({
82
82
  .string()
83
83
  .optional()
84
84
  .describe('ISO 8601 datetime for scheduling (e.g. 2026-03-05T09:00:00Z). Omit for immediate publish.'),
85
- media_url: z.string().optional().describe('URL of media to attach (image or video). For threads, attaches to the lead post only.'),
85
+ media_url: z.string().optional().describe('Media URL to attach. Posterly storage URLs are used as-is; third-party HTTP(S) URLs are copied into Posterly storage before the post is saved. Short-lived signed URLs must still be live when this tool runs. For threads, attaches to the lead post only.'),
86
86
  media_urls: z
87
87
  .array(z.string())
88
88
  .optional()
89
- .describe('Multiple media URLs for carousel or multi-image posts. For TikTok, 2 or more images auto-create a photo slideshow (up to 35 images) and every image is posted.'),
89
+ .describe('Multiple media URLs for carousel or multi-image posts. Posterly storage URLs are used as-is; third-party HTTP(S) URLs are copied into Posterly storage before the post is saved. For TikTok, 2 or more images auto-create a photo slideshow (up to 35 images) and every image is posted.'),
90
90
  post_type: z
91
91
  .string()
92
92
  .optional()
@@ -156,6 +156,7 @@ export const createPostTool = {
156
156
  '4. If scheduling multiple posts in one turn, list every post first and confirm the batch as a whole, then prefer `create_posts_batch` so they are created in one API request.\n\n' +
157
157
  'AFTER CALLING: Tell the user the post was created, include the Posterly dashboard link returned by the tool, and offer the next natural action. Do not narrate raw HTTP, curl, or API plumbing.\n\n' +
158
158
  'Provide either account_id OR username+platform to identify the account. If scheduled_at is omitted, the post publishes immediately. If workspace_id is omitted, the server resolves one from the social account, falling back to the caller\'s default (personal) workspace - pass workspace_id explicitly if the user has more than one workspace.\n\n' +
159
+ 'MEDIA URLS: Posterly storage URLs are used as-is. Third-party HTTP(S) media URLs are copied into Posterly storage before the post is saved, so API-created posts do not later fail on expired signed URLs. Short-lived signed URLs must still be live when this tool runs. You can also call `upload_media_from_url` first if you want to upload once and reuse the returned Posterly URL across posts.\n\n' +
159
160
  'THREADS: Pass `thread_posts` (an array of 2+ strings) to schedule a multi-post thread on X (Twitter) or Threads (Meta). The first entry is the lead post; the rest are published as replies in the same chain. X entries are capped at 280 characters each (4000 for verified, 25000 for organization accounts); Threads entries are capped at 500 characters each. When `thread_posts` is set, `caption` is ignored.\n\n' +
160
161
  'PLATFORM SETTINGS: Pass `platform_settings` for composer-equivalent controls: Facebook story/reel/backgrounds, YouTube title/privacy/thumbnail/playlist, LinkedIn document titles/mentions/video thumbnails, TikTok direct-post privacy/toggles/commercial disclosure, Pinterest post_type (image/video/carousel), board (from pinterest.boards helper), title, link, and cover_image_url (video Pins), GBP event/offer/CTA, X reply settings/polls, Threads reply controls/text attachments, Bluesky languages/alt text, and Instagram feed/story/reel/carousel/collaborators/first comments/trial Reels. `instagram_settings` remains as a backwards-compatible alias.\n\n' +
161
162
  'TIKTOK MEDIA: TikTok supports a single video or a photo slideshow of 1 to 35 images, never multiple videos. Image media auto-detects as a slideshow, so you usually do not set post_type or media_type for photos and every image is posted. Pass `platform_settings.media_type: "PHOTO"` to force a slideshow explicitly.',
@@ -67,8 +67,8 @@ export const updatePostTool = {
67
67
  .string()
68
68
  .optional()
69
69
  .describe('New scheduled time (ISO 8601, e.g. 2026-03-10T09:00:00Z)'),
70
- media_url: z.string().optional().describe('New media URL'),
71
- media_urls: z.array(z.string()).optional().describe('New media URLs for carousel'),
70
+ media_url: z.string().optional().describe('New media URL. Posterly storage URLs are used as-is; third-party HTTP(S) URLs are copied into Posterly storage before the post is saved. Short-lived signed URLs must still be live when this tool runs.'),
71
+ media_urls: z.array(z.string()).optional().describe('New media URLs for carousel. Posterly storage URLs are used as-is; third-party HTTP(S) URLs are copied into Posterly storage before the post is saved.'),
72
72
  post_type: z
73
73
  .string()
74
74
  .optional()
@@ -1,7 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  export const uploadMediaFromUrlTool = {
3
3
  name: 'upload_media_from_url',
4
- description: 'Fetch an image or video from a public HTTPS URL into posterly storage. Returns a URL that can be used with create_post.',
4
+ description: 'Fetch an image or video from a public HTTPS URL into Posterly storage. Returns a URL that can be used with create_post. You can also pass public HTTP(S) media URLs directly to create_post/update_post; use this tool when you want to upload once and reuse the returned Posterly URL.',
5
5
  inputSchema: z.object({
6
6
  url: z.string().url().describe('Public HTTPS URL for the image or video. Local/private network URLs are blocked.'),
7
7
  filename: z.string().optional().describe('Optional filename override.'),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "posterly-mcp-server",
3
- "version": "0.20.5",
3
+ "version": "0.20.7",
4
4
  "description": "MCP server for posterly: schedule social media posts from Claude Desktop",
5
5
  "license": "MIT",
6
6
  "homepage": "https://www.poster.ly/mcp",
package/src/index.ts CHANGED
@@ -21,7 +21,7 @@ import { listPostsTool } from './tools/list-posts.js';
21
21
  import { uploadMediaTool } from './tools/upload-media.js';
22
22
  import { getPostTool } from './tools/get-post.js';
23
23
  import { getPostMissingTool } from './tools/get-post-missing.js';
24
- import { askSupportTool, getSupportTool } from './tools/ask-support.js';
24
+ import { askSupportTool } from './tools/ask-support.js';
25
25
  import { updatePostTool } from './tools/update-post.js';
26
26
  import { updatePostStatusTool } from './tools/update-post-status.js';
27
27
  import { updatePostReleaseIdTool } from './tools/update-post-release-id.js';
@@ -603,20 +603,6 @@ server.tool(
603
603
  }
604
604
  );
605
605
 
606
- server.tool(
607
- getSupportTool.name,
608
- getSupportTool.description,
609
- getSupportTool.inputSchema.shape,
610
- async (input) => {
611
- try {
612
- const text = await getSupportTool.execute(client, input as any);
613
- return { content: [{ type: 'text' as const, text }] };
614
- } catch (err: any) {
615
- return { content: [{ type: 'text' as const, text: `Error: ${err.message}` }], isError: true };
616
- }
617
- }
618
- );
619
-
620
606
  server.tool(
621
607
  updatePostTool.name,
622
608
  updatePostTool.description,
@@ -1 +1 @@
1
- export const POSTERLY_MCP_VERSION = '0.20.5';
1
+ export const POSTERLY_MCP_VERSION = '0.20.7';
@@ -53,11 +53,3 @@ export const askSupportTool = {
53
53
  inputSchema: supportInputSchema,
54
54
  execute: executeSupport,
55
55
  };
56
-
57
- export const getSupportTool = {
58
- name: 'get_support',
59
- description:
60
- 'Alias for ask_support. Ask Posterly Support AI an authenticated question using Posterly docs plus read-only account/post diagnostics. Human tickets require request_human=true and confirm_escalation=true after explicit user confirmation.',
61
- inputSchema: supportInputSchema,
62
- execute: executeSupport,
63
- };
@@ -86,11 +86,11 @@ export const createPostPayloadInputSchema = z.object({
86
86
  .string()
87
87
  .optional()
88
88
  .describe('ISO 8601 datetime for scheduling (e.g. 2026-03-05T09:00:00Z). Omit for immediate publish.'),
89
- media_url: z.string().optional().describe('URL of media to attach (image or video). For threads, attaches to the lead post only.'),
89
+ media_url: z.string().optional().describe('Media URL to attach. Posterly storage URLs are used as-is; third-party HTTP(S) URLs are copied into Posterly storage before the post is saved. Short-lived signed URLs must still be live when this tool runs. For threads, attaches to the lead post only.'),
90
90
  media_urls: z
91
91
  .array(z.string())
92
92
  .optional()
93
- .describe('Multiple media URLs for carousel or multi-image posts. For TikTok, 2 or more images auto-create a photo slideshow (up to 35 images) and every image is posted.'),
93
+ .describe('Multiple media URLs for carousel or multi-image posts. Posterly storage URLs are used as-is; third-party HTTP(S) URLs are copied into Posterly storage before the post is saved. For TikTok, 2 or more images auto-create a photo slideshow (up to 35 images) and every image is posted.'),
94
94
  post_type: z
95
95
  .string()
96
96
  .optional()
@@ -172,6 +172,7 @@ export const createPostTool = {
172
172
  '4. If scheduling multiple posts in one turn, list every post first and confirm the batch as a whole, then prefer `create_posts_batch` so they are created in one API request.\n\n' +
173
173
  'AFTER CALLING: Tell the user the post was created, include the Posterly dashboard link returned by the tool, and offer the next natural action. Do not narrate raw HTTP, curl, or API plumbing.\n\n' +
174
174
  'Provide either account_id OR username+platform to identify the account. If scheduled_at is omitted, the post publishes immediately. If workspace_id is omitted, the server resolves one from the social account, falling back to the caller\'s default (personal) workspace - pass workspace_id explicitly if the user has more than one workspace.\n\n' +
175
+ 'MEDIA URLS: Posterly storage URLs are used as-is. Third-party HTTP(S) media URLs are copied into Posterly storage before the post is saved, so API-created posts do not later fail on expired signed URLs. Short-lived signed URLs must still be live when this tool runs. You can also call `upload_media_from_url` first if you want to upload once and reuse the returned Posterly URL across posts.\n\n' +
175
176
  'THREADS: Pass `thread_posts` (an array of 2+ strings) to schedule a multi-post thread on X (Twitter) or Threads (Meta). The first entry is the lead post; the rest are published as replies in the same chain. X entries are capped at 280 characters each (4000 for verified, 25000 for organization accounts); Threads entries are capped at 500 characters each. When `thread_posts` is set, `caption` is ignored.\n\n' +
176
177
  'PLATFORM SETTINGS: Pass `platform_settings` for composer-equivalent controls: Facebook story/reel/backgrounds, YouTube title/privacy/thumbnail/playlist, LinkedIn document titles/mentions/video thumbnails, TikTok direct-post privacy/toggles/commercial disclosure, Pinterest post_type (image/video/carousel), board (from pinterest.boards helper), title, link, and cover_image_url (video Pins), GBP event/offer/CTA, X reply settings/polls, Threads reply controls/text attachments, Bluesky languages/alt text, and Instagram feed/story/reel/carousel/collaborators/first comments/trial Reels. `instagram_settings` remains as a backwards-compatible alias.\n\n' +
177
178
  'TIKTOK MEDIA: TikTok supports a single video or a photo slideshow of 1 to 35 images, never multiple videos. Image media auto-detects as a slideshow, so you usually do not set post_type or media_type for photos and every image is posted. Pass `platform_settings.media_type: "PHOTO"` to force a slideshow explicitly.',
@@ -72,8 +72,8 @@ export const updatePostTool = {
72
72
  .string()
73
73
  .optional()
74
74
  .describe('New scheduled time (ISO 8601, e.g. 2026-03-10T09:00:00Z)'),
75
- media_url: z.string().optional().describe('New media URL'),
76
- media_urls: z.array(z.string()).optional().describe('New media URLs for carousel'),
75
+ media_url: z.string().optional().describe('New media URL. Posterly storage URLs are used as-is; third-party HTTP(S) URLs are copied into Posterly storage before the post is saved. Short-lived signed URLs must still be live when this tool runs.'),
76
+ media_urls: z.array(z.string()).optional().describe('New media URLs for carousel. Posterly storage URLs are used as-is; third-party HTTP(S) URLs are copied into Posterly storage before the post is saved.'),
77
77
  post_type: z
78
78
  .string()
79
79
  .optional()
@@ -4,7 +4,7 @@ import type { PosterlyClient } from '../lib/api-client.js';
4
4
  export const uploadMediaFromUrlTool = {
5
5
  name: 'upload_media_from_url',
6
6
  description:
7
- 'Fetch an image or video from a public HTTPS URL into posterly storage. Returns a URL that can be used with create_post.',
7
+ 'Fetch an image or video from a public HTTPS URL into Posterly storage. Returns a URL that can be used with create_post. You can also pass public HTTP(S) media URLs directly to create_post/update_post; use this tool when you want to upload once and reuse the returned Posterly URL.',
8
8
  inputSchema: z.object({
9
9
  url: z.string().url().describe('Public HTTPS URL for the image or video. Local/private network URLs are blocked.'),
10
10
  filename: z.string().optional().describe('Optional filename override.'),