posterly-mcp-server 0.51.0 → 0.51.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/lib/api-client.d.ts +10 -0
- package/dist/lib/format.d.ts +4 -0
- package/dist/lib/format.js +24 -1
- package/dist/lib/version.d.ts +1 -1
- package/dist/lib/version.js +1 -1
- package/dist/tools/get-post.js +9 -3
- package/package.json +1 -1
- package/server.json +2 -2
package/README.md
CHANGED
|
@@ -123,7 +123,7 @@ Add the same server definition to your Cursor MCP settings:
|
|
|
123
123
|
|
|
124
124
|
## Available tools
|
|
125
125
|
|
|
126
|
-
`posterly-mcp-server@0.51.
|
|
126
|
+
`posterly-mcp-server@0.51.1` exposes 64 tools covering 100 actions. The hosted HTTP endpoint exposes the same catalog minus the three signup tools: 61 tools covering 97 actions.
|
|
127
127
|
|
|
128
128
|
Many tools pick what to do with one parameter: `view` (reads), `action` (writes), or `type`. A few pick their mode from which parameters you pass (for example `update_post` with `status` changes the status instead of editing). Every tool description names all of its views and actions.
|
|
129
129
|
|
package/dist/lib/api-client.d.ts
CHANGED
|
@@ -154,10 +154,20 @@ export interface ApiPostApproval {
|
|
|
154
154
|
requested_at: string | null;
|
|
155
155
|
completed_at: string | null;
|
|
156
156
|
}
|
|
157
|
+
/** Who or what created a post. Any field is null when it was never recorded. */
|
|
158
|
+
export interface ApiPostCreator {
|
|
159
|
+
user_id: string | null;
|
|
160
|
+
name: string | null;
|
|
161
|
+
source: string | null;
|
|
162
|
+
source_label: string | null;
|
|
163
|
+
}
|
|
157
164
|
export interface Post {
|
|
158
165
|
id: number;
|
|
159
166
|
content: string;
|
|
160
167
|
scheduled_at: string;
|
|
168
|
+
created_at?: string | null;
|
|
169
|
+
updated_at?: string | null;
|
|
170
|
+
created_by?: ApiPostCreator | null;
|
|
161
171
|
social_account_id: string;
|
|
162
172
|
media_url?: string;
|
|
163
173
|
media_urls?: string[];
|
package/dist/lib/format.d.ts
CHANGED
|
@@ -68,6 +68,10 @@ export declare function formatCalendarDay(day: string): string;
|
|
|
68
68
|
* day before); anything else reads as "from X up to Y".
|
|
69
69
|
*/
|
|
70
70
|
export declare function formatPostRange(range: PostListRange): string;
|
|
71
|
+
/** ISO 8601 in UTC to the second ("2026-10-07T07:32:54Z"); "unknown" when missing. */
|
|
72
|
+
export declare function formatIsoTimestamp(value: string | null | undefined): string;
|
|
73
|
+
/** "Georgia via Dashboard"; whichever half was never recorded reads as unknown. */
|
|
74
|
+
export declare function formatPostCreator(creator: Post['created_by']): string;
|
|
71
75
|
/**
|
|
72
76
|
* One page of list_posts. Always says whether every matching post is shown,
|
|
73
77
|
* and when it is not, exactly which offset to call next, so an agent never
|
package/dist/lib/format.js
CHANGED
|
@@ -304,6 +304,27 @@ export function formatPostRange(range) {
|
|
|
304
304
|
const to = range.to ? `up to ${formatDateTimeInZone(range.to, tz)}` : '';
|
|
305
305
|
return `${[from, to].filter(Boolean).join(' ')} (${tz})`;
|
|
306
306
|
}
|
|
307
|
+
/** ISO 8601 in UTC to the second ("2026-10-07T07:32:54Z"); "unknown" when missing. */
|
|
308
|
+
export function formatIsoTimestamp(value) {
|
|
309
|
+
if (!value)
|
|
310
|
+
return 'unknown';
|
|
311
|
+
const date = new Date(value);
|
|
312
|
+
if (Number.isNaN(date.getTime()))
|
|
313
|
+
return value;
|
|
314
|
+
return date.toISOString().replace(/\.\d{3}Z$/, 'Z');
|
|
315
|
+
}
|
|
316
|
+
/** "Georgia via Dashboard"; whichever half was never recorded reads as unknown. */
|
|
317
|
+
export function formatPostCreator(creator) {
|
|
318
|
+
const who = creator?.name || (creator?.user_id ? `user ${creator.user_id}` : null);
|
|
319
|
+
const via = creator?.source_label || null;
|
|
320
|
+
if (who && via)
|
|
321
|
+
return `${who} via ${via}`;
|
|
322
|
+
if (who)
|
|
323
|
+
return `${who} (source unknown)`;
|
|
324
|
+
if (via)
|
|
325
|
+
return `via ${via} (account unknown)`;
|
|
326
|
+
return 'unknown';
|
|
327
|
+
}
|
|
307
328
|
function approvalCell(post) {
|
|
308
329
|
if (!post.approval || post.approval.status === 'none')
|
|
309
330
|
return 'none';
|
|
@@ -340,7 +361,7 @@ export function formatPostListPage(data, options) {
|
|
|
340
361
|
: first === 1
|
|
341
362
|
? `**Complete: all ${total} matching posts are shown.**`
|
|
342
363
|
: `**Complete: this is the last page (posts ${first}-${last} of ${total}).**`;
|
|
343
|
-
const table = mdTable(['Status', 'Post ID', `Scheduled (${tz})`, 'Type', 'Account ID', 'Brand ID', 'Approval', 'Caption'],
|
|
364
|
+
const table = mdTable(['Status', 'Post ID', `Scheduled (${tz})`, 'Type', 'Account ID', 'Brand ID', 'Approval', 'Created', 'Created by', 'Caption'],
|
|
344
365
|
// The API post row carries account and brand IDs only (no joined names);
|
|
345
366
|
// list_accounts and list_brands, or view=counts, resolve them.
|
|
346
367
|
posts.map((post) => [
|
|
@@ -351,6 +372,8 @@ export function formatPostListPage(data, options) {
|
|
|
351
372
|
post.social_account_id != null ? String(post.social_account_id) : 'n/a',
|
|
352
373
|
post.brand_id || 'none',
|
|
353
374
|
approvalCell(post),
|
|
375
|
+
formatIsoTimestamp(post.created_at),
|
|
376
|
+
formatPostCreator(post.created_by),
|
|
354
377
|
compactText(post.content, 80) || '(empty)',
|
|
355
378
|
]));
|
|
356
379
|
return [
|
package/dist/lib/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const POSTERLY_MCP_VERSION = "0.51.
|
|
1
|
+
export declare const POSTERLY_MCP_VERSION = "0.51.1";
|
package/dist/lib/version.js
CHANGED
|
@@ -5,4 +5,4 @@
|
|
|
5
5
|
// tool set (minus the intentional pre-auth signup tools that only this stdio
|
|
6
6
|
// package exposes). `npm run check:mcp-parity` enforces both the version match
|
|
7
7
|
// and the tool-list match, and runs in the pre-commit hook.
|
|
8
|
-
export const POSTERLY_MCP_VERSION = '0.51.
|
|
8
|
+
export const POSTERLY_MCP_VERSION = '0.51.1';
|
package/dist/tools/get-post.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { dashboardUrlForPost, formatLocalDateTime } from '../lib/format.js';
|
|
2
|
+
import { dashboardUrlForPost, formatIsoTimestamp, formatLocalDateTime, formatPostCreator } from '../lib/format.js';
|
|
3
3
|
import { validateArgs } from '../lib/tool-runtime.js';
|
|
4
4
|
export const getPostTool = {
|
|
5
5
|
name: 'get_post',
|
|
6
|
-
description: 'One post by ID. view=post (default): caption, status, scheduled time, media, and platform info. view=missing: whether the post is missing required content, media, account, platform settings, or metadata before it can publish; use it to repair failed or imported posts.',
|
|
6
|
+
description: 'One post by ID. view=post (default): caption, status, scheduled time, when it was created and by whom (account and channel, such as dashboard, API, or MCP), media, and platform info. view=missing: whether the post is missing required content, media, account, platform settings, or metadata before it can publish; use it to repair failed or imported posts.',
|
|
7
7
|
inputSchema: z.object({
|
|
8
8
|
post_id: z.number().describe('The post ID to look up'),
|
|
9
9
|
view: z.enum(['post', 'missing']).optional().describe('post (default) or missing.'),
|
|
@@ -28,8 +28,14 @@ async function post(client, input) {
|
|
|
28
28
|
`• Caption: ${p.content || '(empty)'}`,
|
|
29
29
|
`• Type: ${p.post_type || 'unknown'}`,
|
|
30
30
|
`• Scheduled: ${formatLocalDateTime(p.scheduled_at)}`,
|
|
31
|
-
`• View in posterly: ${dashboardUrlForPost({ id: p.id, scheduled_at: p.scheduled_at })}`,
|
|
32
31
|
];
|
|
32
|
+
if ('created_at' in p)
|
|
33
|
+
lines.push(`• Created: ${formatIsoTimestamp(p.created_at)}`);
|
|
34
|
+
if ('created_by' in p)
|
|
35
|
+
lines.push(`• Created by: ${formatPostCreator(p.created_by)}`);
|
|
36
|
+
if ('updated_at' in p)
|
|
37
|
+
lines.push(`• Last updated: ${formatIsoTimestamp(p.updated_at)}`);
|
|
38
|
+
lines.push(`• View in posterly: ${dashboardUrlForPost({ id: p.id, scheduled_at: p.scheduled_at })}`);
|
|
33
39
|
if (p.platform_post_url)
|
|
34
40
|
lines.push(`• Published URL: ${p.platform_post_url}`);
|
|
35
41
|
if (p.media_url)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "posterly-mcp-server",
|
|
3
|
-
"version": "0.51.
|
|
3
|
+
"version": "0.51.1",
|
|
4
4
|
"mcpName": "io.github.awpthorp/posterly",
|
|
5
5
|
"description": "MCP server for posterly: schedule and publish social media posts across 18 platforms from any MCP client (Claude, ChatGPT, Cursor, Windsurf, Cline, and more)",
|
|
6
6
|
"license": "MIT",
|
package/server.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"name": "io.github.awpthorp/posterly",
|
|
4
4
|
"title": "posterly",
|
|
5
5
|
"description": "Validate, schedule, publish, and analyze social content across 18 platforms with posterly.",
|
|
6
|
-
"version": "0.51.
|
|
6
|
+
"version": "0.51.1",
|
|
7
7
|
"websiteUrl": "https://www.poster.ly/mcp",
|
|
8
8
|
"repository": {
|
|
9
9
|
"url": "https://github.com/awpthorp/posterly-mcp-server",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
{
|
|
14
14
|
"registryType": "npm",
|
|
15
15
|
"identifier": "posterly-mcp-server",
|
|
16
|
-
"version": "0.51.
|
|
16
|
+
"version": "0.51.1",
|
|
17
17
|
"transport": {
|
|
18
18
|
"type": "stdio"
|
|
19
19
|
},
|