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 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.0` exposes 64 tools covering 100 actions. The hosted HTTP endpoint exposes the same catalog minus the three signup tools: 61 tools covering 97 actions.
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
 
@@ -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[];
@@ -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
@@ -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 [
@@ -1 +1 @@
1
- export declare const POSTERLY_MCP_VERSION = "0.51.0";
1
+ export declare const POSTERLY_MCP_VERSION = "0.51.1";
@@ -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.0';
8
+ export const POSTERLY_MCP_VERSION = '0.51.1';
@@ -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.0",
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.0",
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.0",
16
+ "version": "0.51.1",
17
17
  "transport": {
18
18
  "type": "stdio"
19
19
  },