@omnisocials/mcp-server 1.13.0 → 1.14.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
@@ -173,6 +173,17 @@ OmniSocials accepts the following channel IDs in `create_post`, `create_and_publ
173
173
  | `delete_webhook` | Delete a webhook |
174
174
  | `rotate_webhook_secret` | Rotate a webhook's signing secret |
175
175
 
176
+ ### Social Inbox (4 tools)
177
+
178
+ | Tool | Description |
179
+ |------|-------------|
180
+ | `list_inbox_conversations` | List conversations — Instagram/Facebook DMs, comments, mentions, and LinkedIn company-page comments/mentions; filter by platform, type, or unread |
181
+ | `get_inbox_conversation` | Get a conversation's full message history |
182
+ | `mark_inbox_read` | Mark all incoming messages in a conversation as read |
183
+ | `reply_to_inbox` | Reply to a DM, comment, or mention (existing conversations only) |
184
+
185
+ Requires an API key with the opt-in `inbox:read` / `inbox:write` scopes — enable "Social Inbox access" when you create the key.
186
+
176
187
  ## Environment Variables
177
188
 
178
189
  | Variable | Required | Description |
@@ -196,6 +207,50 @@ Full API docs: [docs.omnisocials.com](https://docs.omnisocials.com)
196
207
 
197
208
  ## Changelog
198
209
 
210
+ ### 1.13.1
211
+
212
+ - Docs-only republish to refresh the README on npmjs.com — the changelog below had drifted (it stopped at 1.5.0) and the Social Inbox tools were missing from the tool list. No code changes from 1.13.0.
213
+
214
+ ### 1.13.0
215
+
216
+ - **Added: Social Inbox tools** — `list_inbox_conversations`, `get_inbox_conversation`, `mark_inbox_read`, `reply_to_inbox`. Read and reply to Instagram and Facebook DMs, comments, and mentions, plus LinkedIn company-page comments and mentions (LinkedIn has no API DMs). Cursor-paginated with platform/type/unread filters. Replies work only on existing conversations (no cold outreach); direct-message replies must be within the platform's 24-hour window, and each workspace can send up to 1,000 replies per day. Requires the opt-in `inbox:read` / `inbox:write` scopes (enable "Social Inbox access" when creating the key). Same tools on the companion server (`mcp.omnisocials.com`).
217
+
218
+ ### 1.12.0
219
+
220
+ - **Added: Instagram Trial Reels** — `instagram.is_trial_reel` (plus `trial_graduation_strategy`) on `create_post` / `create_and_publish_post` / `update_post`; the reel is shown to non-followers first. Requires roughly 1,000+ followers and per-account eligibility.
221
+ - **Added: reel music** — `instagram.audio_id` attaches licensed audio to a reel; the new `search_instagram_audio` tool finds tracks and returns their `audio_id`.
222
+ - **Changed:** `update_post` Instagram options now MERGE into the stored options instead of replacing them, so updating one option no longer clears others.
223
+
224
+ ### 1.11.0
225
+
226
+ - **Fixed:** `get_post_analytics` and `get_posts_analytics` now render every metric the platform reports (reach, saves, views, and more) instead of a fixed column set that silently dropped some.
227
+
228
+ ### 1.10.0
229
+
230
+ - **Added:** `get_best_times` — best times to post for the workspace, per platform, from historical engagement.
231
+ - **Added:** YouTube cover support plus media order and thumbnail fixes in `create_post` / `update_post`.
232
+
233
+ ### 1.9.0
234
+
235
+ - Maintenance release aligned with a backend upload-media fix; existing clients benefit automatically once the backend deploys. No MCP tool changes.
236
+
237
+ ### 1.8.0
238
+
239
+ - **Added:** `get_posts_analytics` — the latest per-platform metrics for up to 100 posts in a single (bulk) call.
240
+ - **Added:** upload a PDF as a carousel via `upload_media` — rasterized into one slide per page (max 20); posts as a native swipeable document on LinkedIn and an image carousel elsewhere.
241
+
242
+ ### 1.7.1
243
+
244
+ - **Changed:** clearer guidance for files over 100 MB — base64/direct uploads cap at 100 MB; for up to 1 GB pass a public `url` or use the Library UI. Also fixes a stray " B" in `list_media` size output.
245
+
246
+ ### 1.7.0
247
+
248
+ - **Changed:** `switch_workspace` now switches by workspace **name** (id or list position also accepted); `list_workspaces` leads with names. Fixes posts landing in the wrong workspace when the list order changed.
249
+
250
+ ### 1.6.0
251
+
252
+ - **Added:** media library names, search, and folders — `name` / `folder` on `upload_media`, `search` / `folder_id` on `list_media`, plus `update_media`, `list_folders`, and `create_folder`.
253
+
199
254
  ### 1.5.0
200
255
 
201
256
  - **Added:** Attach uploaded media to any tweet in an X thread. `x.thread_parts[]` now accepts `media_ids` (the same numeric Library IDs returned by `upload_media`) on any part, first tweet or reply, alongside the existing `media_urls`. Combined cap is 4 media per part. This makes graphic-led threads possible without self-hosting image URLs: for example a graphic on the first tweet and the signup link alone in a reply (which keeps the first tweet's reach). Companion server change: media attached to the parent post was previously dropped in thread mode and is now folded into the first tweet.
package/build/index.js CHANGED
@@ -28,7 +28,7 @@ const sessionState = { activeIndex: 0 };
28
28
  const getActiveClient = () => workspaceClients[sessionState.activeIndex].client;
29
29
  const server = new McpServer({
30
30
  name: "OmniSocials",
31
- version: "1.13.0",
31
+ version: "1.13.1",
32
32
  });
33
33
  // Register all tools - pass getter function so tools always use the active workspace's client
34
34
  registerPostTools(server, getActiveClient);
@@ -885,7 +885,7 @@ Notes: only tracks Meta licenses for third-party publishing appear, so the selec
885
885
  });
886
886
  return { content: [{ type: "text", text: md }] };
887
887
  });
888
- server.tool("get_recent_platform_posts", "Fetch the user's most recent posts straight from their connected platform APIs (Instagram, TikTok, X, YouTube, Facebook, LinkedIn, and more), INCLUDING content published outside OmniSocials. Use this when list_posts is empty — e.g. a brand-new workspace that has not published through OmniSocials yet — so you can still analyze the user's real content. Each post includes normalized `engagement` plus every raw metric the platform reported (Instagram: reach/views/saves/shares from per-post insights). Metrics only appear where the platform exposes them for historical posts (X, TikTok, Bluesky, Mastodon, Instagram, Facebook, YouTube); Threads, Pinterest, and Google Business return captions only. LinkedIn personal profiles can't be listed live (LinkedIn grants apps no such permission), so their results are posts published through OmniSocials with their latest collected stats. Fetched live, so expect a few seconds of latency. Requires the analytics:read scope.", {
888
+ server.tool("get_recent_platform_posts", "Fetch the user's most recent posts straight from their connected platform APIs (Instagram, TikTok, X, YouTube, Facebook, LinkedIn, and more), INCLUDING content published outside OmniSocials. Use this when list_posts is empty — e.g. a brand-new workspace that has not published through OmniSocials yet — so you can still analyze the user's real content. Each post includes normalized `engagement` plus every raw metric the platform reported (Instagram: reach/views/saves/shares from per-post insights). Metrics only appear where the platform exposes them for historical posts (X, TikTok, Bluesky, Mastodon, Instagram, Facebook, YouTube); Threads, Pinterest, and Google Business return captions only. LinkedIn personal profiles can't be listed live (LinkedIn grants apps no such permission), so their results are posts published through OmniSocials with their latest collected stats. Fetched live, so expect a few seconds of latency. Output is a human-readable summary table PLUS a 'Structured data' JSON block carrying, for every post, the platform's own post id (the stable dedupe key), a permalink, the FULL untruncated caption, and exact-integer metrics — use that block when ingesting or storing native posts rather than the rounded/truncated table. Requires the analytics:read scope.", {
889
889
  limit: z
890
890
  .string()
891
891
  .optional()
@@ -938,6 +938,25 @@ Notes: only tracks Meta licenses for third-party publishing appear, so the selec
938
938
  });
939
939
  }
940
940
  md += `\nPosts showing "—" for engagement have no metrics available from that platform for historical posts; analyze their captions and formats instead.\n`;
941
+ // The table above is rounded + truncated for a human skim. Anything
942
+ // storing/ingesting these posts needs the raw fields: the platform's own
943
+ // post id (dedupe key), permalink, the FULL caption, and exact-integer
944
+ // metrics. Emit them as a machine-readable JSON block.
945
+ const records = posts.map((p) => ({
946
+ platform: p.platform,
947
+ id: p.id ?? null,
948
+ permalink: p.permalink ?? null,
949
+ text: p.text ?? "",
950
+ format: p.format ?? "post",
951
+ media_count: p.media_count ?? 1,
952
+ timestamp: p.timestamp ?? null,
953
+ image_url: p.image_url ?? null,
954
+ engagement: p.engagement ?? null,
955
+ impressions: p.impressions ?? null,
956
+ engagement_rate: p.engagement_rate ?? null,
957
+ metrics: p.metrics || {},
958
+ }));
959
+ md += `\n### Structured data\nFull records for storing/ingesting each post — exact-integer metrics, the platform's own post \`id\` (dedupe key), \`permalink\`, and the complete untruncated caption:\n\n\`\`\`json\n${JSON.stringify(records, null, 2)}\n\`\`\`\n`;
941
960
  return {
942
961
  content: [{ type: "text", text: md }],
943
962
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omnisocials/mcp-server",
3
- "version": "1.13.0",
3
+ "version": "1.14.0",
4
4
  "description": "MCP server for OmniSocials API - manage social media posts, media, accounts, analytics, and webhooks",
5
5
  "type": "module",
6
6
  "main": "build/index.js",