@upload-post/mcp 0.3.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/LICENSE +21 -0
- package/README.md +225 -0
- package/dist/client.d.ts +32 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +61 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +66 -0
- package/dist/index.js.map +1 -0
- package/dist/oauth/auth_resolver.d.ts +33 -0
- package/dist/oauth/auth_resolver.d.ts.map +1 -0
- package/dist/oauth/auth_resolver.js +30 -0
- package/dist/oauth/auth_resolver.js.map +1 -0
- package/dist/oauth/authorize.d.ts +18 -0
- package/dist/oauth/authorize.d.ts.map +1 -0
- package/dist/oauth/authorize.js +26 -0
- package/dist/oauth/authorize.js.map +1 -0
- package/dist/oauth/config.d.ts +19 -0
- package/dist/oauth/config.d.ts.map +1 -0
- package/dist/oauth/config.js +28 -0
- package/dist/oauth/config.js.map +1 -0
- package/dist/oauth/http_utils.d.ts +8 -0
- package/dist/oauth/http_utils.d.ts.map +1 -0
- package/dist/oauth/http_utils.js +48 -0
- package/dist/oauth/http_utils.js.map +1 -0
- package/dist/oauth/introspect_cache.d.ts +19 -0
- package/dist/oauth/introspect_cache.d.ts.map +1 -0
- package/dist/oauth/introspect_cache.js +40 -0
- package/dist/oauth/introspect_cache.js.map +1 -0
- package/dist/oauth/metadata.d.ts +35 -0
- package/dist/oauth/metadata.d.ts.map +1 -0
- package/dist/oauth/metadata.js +43 -0
- package/dist/oauth/metadata.js.map +1 -0
- package/dist/oauth/registration.d.ts +14 -0
- package/dist/oauth/registration.d.ts.map +1 -0
- package/dist/oauth/registration.js +40 -0
- package/dist/oauth/registration.js.map +1 -0
- package/dist/oauth/tokens.d.ts +15 -0
- package/dist/oauth/tokens.d.ts.map +1 -0
- package/dist/oauth/tokens.js +43 -0
- package/dist/oauth/tokens.js.map +1 -0
- package/dist/oauth/upstream_client.d.ts +32 -0
- package/dist/oauth/upstream_client.d.ts.map +1 -0
- package/dist/oauth/upstream_client.js +62 -0
- package/dist/oauth/upstream_client.js.map +1 -0
- package/dist/schemas.d.ts +38 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +121 -0
- package/dist/schemas.js.map +1 -0
- package/dist/server.d.ts +4 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +36 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/analytics.d.ts +4 -0
- package/dist/tools/analytics.d.ts.map +1 -0
- package/dist/tools/analytics.js +74 -0
- package/dist/tools/analytics.js.map +1 -0
- package/dist/tools/comments.d.ts +4 -0
- package/dist/tools/comments.d.ts.map +1 -0
- package/dist/tools/comments.js +108 -0
- package/dist/tools/comments.js.map +1 -0
- package/dist/tools/dms.d.ts +4 -0
- package/dist/tools/dms.d.ts.map +1 -0
- package/dist/tools/dms.js +100 -0
- package/dist/tools/dms.js.map +1 -0
- package/dist/tools/ffmpeg.d.ts +4 -0
- package/dist/tools/ffmpeg.d.ts.map +1 -0
- package/dist/tools/ffmpeg.js +96 -0
- package/dist/tools/ffmpeg.js.map +1 -0
- package/dist/tools/media_uploads.d.ts +4 -0
- package/dist/tools/media_uploads.d.ts.map +1 -0
- package/dist/tools/media_uploads.js +106 -0
- package/dist/tools/media_uploads.js.map +1 -0
- package/dist/tools/pages.d.ts +4 -0
- package/dist/tools/pages.d.ts.map +1 -0
- package/dist/tools/pages.js +101 -0
- package/dist/tools/pages.js.map +1 -0
- package/dist/tools/queue.d.ts +4 -0
- package/dist/tools/queue.d.ts.map +1 -0
- package/dist/tools/queue.js +79 -0
- package/dist/tools/queue.js.map +1 -0
- package/dist/tools/schedule.d.ts +4 -0
- package/dist/tools/schedule.d.ts.map +1 -0
- package/dist/tools/schedule.js +48 -0
- package/dist/tools/schedule.js.map +1 -0
- package/dist/tools/status.d.ts +4 -0
- package/dist/tools/status.d.ts.map +1 -0
- package/dist/tools/status.js +67 -0
- package/dist/tools/status.js.map +1 -0
- package/dist/tools/upload.d.ts +10 -0
- package/dist/tools/upload.d.ts.map +1 -0
- package/dist/tools/upload.js +397 -0
- package/dist/tools/upload.js.map +1 -0
- package/dist/tools/upload_studio.d.ts +3 -0
- package/dist/tools/upload_studio.d.ts.map +1 -0
- package/dist/tools/upload_studio.js +808 -0
- package/dist/tools/upload_studio.js.map +1 -0
- package/dist/tools/users.d.ts +4 -0
- package/dist/tools/users.d.ts.map +1 -0
- package/dist/tools/users.js +95 -0
- package/dist/tools/users.js.map +1 -0
- package/dist/transport/http.d.ts +33 -0
- package/dist/transport/http.d.ts.map +1 -0
- package/dist/transport/http.js +263 -0
- package/dist/transport/http.js.map +1 -0
- package/dist/transport/stdio.d.ts +3 -0
- package/dist/transport/stdio.d.ts.map +1 -0
- package/dist/transport/stdio.js +7 -0
- package/dist/transport/stdio.js.map +1 -0
- package/examples/mcp-config.json +11 -0
- package/package.json +68 -0
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { writeFile, unlink } from "node:fs/promises";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { PhotoPlatform, TextPlatform, VideoPlatform, genericResultOutputSchema, safe, schedulingFields, } from "../schemas.js";
|
|
7
|
+
/**
|
|
8
|
+
* Max decoded size accepted for inline (base64) video bytes, in MB.
|
|
9
|
+
* Caps memory use of the MCP process; override with UPLOAD_POST_MAX_INLINE_MB.
|
|
10
|
+
* Big videos should still be passed as a public URL, not inlined.
|
|
11
|
+
*/
|
|
12
|
+
const MAX_INLINE_MB = Number(process.env.UPLOAD_POST_MAX_INLINE_MB ?? 100);
|
|
13
|
+
/** Keys shared by video, photo and text posts. */
|
|
14
|
+
const commonPlatformOptionFields = {
|
|
15
|
+
facebookPageId: z.string().optional().describe("Facebook Page ID to publish to (see get_facebook_pages)."),
|
|
16
|
+
linkedinPageId: z
|
|
17
|
+
.string()
|
|
18
|
+
.optional()
|
|
19
|
+
.describe("Alias of targetLinkedinPageId: LinkedIn organization/page ID to publish to."),
|
|
20
|
+
targetLinkedinPageId: z
|
|
21
|
+
.string()
|
|
22
|
+
.optional()
|
|
23
|
+
.describe("LinkedIn organization/page ID to publish to (see get_linkedin_pages)."),
|
|
24
|
+
linkedinVisibility: z
|
|
25
|
+
.enum(["PUBLIC", "CONNECTIONS", "LOGGED_IN", "CONTAINER"])
|
|
26
|
+
.optional()
|
|
27
|
+
.describe("LinkedIn post visibility."),
|
|
28
|
+
googleBusinessLocationId: z
|
|
29
|
+
.string()
|
|
30
|
+
.optional()
|
|
31
|
+
.describe("Google Business location ID (see get_google_business_locations). Selected on the profile before publishing."),
|
|
32
|
+
xReplySettings: z
|
|
33
|
+
.enum(["everyone", "following", "mentionedUsers", "subscribers", "verified"])
|
|
34
|
+
.optional()
|
|
35
|
+
.describe("Who can reply on X."),
|
|
36
|
+
xCommunityId: z.string().optional().describe("X community ID to post into."),
|
|
37
|
+
xLongTextAsPost: z.boolean().optional().describe("Post long X text as a single post instead of a thread."),
|
|
38
|
+
threadsLongTextAsPost: z.boolean().optional().describe("Post long Threads text as a single post instead of a thread."),
|
|
39
|
+
threadsTopicTag: z.string().optional().describe("Threads topic tag."),
|
|
40
|
+
brandContentToggle: z.boolean().optional().describe("TikTok branded content disclosure."),
|
|
41
|
+
brandOrganicToggle: z.boolean().optional().describe("TikTok brand organic disclosure."),
|
|
42
|
+
};
|
|
43
|
+
const VideoPlatformOptions = z
|
|
44
|
+
.object({
|
|
45
|
+
...commonPlatformOptionFields,
|
|
46
|
+
// TikTok
|
|
47
|
+
tiktokPrivacyLevel: z
|
|
48
|
+
.string()
|
|
49
|
+
.optional()
|
|
50
|
+
.describe("TikTok privacy value, e.g. PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, SELF_ONLY."),
|
|
51
|
+
tiktokDisableDuet: z.boolean().optional().describe("Disable duets on TikTok."),
|
|
52
|
+
tiktokDisableComment: z.boolean().optional().describe("Disable comments on TikTok."),
|
|
53
|
+
tiktokDisableStitch: z.boolean().optional().describe("Disable stitch on TikTok."),
|
|
54
|
+
tiktokCoverTimestamp: z.number().optional().describe("Cover frame timestamp in ms."),
|
|
55
|
+
tiktokIsAigc: z.boolean().optional().describe("TikTok AI-generated content flag."),
|
|
56
|
+
tiktokPostMode: z.enum(["DIRECT_POST", "MEDIA_UPLOAD"]).optional().describe("TikTok post mode."),
|
|
57
|
+
// Instagram
|
|
58
|
+
instagramMediaType: z
|
|
59
|
+
.enum(["REELS", "STORIES"])
|
|
60
|
+
.optional()
|
|
61
|
+
.describe("Instagram video placement. Use REELS for Reels, STORIES for Stories."),
|
|
62
|
+
instagramShareToFeed: z.boolean().optional().describe("Also show the Reel in the feed."),
|
|
63
|
+
instagramCoverUrl: z.string().optional().describe("Custom cover image URL for the Reel."),
|
|
64
|
+
instagramThumbOffset: z.string().optional().describe("Frame offset for the auto-generated thumbnail."),
|
|
65
|
+
instagramCollaborators: z.string().optional().describe("Comma-separated collaborator usernames."),
|
|
66
|
+
instagramUserTags: z.string().optional().describe("Comma-separated user tags."),
|
|
67
|
+
instagramLocationId: z.string().optional().describe("Instagram location ID."),
|
|
68
|
+
instagramAudioName: z.string().optional().describe("Audio track name."),
|
|
69
|
+
// YouTube
|
|
70
|
+
youtubePrivacyStatus: z
|
|
71
|
+
.enum(["public", "private", "unlisted"])
|
|
72
|
+
.optional()
|
|
73
|
+
.describe("YouTube visibility for the uploaded video."),
|
|
74
|
+
youtubePlaylistId: z
|
|
75
|
+
.union([z.string(), z.array(z.string())])
|
|
76
|
+
.optional()
|
|
77
|
+
.describe("One YouTube playlist ID, or an array of playlist IDs, to add the uploaded video to."),
|
|
78
|
+
youtubeThumbnailUrl: z.string().optional().describe("Custom thumbnail image URL for the YouTube video."),
|
|
79
|
+
youtubeTags: z
|
|
80
|
+
.union([z.string(), z.array(z.string())])
|
|
81
|
+
.optional()
|
|
82
|
+
.describe("YouTube video tags, as an array or comma-separated string."),
|
|
83
|
+
youtubeCategoryId: z.string().optional().describe("YouTube category ID, e.g. '22' for People & Blogs."),
|
|
84
|
+
youtubeEmbeddable: z.boolean().optional().describe("Allow embedding the video on other sites."),
|
|
85
|
+
youtubeLicense: z.enum(["youtube", "creativeCommon"]).optional().describe("YouTube video license."),
|
|
86
|
+
youtubePublicStatsViewable: z.boolean().optional().describe("Show public view stats on the video."),
|
|
87
|
+
youtubeSelfDeclaredMadeForKids: z.boolean().optional().describe("YouTube made-for-kids flag (COPPA)."),
|
|
88
|
+
youtubeContainsSyntheticMedia: z.boolean().optional().describe("YouTube AI/synthetic content disclosure."),
|
|
89
|
+
youtubeDefaultLanguage: z.string().optional().describe("BCP-47 language of title/description."),
|
|
90
|
+
youtubeDefaultAudioLanguage: z.string().optional().describe("BCP-47 language of the audio."),
|
|
91
|
+
youtubeAllowedCountries: z.string().optional().describe("Comma-separated allowed country codes."),
|
|
92
|
+
youtubeBlockedCountries: z.string().optional().describe("Comma-separated blocked country codes."),
|
|
93
|
+
youtubeHasPaidProductPlacement: z.boolean().optional().describe("Paid product placement flag."),
|
|
94
|
+
youtubeRecordingDate: z.string().optional().describe("Recording date, ISO 8601."),
|
|
95
|
+
youtubeSubtitles: z
|
|
96
|
+
.array(z.object({
|
|
97
|
+
language: z.string().describe("BCP-47 language code, e.g. 'en', 'es'."),
|
|
98
|
+
name: z.string().optional().describe("Display name of the subtitle track."),
|
|
99
|
+
url: z.string().optional().describe("URL of the subtitle file (SRT, VTT, SBV, SUB, ASS, SSA, TTML)."),
|
|
100
|
+
}))
|
|
101
|
+
.optional()
|
|
102
|
+
.describe("Subtitle/caption tracks to attach to the YouTube video."),
|
|
103
|
+
// Facebook
|
|
104
|
+
facebookMediaType: z.enum(["REELS", "STORIES", "VIDEO"]).optional().describe("Facebook video placement."),
|
|
105
|
+
facebookVideoState: z.enum(["PUBLISHED", "DRAFT"]).optional().describe("Facebook video state."),
|
|
106
|
+
thumbnailUrl: z
|
|
107
|
+
.string()
|
|
108
|
+
.optional()
|
|
109
|
+
.describe("Thumbnail URL for normal Facebook page videos (facebookMediaType VIDEO)."),
|
|
110
|
+
// Pinterest
|
|
111
|
+
pinterestBoardId: z.string().optional().describe("Pinterest board ID to publish to (see get_pinterest_boards)."),
|
|
112
|
+
pinterestLink: z.string().optional().describe("Destination link for the pin."),
|
|
113
|
+
pinterestCoverImageUrl: z.string().optional().describe("Cover image URL for the video pin."),
|
|
114
|
+
pinterestCoverImageKeyFrameTime: z.number().optional().describe("Key frame time in ms for the cover."),
|
|
115
|
+
// X
|
|
116
|
+
xTaggedUserIds: z.union([z.string(), z.array(z.string())]).optional().describe("X user IDs to tag in the media."),
|
|
117
|
+
xPlaceId: z.string().optional().describe("X location place ID."),
|
|
118
|
+
})
|
|
119
|
+
.passthrough()
|
|
120
|
+
.describe("Flat platform-specific override object with camelCase keys. Per-platform text overrides (youtubeTitle, tiktokTitle, youtubeDescription, instagramFirstComment, …) are also accepted. Keys the upload-post SDK does not support are silently ignored upstream.");
|
|
121
|
+
const PhotoPlatformOptions = z
|
|
122
|
+
.object({
|
|
123
|
+
...commonPlatformOptionFields,
|
|
124
|
+
tiktokAutoAddMusic: z.boolean().optional().describe("Auto add music to TikTok photo posts."),
|
|
125
|
+
tiktokDisableComment: z.boolean().optional().describe("Disable comments on TikTok."),
|
|
126
|
+
tiktokPhotoCoverIndex: z.number().int().optional().describe("Index of the cover photo, 0-based."),
|
|
127
|
+
instagramMediaType: z
|
|
128
|
+
.enum(["IMAGE", "STORIES"])
|
|
129
|
+
.optional()
|
|
130
|
+
.describe("Instagram photo placement. Use IMAGE for feed, STORIES for Stories."),
|
|
131
|
+
instagramCollaborators: z.string().optional().describe("Comma-separated collaborator usernames."),
|
|
132
|
+
instagramUserTags: z.string().optional().describe("Comma-separated user tags."),
|
|
133
|
+
instagramLocationId: z.string().optional().describe("Instagram location ID."),
|
|
134
|
+
pinterestBoardId: z.string().optional().describe("Pinterest board ID to publish to (see get_pinterest_boards)."),
|
|
135
|
+
pinterestLink: z.string().optional().describe("Destination link for the pin."),
|
|
136
|
+
pinterestAltText: z.string().optional().describe("Pinterest-specific alt text."),
|
|
137
|
+
xTaggedUserIds: z.union([z.string(), z.array(z.string())]).optional().describe("X user IDs to tag in the media."),
|
|
138
|
+
xPlaceId: z.string().optional().describe("X location place ID."),
|
|
139
|
+
xThreadImageLayout: z
|
|
140
|
+
.string()
|
|
141
|
+
.optional()
|
|
142
|
+
.describe("Images per X thread post, e.g. '4,4' or '2,3,1'. Total must equal image count."),
|
|
143
|
+
threadsThreadMediaLayout: z
|
|
144
|
+
.string()
|
|
145
|
+
.optional()
|
|
146
|
+
.describe("Media items per Threads post, e.g. '5,5'. Total must equal file count."),
|
|
147
|
+
redditSubreddit: z.string().optional().describe("Subreddit name, without r/."),
|
|
148
|
+
redditFlairId: z.string().optional().describe("Reddit flair template ID."),
|
|
149
|
+
})
|
|
150
|
+
.passthrough()
|
|
151
|
+
.describe("Flat platform-specific override object with camelCase keys. Per-platform text overrides (instagramTitle, xFirstComment, …) are also accepted. Keys the upload-post SDK does not support are silently ignored upstream.");
|
|
152
|
+
const TextPlatformOptions = z
|
|
153
|
+
.object({
|
|
154
|
+
...commonPlatformOptionFields,
|
|
155
|
+
facebookLinkUrl: z.string().optional().describe("Link preview URL on Facebook."),
|
|
156
|
+
linkedinLinkUrl: z.string().optional().describe("Link preview URL on LinkedIn."),
|
|
157
|
+
blueskyLinkUrl: z.string().optional().describe("External embed link preview URL on Bluesky."),
|
|
158
|
+
xPostUrl: z.string().optional().describe("URL to attach to the X post."),
|
|
159
|
+
xQuoteTweetId: z.string().optional().describe("Tweet ID to quote."),
|
|
160
|
+
xPollOptions: z
|
|
161
|
+
.union([z.string(), z.array(z.string())])
|
|
162
|
+
.optional()
|
|
163
|
+
.describe("X poll options (2-4)."),
|
|
164
|
+
xPollDuration: z.number().int().optional().describe("X poll duration in minutes (5-10080)."),
|
|
165
|
+
xPollReplySettings: z
|
|
166
|
+
.enum(["everyone", "following", "mentionedUsers", "subscribers", "verified"])
|
|
167
|
+
.optional()
|
|
168
|
+
.describe("Who can reply to the X poll."),
|
|
169
|
+
xCardUri: z.string().optional().describe("Card URI for Twitter Cards."),
|
|
170
|
+
redditSubreddit: z.string().optional().describe("Subreddit name, without r/. Title is required for Reddit."),
|
|
171
|
+
redditFlairId: z.string().optional().describe("Reddit flair template ID."),
|
|
172
|
+
redditLinkUrl: z.string().optional().describe("Link to attach on Reddit."),
|
|
173
|
+
})
|
|
174
|
+
.passthrough()
|
|
175
|
+
.describe("Flat platform-specific override object with camelCase keys. Per-platform text overrides (xTitle, linkedinTitle, …) are also accepted. Keys the upload-post SDK does not support are silently ignored upstream.");
|
|
176
|
+
/**
|
|
177
|
+
* Normalize option names the SDK does not know and resolve routing that is
|
|
178
|
+
* profile state rather than an upload field:
|
|
179
|
+
* - `linkedinPageId` is an MCP-level alias of the SDK's `targetLinkedinPageId`.
|
|
180
|
+
* - `googleBusinessLocationId` is applied by selecting the location on the
|
|
181
|
+
* profile (same call as the select_google_business_location tool) before
|
|
182
|
+
* uploading, because /api/upload has no per-request location field.
|
|
183
|
+
*/
|
|
184
|
+
async function resolvePlatformRouting(client, options) {
|
|
185
|
+
const opts = { ...options };
|
|
186
|
+
if (opts.linkedinPageId && !opts.targetLinkedinPageId) {
|
|
187
|
+
opts.targetLinkedinPageId = opts.linkedinPageId;
|
|
188
|
+
}
|
|
189
|
+
delete opts.linkedinPageId;
|
|
190
|
+
const locationId = opts.googleBusinessLocationId;
|
|
191
|
+
delete opts.googleBusinessLocationId;
|
|
192
|
+
const platforms = Array.isArray(opts.platforms) ? opts.platforms : [];
|
|
193
|
+
if (locationId && platforms.includes("google_business")) {
|
|
194
|
+
try {
|
|
195
|
+
await client.request("POST", "/uploadposts/google-business/locations/select", {
|
|
196
|
+
body: { location_id: String(locationId), profile: String(opts.user) },
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
201
|
+
throw new Error(`Could not select Google Business location '${locationId}': ${message}. ` +
|
|
202
|
+
"If the backend does not support location selection yet, omit googleBusinessLocationId — " +
|
|
203
|
+
"accounts with a single location publish to it automatically.");
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return opts;
|
|
207
|
+
}
|
|
208
|
+
/** Strip a leading `data:<mime>;base64,` prefix if present. */
|
|
209
|
+
function stripDataUri(input) {
|
|
210
|
+
const match = /^data:[^;,]*;base64,/i.exec(input);
|
|
211
|
+
return match ? input.slice(match[0].length) : input;
|
|
212
|
+
}
|
|
213
|
+
function looksLikeHostedAttachmentPath(input) {
|
|
214
|
+
const value = input.trim().toLowerCase();
|
|
215
|
+
return (value.startsWith("/mnt/data/") ||
|
|
216
|
+
value.includes("/mnt/data/") ||
|
|
217
|
+
value.startsWith("sandbox:/") ||
|
|
218
|
+
value.startsWith("attachment:") ||
|
|
219
|
+
value.startsWith("openai-file:"));
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Decode inline base64 video bytes to a uniquely-named temp file and return its
|
|
223
|
+
* path. Throws before allocating the full buffer is impossible, so we decode
|
|
224
|
+
* then enforce the size cap. Caller is responsible for unlinking the path.
|
|
225
|
+
*/
|
|
226
|
+
async function writeInlineVideo(videoBase64, filename) {
|
|
227
|
+
const buf = Buffer.from(stripDataUri(videoBase64), "base64");
|
|
228
|
+
if (buf.length === 0) {
|
|
229
|
+
throw new Error("videoBase64 decoded to 0 bytes (not valid base64?).");
|
|
230
|
+
}
|
|
231
|
+
const maxBytes = MAX_INLINE_MB * 1024 * 1024;
|
|
232
|
+
if (buf.length > maxBytes) {
|
|
233
|
+
throw new Error(`Inline video is ${(buf.length / 1024 / 1024).toFixed(1)} MB, over the ${MAX_INLINE_MB} MB limit. Pass a public URL in videoPathOrUrl instead.`);
|
|
234
|
+
}
|
|
235
|
+
const ext = filename?.match(/\.[a-z0-9]+$/i)?.[0] ?? ".mp4";
|
|
236
|
+
const tmpPath = join(tmpdir(), `uppost-${randomUUID()}${ext}`);
|
|
237
|
+
await writeFile(tmpPath, buf);
|
|
238
|
+
return tmpPath;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* The 4 publish endpoints exposed by the official SDK. We deliberately keep
|
|
242
|
+
* the schema "open" via passthrough so platform-specific overrides documented
|
|
243
|
+
* in the Upload-Post docs (tiktokPrivacyLevel, youtubePrivacyStatus, …) flow
|
|
244
|
+
* through unchanged, even when not strictly typed here.
|
|
245
|
+
*/
|
|
246
|
+
export function registerUploadTools(server, client) {
|
|
247
|
+
server.registerTool("upload_video", {
|
|
248
|
+
title: "Upload video",
|
|
249
|
+
description: "Publish a video to one or more platforms. Use `videoPathOrUrl` only for public/signed HTTPS URLs, or for absolute local paths when the MCP server runs on the same machine as the file. Hosted clients such as ChatGPT and claude.ai cannot publish attached files by passing `/mnt/data`, sandbox, or mounted local paths; for those files, ALWAYS call `open_upload_studio` first so the browser stages the video to Upload-Post/R2, then publishes it. `videoBase64` is only for clients that can provide raw bytes directly and is capped by UPLOAD_POST_MAX_INLINE_MB (default 100). Returns a `request_id` you can poll with `get_status`. Supports per-platform overrides (tiktokPrivacyLevel, youtubePrivacyStatus, youtubePlaylistId, youtubeThumbnailUrl, youtubeTags, facebookPageId, instagramMediaType, etc.).",
|
|
250
|
+
inputSchema: {
|
|
251
|
+
videoPathOrUrl: z
|
|
252
|
+
.string()
|
|
253
|
+
.optional()
|
|
254
|
+
.describe("Public/signed HTTPS URL of the video. Absolute local paths are supported only for local/self-hosted MCP clients sharing the same filesystem. Do not pass ChatGPT `/mnt/data` or sandbox paths; use open_upload_studio instead."),
|
|
255
|
+
videoBase64: z
|
|
256
|
+
.string()
|
|
257
|
+
.optional()
|
|
258
|
+
.describe("Video bytes as base64 (or a data: URI). Provide this OR videoPathOrUrl. The server writes it to a temp file, uploads, then deletes it. Capped by UPLOAD_POST_MAX_INLINE_MB (default 100)."),
|
|
259
|
+
videoFilename: z
|
|
260
|
+
.string()
|
|
261
|
+
.optional()
|
|
262
|
+
.describe("Optional filename (e.g. 'clip.mp4') used only to pick the temp file extension when videoBase64 is given. Defaults to .mp4."),
|
|
263
|
+
user: z.string().describe("Profile name (Upload-Post user)."),
|
|
264
|
+
platforms: z
|
|
265
|
+
.array(VideoPlatform)
|
|
266
|
+
.min(1)
|
|
267
|
+
.describe("Required array of platform identifiers, e.g. ['instagram']. Never pass a single string."),
|
|
268
|
+
title: z.string().optional().describe("Caption / title."),
|
|
269
|
+
description: z.string().optional(),
|
|
270
|
+
firstComment: z.string().optional(),
|
|
271
|
+
...schedulingFields,
|
|
272
|
+
platformOptions: VideoPlatformOptions
|
|
273
|
+
.optional()
|
|
274
|
+
.describe("Platform-specific overrides as a flat object (camelCase keys), e.g. { tiktokPrivacyLevel: 'PUBLIC_TO_EVERYONE', youtubePrivacyStatus: 'public', youtubePlaylistId: 'PLxxxxxxxxxxxx', facebookPageId: '123' }. `youtubePlaylistId` may also be an array or a comma-separated list of playlist IDs to add the uploaded video to."),
|
|
275
|
+
},
|
|
276
|
+
outputSchema: genericResultOutputSchema,
|
|
277
|
+
annotations: {
|
|
278
|
+
readOnlyHint: false,
|
|
279
|
+
openWorldHint: true,
|
|
280
|
+
destructiveHint: false,
|
|
281
|
+
},
|
|
282
|
+
_meta: {
|
|
283
|
+
ui: {
|
|
284
|
+
visibility: ["model", "app"],
|
|
285
|
+
},
|
|
286
|
+
"openai/widgetAccessible": true,
|
|
287
|
+
"openai/toolInvocation/invoking": "Uploading video…",
|
|
288
|
+
"openai/toolInvocation/invoked": "Upload started",
|
|
289
|
+
},
|
|
290
|
+
}, safe(async (args) => {
|
|
291
|
+
const { videoPathOrUrl, videoBase64, videoFilename, platformOptions, ...rest } = args;
|
|
292
|
+
if (!videoPathOrUrl && !videoBase64) {
|
|
293
|
+
throw new Error("Provide either videoPathOrUrl or videoBase64.");
|
|
294
|
+
}
|
|
295
|
+
if (videoPathOrUrl && videoBase64) {
|
|
296
|
+
throw new Error("Provide only one of videoPathOrUrl or videoBase64, not both.");
|
|
297
|
+
}
|
|
298
|
+
if (videoPathOrUrl && looksLikeHostedAttachmentPath(videoPathOrUrl)) {
|
|
299
|
+
throw new Error("This looks like a hosted ChatGPT/Claude attachment path. The MCP server cannot read mounted paths such as /mnt/data. Use open_upload_studio so the user can select the file in the browser and stage it through Upload-Post/R2, then publish from the returned media URL.");
|
|
300
|
+
}
|
|
301
|
+
const options = (await resolvePlatformRouting(client, {
|
|
302
|
+
...rest,
|
|
303
|
+
...(platformOptions ?? {}),
|
|
304
|
+
}));
|
|
305
|
+
if (videoBase64) {
|
|
306
|
+
const tmpPath = await writeInlineVideo(videoBase64, videoFilename);
|
|
307
|
+
try {
|
|
308
|
+
return await client.sdk.upload(tmpPath, options);
|
|
309
|
+
}
|
|
310
|
+
finally {
|
|
311
|
+
await unlink(tmpPath).catch(() => { });
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return client.sdk.upload(videoPathOrUrl, options);
|
|
315
|
+
}));
|
|
316
|
+
server.registerTool("upload_photos", {
|
|
317
|
+
title: "Upload photos / carousel",
|
|
318
|
+
description: "Publish one or more photos (single image or carousel). Each item in `photosPathsOrUrls` may be a public URL or a local path.",
|
|
319
|
+
inputSchema: {
|
|
320
|
+
photosPathsOrUrls: z.array(z.string()).min(1),
|
|
321
|
+
user: z.string(),
|
|
322
|
+
platforms: z.array(PhotoPlatform).min(1),
|
|
323
|
+
title: z.string().optional(),
|
|
324
|
+
description: z.string().optional(),
|
|
325
|
+
firstComment: z.string().optional(),
|
|
326
|
+
altText: z.string().optional(),
|
|
327
|
+
...schedulingFields,
|
|
328
|
+
platformOptions: PhotoPlatformOptions.optional(),
|
|
329
|
+
},
|
|
330
|
+
outputSchema: genericResultOutputSchema,
|
|
331
|
+
annotations: {
|
|
332
|
+
readOnlyHint: false,
|
|
333
|
+
openWorldHint: true,
|
|
334
|
+
destructiveHint: false,
|
|
335
|
+
},
|
|
336
|
+
}, safe(async (args) => {
|
|
337
|
+
const { photosPathsOrUrls, platformOptions, ...rest } = args;
|
|
338
|
+
const options = (await resolvePlatformRouting(client, {
|
|
339
|
+
...rest,
|
|
340
|
+
...(platformOptions ?? {}),
|
|
341
|
+
}));
|
|
342
|
+
return client.sdk.uploadPhotos(photosPathsOrUrls, options);
|
|
343
|
+
}));
|
|
344
|
+
server.registerTool("upload_text", {
|
|
345
|
+
title: "Upload text post",
|
|
346
|
+
description: "Publish a text-only post. Title is required for Reddit. `linkUrl` (or platform-specific *LinkUrl) attaches a link preview where supported.",
|
|
347
|
+
inputSchema: {
|
|
348
|
+
title: z.string().describe("Post text / caption."),
|
|
349
|
+
user: z.string(),
|
|
350
|
+
platforms: z.array(TextPlatform).min(1),
|
|
351
|
+
linkUrl: z
|
|
352
|
+
.string()
|
|
353
|
+
.optional()
|
|
354
|
+
.describe("Generic link preview URL (LinkedIn, Bluesky, Facebook)."),
|
|
355
|
+
...schedulingFields,
|
|
356
|
+
platformOptions: TextPlatformOptions.optional(),
|
|
357
|
+
},
|
|
358
|
+
outputSchema: genericResultOutputSchema,
|
|
359
|
+
annotations: {
|
|
360
|
+
readOnlyHint: false,
|
|
361
|
+
openWorldHint: true,
|
|
362
|
+
destructiveHint: false,
|
|
363
|
+
},
|
|
364
|
+
}, safe(async (args) => {
|
|
365
|
+
const { platformOptions, ...rest } = args;
|
|
366
|
+
const options = (await resolvePlatformRouting(client, {
|
|
367
|
+
...rest,
|
|
368
|
+
...(platformOptions ?? {}),
|
|
369
|
+
}));
|
|
370
|
+
return client.sdk.uploadText(options);
|
|
371
|
+
}));
|
|
372
|
+
server.registerTool("upload_document", {
|
|
373
|
+
title: "Upload document (LinkedIn)",
|
|
374
|
+
description: "Publish a document (PDF / PPT / PPTX / DOC / DOCX) to LinkedIn. Title is required.",
|
|
375
|
+
inputSchema: {
|
|
376
|
+
documentPathOrUrl: z.string(),
|
|
377
|
+
title: z.string(),
|
|
378
|
+
user: z.string(),
|
|
379
|
+
description: z.string().optional(),
|
|
380
|
+
linkedinVisibility: z
|
|
381
|
+
.enum(["PUBLIC", "CONNECTIONS", "LOGGED_IN", "CONTAINER"])
|
|
382
|
+
.optional(),
|
|
383
|
+
targetLinkedinPageId: z.string().optional(),
|
|
384
|
+
...schedulingFields,
|
|
385
|
+
},
|
|
386
|
+
outputSchema: genericResultOutputSchema,
|
|
387
|
+
annotations: {
|
|
388
|
+
readOnlyHint: false,
|
|
389
|
+
openWorldHint: true,
|
|
390
|
+
destructiveHint: false,
|
|
391
|
+
},
|
|
392
|
+
}, safe(async (args) => {
|
|
393
|
+
const { documentPathOrUrl, ...rest } = args;
|
|
394
|
+
return client.sdk.uploadDocument(documentPathOrUrl, rest);
|
|
395
|
+
}));
|
|
396
|
+
}
|
|
397
|
+
//# sourceMappingURL=upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/tools/upload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload_studio.d.ts","sourceRoot":"","sources":["../../src/tools/upload_studio.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA6CzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0F5D"}
|