@omnisocials/mcp-server 1.39.0 → 1.46.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/build/types.d.ts CHANGED
@@ -11,6 +11,12 @@ export interface ApiResponse<T = unknown> {
11
11
  credits_balance?: number | null;
12
12
  enforced?: boolean;
13
13
  enforce_from?: string;
14
+ platform?: string;
15
+ media_url?: string;
16
+ ratio?: string;
17
+ target?: string;
18
+ action?: "cropped" | "kept" | "crop_failed";
19
+ crop_url?: string;
14
20
  }>;
15
21
  pagination?: {
16
22
  next_cursor: string | null;
@@ -115,6 +121,17 @@ export type ApiPostMediaEntry = string | {
115
121
  id?: string | number;
116
122
  url?: string;
117
123
  alt?: string;
124
+ /** Image fit of this channel's copy: 'crop' = url is a crop of crop.of. */
125
+ fit?: "crop" | "keep";
126
+ crop?: {
127
+ of: string;
128
+ id?: string;
129
+ ratio: string;
130
+ focus: {
131
+ x: number;
132
+ y: number;
133
+ } | null;
134
+ };
118
135
  [k: string]: unknown;
119
136
  };
120
137
  /** A thread part as echoed back by the API (X / Bluesky / Mastodon / Threads). */
@@ -180,6 +197,10 @@ export interface ApiPost {
180
197
  status: string;
181
198
  /** "post" | "story" | "reel" */
182
199
  type?: string;
200
+ /** The comment-to-DM automations bound to this post (get_post on a post
201
+ * that goes to Instagram or Facebook, create/update when the request
202
+ * carried it); null = none. */
203
+ comment_dm_automation?: PostCommentDmAutomation | null;
183
204
  /** Per-platform captions keyed by platform id plus "default". Legacy
184
205
  * servers returned a plain string. */
185
206
  content?: Record<string, string> | string;
@@ -247,6 +268,12 @@ export interface ApiPost {
247
268
  bluesky?: ApiPlatformOptionsOut;
248
269
  mastodon?: ApiPlatformOptionsOut;
249
270
  threads?: ApiPlatformOptionsOut;
271
+ /** Telegram options (silent, pin, buttons, poll ...) and, once sent,
272
+ * `result` with the message ids and the links. */
273
+ telegram?: ApiPlatformOptionsOut;
274
+ /** Discord options (silent, thread_name, buttons, poll ...) and, once
275
+ * sent, `result` with the message id and the link. */
276
+ discord?: ApiPlatformOptionsOut;
250
277
  /** platform → user-friendly error message; only failed platforms appear.
251
278
  * null while draft/scheduled/processing or when every platform succeeded. */
252
279
  errors?: Record<string, string> | null;
@@ -412,6 +439,8 @@ export interface PinterestProductsResult {
412
439
  bookmark?: string | null;
413
440
  source?: "catalog" | "pins";
414
441
  catalog_access?: boolean;
442
+ /** The connection has catalog access but the account has no catalog yet. */
443
+ no_catalog?: boolean;
415
444
  product_groups?: Array<{
416
445
  id: string;
417
446
  name?: string | null;
@@ -487,6 +516,8 @@ export interface MediaItem {
487
516
  filename: string;
488
517
  folder_id?: string | null;
489
518
  size: string;
519
+ width?: number | null;
520
+ height?: number | null;
490
521
  status?: string;
491
522
  created_at: string;
492
523
  pdf?: {
@@ -549,6 +580,29 @@ export interface Account {
549
580
  }[];
550
581
  platform_details?: {
551
582
  subscription_type?: string;
583
+ /** Telegram: "channel", "supergroup" or "group". */
584
+ chat_type?: string | null;
585
+ /** Telegram chat id (a negative number as a string). */
586
+ chat_id?: string | null;
587
+ /** Telegram: subscribers of a channel, members of a group. */
588
+ subscribers?: number | null;
589
+ /** Telegram: t.me link of a public chat, else the chat's private link.
590
+ * Discord: discord.com/channels link to the channel. */
591
+ url?: string | null;
592
+ /** Discord: the server id. */
593
+ guild_id?: string | null;
594
+ /** Discord: the server name (Continue with Discord, or a pasted URL in a server the OmniSocials bot is in). */
595
+ guild_name?: string | null;
596
+ /** Discord: the channel id. */
597
+ channel_id?: string | null;
598
+ /** Discord: the channel name without the # (read by the OmniSocials bot, or given by the person); null when unknown. */
599
+ channel_name?: string | null;
600
+ /** Discord: text, voice, announcement, stage, forum or media, as the bot read it; null when it cannot see the channel. */
601
+ channel_type?: "text" | "voice" | "announcement" | "stage" | "forum" | "media" | null;
602
+ /** Discord: the webhook's name, shown as the sender of every post. */
603
+ webhook_name?: string | null;
604
+ /** Discord: "oauth" (Continue with Discord) or "url" (a pasted webhook URL). */
605
+ connect_method?: string | null;
552
606
  };
553
607
  }
554
608
  export interface Webhook {
@@ -577,6 +631,162 @@ export interface HashtagSet {
577
631
  created_at: string;
578
632
  updated_at: string;
579
633
  }
634
+ /** The channel an automation runs on: the Instagram account or the Facebook Page. */
635
+ export type AutomationPlatform = "instagram" | "facebook";
636
+ /** `story_reply` is Instagram only: Facebook has no story replies. */
637
+ export type AutomationTriggerKind = "comment" | "dm" | "story_reply";
638
+ export type AutomationScope = "post" | "next_post" | "any";
639
+ export type AutomationMatch = "word" | "contains" | "any";
640
+ export interface AutomationPost {
641
+ /** `omnisocials` = a post of this workspace, `instagram` / `facebook` = read from that platform */
642
+ source: "omnisocials" | "instagram" | "facebook";
643
+ id: string;
644
+ caption: string;
645
+ thumbnail_url: string | null;
646
+ permalink: string | null;
647
+ media_type: string | null;
648
+ status?: string;
649
+ post_date_time?: string | null;
650
+ /** omnisocials source only: the post is live on the automation's platform */
651
+ live?: boolean;
652
+ timestamp?: string | null;
653
+ }
654
+ export interface Automation {
655
+ id: string;
656
+ type: "comment_to_dm";
657
+ platform: AutomationPlatform;
658
+ status: "active" | "paused" | "completed";
659
+ name: string | null;
660
+ /** The OmniSocials post the automation listens on (scope post), else null */
661
+ post_id: string | null;
662
+ /** The Instagram media id, set once the post is live (null on Facebook) */
663
+ instagram_media_id: string | null;
664
+ /** The Facebook Page post id ({page-id}_{post-id}), set once the post is live (null on Instagram) */
665
+ facebook_post_id: string | null;
666
+ post: AutomationPost | null;
667
+ trigger: {
668
+ kinds: AutomationTriggerKind[];
669
+ scope: AutomationScope | null;
670
+ keywords: string[];
671
+ match: AutomationMatch;
672
+ };
673
+ actions: {
674
+ dm: {
675
+ text: string;
676
+ };
677
+ public_reply: {
678
+ enabled: boolean;
679
+ variations: string[];
680
+ };
681
+ };
682
+ limits: {
683
+ max_sends: number | null;
684
+ stop_at: string | null;
685
+ };
686
+ stats: {
687
+ matched: number;
688
+ sent: number;
689
+ skipped: number;
690
+ failed: number;
691
+ last_event_at: string | null;
692
+ };
693
+ created_at: string;
694
+ updated_at: string;
695
+ }
696
+ /** The body of POST /automations; every section is optional on PATCH. */
697
+ export interface AutomationInput {
698
+ name?: string | null;
699
+ /** Default instagram; cannot change on PATCH (400 platform_immutable) */
700
+ platform?: AutomationPlatform;
701
+ post_id?: string;
702
+ instagram_media_id?: string;
703
+ /** A Page post published outside OmniSocials; implies platform facebook */
704
+ facebook_post_id?: string;
705
+ trigger?: {
706
+ kinds?: AutomationTriggerKind[];
707
+ scope?: AutomationScope;
708
+ keywords?: string[];
709
+ match?: AutomationMatch;
710
+ };
711
+ actions?: {
712
+ dm: {
713
+ text: string;
714
+ };
715
+ public_reply?: {
716
+ enabled?: boolean;
717
+ variations?: string[];
718
+ };
719
+ };
720
+ limits?: {
721
+ max_sends?: number | null;
722
+ stop_at?: string | null;
723
+ };
724
+ status?: "active" | "paused";
725
+ }
726
+ /** `comment_dm_automation` on a post: the automations bound to that post. */
727
+ export interface CommentDmAutomationInput {
728
+ /** One automation per listed channel; default Instagram when the post goes there, else Facebook */
729
+ platforms?: AutomationPlatform[];
730
+ trigger?: {
731
+ keywords?: string[];
732
+ match?: AutomationMatch;
733
+ };
734
+ actions: {
735
+ dm: {
736
+ text: string;
737
+ };
738
+ public_reply?: {
739
+ enabled?: boolean;
740
+ variations?: string[];
741
+ };
742
+ };
743
+ limits?: {
744
+ max_sends?: number | null;
745
+ stop_at?: string | null;
746
+ };
747
+ }
748
+ /** `comment_dm_automation` on a post: the first automation's fields (Instagram
749
+ * first), plus the channels and the id of each automation. */
750
+ export interface PostCommentDmAutomation extends Automation {
751
+ platforms?: AutomationPlatform[];
752
+ automations?: Array<{
753
+ id: string;
754
+ platform: AutomationPlatform;
755
+ status: Automation["status"];
756
+ }>;
757
+ }
758
+ export interface AutomationEvent {
759
+ id: string;
760
+ automation_id: string;
761
+ kind: AutomationTriggerKind;
762
+ outcome: "sent" | "skipped" | "failed" | "pending";
763
+ reason: string | null;
764
+ reason_label: string | null;
765
+ /** `username` = the Instagram @handle, or the person's name on Facebook */
766
+ person: {
767
+ id: string;
768
+ username: string | null;
769
+ };
770
+ trigger_id: string | null;
771
+ /** The comment; a DM's text only with the inbox:read scope */
772
+ trigger_text: string | null;
773
+ /** The DM that was sent */
774
+ message: string | null;
775
+ public_reply: string | null;
776
+ platform_message_id: string | null;
777
+ created_at: string;
778
+ sent_at: string | null;
779
+ }
780
+ export interface AutomationEventsResult {
781
+ data: AutomationEvent[];
782
+ counts: Record<string, number>;
783
+ pagination: {
784
+ total: number;
785
+ limit: number;
786
+ offset: number;
787
+ has_more: boolean;
788
+ };
789
+ }
580
790
  /** Per-platform stats block inside AnalyticsOverview.platform_breakdown.
581
791
  * Shape from backend/routes/api/v1/analytics.js (overview route). */
582
792
  export interface AnalyticsPlatformBreakdown {
@@ -618,6 +828,16 @@ export interface MediaCompatibility {
618
828
  /** POST /media/check response — the compatibility block is spread top-level
619
829
  * next to `file` and `connected_platforms`; there is no `data` key
620
830
  * (backend/routes/api/v1/media.js check route). */
831
+ export interface MediaFitRow {
832
+ platform: string;
833
+ display_name: string;
834
+ fits: boolean;
835
+ ratio: string;
836
+ shown: "whole" | "cut";
837
+ target: string | null;
838
+ default_action: "crop" | "keep" | null;
839
+ message: string | null;
840
+ }
621
841
  export interface MediaCheckResult {
622
842
  error?: {
623
843
  code: string;
@@ -627,11 +847,15 @@ export interface MediaCheckResult {
627
847
  size_bytes: number | null;
628
848
  mime: string | null;
629
849
  size_known: boolean;
850
+ width?: number | null;
851
+ height?: number | null;
630
852
  };
631
853
  connected_platforms?: string[];
632
854
  compatible?: boolean;
633
855
  warnings?: MediaCompatWarning[];
634
856
  summary?: string | null;
857
+ /** How each connected channel with a fit rule shows this image as a feed post. */
858
+ fit?: MediaFitRow[];
635
859
  }
636
860
  /** One folder from GET /folders — formatFolder in
637
861
  * backend/routes/api/v1/folders.js (:15-23). */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omnisocials/mcp-server",
3
- "version": "1.39.0",
3
+ "version": "1.46.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",
@@ -45,7 +45,7 @@
45
45
  },
46
46
  "license": "MIT",
47
47
  "dependencies": {
48
- "@modelcontextprotocol/sdk": "^1.12.1"
48
+ "@modelcontextprotocol/sdk": "^1.32.1"
49
49
  },
50
50
  "devDependencies": {
51
51
  "@types/node": "^25.3.3",