@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/README.md +55 -2
- package/build/client.d.ts +136 -1
- package/build/client.js +27 -0
- package/build/index.js +3 -1
- package/build/metrics.js +30 -0
- package/build/tools/accounts.js +35 -3
- package/build/tools/analytics.js +2 -2
- package/build/tools/automations.d.ts +25 -0
- package/build/tools/automations.js +199 -0
- package/build/tools/media.js +14 -1
- package/build/tools/posts.js +298 -29
- package/build/types.d.ts +224 -0
- package/package.json +2 -2
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.
|
|
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.
|
|
48
|
+
"@modelcontextprotocol/sdk": "^1.32.1"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
51
|
"@types/node": "^25.3.3",
|