@sudomock/mcp 1.0.2 → 1.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/README.md CHANGED
@@ -6,7 +6,8 @@
6
6
 
7
7
  ## Quick Start
8
8
 
9
- ### Option 1: Local (npx)
9
+ This is a local **stdio** server: your MCP client launches it as a child process
10
+ via `npx` and authenticates with your `SUDOMOCK_API_KEY`.
10
11
 
11
12
  ```bash
12
13
  claude mcp add sudomock \
@@ -35,29 +36,8 @@ Get your API key at [sudomock.com/dashboard/api-keys](https://sudomock.com/dashb
35
36
 
36
37
  </details>
37
38
 
38
- ### Option 2: Remote (OAuth)
39
-
40
- No API key needed. Your client opens a browser for login.
41
-
42
- ```bash
43
- claude mcp add --transport http sudomock https://mcp.sudomock.com
44
- ```
45
-
46
- <details>
47
- <summary>JSON config for other clients</summary>
48
-
49
- ```json
50
- {
51
- "mcpServers": {
52
- "sudomock": {
53
- "type": "http",
54
- "url": "https://mcp.sudomock.com"
55
- }
56
- }
57
- }
58
- ```
59
-
60
- </details>
39
+ > **Note:** A hosted remote (HTTP/OAuth) transport is not available yet. This
40
+ > package only ships the local stdio server shown above.
61
41
 
62
42
  ## Tools
63
43
 
@@ -66,28 +46,59 @@ claude mcp add --transport http sudomock https://mcp.sudomock.com
66
46
  | `list_mockups` | List your uploaded mockup templates | 0 |
67
47
  | `get_mockup_details` | Get smart object UUIDs, dimensions, blend modes | 0 |
68
48
  | `render_mockup` | Render a mockup with your artwork | 1 |
69
- | `ai_render` | AI-powered render without a PSD template | 5 |
70
- | `upload_psd` | Upload a Photoshop PSD/PSB template | 0 |
49
+ | `render_2d_mockup` | Render artwork onto a saved 2D mockup template (no PSD) | 5 |
50
+ | `render_video` | Animate a mockup into an AI video clip (always async) | cost-based (free: 1/lifetime) |
51
+ | `upload_psd` | Upload a Photoshop PSD/PSB template (sync or async) | 0 |
52
+ | `list_2d_mockups` | List your saved SudoAI 2D mockup templates | 0 |
53
+ | `get_2d_mockup` | Get one 2D mockup's details + print-area UUIDs | 0 |
54
+ | `delete_2d_mockup` | Delete a 2D mockup template | 0 |
55
+ | `get_job` | Check the status of an async job by job_id | 0 |
56
+ | `wait_for_job` | Poll an async job until it succeeds or fails | 0 |
57
+ | `list_jobs` | List your async jobs (renders, videos, uploads) | 0 |
71
58
  | `get_account` | Check plan, credits, and usage | 0 |
72
59
  | `update_mockup` | Rename a mockup template | 0 |
73
60
  | `delete_mockup` | Delete a mockup template | 0 |
74
61
  | `create_studio_session` | Create an embedded editor session | 0 |
62
+ | `create_webhook_endpoint` | Register a webhook for async job completion | 0 |
63
+ | `list_webhook_endpoints` | List your webhook endpoints | 0 |
64
+ | `update_webhook_endpoint` | Edit or enable/disable a webhook endpoint | 0 |
65
+ | `delete_webhook_endpoint` | Delete a webhook endpoint | 0 |
66
+ | `rotate_webhook_secret` | Rotate a webhook signing secret | 0 |
67
+ | `test_webhook_endpoint` | Send a signed `webhook.test` event | 0 |
68
+ | `list_webhook_deliveries` | List delivery attempts for an endpoint | 0 |
69
+ | `replay_webhook_delivery` | Replay a single failed delivery | 0 |
70
+
71
+ ### Async jobs
72
+
73
+ `render_mockup` and `upload_psd` accept `is_async: true`, and `render_video` is
74
+ always async. These return a `job_id` immediately (HTTP 202) instead of a
75
+ final result. Poll it with `get_job`, or let `wait_for_job` block until the job
76
+ reaches a terminal status and hands back `result_url`, `mockup_uuid`, `model`,
77
+ `credits_charged`, and `payg` (`{credits, unit_price, cost}` for pay-as-you-go
78
+ jobs, otherwise `null`).
79
+
80
+ ### Webhooks
81
+
82
+ Register an endpoint with `create_webhook_endpoint` to be notified when async
83
+ jobs finish. Deliveries are signed with TWO headers: `X-SudoMock-Signature`
84
+ (a hex HMAC-SHA256 over `${timestamp}.${rawBody}` using the secret returned at
85
+ creation/rotation) and `X-SudoMock-Timestamp` (unix seconds). Verify in constant
86
+ time and reject if `|now - timestamp| > 300s`. The delivery body is
87
+ `{event, job_id, kind, status, result_url, error, created_at}`. Event types:
88
+ `render.succeeded`, `render.failed`, `upload.succeeded`, `video.succeeded`,
89
+ `video.failed`, `webhook.test`.
75
90
 
76
91
  ## Example Prompts
77
92
 
78
93
  - "List my mockup templates"
79
94
  - "Render the t-shirt mockup with this design: https://example.com/logo.png"
95
+ - "List my 2D mockups, then render the first one with this artwork: https://example.com/logo.png"
96
+ - "Render this design asynchronously and wait for it to finish"
97
+ - "Animate the hoodie mockup into a 5-second video clip"
80
98
  - "Upload this PSD as a new template: https://example.com/mockup.psd"
99
+ - "Set up a webhook at https://example.com/hooks so I get notified when renders finish"
81
100
  - "How many credits do I have left?"
82
101
 
83
- ## Resources
84
-
85
- The server provides built-in documentation:
86
-
87
- - **Quick Start Guide** -- How to use the tools step by step
88
- - **Pricing** -- Live plan and credit information
89
- - **Formats** -- Supported output formats, blend modes, and PSD requirements
90
-
91
102
  ## Links
92
103
 
93
104
  - [Dashboard](https://sudomock.com/dashboard) -- Manage mockups and API keys
package/dist/index.d.ts CHANGED
@@ -8,5 +8,20 @@
8
8
  * Auth: SUDOMOCK_API_KEY environment variable
9
9
  * Transport: stdio (local process)
10
10
  */
11
- export {};
11
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
12
+ /**
13
+ * A queued (202 Accepted) async submission carries a job_id + status_url.
14
+ * Surface that contract plainly so an agent knows to poll instead of hunting
15
+ * for a result_url that does not exist yet. Every async submit endpoint
16
+ * (/renders, /psd/upload, /renders/video) returns `job_id` in its 202 body.
17
+ */
18
+ export declare function formatJobAccepted(result: unknown): string;
19
+ export declare const TERMINAL_JOB_STATUSES: Set<string>;
20
+ /**
21
+ * A job is done when its status is terminal. The poll response (GET
22
+ * /api/v1/jobs/{job_id}) always reports the job state in the `status` field.
23
+ */
24
+ export declare function isTerminalJob(job: Record<string, unknown>): boolean;
25
+ declare const server: McpServer;
26
+ export { server };
12
27
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA2GpE;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAezD;AAED,eAAO,MAAM,qBAAqB,aAAmC,CAAC;AAWtE;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAGnE;AAMD,QAAA,MAAM,MAAM,WAGV,CAAC;AAqxBH,OAAO,EAAE,MAAM,EAAE,CAAC"}
package/dist/index.js CHANGED
@@ -10,6 +10,7 @@
10
10
  */
11
11
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
12
12
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
13
+ import { pathToFileURL } from "node:url";
13
14
  import { z } from "zod";
14
15
  // ---------------------------------------------------------------------------
15
16
  // Configuration
@@ -17,7 +18,7 @@ import { z } from "zod";
17
18
  const BASE_URL = "https://api.sudomock.com";
18
19
  const DEFAULT_TIMEOUT = 30_000;
19
20
  const RENDER_TIMEOUT = 120_000;
20
- const USER_AGENT = "SudoMock-MCP/1.0 (stdio)";
21
+ const USER_AGENT = "SudoMock-MCP/1.3.0 (stdio)";
21
22
  function getApiKey() {
22
23
  const key = process.env.SUDOMOCK_API_KEY;
23
24
  if (!key) {
@@ -86,11 +87,52 @@ async function apiRequest({ method, path, params, body, timeout = DEFAULT_TIMEOU
86
87
  }
87
88
  }
88
89
  // ---------------------------------------------------------------------------
90
+ // Async job helpers
91
+ // ---------------------------------------------------------------------------
92
+ /**
93
+ * A queued (202 Accepted) async submission carries a job_id + status_url.
94
+ * Surface that contract plainly so an agent knows to poll instead of hunting
95
+ * for a result_url that does not exist yet. Every async submit endpoint
96
+ * (/renders, /psd/upload, /renders/video) returns `job_id` in its 202 body.
97
+ */
98
+ export function formatJobAccepted(result) {
99
+ const r = (result ?? {});
100
+ const jobId = r.job_id ?? null;
101
+ const statusUrl = r.status_url ?? (jobId ? `/api/v1/jobs/${jobId}` : null);
102
+ const summary = {
103
+ accepted: true,
104
+ job_id: jobId,
105
+ kind: r.kind ?? null,
106
+ status: r.status ?? "queued",
107
+ status_url: statusUrl,
108
+ next_step: "Poll get_job with this job_id, or call wait_for_job to block until it finishes.",
109
+ raw: result,
110
+ };
111
+ return JSON.stringify(summary, null, 2);
112
+ }
113
+ export const TERMINAL_JOB_STATUSES = new Set(["succeeded", "failed"]);
114
+ /** GET /api/v1/jobs/{job_id} -- owner-scoped job status snapshot. */
115
+ async function getJob(jobId) {
116
+ const result = (await apiRequest({
117
+ method: "GET",
118
+ path: `/api/v1/jobs/${jobId}`,
119
+ }));
120
+ return result;
121
+ }
122
+ /**
123
+ * A job is done when its status is terminal. The poll response (GET
124
+ * /api/v1/jobs/{job_id}) always reports the job state in the `status` field.
125
+ */
126
+ export function isTerminalJob(job) {
127
+ const status = typeof job.status === "string" ? job.status : "";
128
+ return TERMINAL_JOB_STATUSES.has(status);
129
+ }
130
+ // ---------------------------------------------------------------------------
89
131
  // Server
90
132
  // ---------------------------------------------------------------------------
91
133
  const server = new McpServer({
92
134
  name: "SudoMock",
93
- version: "1.0.0",
135
+ version: "1.3.0",
94
136
  });
95
137
  // ---------------------------------------------------------------------------
96
138
  // Tool 1: list_mockups
@@ -99,13 +141,15 @@ server.tool("list_mockups", "List your uploaded mockup templates with UUIDs, nam
99
141
  limit: z.number().min(1).max(100).default(20).describe("Results per page (1-100, default 20)"),
100
142
  offset: z.number().min(0).default(0).describe("Pagination offset (default 0)"),
101
143
  name: z.string().optional().describe("Filter by name (case-insensitive substring match)"),
102
- sort_by: z.enum(["created_at", "name"]).default("created_at").describe("Sort field"),
144
+ created_after: z.string().optional().describe("Only mockups created after this ISO 8601 timestamp"),
145
+ created_before: z.string().optional().describe("Only mockups created before this ISO 8601 timestamp"),
146
+ sort_by: z.enum(["created_at", "updated_at", "name"]).default("created_at").describe("Sort field"),
103
147
  sort_order: z.enum(["asc", "desc"]).default("desc").describe("Sort direction"),
104
- }, async ({ limit, offset, name, sort_by, sort_order }) => {
148
+ }, async ({ limit, offset, name, created_after, created_before, sort_by, sort_order }) => {
105
149
  const result = await apiRequest({
106
150
  method: "GET",
107
151
  path: "/api/v1/mockups",
108
- params: { limit, offset, name, sort_by, sort_order },
152
+ params: { limit, offset, name, created_after, created_before, sort: sort_by, order: sort_order },
109
153
  });
110
154
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
111
155
  });
@@ -156,8 +200,9 @@ server.tool("render_mockup", "Render a mockup by placing artwork onto a PSD temp
156
200
  artwork_url: z.string().describe("Public URL of the artwork image (PNG/JPG/WebP) to place on the mockup"),
157
201
  fit: z.enum(["fill", "contain", "cover"]).default("fill").describe("How artwork fills the smart object area"),
158
202
  image_format: z.enum(["webp", "png", "jpg"]).default("webp").describe("Output format"),
159
- image_size: z.number().min(100).max(10000).default(1920).describe("Output width in pixels"),
160
- quality: z.number().min(1).max(100).default(95).describe("Compression quality for webp/jpg"),
203
+ image_size: z.number().min(100).max(10000).default(2048).describe("Output width in pixels (default 2048)"),
204
+ quality: z.number().min(1).max(100).default(90).describe("Compression quality for webp/jpg (default 90)"),
205
+ dpi: z.number().int().min(72).max(2400).optional().describe("Print resolution 72-2400. Embeds a resolution tag into output metadata (JPEG Exif / PNG pHYs / WebP Exif). Does not change pixel size -- use image_size. jpg/png recommended for max compatibility."),
161
206
  rotate: z.number().min(-360).max(360).default(0).describe("Rotate artwork in degrees"),
162
207
  flip_horizontal: z.boolean().default(false).describe("Mirror artwork left-right"),
163
208
  flip_vertical: z.boolean().default(false).describe("Mirror artwork top-bottom"),
@@ -167,7 +212,13 @@ server.tool("render_mockup", "Render a mockup by placing artwork onto a PSD temp
167
212
  contrast: z.number().min(-100).max(100).default(0).describe("Contrast adjustment"),
168
213
  opacity: z.number().min(0).max(100).default(100).describe("Layer opacity percentage"),
169
214
  saturation: z.number().min(-100).max(100).default(0).describe("Saturation adjustment"),
215
+ vibrance: z.number().min(-100).max(100).default(0).describe("Vibrance adjustment (-100 to 100)"),
216
+ blur: z.number().min(0).max(100).default(0).describe("Gaussian blur strength (0 to 100)"),
170
217
  export_label: z.string().optional().describe("Optional label for file naming"),
218
+ is_async: z
219
+ .boolean()
220
+ .default(false)
221
+ .describe("Queue the render instead of waiting for it. When true the API returns 202 with a job_id immediately (no result_url yet) -- poll with get_job, or call wait_for_job to block until it finishes. Use for long renders or when running many in parallel."),
171
222
  }, async (args) => {
172
223
  const smartObject = {
173
224
  uuid: args.smart_object_uuid,
@@ -185,12 +236,19 @@ server.tool("render_mockup", "Render a mockup by placing artwork onto a PSD temp
185
236
  blending_mode: args.color_blend_mode ?? "normal",
186
237
  };
187
238
  }
188
- if (args.brightness || args.contrast || args.opacity !== 100 || args.saturation) {
239
+ if (args.brightness ||
240
+ args.contrast ||
241
+ args.opacity !== 100 ||
242
+ args.saturation ||
243
+ args.vibrance ||
244
+ args.blur) {
189
245
  smartObject.adjustment_layers = {
190
246
  brightness: args.brightness,
191
247
  contrast: args.contrast,
192
248
  opacity: args.opacity,
193
249
  saturation: args.saturation,
250
+ vibrance: args.vibrance,
251
+ blur: args.blur,
194
252
  };
195
253
  }
196
254
  const body = {
@@ -200,66 +258,320 @@ server.tool("render_mockup", "Render a mockup by placing artwork onto a PSD temp
200
258
  image_format: args.image_format,
201
259
  image_size: args.image_size,
202
260
  quality: args.quality,
261
+ ...(args.dpi !== undefined ? { dpi: args.dpi } : {}),
203
262
  },
204
263
  };
205
264
  if (args.export_label) {
206
265
  body.export_label = args.export_label;
207
266
  }
267
+ if (args.is_async) {
268
+ body.is_async = true;
269
+ }
208
270
  const result = await apiRequest({
209
271
  method: "POST",
210
272
  path: "/api/v1/renders",
211
273
  body,
212
274
  timeout: RENDER_TIMEOUT,
213
275
  });
276
+ if (args.is_async) {
277
+ return { content: [{ type: "text", text: formatJobAccepted(result) }] };
278
+ }
214
279
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
215
280
  });
216
281
  // ---------------------------------------------------------------------------
217
- // Tool 6: ai_render
282
+ // Tool 6: render_2d_mockup
218
283
  // ---------------------------------------------------------------------------
219
- server.tool("ai_render", "AI-powered mockup render without needing a PSD template. Upload any product photo + artwork, AI detects the printable surface and renders with perspective correction. Costs 5 credits.", {
220
- source_url: z.string().describe("Public URL of the product photo (e.g. a plain t-shirt photo)"),
221
- artwork_url: z.string().describe("Public URL of the artwork/design to place on the product"),
222
- product_type: z.string().optional().describe("Optional product category hint (e.g. 'tshirt', 'hoodie', 'mug')"),
223
- segment_index: z.number().optional().describe("Optional specific segment index (0-based) if the product has multiple printable areas"),
224
- image_format: z.enum(["webp", "png"]).default("webp").describe("Output format"),
225
- quality: z.number().min(1).max(100).default(95).describe("Compression quality"),
226
- }, async ({ source_url, artwork_url, product_type, segment_index, image_format, quality }) => {
284
+ server.tool("render_2d_mockup", "Render artwork onto a saved 2D mockup template (no PSD needed) with perspective correction. Needs mockup_uuid + print_area_uuid. Use list_2d_mockups to find mockup_uuid, then get_2d_mockup to read its quads[].print_area_id for print_area_uuid. Returns the CDN URL of the rendered image. Costs 5 credits. The mockup must be in 'ready' status (depth computation complete).", {
285
+ mockup_uuid: z.string().describe("UUID of the 2D mockup template (from list_2d_mockups, returned as mockup_id)."),
286
+ print_area_uuid: z.string().describe("UUID of the print area to render into (from get_2d_mockup, returned as quads[].print_area_id)."),
287
+ artwork_url: z.string().describe("Public URL of the artwork image (PNG/JPG/WebP) to place on the mockup"),
288
+ blend_mode: z.string().default("multiply").describe("Blend mode for artwork over the product surface: 'multiply' (fabric texture, default) or 'normal' (no texture). Free-form string -- other Photoshop blend modes the API supports are accepted too."),
289
+ opacity: z.number().min(0).max(100).default(100).describe("Artwork opacity percentage (0-100)"),
290
+ brightness: z.number().min(-150).max(150).default(0).describe("Brightness adjustment (-150 to 150)"),
291
+ contrast: z.number().min(-100).max(100).default(0).describe("Contrast adjustment (-100 to 100)"),
292
+ saturation: z.number().min(-100).max(100).default(0).describe("Saturation adjustment (-100 to 100)"),
293
+ warp_strength: z.number().min(0).max(2).default(1.5).describe("Mesh warp strength for fabric curvature (0.0-2.0, 0=disabled, default 1.5). Higher = more surface warp effect."),
294
+ rotation: z.number().min(-360).max(360).default(0).describe("Rotate artwork in degrees (-360 to 360)"),
295
+ position: z
296
+ .enum([
297
+ "center",
298
+ "top_left",
299
+ "top_center",
300
+ "top_right",
301
+ "center_left",
302
+ "center_right",
303
+ "bottom_left",
304
+ "bottom_center",
305
+ "bottom_right",
306
+ ])
307
+ .default("center")
308
+ .describe("Placement within the print area (default 'center')"),
309
+ coverage: z.number().min(10).max(100).default(70).describe("Percentage of the print area to cover (10-100, default 70)"),
310
+ fit: z.enum(["contain", "fill", "cover"]).default("contain").describe("How artwork fits the print area - 'contain' (fit inside, default), 'fill' (stretch), 'cover' (fill and crop)"),
311
+ image_format: z.enum(["webp", "png", "jpg"]).default("webp").describe("Output format - 'webp' (smaller, recommended), 'png' (lossless), 'jpg'"),
312
+ image_size: z.number().min(100).max(10000).default(2048).describe("Output width in pixels (100-10000, default 2048)"),
313
+ quality: z.number().min(1).max(100).default(90).describe("Compression quality for webp/jpg (1-100, default 90)"),
314
+ }, async (args) => {
227
315
  const body = {
228
- source_url,
229
- artwork_url,
230
- export_options: { image_format, quality },
316
+ mockup_uuid: args.mockup_uuid,
317
+ print_areas: [
318
+ {
319
+ uuid: args.print_area_uuid,
320
+ artwork_url: args.artwork_url,
321
+ adjustments: {
322
+ blend_mode: args.blend_mode,
323
+ opacity: args.opacity,
324
+ brightness: args.brightness,
325
+ contrast: args.contrast,
326
+ saturation: args.saturation,
327
+ warp_strength: args.warp_strength,
328
+ },
329
+ placement: {
330
+ position: args.position,
331
+ coverage: args.coverage,
332
+ fit: args.fit,
333
+ rotation: args.rotation,
334
+ },
335
+ },
336
+ ],
337
+ export_options: {
338
+ image_format: args.image_format,
339
+ image_size: args.image_size,
340
+ quality: args.quality,
341
+ },
231
342
  };
232
- if (product_type)
233
- body.product_type = product_type;
234
- if (segment_index !== undefined)
235
- body.segment_index = segment_index;
236
343
  const result = await apiRequest({
237
344
  method: "POST",
238
- path: "/api/v1/sudoai/render",
345
+ path: "/api/v1/sudoai/2d-mockup/render",
239
346
  body,
240
347
  timeout: RENDER_TIMEOUT,
241
348
  });
242
349
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
243
350
  });
244
351
  // ---------------------------------------------------------------------------
352
+ // Tool: list_2d_mockups
353
+ // ---------------------------------------------------------------------------
354
+ server.tool("list_2d_mockups", "List your saved SudoAI 2D mockup templates (no PSD). Returns each mockup's mockup_id, name, status, thumbnail, dimensions, and print_areas. Use the mockup_id with get_2d_mockup (to read print_area UUIDs) or render_2d_mockup. Costs 0 credits.", {
355
+ limit: z.number().min(1).max(100).default(20).describe("Results per page (1-100, default 20)"),
356
+ offset: z.number().min(0).default(0).describe("Pagination offset (default 0)"),
357
+ }, async ({ limit, offset }) => {
358
+ const result = await apiRequest({
359
+ method: "GET",
360
+ path: "/api/v1/sudoai/2d-mockups",
361
+ params: { limit, offset },
362
+ });
363
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
364
+ });
365
+ // ---------------------------------------------------------------------------
366
+ // Tool: get_2d_mockup
367
+ // ---------------------------------------------------------------------------
368
+ server.tool("get_2d_mockup", "Get one SudoAI 2D mockup's full details: status, thumbnail, source dimensions, and quads[] (each with print_area_id). Use a quads[].print_area_id as the print_area_uuid for render_2d_mockup. Costs 0 credits.", {
369
+ mockup_id: z.string().describe("UUID of the 2D mockup (mockup_id from list_2d_mockups)"),
370
+ }, async ({ mockup_id }) => {
371
+ const result = await apiRequest({
372
+ method: "GET",
373
+ path: `/api/v1/sudoai/2d-mockup/${mockup_id}`,
374
+ });
375
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
376
+ });
377
+ // ---------------------------------------------------------------------------
378
+ // Tool: delete_2d_mockup
379
+ // ---------------------------------------------------------------------------
380
+ server.tool("delete_2d_mockup", "Permanently delete a SudoAI 2D mockup template (and its masks, quads, and stored files). Cannot be undone. Costs 0 credits.", {
381
+ mockup_id: z.string().describe("UUID of the 2D mockup to delete (mockup_id from list_2d_mockups)"),
382
+ }, async ({ mockup_id }) => {
383
+ const result = await apiRequest({
384
+ method: "DELETE",
385
+ path: `/api/v1/sudoai/2d-mockup/${mockup_id}`,
386
+ });
387
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
388
+ });
389
+ // ---------------------------------------------------------------------------
245
390
  // Tool 7: upload_psd
246
391
  // ---------------------------------------------------------------------------
247
392
  server.tool("upload_psd", "Upload a Photoshop PSD/PSB file as a new mockup template. The PSD must have at least one Smart Object layer. Processing takes 5-30 seconds.", {
248
393
  psd_file_url: z.string().describe("Public URL to a .psd or .psb file (up to Adobe's official PSD file size limit)"),
249
394
  psd_name: z.string().optional().describe("Display name for the template (auto-generated from filename if omitted)"),
250
- }, async ({ psd_file_url, psd_name }) => {
395
+ is_async: z
396
+ .boolean()
397
+ .default(false)
398
+ .describe("Queue the upload instead of blocking. When true the API returns 202 with a job_id immediately -- poll with get_job (or wait_for_job) to learn when processing finishes and get the new mockup_uuid. Always free (0 credits), sync or async."),
399
+ }, async ({ psd_file_url, psd_name, is_async }) => {
251
400
  const body = { psd_file_url };
252
401
  if (psd_name)
253
402
  body.psd_name = psd_name;
403
+ if (is_async)
404
+ body.is_async = true;
254
405
  const result = await apiRequest({
255
406
  method: "POST",
256
407
  path: "/api/v1/psd/upload",
257
408
  body,
258
409
  timeout: RENDER_TIMEOUT,
259
410
  });
411
+ if (is_async) {
412
+ return { content: [{ type: "text", text: formatJobAccepted(result) }] };
413
+ }
414
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
415
+ });
416
+ // ---------------------------------------------------------------------------
417
+ // Tool: get_job
418
+ // ---------------------------------------------------------------------------
419
+ server.tool("get_job", "Get the current status of an async job (render, video, or PSD upload) by its job_id. Returns status (queued|running|succeeded|failed), and once succeeded: result_url, mockup_uuid, model, credits_charged, and payg ({credits, unit_price, cost} for pay-as-you-go jobs, else null) -- or error if failed. Get the job_id from a render_mockup/upload_psd call with is_async=true, or from render_video. To block until done, use wait_for_job instead.", {
420
+ job_id: z.string().describe("The job_id returned by an async submission (render_mockup is_async, upload_psd is_async, or render_video)"),
421
+ }, async ({ job_id }) => {
422
+ const result = await getJob(job_id);
260
423
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
261
424
  });
262
425
  // ---------------------------------------------------------------------------
426
+ // Tool: list_jobs
427
+ // ---------------------------------------------------------------------------
428
+ server.tool("list_jobs", "List your async jobs (renders, videos, PSD uploads), newest first. Use this to enumerate in-flight or finished jobs when you do not already hold a job_id. Keyset-paginated: pass the returned next_cursor to fetch the next page. Each job carries job_id, kind, status, model, result_url, mockup_uuid, credits_charged, and (for video) duration_seconds/audio.", {
429
+ kind: z.enum(["video", "render", "upload"]).optional().describe("Filter by job kind. Omit for all kinds."),
430
+ mockup_uuid: z.string().optional().describe("Filter by source mockup UUID (e.g. one mockup's videos). Raw-image videos are never returned by this filter."),
431
+ limit: z.number().int().min(1).max(50).default(20).describe("Max jobs per page (1-50, default 20)"),
432
+ cursor: z.string().optional().describe("Opaque keyset cursor from a prior page's next_cursor"),
433
+ }, async ({ kind, mockup_uuid, limit, cursor }) => {
434
+ const result = await apiRequest({
435
+ method: "GET",
436
+ path: "/api/v1/jobs",
437
+ params: { kind, mockup_uuid, limit, cursor },
438
+ });
439
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
440
+ });
441
+ // ---------------------------------------------------------------------------
442
+ // Tool: wait_for_job
443
+ // ---------------------------------------------------------------------------
444
+ server.tool("wait_for_job", "Poll an async job until it reaches a terminal status (succeeded or failed), then return the final job. Blocks while polling. Use after render_mockup/upload_psd with is_async=true or after render_video. On success the result includes result_url, mockup_uuid, model, credits_charged, and payg ({credits, unit_price, cost} or null); on failure it includes error.", {
445
+ job_id: z.string().describe("The job_id to wait on (from an async submission or render_video)"),
446
+ poll_interval_seconds: z
447
+ .number()
448
+ .min(1)
449
+ .max(30)
450
+ .default(3)
451
+ .describe("Seconds between status checks (1-30, default 3)"),
452
+ timeout_seconds: z
453
+ .number()
454
+ .min(5)
455
+ .max(900)
456
+ .default(300)
457
+ .describe("Give up after this many seconds if the job has not finished (5-900, default 300)"),
458
+ }, async ({ job_id, poll_interval_seconds, timeout_seconds }) => {
459
+ const deadline = Date.now() + timeout_seconds * 1000;
460
+ let job = await getJob(job_id);
461
+ while (!isTerminalJob(job)) {
462
+ if (Date.now() >= deadline) {
463
+ const timedOut = {
464
+ timed_out: true,
465
+ job_id,
466
+ waited_seconds: timeout_seconds,
467
+ last_status: job.status ?? "unknown",
468
+ message: "Job did not reach a terminal state within timeout_seconds. It may still be running -- call get_job later to check.",
469
+ last_job: job,
470
+ };
471
+ return { content: [{ type: "text", text: JSON.stringify(timedOut, null, 2) }] };
472
+ }
473
+ await new Promise((resolve) => setTimeout(resolve, poll_interval_seconds * 1000));
474
+ job = await getJob(job_id);
475
+ }
476
+ return { content: [{ type: "text", text: JSON.stringify(job, null, 2) }] };
477
+ });
478
+ // ---------------------------------------------------------------------------
479
+ // Tool: render_video
480
+ // ---------------------------------------------------------------------------
481
+ server.tool("render_video", "Animate a mockup into an AI video clip. TWO input modes (supply exactly one): RENDER mode (mockup_uuid + smart_object_uuid + artwork) produces a still render from the mockup (same shape as render_mockup), then animates it; RAW-IMAGE mode (image_url) animates a public image URL directly with no render step. Either way an auto-routed image-to-video model does the animation. ALWAYS async: returns 202 with a job_id immediately -- pair with get_job or wait_for_job. Credit cost is computed from model x duration x audio. duration_seconds must be one of the chosen model's allowed durations or the call fails with 400.", {
482
+ mockup_uuid: z.string().optional().describe("RENDER MODE: UUID of the mockup to animate (from list_mockups or upload_psd). Required in render mode. In raw-image mode it is an optional association (groups the clip under that mockup's 'Past clips')."),
483
+ smart_object_uuid: z.string().optional().describe("RENDER MODE: UUID of the smart object layer to place artwork on (from get_mockup_details). Required in render mode; omit in raw-image mode."),
484
+ artwork_url: z.string().optional().describe("RENDER MODE: public URL of the artwork image (PNG/JPG/WebP) to place on the mockup before animating. Provide this OR artwork_base64. Omit in raw-image mode."),
485
+ artwork_base64: z.string().optional().describe("RENDER MODE: raw base64-encoded artwork bytes (no data: prefix). Alternative to artwork_url that skips a server-side download (faster). Provide this OR artwork_url."),
486
+ artwork_content_type: z.enum(["image/png", "image/jpeg", "image/webp", "image/gif"]).optional().describe("MIME type for artwork_base64 (defaults to image/png if omitted)."),
487
+ image_url: z.string().optional().describe("RAW-IMAGE MODE: a public https png/jpg URL to animate directly (general image-to-video, no render step). Supply this OR (mockup_uuid + smart_object_uuid + artwork), never both."),
488
+ fit: z.enum(["fill", "contain", "cover"]).default("fill").describe("RENDER MODE: how artwork fills the smart object area in the still frame"),
489
+ asset_width: z.number().int().min(1).optional().describe("RENDER MODE: custom artwork width in pixels (overrides fit sizing)."),
490
+ asset_height: z.number().int().min(1).optional().describe("RENDER MODE: custom artwork height in pixels (overrides fit sizing)."),
491
+ asset_top: z.number().int().optional().describe("RENDER MODE: artwork top offset in pixels within the smart object area."),
492
+ asset_left: z.number().int().optional().describe("RENDER MODE: artwork left offset in pixels within the smart object area."),
493
+ duration_seconds: z
494
+ .number()
495
+ .int()
496
+ .min(1)
497
+ .max(15)
498
+ .default(5)
499
+ .describe("Clip length in seconds chosen by you. Must be one of the auto-routed model's allowed durations (e.g. Veo [4,5,6,8], Kling [5,10]) or the call is rejected with 400 (INVALID_VIDEO_DURATION). The 1-15 bound here is a coarse guard; the per-model set is the real constraint. The credit cost scales with this value."),
500
+ audio: z
501
+ .boolean()
502
+ .default(false)
503
+ .describe("Generate audio. Default off (muted clips are cheaper). Audio cost depends on the routed model: Veo bundles audio at a premium, Kling v3/2.6 charge an audio premium; Seedance and Wan add no audio cost."),
504
+ motion: z
505
+ .enum(["ambient", "showcase"])
506
+ .default("ambient")
507
+ .describe("'ambient' = subtle looping hero motion that keeps the print readable; 'showcase' = one deliberate camera/product move."),
508
+ advanced_model: z
509
+ .string()
510
+ .optional()
511
+ .describe("Escape hatch: explicit roster model id to override the auto-router (e.g. 'kling-v3-pro'). Eliminated/unknown ids are rejected. Omit to auto-route (recommended)."),
512
+ image_format: z.enum(["webp", "png", "jpg"]).default("webp").describe("Output format of the still input frame"),
513
+ image_size: z.number().min(100).max(10000).default(2048).describe("Width in pixels of the still input frame (default 2048)"),
514
+ quality: z.number().min(1).max(100).default(90).describe("Compression quality for the still input frame (webp/jpg, default 90)"),
515
+ webhook_url: z
516
+ .string()
517
+ .optional()
518
+ .describe("Optional completion webhook URL. Best-effort push; polling get_job remains the source of truth."),
519
+ }, async (args) => {
520
+ const video = {
521
+ duration_seconds: args.duration_seconds,
522
+ audio: args.audio,
523
+ motion: args.motion,
524
+ };
525
+ if (args.advanced_model) {
526
+ video.advanced_model = args.advanced_model;
527
+ }
528
+ const body = {
529
+ export_options: {
530
+ image_format: args.image_format,
531
+ image_size: args.image_size,
532
+ quality: args.quality,
533
+ },
534
+ video,
535
+ };
536
+ if (args.image_url) {
537
+ // RAW-IMAGE mode: animate the URL directly (no render). mockup_uuid, when
538
+ // present, is an optional association only -- the API ignores it as a render
539
+ // input. The two render-vs-raw modes are mutually exclusive (BE enforces XOR).
540
+ body.image_url = args.image_url;
541
+ if (args.mockup_uuid)
542
+ body.mockup_uuid = args.mockup_uuid;
543
+ }
544
+ else {
545
+ // RENDER mode: build the i2v input still from the mockup + artwork.
546
+ const asset = { fit: args.fit };
547
+ if (args.artwork_url)
548
+ asset.url = args.artwork_url;
549
+ if (args.artwork_base64) {
550
+ asset.base64 = args.artwork_base64;
551
+ if (args.artwork_content_type)
552
+ asset.content_type = args.artwork_content_type;
553
+ }
554
+ if (args.asset_width !== undefined || args.asset_height !== undefined) {
555
+ asset.size = { width: args.asset_width, height: args.asset_height };
556
+ }
557
+ if (args.asset_top !== undefined || args.asset_left !== undefined) {
558
+ asset.position = { top: args.asset_top, left: args.asset_left };
559
+ }
560
+ body.mockup_uuid = args.mockup_uuid;
561
+ body.smart_objects = [{ uuid: args.smart_object_uuid, asset }];
562
+ }
563
+ if (args.webhook_url) {
564
+ body.webhook = { url: args.webhook_url };
565
+ }
566
+ const result = await apiRequest({
567
+ method: "POST",
568
+ path: "/api/v1/renders/video",
569
+ body,
570
+ timeout: RENDER_TIMEOUT,
571
+ });
572
+ return { content: [{ type: "text", text: formatJobAccepted(result) }] };
573
+ });
574
+ // ---------------------------------------------------------------------------
263
575
  // Tool 8: get_account
264
576
  // ---------------------------------------------------------------------------
265
577
  server.tool("get_account", "Get your account info: subscription plan, credit balance, usage stats, billing period, and API key details.", {}, async () => {
@@ -272,14 +584,139 @@ server.tool("get_account", "Get your account info: subscription plan, credit bal
272
584
  // ---------------------------------------------------------------------------
273
585
  // Tool 9: create_studio_session
274
586
  // ---------------------------------------------------------------------------
275
- server.tool("create_studio_session", "Create an embedded studio session for interactive mockup editing in a web page. Returns a 15-minute session token for iframe embedding.", {
587
+ server.tool("create_studio_session", "Create an embedded studio session for interactive mockup editing in a web page. Returns a 15-minute session token (sess_...) for iframe embedding; the token auto-extends on use. Authenticated with your API key.", {
276
588
  mockup_uuid: z.string().describe("UUID of the mockup to edit"),
277
- smart_object_uuid: z.string().describe("UUID of the smart object to customize"),
278
- }, async ({ mockup_uuid, smart_object_uuid }) => {
589
+ product_id: z.string().optional().describe("Optional platform product ID to associate with the session"),
590
+ }, async ({ mockup_uuid, product_id }) => {
591
+ const body = { mockup_uuid };
592
+ if (product_id)
593
+ body.product_id = product_id;
279
594
  const result = await apiRequest({
280
595
  method: "POST",
281
596
  path: "/api/v1/studio/create-session",
282
- body: { mockup_uuid, smart_object_uuid },
597
+ body,
598
+ });
599
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
600
+ });
601
+ // ---------------------------------------------------------------------------
602
+ // Webhook endpoints
603
+ //
604
+ // Manage outbound webhooks so your endpoint is notified when async jobs finish.
605
+ // Deliveries are signed with TWO headers: "X-SudoMock-Signature: <hex>" (the
606
+ // HMAC-SHA256 over `${timestamp}.${rawBody}` with the endpoint's secret) and
607
+ // "X-SudoMock-Timestamp: <unix-seconds>". Verify in constant time and reject if
608
+ // |now - timestamp| > 300s (User-Agent SudoMock-Webhook/1.0). The delivery body
609
+ // is {event, job_id, kind, status, result_url, error, created_at}.
610
+ //
611
+ // Event types: render.succeeded, render.failed, upload.succeeded,
612
+ // video.succeeded, video.failed, webhook.test.
613
+ // ---------------------------------------------------------------------------
614
+ const WEBHOOK_EVENT_TYPES = [
615
+ "render.succeeded",
616
+ "render.failed",
617
+ "upload.succeeded",
618
+ "video.succeeded",
619
+ "video.failed",
620
+ "webhook.test",
621
+ ];
622
+ server.tool("create_webhook_endpoint", "Register a webhook endpoint that SudoMock calls when async jobs finish. The signing secret is returned IN FULL exactly once here -- store it to verify the HMAC carried in the X-SudoMock-Signature header (with X-SudoMock-Timestamp) on incoming deliveries. URL must be https and publicly routable.", {
623
+ url: z.string().describe("https endpoint URL to receive POST deliveries (publicly routable; private/loopback hosts are rejected)"),
624
+ event_types: z
625
+ .array(z.enum(WEBHOOK_EVENT_TYPES))
626
+ .default([])
627
+ .describe("Event types to subscribe to (render.succeeded, render.failed, upload.succeeded, video.succeeded, video.failed, webhook.test). Pass an empty array (the default) to subscribe to ALL events."),
628
+ description: z.string().max(255).optional().describe("Optional human-readable label for this endpoint"),
629
+ }, async ({ url, event_types, description }) => {
630
+ const body = { url, event_types };
631
+ if (description)
632
+ body.description = description;
633
+ const result = await apiRequest({
634
+ method: "POST",
635
+ path: "/api/v1/webhook-endpoints",
636
+ body,
637
+ });
638
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
639
+ });
640
+ server.tool("list_webhook_endpoints", "List your registered webhook endpoints (id, url, subscribed event_types, enabled state). Secrets are NOT returned here -- only at creation and rotation.", {}, async () => {
641
+ const result = await apiRequest({
642
+ method: "GET",
643
+ path: "/api/v1/webhook-endpoints",
644
+ });
645
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
646
+ });
647
+ server.tool("update_webhook_endpoint", "Update a webhook endpoint in place: change its url, description, subscribed event_types, or enable/disable it (enabled:false pauses deliveries without losing the signing secret). All fields optional -- only the ones you pass are changed. The secret is NOT rotated or returned here.", {
648
+ endpoint_id: z.string().describe("The id of the webhook endpoint to update (from list_webhook_endpoints)"),
649
+ url: z.string().optional().describe("New https endpoint URL (publicly routable; private/loopback hosts are rejected)"),
650
+ description: z.string().max(255).optional().describe("New human-readable label"),
651
+ event_types: z
652
+ .array(z.enum(WEBHOOK_EVENT_TYPES))
653
+ .optional()
654
+ .describe("Replacement list of subscribed event types. Pass an empty array to subscribe to ALL events."),
655
+ enabled: z.boolean().optional().describe("Set false to pause deliveries (secret preserved), true to resume"),
656
+ }, async ({ endpoint_id, url, description, event_types, enabled }) => {
657
+ const body = {};
658
+ if (url !== undefined)
659
+ body.url = url;
660
+ if (description !== undefined)
661
+ body.description = description;
662
+ if (event_types !== undefined)
663
+ body.event_types = event_types;
664
+ if (enabled !== undefined)
665
+ body.enabled = enabled;
666
+ const result = await apiRequest({
667
+ method: "PATCH",
668
+ path: `/api/v1/webhook-endpoints/${endpoint_id}`,
669
+ body,
670
+ });
671
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
672
+ });
673
+ server.tool("delete_webhook_endpoint", "Permanently delete a webhook endpoint. SudoMock stops delivering to it. Cannot be undone.", {
674
+ endpoint_id: z.string().describe("The id of the webhook endpoint to delete (from list_webhook_endpoints)"),
675
+ }, async ({ endpoint_id }) => {
676
+ await apiRequest({
677
+ method: "DELETE",
678
+ path: `/api/v1/webhook-endpoints/${endpoint_id}`,
679
+ });
680
+ return { content: [{ type: "text", text: `Webhook endpoint ${endpoint_id} deleted successfully.` }] };
681
+ });
682
+ server.tool("rotate_webhook_secret", "Rotate the signing secret for a webhook endpoint. A new secret is returned IN FULL exactly once -- update your verifier with it. The old secret stops being valid.", {
683
+ endpoint_id: z.string().describe("The id of the webhook endpoint to rotate (from list_webhook_endpoints)"),
684
+ }, async ({ endpoint_id }) => {
685
+ const result = await apiRequest({
686
+ method: "POST",
687
+ path: `/api/v1/webhook-endpoints/${endpoint_id}/rotate-secret`,
688
+ });
689
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
690
+ });
691
+ server.tool("test_webhook_endpoint", "Send a synthetic webhook.test event through the real signed delivery path to verify your endpoint is reachable and your signature verification works. Returns the enqueued test job_id; check the result with list_webhook_deliveries.", {
692
+ endpoint_id: z.string().describe("The id of the webhook endpoint to test (from list_webhook_endpoints)"),
693
+ }, async ({ endpoint_id }) => {
694
+ const result = await apiRequest({
695
+ method: "POST",
696
+ path: `/api/v1/webhook-endpoints/${endpoint_id}/test`,
697
+ });
698
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
699
+ });
700
+ server.tool("list_webhook_deliveries", "List delivery attempts for a webhook endpoint (status, event_type, response code, timestamps). Use this to debug failed deliveries before replaying them.", {
701
+ endpoint_id: z.string().describe("The id of the webhook endpoint (from list_webhook_endpoints)"),
702
+ status: z.string().optional().describe("Filter by delivery status (e.g. 'failed', 'succeeded')"),
703
+ event_type: z.enum(WEBHOOK_EVENT_TYPES).optional().describe("Filter by event type"),
704
+ limit: z.number().int().min(1).max(200).default(50).describe("Max deliveries to return (1-200, default 50)"),
705
+ }, async ({ endpoint_id, status, event_type, limit }) => {
706
+ const result = await apiRequest({
707
+ method: "GET",
708
+ path: `/api/v1/webhook-endpoints/${endpoint_id}/deliveries`,
709
+ params: { status, event_type, limit },
710
+ });
711
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
712
+ });
713
+ server.tool("replay_webhook_delivery", "Re-enqueue a single webhook delivery with the SAME idempotency key (job_id:event_type), e.g. after fixing your endpoint. Get delivery_id from list_webhook_deliveries.", {
714
+ endpoint_id: z.string().describe("The id of the webhook endpoint (from list_webhook_endpoints)"),
715
+ delivery_id: z.string().describe("The id of the delivery to replay (from list_webhook_deliveries)"),
716
+ }, async ({ endpoint_id, delivery_id }) => {
717
+ const result = await apiRequest({
718
+ method: "POST",
719
+ path: `/api/v1/webhook-endpoints/${endpoint_id}/deliveries/${delivery_id}/replay`,
283
720
  });
284
721
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
285
722
  });
@@ -290,8 +727,16 @@ async function main() {
290
727
  const transport = new StdioServerTransport();
291
728
  await server.connect(transport);
292
729
  }
293
- main().catch((err) => {
294
- console.error("SudoMock MCP server failed to start:", err);
295
- process.exit(1);
296
- });
730
+ // Only start the stdio transport when this file is executed directly (the bin
731
+ // entrypoint). When imported (e.g. by the test suite) we expose `server` without
732
+ // connecting, so tests can introspect it over an in-memory transport.
733
+ const isEntrypoint = process.argv[1] !== undefined &&
734
+ import.meta.url === pathToFileURL(process.argv[1]).href;
735
+ if (isEntrypoint) {
736
+ main().catch((err) => {
737
+ console.error("SudoMock MCP server failed to start:", err);
738
+ process.exit(1);
739
+ });
740
+ }
741
+ export { server };
297
742
  //# sourceMappingURL=index.js.map
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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sudomock/mcp",
3
- "version": "1.0.2",
3
+ "version": "1.3.0",
4
4
  "mcpName": "io.github.sudomock/mcp",
5
5
  "description": "SudoMock MCP server for Claude, Cursor, and VS Code. Generate photorealistic product mockups from Photoshop PSD templates.",
6
6
  "keywords": [
@@ -34,6 +34,7 @@
34
34
  "build": "tsc",
35
35
  "dev": "tsc --watch",
36
36
  "start": "node dist/index.js",
37
+ "test": "tsc -p tsconfig.test.json && node --test \".test-build/test/**/*.test.js\"",
37
38
  "prepublishOnly": "npm run build"
38
39
  },
39
40
  "dependencies": {