@omnisocials/mcp-server 1.28.0 → 1.29.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.
package/README.md CHANGED
@@ -188,7 +188,7 @@ Apply a set when creating a post: `create_post` / `create_and_publish_post` acce
188
188
 
189
189
  | Tool | Description |
190
190
  |------|-------------|
191
- | `list_inbox_conversations` | List conversations — Instagram/Facebook DMs, comments, mentions, LinkedIn company-page comments/mentions, TikTok video comments, and X DMs (opt-in); filter by platform, type, or unread |
191
+ | `list_inbox_conversations` | List conversations — Instagram/Facebook DMs, comments, mentions, LinkedIn company-page comments/mentions, TikTok video comments, YouTube video comments, and X DMs (opt-in); filter by platform, type, or unread |
192
192
  | `get_inbox_conversation` | Get a conversation's full message history |
193
193
  | `mark_inbox_read` | Mark all incoming messages in a conversation as read |
194
194
  | `reply_to_inbox` | Reply to a DM, comment, or mention (existing conversations only) |
@@ -218,6 +218,48 @@ Full API docs: [docs.omnisocials.com](https://docs.omnisocials.com)
218
218
 
219
219
  ## Changelog
220
220
 
221
+ ### 1.29.0 (2026-08-29)
222
+
223
+ - **Added: YouTube comments in the Social Inbox.** `list_inbox_conversations` accepts `platform: "youtube"` and returns YouTube video comment threads (comments only; YouTube has no DMs). `reply_to_inbox` can reply to YouTube comments. YouTube has no comment webhooks, so each channel is checked for new comments once per day; a new comment can take up to a day to appear. Same on the companion server (`mcp.omnisocials.com`).
224
+
225
+ ### 1.28.0 (2026-08-23)
226
+
227
+ - **Added: Threads (Meta) chained threads.** `create_post`, `create_and_publish_post`, and `update_post` accept a new `threads` option object with `thread_parts`, the same shape as the existing `x`, `bluesky`, and `mastodon` thread support: an array of 2 to 25 `{ text, media_ids?, media_urls? }` parts, 500 characters per part, up to 10 media per part (images and videos can be mixed in one carousel). Parts after the first publish as replies to the previous part. When `thread_parts` is set, the Threads caption is taken from part 1. On `update_post`, `threads.thread_parts: null` reverts the post to a single Threads post. `get_post` renders a `### Threads Thread` section, `list_posts` previews a Threads chain the same way it previews X/Bluesky/Mastodon threads, and the analytics `thread_parts` counter covers Threads. Same on the companion server (`mcp.omnisocials.com`).
228
+
229
+ ### 1.27.0 (2026-08-22)
230
+
231
+ - **Added: every metric the platforms report.** `get_post_analytics` and `get_posts_analytics` now render the full per-platform metric set with labels: link clicks, profile visits, follows from the post, pin and outbound clicks, video views, engaged views, average and total watch time, watched percentage, completion rate, skip rate, replays, subscribers gained and lost, duration, plus breakdown rows for reactions by type, clicks by type, traffic sources (YouTube), where the video was seen and viewer types (TikTok), Instagram story navigation and completion, Google Business impressions by surface. Items a platform cannot measure carry `metrics_unavailable` and a note instead of zeros.
232
+ - **Added: account day values and audience data.** `get_account_analytics` details now list views, reach, engagement, profile views, link clicks, new and lost followers, accounts engaged, video views, minutes watched, Pinterest monthly views, Google Business rating, reviews, calls, direction requests, website clicks and bookings, and the row's `period`. The raw response also carries `demographics` and `online_followers` when the platform provides them. LinkedIn profile rows keep the lifetime total under `impressions_lifetime`; `impressions_period` is gone.
233
+ - **Changed: `get_best_times` blends in when the audience is online.** New `basis` values `own_data_and_audience` and `audience` (Instagram, TikTok Business), and the response carries `audience_online` (hour to followers online). Tool description and footer text updated. Same on the companion server (`mcp.omnisocials.com`).
234
+ - **Fixed:** a `reactions` breakdown object no longer turns the likes total into `NaN` in `get_posts_analytics`.
235
+
236
+ ### 1.26.0 (2026-08-22)
237
+
238
+ - **Added: TikTok first comments.** The `tiktok` option object on `create_post`, `create_and_publish_post`, and `update_post` accepts `first_comment` (max **150 characters**, TikTok's own comment limit). It is posted through the TikTok Business API right after the video publishes, so the workspace's TikTok channel must have comments enabled (the "Enable comments" authorization on the channel card); without it `first_comment_result.status` is `failed` with an explanatory error. The video must be public with comments allowed. TikTok sometimes returns the final video id a few minutes after publish — then `first_comment_result.pending` is `true` and the comment posts automatically once the id resolves. `get_post` renders TikTok in the `### First comment` section. Same on the companion server (`mcp.omnisocials.com`).
239
+ - **Added: TikTok watch-depth metrics.** `get_post_analytics`, `get_posts_analytics`, and `get_recent_platform_posts` now include `average_time_watched` (seconds), `full_video_watched_rate`, `total_time_watched` (seconds), `favorites`, and `reach` for TikTok videos when the workspace enabled TikTok comments. Workspaces that enabled comments before this release must click "Unlock watch-time analytics" on the TikTok channel card once (one extra TikTok consent for the `video.insights` scope). Tool descriptions updated accordingly.
240
+
241
+ ### 1.25.0 (2026-08-21)
242
+
243
+ - **Added: multi-slide stories.** `create_post`, `create_and_publish_post`, and `update_post` now treat every media item on a `type: "story"` post as one slide (1 to 10). Instagram and Facebook have no multi-slide story container, so each slide publishes as its own story, in the order given; more than 10 returns 400. The tool descriptions tell the model to ask which media and in what order, and that story videos are capped at 60 seconds per slide. `get_post` renders a `### Story Slides` section with every slide's own URL (the `published_urls` block keeps the first slide), and `get_post_analytics` shows a per-slide table under the platform totals for multi-slide stories. Same on the companion server (`mcp.omnisocials.com`).
244
+
245
+ ### 1.24.0 (2026-08-20)
246
+
247
+ - **Added: LinkedIn multi-image style (`carousel_as_images`).** The `linkedin` and `linkedin_page` option objects on `create_post`, `create_and_publish_post`, and `update_post` accept a new `carousel_as_images` boolean. By default a LinkedIn post with 2+ images publishes as LinkedIn's swipeable PDF document carousel; set `carousel_as_images: true` to publish the images as a plain multi-image gallery instead. Independent per channel (profile vs company page). Ignored for 0-1 images, videos, and polls. On `update_post` the flag merges: `true` sets it, `false`/`null` reverts to the document carousel, omitted keeps the current value. `get_post` echoes the flag inside each channel's options and renders a note when a post opts out of the document carousel. Same on the companion server (`mcp.omnisocials.com`).
248
+
249
+ ### 1.23.0 (2026-08-20)
250
+
251
+ - **Changed: X thread parts now teach the weighted character count.** The `thread_parts[].text` description explains that X's 280 limit is a weighted count: every link counts as 23 characters, and every emoji or non-Latin symbol (rocket, ellipsis, CJK) counts as 2, so text that looks under 280 can still be over. Models trimming generated copy are told to leave headroom instead of cutting to exactly 280 raw characters. Backed by the server-side weighting fix (verified against the official twitter-text library), which also maps X's vague 403 to a message naming the character-limit cause. Same on the companion server (`mcp.omnisocials.com`).
252
+ - **Changed: per-platform mixed-media rules in `create_post` / `create_and_publish_post` / `update_post` descriptions.** Instagram and Threads carousels CAN mix images and videos in one carousel (a May 2025 blanket block was removed); Facebook, LinkedIn Profile, LinkedIn Page, X, Bluesky, and Mastodon cannot mix and now reject mixed batches at create time with a message naming the platform (previously the API published the video and silently dropped the images). Pinterest note clarified: a video splits off into its own video pin. Same on the companion server (`mcp.omnisocials.com`).
253
+ - **Changed: npm keywords expanded** (scheduling plus every platform name) so MCP registries and npm search can find the server.
254
+
255
+ ### 1.22.0 (2026-08-13)
256
+
257
+ - **Added: TikTok comments in the Social Inbox.** `list_inbox_conversations` accepts `platform: "tiktok"` and TikTok video comments now appear alongside the other platforms (comments only — TikTok has no DM or mention conversations here). `reply_to_inbox` replies to TikTok comments: text-only, capped at **150 characters** (the platform's own limit; longer text returns a validation error), and the posted reply can take a few minutes to become publicly visible while TikTok's spam review clears it. Requires the workspace's TikTok channel to have comments enabled (the "Enable comments" authorization on the TikTok channel card). A 401 `reauth_required` on reply means that authorization expired — re-enable comments on the channel. Same tools on the companion server (`mcp.omnisocials.com`).
258
+
259
+ ### 1.21.0 (2026-08-12)
260
+
261
+ - **Added: LinkedIn polls.** `create_post`, `create_and_publish_post`, and `update_post` accept a new `linkedin_poll` parameter, keyed by channel: `{ linkedin?: { question (max 140 chars), options (2-4 entries, max 30 chars each), duration }, linkedin_page?: {...} }` where `duration` is one of `ONE_DAY`/`THREE_DAYS`/`SEVEN_DAYS`/`FOURTEEN_DAYS`. `linkedin` (personal profile) and `linkedin_page` (company page) each carry an **independent** poll — set both keys to post a different poll to each. A poll is mutually exclusive with media and a link share on that channel's post — a poll silently takes priority over both at publish time, so don't combine them. On `update_post`, the object replaces wholesale (send the full state for both channels); set a channel's key to `null` to clear that channel's poll and revert it to a normal post. `get_post` now renders a `### LinkedIn Profile Poll` and/or `### LinkedIn Page Poll` section (question, options, duration) when either channel is one. Same on the companion server (`mcp.omnisocials.com`).
262
+
221
263
  ### 1.20.0 (2026-08-04)
222
264
 
223
265
  - **Engagement rate now matches the dashboard:** `get_post_analytics` / `get_posts_analytics` previously summed likes + comments + shares only, dropping LinkedIn link clicks and X quotes/bookmarks from engagement. Both tools now use the same normalization as the dashboard and `get_analytics_overview`; rates are suppressed below 10 impressions and capped at 100%.
package/build/index.js CHANGED
@@ -29,7 +29,7 @@ const sessionState = { activeIndex: 0 };
29
29
  const getActiveClient = () => workspaceClients[sessionState.activeIndex].client;
30
30
  const server = new McpServer({
31
31
  name: "OmniSocials",
32
- version: "1.28.0",
32
+ version: "1.29.0",
33
33
  });
34
34
  // Register all tools - pass getter function so tools always use the active workspace's client
35
35
  registerPostTools(server, getActiveClient);
@@ -5,12 +5,13 @@ const PLATFORM_EMOJI = {
5
5
  facebook: "📘",
6
6
  linkedin: "💼",
7
7
  tiktok: "🎵",
8
+ youtube: "▶️",
8
9
  x: "🐦",
9
10
  };
10
11
  export function registerInboxTools(server, getClient) {
11
- server.tool("list_inbox_conversations", "List social inbox conversations (Instagram/Facebook DMs, comments, mentions, LinkedIn company-page comments/mentions, TikTok video comments, and X DMs where the workspace has opted into X DMs), newest activity first. Cursor-paginated: pass the returned cursor to get the next page.", {
12
+ server.tool("list_inbox_conversations", "List social inbox conversations (Instagram/Facebook DMs, comments, mentions, LinkedIn company-page comments/mentions, TikTok video comments, YouTube video comments, and X DMs where the workspace has opted into X DMs), newest activity first. Cursor-paginated: pass the returned cursor to get the next page.", {
12
13
  platform: z
13
- .enum(["instagram", "facebook", "linkedin", "tiktok", "x"])
14
+ .enum(["instagram", "facebook", "linkedin", "tiktok", "youtube", "x"])
14
15
  .optional()
15
16
  .describe("Filter to one platform"),
16
17
  type: z
@@ -138,7 +139,7 @@ export function registerInboxTools(server, getClient) {
138
139
  ],
139
140
  };
140
141
  });
141
- server.tool("reply_to_inbox", "Reply to an existing inbox conversation (DM, comment, or mention) on Instagram, Facebook, LinkedIn, TikTok, or X. You can only reply to conversations that already exist. Meta direct-message replies must be within the platform's 24-hour messaging window. TikTok replies are comments only, text-only, and capped at 150 characters; they can take a few minutes to appear on TikTok while they pass spam review. X replies are DM-only and use 2 prepaid credits per send (X's API fee passed through at cost) — a 402 insufficient_credits error means the organisation needs to top up at https://app.omnisocials.com/credits; relay that link to the user rather than retrying. Each workspace can send up to 1,000 replies per day.", {
142
+ server.tool("reply_to_inbox", "Reply to an existing inbox conversation (DM, comment, or mention) on Instagram, Facebook, LinkedIn, TikTok, YouTube, or X. You can only reply to conversations that already exist. Meta direct-message replies must be within the platform's 24-hour messaging window. TikTok replies are comments only, text-only, and capped at 150 characters; they can take a few minutes to appear on TikTok while they pass spam review. YouTube replies are comments only. X replies are DM-only and use 2 prepaid credits per send (X's API fee passed through at cost) — a 402 insufficient_credits error means the organisation needs to top up at https://app.omnisocials.com/credits; relay that link to the user rather than retrying. Each workspace can send up to 1,000 replies per day.", {
142
143
  conversation_id: z.string().describe("The conversation ID to reply to"),
143
144
  text: z
144
145
  .string()
package/build/types.d.ts CHANGED
@@ -28,7 +28,7 @@ export interface InboxParticipant {
28
28
  }
29
29
  export interface InboxConversation {
30
30
  conversation_id: string;
31
- platform: "instagram" | "facebook" | "linkedin" | "tiktok" | "x";
31
+ platform: "instagram" | "facebook" | "linkedin" | "tiktok" | "youtube" | "x";
32
32
  type: "dm" | "comment" | "mention";
33
33
  participant: InboxParticipant;
34
34
  unread_count: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omnisocials/mcp-server",
3
- "version": "1.28.0",
3
+ "version": "1.29.0",
4
4
  "mcpName": "io.github.omnisocials/mcp-server",
5
5
  "description": "MCP server for OmniSocials API - manage social media posts, media, accounts, analytics, and webhooks",
6
6
  "type": "module",