@xreplyai/mcp 0.3.11 → 0.3.17

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.
@@ -0,0 +1,312 @@
1
+ import { z } from "zod";
2
+ import { readFileSync } from "fs";
3
+ import { ok, err } from "./helpers.js";
4
+ export const _fs = { readFile: (path) => readFileSync(path) };
5
+ const ALLOWED_CONTENT_TYPES = ["image/jpeg", "image/png", "video/mp4", "video/quicktime"];
6
+ const TIKTOK_IMAGE_CONTENT_TYPES = ["image/jpeg", "image/png"];
7
+ const TIKTOK_VIDEO_CONTENT_TYPES = ["video/mp4", "video/quicktime"];
8
+ const IMAGE_ONLY_CONTENT_TYPES = ["image/jpeg", "image/png"];
9
+ const LinkedInDocumentUploadSchema = z.object({
10
+ file_path: z.string().describe("Absolute path to the PDF file on disk"),
11
+ });
12
+ const InstagramMediaUploadSchema = z.object({
13
+ file_path: z.string().describe("Absolute path to the image or video file on disk"),
14
+ content_type: z
15
+ .enum(ALLOWED_CONTENT_TYPES)
16
+ .describe("MIME type of the file (image/jpeg, image/png, video/mp4, video/quicktime)"),
17
+ });
18
+ const TikTokImageUploadSchema = z.object({
19
+ file_path: z.string().describe("Absolute path to the image file on disk"),
20
+ content_type: z
21
+ .enum(TIKTOK_IMAGE_CONTENT_TYPES)
22
+ .describe("MIME type of the file (image/jpeg, image/png)"),
23
+ });
24
+ const TikTokVideoUploadSchema = z.object({
25
+ file_path: z.string().describe("Absolute path to the video file on disk"),
26
+ content_type: z
27
+ .enum(TIKTOK_VIDEO_CONTENT_TYPES)
28
+ .describe("MIME type of the file (video/mp4, video/quicktime)"),
29
+ });
30
+ const ImageOnlyUploadSchema = z.object({
31
+ file_path: z.string().describe("Absolute path to the image file on disk"),
32
+ content_type: z
33
+ .enum(IMAGE_ONLY_CONTENT_TYPES)
34
+ .describe("MIME type of the file (image/jpeg or image/png)"),
35
+ });
36
+ export const mediaTools = [
37
+ {
38
+ name: "xreply_instagram_media_upload",
39
+ description: "Upload a local image or video file to R2 storage and get back a public URL to use in Instagram posts. " +
40
+ "Pass the returned url in post_contents[].metadata.image_url (single image), image_urls (carousel), or video_url (reel). " +
41
+ "Also pass the returned r2_key in post_contents[].metadata.r2_key (single) or r2_keys[] (carousel) — required for cleanup to preserve the file. " +
42
+ "Supports JPEG, PNG (images up to 8 MB) and MP4, MOV (videos up to 100 MB).",
43
+ inputSchema: {
44
+ type: "object",
45
+ properties: {
46
+ file_path: { type: "string", description: "Absolute path to the file on disk" },
47
+ content_type: {
48
+ type: "string",
49
+ enum: [...ALLOWED_CONTENT_TYPES],
50
+ description: "MIME type of the file",
51
+ },
52
+ },
53
+ required: ["file_path", "content_type"],
54
+ },
55
+ async handler(args, client) {
56
+ try {
57
+ const { file_path, content_type } = InstagramMediaUploadSchema.parse(args);
58
+ let fileData;
59
+ try {
60
+ fileData = _fs.readFile(file_path);
61
+ }
62
+ catch {
63
+ return err(`Could not read file at ${file_path}`);
64
+ }
65
+ const result = await client.post("/api/v1/instagram/media_uploads", { media: fileData.toString("base64"), content_type });
66
+ return ok({ url: result.url, r2_key: result.r2_key });
67
+ }
68
+ catch (e) {
69
+ return err(e);
70
+ }
71
+ },
72
+ },
73
+ {
74
+ name: "xreply_linkedin_document_upload",
75
+ description: "Upload a local PDF file to LinkedIn and get back a document_urn to use as a carousel post. " +
76
+ "Pass the returned document_urn in post_contents[].metadata.document_urn with content_type: 'document'. " +
77
+ "Supports PDF files up to 100 MB. LinkedIn renders the PDF as a swipeable carousel.",
78
+ inputSchema: {
79
+ type: "object",
80
+ properties: {
81
+ file_path: { type: "string", description: "Absolute path to the PDF file on disk" },
82
+ },
83
+ required: ["file_path"],
84
+ },
85
+ async handler(args, client) {
86
+ try {
87
+ const { file_path } = LinkedInDocumentUploadSchema.parse(args);
88
+ let fileData;
89
+ try {
90
+ fileData = _fs.readFile(file_path);
91
+ }
92
+ catch {
93
+ return err(`Could not read file at ${file_path}`);
94
+ }
95
+ if (!fileData.slice(0, 5).toString("ascii").startsWith("%PDF-")) {
96
+ return err("File does not appear to be a valid PDF");
97
+ }
98
+ const form = new FormData();
99
+ form.append("document", new Blob([fileData], { type: "application/pdf" }), file_path.split("/").pop() ?? "document.pdf");
100
+ const result = await client.postMultipart("/api/v1/linkedin/document_uploads", form);
101
+ return ok({ document_urn: result.document_urn });
102
+ }
103
+ catch (e) {
104
+ return err(e);
105
+ }
106
+ },
107
+ },
108
+ {
109
+ name: "xreply_tiktok_image_upload",
110
+ description: "Upload a local image file to R2 storage and get back a public URL to use in TikTok posts. " +
111
+ "Pass the returned url in post_contents[].metadata.image_url (single image) or image_urls[] (carousel). " +
112
+ "Also pass the returned r2_key in post_contents[].metadata.r2_key (single) or r2_keys[] (carousel) — required for cleanup to preserve the file. " +
113
+ "Supports JPEG and PNG images up to 8 MB.",
114
+ inputSchema: {
115
+ type: "object",
116
+ properties: {
117
+ file_path: { type: "string", description: "Absolute path to the image file on disk" },
118
+ content_type: {
119
+ type: "string",
120
+ enum: [...TIKTOK_IMAGE_CONTENT_TYPES],
121
+ description: "MIME type of the file (image/jpeg or image/png)",
122
+ },
123
+ },
124
+ required: ["file_path", "content_type"],
125
+ },
126
+ async handler(args, client) {
127
+ try {
128
+ const { file_path, content_type } = TikTokImageUploadSchema.parse(args);
129
+ let fileData;
130
+ try {
131
+ fileData = _fs.readFile(file_path);
132
+ }
133
+ catch {
134
+ return err(`Could not read file at ${file_path}`);
135
+ }
136
+ const result = await client.post("/api/v1/tiktok/media_uploads", { media: fileData.toString("base64"), content_type });
137
+ return ok({ url: result.url, r2_key: result.r2_key });
138
+ }
139
+ catch (e) {
140
+ return err(e);
141
+ }
142
+ },
143
+ },
144
+ {
145
+ name: "xreply_tiktok_video_upload",
146
+ description: "Upload a local video file to R2 storage for use in TikTok posts. " +
147
+ "Uses a presigned URL flow: fetches a presigned PUT URL from the backend, then uploads the video directly to R2. " +
148
+ "Pass the returned r2_key in post_contents[].metadata.r2_key. " +
149
+ "Supports MP4 and MOV (QuickTime) video formats.",
150
+ inputSchema: {
151
+ type: "object",
152
+ properties: {
153
+ file_path: { type: "string", description: "Absolute path to the video file on disk" },
154
+ content_type: {
155
+ type: "string",
156
+ enum: [...TIKTOK_VIDEO_CONTENT_TYPES],
157
+ description: "MIME type of the file (video/mp4 or video/quicktime)",
158
+ },
159
+ },
160
+ required: ["file_path", "content_type"],
161
+ },
162
+ async handler(args, client) {
163
+ try {
164
+ const { file_path, content_type } = TikTokVideoUploadSchema.parse(args);
165
+ let fileData;
166
+ try {
167
+ fileData = _fs.readFile(file_path);
168
+ }
169
+ catch {
170
+ return err(`Could not read file at ${file_path}`);
171
+ }
172
+ const presign = await client.get(`/api/v1/tiktok/uploads/presign?content_type=${encodeURIComponent(content_type)}`);
173
+ const uploadController = new AbortController();
174
+ const uploadTimer = setTimeout(() => uploadController.abort(), 300_000);
175
+ let uploadResponse;
176
+ try {
177
+ uploadResponse = await fetch(presign.upload_url, {
178
+ method: "PUT",
179
+ headers: { "Content-Type": content_type, "Content-Length": String(fileData.byteLength) },
180
+ body: fileData,
181
+ signal: uploadController.signal,
182
+ });
183
+ }
184
+ catch (e) {
185
+ clearTimeout(uploadTimer);
186
+ if (e instanceof Error && e.name === "AbortError") {
187
+ return err("Video upload timed out after 5 minutes. Try a smaller file or check your connection.");
188
+ }
189
+ return err(`Video upload failed: ${e instanceof Error ? e.message : String(e)}`);
190
+ }
191
+ clearTimeout(uploadTimer);
192
+ if (!uploadResponse.ok) {
193
+ const body = await uploadResponse.text().catch(() => "");
194
+ return err(`Video upload failed with HTTP ${uploadResponse.status}: ${body}`);
195
+ }
196
+ return ok({ r2_key: presign.r2_key });
197
+ }
198
+ catch (e) {
199
+ return err(e);
200
+ }
201
+ },
202
+ },
203
+ {
204
+ name: "xreply_threads_media_upload",
205
+ description: "Upload a local image file to R2 storage and get back a public URL to use in Threads posts. " +
206
+ "Pass the returned url in post_contents[].metadata.image_url (required for single_image content_type on Threads). " +
207
+ "Also pass the returned r2_key in post_contents[].metadata.r2_key — required for cleanup to preserve the file. " +
208
+ "Supports JPEG and PNG images up to 8 MB.",
209
+ inputSchema: {
210
+ type: "object",
211
+ properties: {
212
+ file_path: { type: "string", description: "Absolute path to the image file on disk" },
213
+ content_type: {
214
+ type: "string",
215
+ enum: [...IMAGE_ONLY_CONTENT_TYPES],
216
+ description: "MIME type of the file (image/jpeg or image/png)",
217
+ },
218
+ },
219
+ required: ["file_path", "content_type"],
220
+ },
221
+ async handler(args, client) {
222
+ try {
223
+ const { file_path, content_type } = ImageOnlyUploadSchema.parse(args);
224
+ let fileData;
225
+ try {
226
+ fileData = _fs.readFile(file_path);
227
+ }
228
+ catch {
229
+ return err(`Could not read file at ${file_path}`);
230
+ }
231
+ const result = await client.post("/api/v1/threads/media_uploads", { media: fileData.toString("base64"), content_type });
232
+ return ok({ url: result.url, r2_key: result.r2_key });
233
+ }
234
+ catch (e) {
235
+ return err(e);
236
+ }
237
+ },
238
+ },
239
+ {
240
+ name: "xreply_bluesky_media_upload",
241
+ description: "Upload a local image file to Bluesky (uploads directly to the user's PDS via AT Protocol) and get back a blob reference. " +
242
+ "Pass the returned blob in post_contents[].metadata.blob for single_image posts on Bluesky. " +
243
+ "Supports JPEG and PNG images up to 1 MB (Bluesky's limit is much stricter than other platforms). " +
244
+ "Unlike other platforms, Bluesky media is stored on the user's PDS, not R2 — there is no r2_key.",
245
+ inputSchema: {
246
+ type: "object",
247
+ properties: {
248
+ file_path: { type: "string", description: "Absolute path to the image file on disk" },
249
+ content_type: {
250
+ type: "string",
251
+ enum: [...IMAGE_ONLY_CONTENT_TYPES],
252
+ description: "MIME type of the file (image/jpeg or image/png)",
253
+ },
254
+ },
255
+ required: ["file_path", "content_type"],
256
+ },
257
+ async handler(args, client) {
258
+ try {
259
+ const { file_path, content_type } = ImageOnlyUploadSchema.parse(args);
260
+ let fileData;
261
+ try {
262
+ fileData = _fs.readFile(file_path);
263
+ }
264
+ catch {
265
+ return err(`Could not read file at ${file_path}`);
266
+ }
267
+ const result = await client.post("/api/v1/bluesky/media_uploads", { media: fileData.toString("base64"), content_type });
268
+ return ok({ blob: result.blob });
269
+ }
270
+ catch (e) {
271
+ return err(e);
272
+ }
273
+ },
274
+ },
275
+ {
276
+ name: "xreply_pinterest_media_upload",
277
+ description: "Upload a local image file to R2 storage and get back a public URL to use in Pinterest posts. " +
278
+ "Pass the returned url in post_contents[].metadata.image_url. " +
279
+ "Also pass the returned r2_key in post_contents[].metadata.r2_key — required for cleanup to preserve the file. " +
280
+ "Supports JPEG and PNG images up to 8 MB.",
281
+ inputSchema: {
282
+ type: "object",
283
+ properties: {
284
+ file_path: { type: "string", description: "Absolute path to the image file on disk" },
285
+ content_type: {
286
+ type: "string",
287
+ enum: [...IMAGE_ONLY_CONTENT_TYPES],
288
+ description: "MIME type of the file (image/jpeg or image/png)",
289
+ },
290
+ },
291
+ required: ["file_path", "content_type"],
292
+ },
293
+ async handler(args, client) {
294
+ try {
295
+ const { file_path, content_type } = ImageOnlyUploadSchema.parse(args);
296
+ let fileData;
297
+ try {
298
+ fileData = _fs.readFile(file_path);
299
+ }
300
+ catch {
301
+ return err(`Could not read file at ${file_path}`);
302
+ }
303
+ const result = await client.post("/api/v1/pinterest/media_uploads", { media: fileData.toString("base64"), content_type });
304
+ return ok({ url: result.url, r2_key: result.r2_key });
305
+ }
306
+ catch (e) {
307
+ return err(e);
308
+ }
309
+ },
310
+ },
311
+ ];
312
+ //# sourceMappingURL=media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/tools/media.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from "./posts.js";
2
+ export declare const pinterestTools: ToolDefinition[];
3
+ //# sourceMappingURL=pinterest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pinterest.d.ts","sourceRoot":"","sources":["../../src/tools/pinterest.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,YAAY,CAAC;AAa7D,eAAO,MAAM,cAAc,EAAE,cAAc,EA4B1C,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { ok, err } from "./helpers.js";
2
+ export const pinterestTools = [
3
+ {
4
+ name: "xreply_pinterest_boards",
5
+ description: "List the user's Pinterest boards. Returns board IDs, names, and privacy settings — use the returned id as board_id in post_contents[].metadata when creating a Pinterest post. Results are cached; pass force_refresh to re-fetch from the Pinterest API.",
6
+ inputSchema: {
7
+ type: "object",
8
+ properties: {
9
+ force_refresh: {
10
+ type: "boolean",
11
+ description: "Force a fresh fetch from the Pinterest API instead of using cached data (default: false).",
12
+ },
13
+ },
14
+ required: [],
15
+ },
16
+ async handler(args, client) {
17
+ try {
18
+ const forceRefresh = args.force_refresh === true;
19
+ const path = forceRefresh
20
+ ? "/api/v1/pinterest/boards?force_refresh=true"
21
+ : "/api/v1/pinterest/boards";
22
+ const result = await client.get(path);
23
+ return ok(result);
24
+ }
25
+ catch (e) {
26
+ return err(e);
27
+ }
28
+ },
29
+ },
30
+ ];
31
+ //# sourceMappingURL=pinterest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pinterest.js","sourceRoot":"","sources":["../../src/tools/pinterest.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAWvC,MAAM,CAAC,MAAM,cAAc,GAAqB;IAC9C;QACE,IAAI,EAAE,yBAAyB;QAC/B,WAAW,EACT,2PAA2P;QAC7P,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,aAAa,EAAE;oBACb,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,2FAA2F;iBACzG;aACF;YACD,QAAQ,EAAE,EAAE;SACb;QACD,KAAK,CAAC,OAAO,CAAC,IAA6B,EAAE,MAAoB;YAC/D,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC;gBACjD,MAAM,IAAI,GAAG,YAAY;oBACvB,CAAC,CAAC,6CAA6C;oBAC/C,CAAC,CAAC,0BAA0B,CAAC;gBAC/B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAA0B,IAAI,CAAC,CAAC;gBAC/D,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;YACpB,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;YAChB,CAAC;QACH,CAAC;KACF;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"posts.d.ts","sourceRoot":"","sources":["../../src/tools/posts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAUjD,MAAM,MAAM,UAAU,GAAG,cAAc,CAAC;AAExC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CACvF;AAsGD,eAAO,MAAM,SAAS,EAAE,cAAc,EA2kBrC,CAAC"}
1
+ {"version":3,"file":"posts.d.ts","sourceRoot":"","sources":["../../src/tools/posts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAUjD,MAAM,MAAM,UAAU,GAAG,cAAc,CAAC;AAExC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CACvF;AAmID,eAAO,MAAM,SAAS,EAAE,cAAc,EA6tBrC,CAAC"}