vugola-mcp 1.1.3 → 1.2.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
@@ -18,17 +18,17 @@ Let Claude (or any MCP-capable agent) clip videos, check your credits, and sched
18
18
  ### Claude Desktop (one command, auto-configures)
19
19
 
20
20
  ```bash
21
- npx vugola-mcp@1.1.3 install
21
+ npx vugola-mcp@1.2.0 install
22
22
  ```
23
23
 
24
24
  npx will ask to install the package (type `y`), then the installer prompts for your API key. It edits your Claude Desktop config for you — no JSON to hand-write. **Quit and reopen Claude Desktop** to pick up the change.
25
25
 
26
- To skip the key prompt: `npx vugola-mcp@1.1.3 install --key vug_sk_yourkey`.
26
+ To skip the key prompt: `npx vugola-mcp@1.2.0 install --key vug_sk_yourkey`.
27
27
 
28
28
  ### Claude Code
29
29
 
30
30
  ```bash
31
- claude mcp add vugola -- npx -y vugola-mcp@1.1.3
31
+ claude mcp add vugola -- npx -y vugola-mcp@1.2.0
32
32
  ```
33
33
 
34
34
  Then export your key in your shell or `.env`:
@@ -46,7 +46,7 @@ If your MCP client isn't covered above, drop this block into its config file:
46
46
  "mcpServers": {
47
47
  "vugola": {
48
48
  "command": "npx",
49
- "args": ["-y", "vugola-mcp@1.1.3"],
49
+ "args": ["-y", "vugola-mcp@1.2.0"],
50
50
  "env": { "VUGOLA_API_KEY": "vug_sk_your_key_here" }
51
51
  }
52
52
  }
@@ -79,10 +79,26 @@ No inputs.
79
79
 
80
80
  ### `schedule_post`
81
81
 
82
- Schedule one or more social posts. Supports x, instagram, tiktok, youtube, facebook, linkedin, threads, bluesky. Instagram carousels supported with 2–10 items.
82
+ Schedule one or more social posts. Supports x, instagram, tiktok, youtube, facebook, linkedin, threads, bluesky.
83
83
 
84
84
  Inputs: `posts[]` (max 25 per call). See the tool description for full fields.
85
85
 
86
+ ### `list_scheduled_posts`
87
+
88
+ List what's on your posting calendar. Optional filters for status (`scheduled` / `processing` / `posted` / `failed`), platform, limit, offset.
89
+
90
+ ### `cancel_scheduled_post`
91
+
92
+ Cancel a scheduled post before it goes live. Only works for posts in `scheduled` state.
93
+
94
+ Inputs: `post_id`.
95
+
96
+ ### `download_clip`
97
+
98
+ Save a completed clip to your local `~/Downloads/` folder and return the file path. Call after `get_clip_status` reports a job is complete.
99
+
100
+ Inputs: `job_id`, `clip_index` (1-based). Max 500 MB.
101
+
86
102
  ---
87
103
 
88
104
  ## Security
package/dist/errors.js CHANGED
@@ -24,6 +24,8 @@ export function translateHttpError(status, body) {
24
24
  return "Vugola took too long to respond. Try again shortly.";
25
25
  case 429:
26
26
  return "Vugola rate limit hit. Try again in about a minute.";
27
+ case 409:
28
+ return "This post can no longer be cancelled. It's already processing or has already posted.";
27
29
  case 400: {
28
30
  const canned = KNOWN_400_CODES[code];
29
31
  if (canned)
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,SAAS,GAAG,4CAA4C,CAAC;AAC/D,MAAM,OAAO,GAAG,kCAAkC,CAAC;AAEnD,MAAM,eAAe,GAA2B;IAC9C,eAAe,EAAE,yCAAyC;IAC1D,cAAc,EAAE,oCAAoC;IACpD,WAAW,EAAE,iCAAiC;IAC9C,cAAc,EAAE,4DAA4D;IAC5E,oBAAoB,EAAE,+CAA+C;IACrE,qBAAqB,EACnB,0EAA0E;CAC7E,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,IAAa;IAC9D,MAAM,MAAM,GAAG,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAE3D,CAAC;IACF,MAAM,IAAI,GAAG,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAElE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,GAAG;YACN,OAAO,wDAAwD,SAAS,EAAE,CAAC;QAC7E,KAAK,GAAG;YACN,OAAO,oFAAoF,OAAO,EAAE,CAAC;QACvG,KAAK,GAAG;YACN,OAAO,sDAAsD,OAAO,aAAa,CAAC;QACpF,KAAK,GAAG;YACN,OAAO,8EAA8E,CAAC;QACxF,KAAK,GAAG;YACN,OAAO,qDAAqD,CAAC;QAC/D,KAAK,GAAG;YACN,OAAO,qDAAqD,CAAC;QAC/D,KAAK,GAAG,CAAC,CAAC,CAAC;YACT,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAC;YAC1B,OAAO,6DAA6D,CAAC;QACvE,CAAC;QACD,KAAK,GAAG,CAAC;QACT,KAAK,GAAG,CAAC;QACT,KAAK,GAAG,CAAC;QACT,KAAK,GAAG;YACN,OAAO,mEAAmE,CAAC;QAC7E;YACE,OAAO,kDAAkD,MAAM,uBAAuB,CAAC;IAC3F,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAY;IAChD,IACE,GAAG;QACH,OAAO,GAAG,KAAK,QAAQ;QACvB,MAAM,IAAI,GAAG;QACZ,GAAyB,CAAC,IAAI,KAAK,YAAY,EAChD,CAAC;QACD,OAAO,qDAAqD,CAAC;IAC/D,CAAC;IACD,OAAO,wDAAwD,CAAC;AAClE,CAAC"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,SAAS,GAAG,4CAA4C,CAAC;AAC/D,MAAM,OAAO,GAAG,kCAAkC,CAAC;AAEnD,MAAM,eAAe,GAA2B;IAC9C,eAAe,EAAE,yCAAyC;IAC1D,cAAc,EAAE,oCAAoC;IACpD,WAAW,EAAE,iCAAiC;IAC9C,cAAc,EAAE,4DAA4D;IAC5E,oBAAoB,EAAE,+CAA+C;IACrE,qBAAqB,EACnB,0EAA0E;CAC7E,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,IAAa;IAC9D,MAAM,MAAM,GAAG,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAE3D,CAAC;IACF,MAAM,IAAI,GAAG,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAElE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,GAAG;YACN,OAAO,wDAAwD,SAAS,EAAE,CAAC;QAC7E,KAAK,GAAG;YACN,OAAO,oFAAoF,OAAO,EAAE,CAAC;QACvG,KAAK,GAAG;YACN,OAAO,sDAAsD,OAAO,aAAa,CAAC;QACpF,KAAK,GAAG;YACN,OAAO,8EAA8E,CAAC;QACxF,KAAK,GAAG;YACN,OAAO,qDAAqD,CAAC;QAC/D,KAAK,GAAG;YACN,OAAO,qDAAqD,CAAC;QAC/D,KAAK,GAAG;YACN,OAAO,sFAAsF,CAAC;QAChG,KAAK,GAAG,CAAC,CAAC,CAAC;YACT,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAC;YAC1B,OAAO,6DAA6D,CAAC;QACvE,CAAC;QACD,KAAK,GAAG,CAAC;QACT,KAAK,GAAG,CAAC;QACT,KAAK,GAAG,CAAC;QACT,KAAK,GAAG;YACN,OAAO,mEAAmE,CAAC;QAC7E;YACE,OAAO,kDAAkD,MAAM,uBAAuB,CAAC;IAC3F,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAY;IAChD,IACE,GAAG;QACH,OAAO,GAAG,KAAK,QAAQ;QACvB,MAAM,IAAI,GAAG;QACZ,GAAyB,CAAC,IAAI,KAAK,YAAY,EAChD,CAAC;QACD,OAAO,qDAAqD,CAAC;IAC/D,CAAC;IACD,OAAO,wDAAwD,CAAC;AAClE,CAAC"}
package/dist/index.js CHANGED
@@ -9,7 +9,11 @@ import { createClipVideoTool } from "./tools/clip-video.js";
9
9
  import { createGetClipStatusTool } from "./tools/get-clip-status.js";
10
10
  import { createGetUsageTool } from "./tools/get-usage.js";
11
11
  import { createSchedulePostTool } from "./tools/schedule-post.js";
12
+ import { createListScheduledPostsTool } from "./tools/list-scheduled-posts.js";
13
+ import { createCancelScheduledPostTool } from "./tools/cancel-scheduled-post.js";
14
+ import { createDownloadClipTool } from "./tools/download-clip.js";
12
15
  import { runInstall } from "./install.js";
16
+ const VUGOLA_BASE_URL = "https://www.vugolaai.com/api/v1";
13
17
  const MISSING_KEY_MSG = "Set VUGOLA_API_KEY in your MCP config. Get one at https://www.vugolaai.com/dashboard/api-key";
14
18
  function lastFour(s) {
15
19
  return s.slice(-4);
@@ -23,7 +27,7 @@ async function main() {
23
27
  process.stderr.write(`[vugola-mcp] ready — key loaded (last 4: ...${lastFour(apiKey)})\n`);
24
28
  }
25
29
  const client = createClient({
26
- baseUrl: "https://www.vugolaai.com/api/v1",
30
+ baseUrl: VUGOLA_BASE_URL,
27
31
  apiKey,
28
32
  });
29
33
  const rateLimiter = createRateLimiter({
@@ -31,17 +35,27 @@ async function main() {
31
35
  schedule_post: { max: 10, windowMs: 60_000 },
32
36
  get_clip_status: { max: 30, windowMs: 60_000 },
33
37
  get_usage: { max: 30, windowMs: 60_000 },
38
+ list_scheduled_posts: { max: 30, windowMs: 60_000 },
39
+ cancel_scheduled_post: { max: 10, windowMs: 60_000 },
40
+ download_clip: { max: 10, windowMs: 60_000 },
34
41
  });
35
42
  const tools = [
36
43
  createClipVideoTool({ client, rateLimiter }),
37
44
  createGetClipStatusTool({ client, rateLimiter }),
38
45
  createGetUsageTool({ client, rateLimiter }),
39
46
  createSchedulePostTool({ client, rateLimiter }),
47
+ createListScheduledPostsTool({ client, rateLimiter }),
48
+ createCancelScheduledPostTool({ client, rateLimiter }),
49
+ createDownloadClipTool({
50
+ apiKey,
51
+ rateLimiter,
52
+ baseUrl: VUGOLA_BASE_URL,
53
+ }),
40
54
  ];
41
55
  const byName = new Map(tools.map((t) => [t.name, t]));
42
56
  const server = new Server({
43
57
  name: "vugola-mcp",
44
- version: "1.1.3",
58
+ version: "1.2.0",
45
59
  title: "Vugola",
46
60
  icons: [
47
61
  {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/install.js CHANGED
@@ -2,7 +2,7 @@ import { readFileSync, writeFileSync, mkdirSync, existsSync, } from "node:fs";
2
2
  import { dirname, join } from "node:path";
3
3
  import { homedir } from "node:os";
4
4
  import { createInterface } from "node:readline/promises";
5
- const VERSION = "1.1.3";
5
+ const VERSION = "1.2.0";
6
6
  function configPathFor(client) {
7
7
  if (client !== "claude-desktop") {
8
8
  throw new Error(`Unsupported client: ${client}`);
@@ -0,0 +1,32 @@
1
+ import { z } from "zod";
2
+ import type { Client } from "../client.js";
3
+ import type { RateLimiter } from "../rate-limit.js";
4
+ export interface ToolDeps {
5
+ client: Client;
6
+ rateLimiter: RateLimiter;
7
+ }
8
+ declare const InputSchema: z.ZodObject<{
9
+ post_id: z.ZodString;
10
+ }, "strict", z.ZodTypeAny, {
11
+ post_id: string;
12
+ }, {
13
+ post_id: string;
14
+ }>;
15
+ export declare function createCancelScheduledPostTool(deps: ToolDeps): {
16
+ name: string;
17
+ description: string;
18
+ inputSchema: z.ZodObject<{
19
+ post_id: z.ZodString;
20
+ }, "strict", z.ZodTypeAny, {
21
+ post_id: string;
22
+ }, {
23
+ post_id: string;
24
+ }>;
25
+ handler(input: z.infer<typeof InputSchema>): Promise<{
26
+ content: {
27
+ type: "text";
28
+ text: string;
29
+ }[];
30
+ }>;
31
+ };
32
+ export {};
@@ -0,0 +1,55 @@
1
+ import { z } from "zod";
2
+ import { sanitize } from "../sanitize.js";
3
+ import { translateHttpError, translateNetworkError } from "../errors.js";
4
+ const InputSchema = z
5
+ .object({
6
+ post_id: z.string().min(1).max(64),
7
+ })
8
+ .strict();
9
+ const RATE_LIMIT_MSG = "You're calling Vugola too quickly. Wait a moment and try again.";
10
+ export function createCancelScheduledPostTool(deps) {
11
+ return {
12
+ name: "cancel_scheduled_post",
13
+ description: "Cancel a scheduled post before it goes live. Only works for posts with status 'scheduled' — posts that are already processing or posted can't be cancelled and will return an error. Get the post_id from list_scheduled_posts.",
14
+ inputSchema: InputSchema,
15
+ async handler(input) {
16
+ InputSchema.parse(input);
17
+ const rl = deps.rateLimiter.check("cancel_scheduled_post");
18
+ if (!rl.allowed) {
19
+ return { content: [{ type: "text", text: RATE_LIMIT_MSG }] };
20
+ }
21
+ try {
22
+ const res = await deps.client.request(`/schedule/${encodeURIComponent(input.post_id)}`, {
23
+ method: "DELETE",
24
+ timeoutMs: 10_000,
25
+ retryIdempotent: false,
26
+ });
27
+ if (!res.ok) {
28
+ return {
29
+ content: [
30
+ {
31
+ type: "text",
32
+ text: translateHttpError(res.httpStatus, res.body),
33
+ },
34
+ ],
35
+ };
36
+ }
37
+ const body = res.body;
38
+ const payload = {
39
+ success: body.success === true,
40
+ id: sanitize(body.id, { maxLength: 64 }),
41
+ status: sanitize(body.status, { maxLength: 32 }),
42
+ };
43
+ return {
44
+ content: [{ type: "text", text: JSON.stringify(payload) }],
45
+ };
46
+ }
47
+ catch (err) {
48
+ return {
49
+ content: [{ type: "text", text: translateNetworkError(err) }],
50
+ };
51
+ }
52
+ },
53
+ };
54
+ }
55
+ //# sourceMappingURL=cancel-scheduled-post.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancel-scheduled-post.js","sourceRoot":"","sources":["../../src/tools/cancel-scheduled-post.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAOzE,MAAM,WAAW,GAAG,CAAC;KAClB,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;CACnC,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,cAAc,GAClB,iEAAiE,CAAC;AAEpE,MAAM,UAAU,6BAA6B,CAAC,IAAc;IAC1D,OAAO;QACL,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EACT,iOAAiO;QACnO,WAAW,EAAE,WAAW;QACxB,KAAK,CAAC,OAAO,CAAC,KAAkC;YAC9C,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACzB,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC3D,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;gBAChB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;YACxE,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACnC,aAAa,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAChD;oBACE,MAAM,EAAE,QAAQ;oBAChB,SAAS,EAAE,MAAM;oBACjB,eAAe,EAAE,KAAK;iBACvB,CACF,CAAC;gBACF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;oBACZ,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAe;gCACrB,IAAI,EAAE,kBAAkB,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC;6BACnD;yBACF;qBACF,CAAC;gBACJ,CAAC;gBACD,MAAM,IAAI,GAAG,GAAG,CAAC,IAIhB,CAAC;gBACF,MAAM,OAAO,GAAG;oBACd,OAAO,EAAE,IAAI,CAAC,OAAO,KAAK,IAAI;oBAC9B,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;oBACxC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;iBACjD,CAAC;gBACF,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;iBACpE,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,qBAAqB,CAAC,GAAG,CAAC,EAAE,CAAC;iBACvE,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { z } from "zod";
2
+ import type { RateLimiter } from "../rate-limit.js";
3
+ export interface ToolDeps {
4
+ apiKey: string;
5
+ rateLimiter: RateLimiter;
6
+ baseUrl: string;
7
+ downloadDir?: string;
8
+ maxBytes?: number;
9
+ fetch?: typeof fetch;
10
+ }
11
+ declare const InputSchema: z.ZodObject<{
12
+ job_id: z.ZodString;
13
+ clip_index: z.ZodNumber;
14
+ }, "strict", z.ZodTypeAny, {
15
+ job_id: string;
16
+ clip_index: number;
17
+ }, {
18
+ job_id: string;
19
+ clip_index: number;
20
+ }>;
21
+ export declare function createDownloadClipTool(deps: ToolDeps): {
22
+ name: string;
23
+ description: string;
24
+ inputSchema: z.ZodObject<{
25
+ job_id: z.ZodString;
26
+ clip_index: z.ZodNumber;
27
+ }, "strict", z.ZodTypeAny, {
28
+ job_id: string;
29
+ clip_index: number;
30
+ }, {
31
+ job_id: string;
32
+ clip_index: number;
33
+ }>;
34
+ handler(input: z.infer<typeof InputSchema>): Promise<{
35
+ content: {
36
+ type: "text";
37
+ text: string;
38
+ }[];
39
+ }>;
40
+ };
41
+ export {};
@@ -0,0 +1,120 @@
1
+ import { z } from "zod";
2
+ import { writeFileSync, mkdirSync } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { translateHttpError, translateNetworkError } from "../errors.js";
6
+ const DEFAULT_MAX_BYTES = 500 * 1024 * 1024; // 500 MB
7
+ const DEFAULT_TIMEOUT_MS = 120_000; // 2 minutes for large clips
8
+ const InputSchema = z
9
+ .object({
10
+ job_id: z.string().min(1).max(64),
11
+ clip_index: z.number().int().positive(),
12
+ })
13
+ .strict();
14
+ const RATE_LIMIT_MSG = "You're calling Vugola too quickly. Wait a moment and try again.";
15
+ function safeSlug(input) {
16
+ return input.replace(/[^a-zA-Z0-9_-]/g, "_").slice(0, 48);
17
+ }
18
+ export function createDownloadClipTool(deps) {
19
+ const fetchFn = deps.fetch ?? fetch;
20
+ const dir = deps.downloadDir ?? join(homedir(), "Downloads");
21
+ const maxBytes = deps.maxBytes ?? DEFAULT_MAX_BYTES;
22
+ return {
23
+ name: "download_clip",
24
+ description: "Download a rendered clip to the user's local Downloads folder (or a configured directory). Returns the saved file path and size in bytes. Use this after get_clip_status reports a job is complete, with the clip_index (1-based) matching the clip the user wants. Don't call this for jobs that are still processing.",
25
+ inputSchema: InputSchema,
26
+ async handler(input) {
27
+ InputSchema.parse(input);
28
+ const rl = deps.rateLimiter.check("download_clip");
29
+ if (!rl.allowed) {
30
+ return { content: [{ type: "text", text: RATE_LIMIT_MSG }] };
31
+ }
32
+ if (!deps.apiKey) {
33
+ return {
34
+ content: [
35
+ {
36
+ type: "text",
37
+ text: "Set VUGOLA_API_KEY in your MCP config. Get one at https://www.vugolaai.com/dashboard/api-key",
38
+ },
39
+ ],
40
+ };
41
+ }
42
+ const url = `${deps.baseUrl}/clip/${encodeURIComponent(input.job_id)}/download/${input.clip_index}`;
43
+ const controller = new AbortController();
44
+ const timeout = setTimeout(() => controller.abort(), DEFAULT_TIMEOUT_MS);
45
+ try {
46
+ const res = await fetchFn(url, {
47
+ method: "GET",
48
+ headers: { Authorization: `Bearer ${deps.apiKey}` },
49
+ signal: controller.signal,
50
+ });
51
+ if (!res.ok) {
52
+ return {
53
+ content: [
54
+ {
55
+ type: "text",
56
+ text: translateHttpError(res.status, {}),
57
+ },
58
+ ],
59
+ };
60
+ }
61
+ const lengthHeader = res.headers.get("content-length");
62
+ if (lengthHeader !== null) {
63
+ const advertised = Number(lengthHeader);
64
+ if (Number.isFinite(advertised) && advertised > maxBytes) {
65
+ return {
66
+ content: [
67
+ {
68
+ type: "text",
69
+ text: `That clip is too large to download through the MCP (${advertised} bytes, limit ${maxBytes}). Grab it from the Vugola dashboard instead.`,
70
+ },
71
+ ],
72
+ };
73
+ }
74
+ }
75
+ const buffer = Buffer.from(await res.arrayBuffer());
76
+ if (buffer.byteLength > maxBytes) {
77
+ return {
78
+ content: [
79
+ {
80
+ type: "text",
81
+ text: `That clip is too large to download through the MCP (${buffer.byteLength} bytes, limit ${maxBytes}). Grab it from the Vugola dashboard instead.`,
82
+ },
83
+ ],
84
+ };
85
+ }
86
+ mkdirSync(dir, { recursive: true });
87
+ const filename = `vugola-${safeSlug(input.job_id)}-${input.clip_index}.mp4`;
88
+ const savedTo = join(dir, filename);
89
+ writeFileSync(savedTo, buffer);
90
+ return {
91
+ content: [
92
+ {
93
+ type: "text",
94
+ text: JSON.stringify({
95
+ saved_to: savedTo,
96
+ bytes: buffer.byteLength,
97
+ clip_index: input.clip_index,
98
+ job_id: input.job_id,
99
+ }),
100
+ },
101
+ ],
102
+ };
103
+ }
104
+ catch (err) {
105
+ return {
106
+ content: [
107
+ {
108
+ type: "text",
109
+ text: translateNetworkError(err),
110
+ },
111
+ ],
112
+ };
113
+ }
114
+ finally {
115
+ clearTimeout(timeout);
116
+ }
117
+ },
118
+ };
119
+ }
120
+ //# sourceMappingURL=download-clip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download-clip.js","sourceRoot":"","sources":["../../src/tools/download-clip.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { z } from "zod";
2
+ import type { Client } from "../client.js";
3
+ import type { RateLimiter } from "../rate-limit.js";
4
+ export interface ToolDeps {
5
+ client: Client;
6
+ rateLimiter: RateLimiter;
7
+ }
8
+ declare const InputSchema: z.ZodObject<{
9
+ status: z.ZodOptional<z.ZodEnum<["scheduled", "processing", "posted", "failed"]>>;
10
+ platform: z.ZodOptional<z.ZodEnum<["x", "instagram", "tiktok", "youtube", "facebook", "linkedin", "threads", "bluesky"]>>;
11
+ limit: z.ZodOptional<z.ZodNumber>;
12
+ offset: z.ZodOptional<z.ZodNumber>;
13
+ }, "strict", z.ZodTypeAny, {
14
+ status?: "processing" | "failed" | "scheduled" | "posted" | undefined;
15
+ platform?: "x" | "instagram" | "tiktok" | "youtube" | "facebook" | "linkedin" | "threads" | "bluesky" | undefined;
16
+ limit?: number | undefined;
17
+ offset?: number | undefined;
18
+ }, {
19
+ status?: "processing" | "failed" | "scheduled" | "posted" | undefined;
20
+ platform?: "x" | "instagram" | "tiktok" | "youtube" | "facebook" | "linkedin" | "threads" | "bluesky" | undefined;
21
+ limit?: number | undefined;
22
+ offset?: number | undefined;
23
+ }>;
24
+ export declare function createListScheduledPostsTool(deps: ToolDeps): {
25
+ name: string;
26
+ description: string;
27
+ inputSchema: z.ZodObject<{
28
+ status: z.ZodOptional<z.ZodEnum<["scheduled", "processing", "posted", "failed"]>>;
29
+ platform: z.ZodOptional<z.ZodEnum<["x", "instagram", "tiktok", "youtube", "facebook", "linkedin", "threads", "bluesky"]>>;
30
+ limit: z.ZodOptional<z.ZodNumber>;
31
+ offset: z.ZodOptional<z.ZodNumber>;
32
+ }, "strict", z.ZodTypeAny, {
33
+ status?: "processing" | "failed" | "scheduled" | "posted" | undefined;
34
+ platform?: "x" | "instagram" | "tiktok" | "youtube" | "facebook" | "linkedin" | "threads" | "bluesky" | undefined;
35
+ limit?: number | undefined;
36
+ offset?: number | undefined;
37
+ }, {
38
+ status?: "processing" | "failed" | "scheduled" | "posted" | undefined;
39
+ platform?: "x" | "instagram" | "tiktok" | "youtube" | "facebook" | "linkedin" | "threads" | "bluesky" | undefined;
40
+ limit?: number | undefined;
41
+ offset?: number | undefined;
42
+ }>;
43
+ annotations: {
44
+ title: string;
45
+ readOnlyHint: boolean;
46
+ openWorldHint: boolean;
47
+ };
48
+ handler(input: z.infer<typeof InputSchema>): Promise<{
49
+ content: {
50
+ type: "text";
51
+ text: string;
52
+ }[];
53
+ }>;
54
+ };
55
+ export {};
@@ -0,0 +1,108 @@
1
+ import { z } from "zod";
2
+ import { sanitize } from "../sanitize.js";
3
+ import { translateHttpError, translateNetworkError } from "../errors.js";
4
+ const InputSchema = z
5
+ .object({
6
+ status: z
7
+ .enum(["scheduled", "processing", "posted", "failed"])
8
+ .optional(),
9
+ platform: z
10
+ .enum([
11
+ "x",
12
+ "instagram",
13
+ "tiktok",
14
+ "youtube",
15
+ "facebook",
16
+ "linkedin",
17
+ "threads",
18
+ "bluesky",
19
+ ])
20
+ .optional(),
21
+ limit: z.number().int().min(1).max(100).optional(),
22
+ offset: z.number().int().min(0).optional(),
23
+ })
24
+ .strict();
25
+ const RATE_LIMIT_MSG = "You're calling Vugola too quickly. Wait a moment and try again.";
26
+ function buildQueryString(input) {
27
+ const params = [];
28
+ if (input.status)
29
+ params.push(`status=${input.status}`);
30
+ if (input.platform)
31
+ params.push(`platform=${input.platform}`);
32
+ if (typeof input.limit === "number")
33
+ params.push(`limit=${input.limit}`);
34
+ if (typeof input.offset === "number")
35
+ params.push(`offset=${input.offset}`);
36
+ return params.length === 0 ? "" : `?${params.join("&")}`;
37
+ }
38
+ export function createListScheduledPostsTool(deps) {
39
+ return {
40
+ name: "list_scheduled_posts",
41
+ description: "List scheduled social posts. Optional filters: status ('scheduled' | 'processing' | 'posted' | 'failed'), platform, limit (default 20, max 100), offset. Use this when the user asks about their calendar, queue, or upcoming posts.",
42
+ inputSchema: InputSchema,
43
+ annotations: {
44
+ title: "List scheduled posts",
45
+ readOnlyHint: true,
46
+ openWorldHint: true,
47
+ },
48
+ async handler(input) {
49
+ InputSchema.parse(input);
50
+ const rl = deps.rateLimiter.check("list_scheduled_posts");
51
+ if (!rl.allowed) {
52
+ return { content: [{ type: "text", text: RATE_LIMIT_MSG }] };
53
+ }
54
+ try {
55
+ const res = await deps.client.request(`/schedule${buildQueryString(input)}`, {
56
+ method: "GET",
57
+ timeoutMs: 10_000,
58
+ retryIdempotent: true,
59
+ });
60
+ if (!res.ok) {
61
+ return {
62
+ content: [
63
+ {
64
+ type: "text",
65
+ text: translateHttpError(res.httpStatus, res.body),
66
+ },
67
+ ],
68
+ };
69
+ }
70
+ const body = res.body;
71
+ const posts = Array.isArray(body.posts)
72
+ ? body.posts.map((p) => {
73
+ const post = p;
74
+ return {
75
+ id: sanitize(post.id, { maxLength: 64 }),
76
+ platform: sanitize(post.platform, { maxLength: 32 }),
77
+ caption: sanitize(post.caption, { maxLength: 2200 }),
78
+ title: post.title === null ? null : sanitize(post.title, { maxLength: 200 }),
79
+ status: sanitize(post.status, { maxLength: 32 }),
80
+ scheduled_at: sanitize(post.scheduled_at, { maxLength: 64 }),
81
+ posted_at: post.posted_at === null
82
+ ? null
83
+ : sanitize(post.posted_at, { maxLength: 64 }),
84
+ failure_reason: post.failure_reason === null
85
+ ? null
86
+ : sanitize(post.failure_reason, { maxLength: 500 }),
87
+ };
88
+ })
89
+ : [];
90
+ const payload = {
91
+ posts,
92
+ total: typeof body.total === "number" ? body.total : posts.length,
93
+ limit: typeof body.limit === "number" ? body.limit : 20,
94
+ offset: typeof body.offset === "number" ? body.offset : 0,
95
+ };
96
+ return {
97
+ content: [{ type: "text", text: JSON.stringify(payload) }],
98
+ };
99
+ }
100
+ catch (err) {
101
+ return {
102
+ content: [{ type: "text", text: translateNetworkError(err) }],
103
+ };
104
+ }
105
+ },
106
+ };
107
+ }
108
+ //# sourceMappingURL=list-scheduled-posts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-scheduled-posts.js","sourceRoot":"","sources":["../../src/tools/list-scheduled-posts.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "vugola-mcp",
3
- "version": "1.1.3",
4
- "mcpName": "io.github.vcoder25/vugola-mcp",
3
+ "version": "1.2.0",
4
+ "mcpName": "io.github.VCoder25/vugola-mcp",
5
5
  "description": "Official MCP server for Vugola — AI video clipping for agents.",
6
6
  "type": "module",
7
7
  "main": "dist/index.js",