@omnisocials/mcp-server 1.49.0 → 1.50.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
@@ -202,6 +202,7 @@ Apply a set when creating a post: `create_post` / `create_and_publish_post` acce
202
202
  | `get_inbox_conversation` | Get a conversation's full message history with the post it belongs to; every message shows its `#id` |
203
203
  | `mark_inbox_read` | Mark all incoming messages in a conversation as read (also the durable skip for `get_next_unanswered`) |
204
204
  | `reply_to_inbox` | Reply to a DM, comment, or mention (existing conversations only); `message_id` picks the comment being answered; `include_next` returns the next unanswered item in the same call |
205
+ | `like_inbox_comment` | Like or unlike a comment on one of your posts as the account (Facebook Page, LinkedIn Page, TikTok; Facebook allows a Like only) |
205
206
  | `hide_inbox_comment` | Hide or unhide a comment on one of your posts (Facebook, Instagram, TikTok, YouTube, Threads) |
206
207
  | `delete_inbox_comment` | Permanently delete a comment on one of your posts, with the replies under it (Facebook, Instagram, TikTok) |
207
208
  | `hide_inbox_reply` | Older name for `hide_inbox_comment`, kept for compatibility |
@@ -244,6 +245,10 @@ Full API docs: [docs.omnisocials.com](https://docs.omnisocials.com)
244
245
 
245
246
  ## Changelog
246
247
 
248
+ ### 1.50.0 (2026-10-27)
249
+
250
+ - **Added: `like_inbox_comment`.** Like (or unlike with `like: false`) a Facebook, LinkedIn Page or TikTok comment as the connected account. Facebook allows a Like only. Inbox messages carry `liked`.
251
+
247
252
  ### 1.49.0 (2026-10-27)
248
253
 
249
254
  - **Added: the Threads topic.** `threads.topic_tag` on `create_post`, `create_and_publish_post` and `update_post` (one topic per post, 1 to 50 characters, spaces allowed, no period or ampersand; `null` removes it on update). `get_post` shows it.
package/build/client.d.ts CHANGED
@@ -574,5 +574,6 @@ export declare class OmniSocialsClient {
574
574
  exclude?: string;
575
575
  }): Promise<ApiResponse<InboxNextUnanswered | null>>;
576
576
  hideInboxMessage(messageId: string, hide?: boolean): Promise<ApiResponse<InboxMessage>>;
577
+ likeInboxMessage(messageId: string, like?: boolean): Promise<ApiResponse<InboxMessage>>;
577
578
  deleteInboxMessage(messageId: string): Promise<ApiResponse<InboxDeleteResult>>;
578
579
  }
package/build/client.js CHANGED
@@ -585,6 +585,12 @@ export class OmniSocialsClient {
585
585
  async hideInboxMessage(messageId, hide = true) {
586
586
  return this.request("POST", `/inbox/messages/${encodeURIComponent(messageId)}/hide`, { hide });
587
587
  }
588
+ // Like/unlike a comment as the connected account (Facebook Page, LinkedIn
589
+ // Page, TikTok). `like: false` removes the like. Needs the inbox:write
590
+ // scope.
591
+ async likeInboxMessage(messageId, like = true) {
592
+ return this.request("POST", `/inbox/messages/${encodeURIComponent(messageId)}/like`, { like });
593
+ }
588
594
  // Delete a comment on the platform and from the inbox (Facebook, Instagram,
589
595
  // TikTok; YouTube cannot delete other people's comments, hide instead).
590
596
  // Replies under it go too. Needs the inbox:write scope.
package/build/index.js CHANGED
@@ -30,7 +30,7 @@ const sessionState = { activeIndex: 0 };
30
30
  const getActiveClient = () => workspaceClients[sessionState.activeIndex].client;
31
31
  const server = new McpServer({
32
32
  name: "OmniSocials",
33
- version: "1.49.0",
33
+ version: "1.50.0",
34
34
  });
35
35
  // Register all tools - pass getter function so tools always use the active workspace's client
36
36
  registerPostTools(server, getActiveClient);
@@ -61,6 +61,8 @@ function renderInboxMessages(msgs, highlightId) {
61
61
  }
62
62
  if (m.hidden)
63
63
  flags.push("hidden");
64
+ if (m.liked)
65
+ flags.push("liked");
64
66
  if (m.parent_comment_id)
65
67
  flags.push("reply to a comment");
66
68
  md += `**${who}** _(${formatDateTime(m.timestamp)})_ \`#${m.id}\`${flags.length ? " · " + flags.join(" · ") : ""}\n${m.text || ""}\n`;
@@ -88,7 +90,7 @@ function renderNextUnanswered(result) {
88
90
  md += renderInboxPost(item.message.post || c.post);
89
91
  md += renderInboxMessages(item.messages, item.message.id);
90
92
  md += `_${result.remaining || 0} more waiting._\n\n`;
91
- md += `_Reply: reply_to_inbox with the conversation ID and message_id: "${item.message.id}" (add include_next: true to get the next one in the same call). Skip for good: mark_inbox_read. Comments: hide_inbox_comment / delete_inbox_comment with the message id._`;
93
+ md += `_Reply: reply_to_inbox with the conversation ID and message_id: "${item.message.id}" (add include_next: true to get the next one in the same call). Skip for good: mark_inbox_read. Comments: like_inbox_comment / hide_inbox_comment / delete_inbox_comment with the message id._`;
92
94
  return md;
93
95
  }
94
96
  export function registerInboxTools(server, getClient) {
@@ -154,7 +156,7 @@ export function registerInboxTools(server, getClient) {
154
156
  }
155
157
  return { content: [{ type: "text", text: md }] };
156
158
  });
157
- server.tool("get_inbox_conversation", "Get the full message history of one inbox conversation, oldest first, with the post it belongs to (caption, link, image) for comment/mention threads. Each message shows its inbox id (#id): that id is what hide_inbox_comment and delete_inbox_comment take. Use the conversation_id from list_inbox_conversations. Replies sent from the native apps appear as outgoing messages too.", {
159
+ server.tool("get_inbox_conversation", "Get the full message history of one inbox conversation, oldest first, with the post it belongs to (caption, link, image) for comment/mention threads. Each message shows its inbox id (#id): that id is what like_inbox_comment, hide_inbox_comment and delete_inbox_comment take. Use the conversation_id from list_inbox_conversations. Replies sent from the native apps appear as outgoing messages too.", {
158
160
  conversation_id: z.string().describe("The conversation ID to fetch"),
159
161
  limit: z
160
162
  .number()
@@ -320,6 +322,28 @@ export function registerInboxTools(server, getClient) {
320
322
  // Older name from 1.28.0 (when hiding was Threads-only). Kept so existing
321
323
  // setups keep working; same call, same platforms as hide_inbox_comment.
322
324
  server.tool("hide_inbox_reply", "Older name for hide_inbox_comment, kept so existing setups keep working; prefer hide_inbox_comment. Same behaviour: hide (or unhide with hide: false) a comment someone left on one of the workspace's posts, as the post owner, on Facebook, Instagram, TikTok, YouTube or Threads. Takes the message id (the #id in the thread), not the conversation id. A 403 reconnect_required means the account must be reconnected in the dashboard to grant the comment-moderation permission.", hideCommentSchema, { title: "Hide Inbox Comment (older name)", readOnlyHint: false, destructiveHint: false, openWorldHint: true }, hideComment);
325
+ server.tool("like_inbox_comment", "Like (or remove the like from) a comment someone left on one of the workspace's posts, as the connected account: the Facebook Page, the LinkedIn Page or the TikTok account. Incoming Facebook, LinkedIn Page and TikTok comments only. Facebook allows a Like only: no app can add Love or another reaction, so say so when the user asks for one. Takes the message id (the #id shown by get_inbox_conversation and get_next_unanswered), not the conversation id. Liking an already liked comment succeeds and changes nothing. A like does not mark the comment as read or answered: to move past it in get_next_unanswered without a reply, use mark_inbox_read or exclude. Like only comments the user asked you to like, or that match a rule the user gave (for example 'like the positive comments'); never like in bulk on your own. A 403 reconnect_required or 401 reauth_required means the account must be reconnected in the dashboard; relay that to the user rather than retrying.", {
326
+ message_id: z
327
+ .string()
328
+ .describe("The inbox message id of the comment (the #id in the thread)"),
329
+ like: z
330
+ .boolean()
331
+ .optional()
332
+ .describe("true (default) to like, false to remove the like"),
333
+ }, { title: "Like Inbox Comment", readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ message_id, like }) => {
334
+ const result = await getClient().likeInboxMessage(message_id, like !== false);
335
+ if (result.error)
336
+ return errorResult(result.error);
337
+ const m = result.data;
338
+ return {
339
+ content: [
340
+ {
341
+ type: "text",
342
+ text: `Comment \`#${m?.id ?? message_id}\` on ${m?.platform || "the platform"} is now ${m?.liked ? "liked" : "not liked"}.`,
343
+ },
344
+ ],
345
+ };
346
+ });
323
347
  server.tool("delete_inbox_comment", "Permanently delete a comment someone left on one of the workspace's posts, on the platform and from the inbox. Facebook, Instagram and TikTok comments only (YouTube's API cannot delete other people's comments: use hide_inbox_comment there). Replies under the comment are deleted with it. This cannot be undone: confirm with the user before calling. Takes the message id (the #id in the thread), not the conversation id. A 403 reconnect_required means the account must be reconnected in the dashboard to grant the moderation permission.", {
324
348
  message_id: z
325
349
  .string()
package/build/types.d.ts CHANGED
@@ -76,6 +76,10 @@ export interface InboxMessage {
76
76
  * YouTube, Threads): true when the comment is hidden on the platform (flip
77
77
  * it with hide_inbox_comment). null for DMs. */
78
78
  hidden?: boolean | null;
79
+ /** Incoming Facebook, LinkedIn Page and TikTok comments: true when the
80
+ * connected account liked the comment (flip it with like_inbox_comment).
81
+ * null for DMs, outgoing messages and the other platforms. */
82
+ liked?: boolean | null;
79
83
  /** Link to the reply or mentioning post on the platform, when known. */
80
84
  permalink?: string | null;
81
85
  /** Media sent with this message, when present. Incoming Instagram/Facebook
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omnisocials/mcp-server",
3
- "version": "1.49.0",
3
+ "version": "1.50.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",