@metalevel/snapix-mcp-server 0.1.1

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.
Files changed (83) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +161 -0
  3. package/dist/client.d.ts +30 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +203 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/constants.d.ts +7 -0
  8. package/dist/constants.d.ts.map +1 -0
  9. package/dist/constants.js +11 -0
  10. package/dist/constants.js.map +1 -0
  11. package/dist/errors.d.ts +18 -0
  12. package/dist/errors.d.ts.map +1 -0
  13. package/dist/errors.js +48 -0
  14. package/dist/errors.js.map +1 -0
  15. package/dist/index.d.ts +3 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +14 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/resources/galleries.d.ts +4 -0
  20. package/dist/resources/galleries.d.ts.map +1 -0
  21. package/dist/resources/galleries.js +35 -0
  22. package/dist/resources/galleries.js.map +1 -0
  23. package/dist/resources/images.d.ts +4 -0
  24. package/dist/resources/images.d.ts.map +1 -0
  25. package/dist/resources/images.js +35 -0
  26. package/dist/resources/images.js.map +1 -0
  27. package/dist/server.d.ts +9 -0
  28. package/dist/server.d.ts.map +1 -0
  29. package/dist/server.js +56 -0
  30. package/dist/server.js.map +1 -0
  31. package/dist/tools/convert.d.ts +4 -0
  32. package/dist/tools/convert.d.ts.map +1 -0
  33. package/dist/tools/convert.js +28 -0
  34. package/dist/tools/convert.js.map +1 -0
  35. package/dist/tools/create-gallery.d.ts +4 -0
  36. package/dist/tools/create-gallery.d.ts.map +1 -0
  37. package/dist/tools/create-gallery.js +34 -0
  38. package/dist/tools/create-gallery.js.map +1 -0
  39. package/dist/tools/delete-gallery.d.ts +4 -0
  40. package/dist/tools/delete-gallery.d.ts.map +1 -0
  41. package/dist/tools/delete-gallery.js +26 -0
  42. package/dist/tools/delete-gallery.js.map +1 -0
  43. package/dist/tools/delete-image.d.ts +4 -0
  44. package/dist/tools/delete-image.d.ts.map +1 -0
  45. package/dist/tools/delete-image.js +22 -0
  46. package/dist/tools/delete-image.js.map +1 -0
  47. package/dist/tools/generate.d.ts +4 -0
  48. package/dist/tools/generate.d.ts.map +1 -0
  49. package/dist/tools/generate.js +61 -0
  50. package/dist/tools/generate.js.map +1 -0
  51. package/dist/tools/get-gallery.d.ts +4 -0
  52. package/dist/tools/get-gallery.d.ts.map +1 -0
  53. package/dist/tools/get-gallery.js +22 -0
  54. package/dist/tools/get-gallery.js.map +1 -0
  55. package/dist/tools/get-image.d.ts +4 -0
  56. package/dist/tools/get-image.d.ts.map +1 -0
  57. package/dist/tools/get-image.js +22 -0
  58. package/dist/tools/get-image.js.map +1 -0
  59. package/dist/tools/list-galleries.d.ts +4 -0
  60. package/dist/tools/list-galleries.d.ts.map +1 -0
  61. package/dist/tools/list-galleries.js +18 -0
  62. package/dist/tools/list-galleries.js.map +1 -0
  63. package/dist/tools/list-images.d.ts +4 -0
  64. package/dist/tools/list-images.d.ts.map +1 -0
  65. package/dist/tools/list-images.js +34 -0
  66. package/dist/tools/list-images.js.map +1 -0
  67. package/dist/tools/update-gallery.d.ts +4 -0
  68. package/dist/tools/update-gallery.d.ts.map +1 -0
  69. package/dist/tools/update-gallery.js +27 -0
  70. package/dist/tools/update-gallery.js.map +1 -0
  71. package/dist/tools/update-image.d.ts +4 -0
  72. package/dist/tools/update-image.d.ts.map +1 -0
  73. package/dist/tools/update-image.js +32 -0
  74. package/dist/tools/update-image.js.map +1 -0
  75. package/dist/tools/upload-image.d.ts +4 -0
  76. package/dist/tools/upload-image.d.ts.map +1 -0
  77. package/dist/tools/upload-image.js +68 -0
  78. package/dist/tools/upload-image.js.map +1 -0
  79. package/dist/types.d.ts +67 -0
  80. package/dist/types.d.ts.map +1 -0
  81. package/dist/types.js +2 -0
  82. package/dist/types.js.map +1 -0
  83. package/package.json +54 -0
package/README.md ADDED
@@ -0,0 +1,161 @@
1
+ # @metalevel/snapix-mcp-server
2
+
3
+ MCP server for [SnapiX](https://www.snapix.space) — image optimization, conversion, AI generation, and gallery management via the [Model Context Protocol](https://modelcontextprotocol.io).
4
+
5
+ ## Quick Start — Local (stdio)
6
+
7
+ Add to your AI client configuration:
8
+
9
+ ### VS Code (Copilot)
10
+
11
+ Add to `.vscode/mcp.json`:
12
+
13
+ ```json
14
+ {
15
+ "inputs": [
16
+ {
17
+ "id": "SNAPIX_API_KEY",
18
+ "type": "promptString",
19
+ "description": "SnapiX API key",
20
+ "password": true
21
+ }
22
+ ],
23
+ "servers": {
24
+ "snapix": {
25
+ "command": "npx",
26
+ "args": ["-y", "@metalevel/snapix-mcp-server"],
27
+ "env": {
28
+ "SNAPIX_API_KEY": "${input:SNAPIX_API_KEY}"
29
+ }
30
+ }
31
+ }
32
+ }
33
+ ```
34
+
35
+ ### Claude Desktop
36
+
37
+ Add to your Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):
38
+
39
+ ```json
40
+ {
41
+ "mcpServers": {
42
+ "snapix": {
43
+ "command": "npx",
44
+ "args": ["-y", "@metalevel/snapix-mcp-server"],
45
+ "env": {
46
+ "SNAPIX_API_KEY": "your-api-key-here"
47
+ }
48
+ }
49
+ }
50
+ }
51
+ ```
52
+
53
+ ## Quick Start — Remote (HTTP)
54
+
55
+ For clients that support Streamable HTTP transport, point to the hosted endpoint:
56
+
57
+ ```txt
58
+ https://www.snapix.space/api/mcp
59
+ ```
60
+
61
+ Pass your API key via the `Authorization` header:
62
+
63
+ ```ini
64
+ Authorization: Bearer <your-api-key>
65
+ ```
66
+
67
+ The remote endpoint operates in stateless mode — no session persistence between requests.
68
+
69
+ ### VS Code (Copilot)
70
+
71
+ Add to `.vscode/mcp.json`:
72
+
73
+ ```json
74
+ {
75
+ "inputs": [
76
+ {
77
+ "id": "SNAPIX_API_KEY",
78
+ "type": "promptString",
79
+ "description": "SnapiX API key",
80
+ "password": true
81
+ }
82
+ ],
83
+ "servers": {
84
+ "snapix": {
85
+ "type": "http",
86
+ "url": "https://www.snapix.space/api/mcp",
87
+ "headers": {
88
+ "Authorization": "Bearer ${input:SNAPIX_API_KEY}"
89
+ }
90
+ }
91
+ }
92
+ }
93
+ ```
94
+
95
+ ## Environment Variables
96
+
97
+ | Variable | Required | Default | Description |
98
+ | --- | --- | --- | --- |
99
+ | `SNAPIX_API_KEY` | Yes | — | Your SnapiX API key |
100
+
101
+ ## Available Tools
102
+
103
+ | Tool | Description | Credits |
104
+ | --- | --- | --- |
105
+ | `snapix_convert_image` | Guidance tool — explains how to convert images using the upload tool | Free |
106
+ | `snapix_upload_image` | Upload an image from URL, optionally convert format and resize | 1+ |
107
+ | `snapix_generate_image` | Generate an image from a text prompt (Gemini AI)* | 40+ |
108
+ | `snapix_list_images` | List images with pagination and filtering | Free |
109
+ | `snapix_get_image` | Get full details for a single image | Free |
110
+ | `snapix_update_image` | Update image metadata or gallery assignments | Free |
111
+ | `snapix_delete_image` | Permanently delete an image | Free |
112
+ | `snapix_create_gallery` | Create a new gallery, optionally with existing images | Free |
113
+ | `snapix_list_galleries` | List all galleries | Free |
114
+ | `snapix_get_gallery` | Get gallery details with all images | Free |
115
+ | `snapix_update_gallery` | Update gallery name or visibility | Free |
116
+ | `snapix_delete_gallery` | Delete a gallery, optionally with all images | Free |
117
+
118
+ * `snapix_generate_image` the only option that requires a paid subscription, it accepts a text prompt and template image (or image URL) and generates an image using Gemini AI.
119
+
120
+ ## Resources
121
+
122
+ MCP Resources provide passive context that AI clients can pre-load without making explicit tool calls.
123
+
124
+ | URI | Description |
125
+ | --- | --- |
126
+ | `snapix://galleries` | All galleries (name, id, visibility, image count) |
127
+ | `snapix://galleries/{galleryId}` | Gallery details with all images and CDN URLs |
128
+ | `snapix://images` | Recent images (first page) with metadata and CDN URLs |
129
+ | `snapix://images/{imageId}` | Full image metadata, variants, dimensions, and CDN URLs |
130
+
131
+ ## Rate Limiting
132
+
133
+ The MCP server respects the same rate limits as the REST API. When a rate limit is hit (HTTP 429), the server returns an MCP error with a retryable flag, signaling to the AI client that it should wait and retry the request.
134
+
135
+ ## Credits & Quotas
136
+
137
+ * **Free operations**: listing, getting, updating metadata, and deleting images/galleries
138
+ * **Credit-consuming operations**: uploading images (1+ credits), generating images (40+ credits)
139
+ * Credit costs follow the same rules as the [REST API](https://www.snapix.space/docs/api#app-credits)
140
+ * When credits are exhausted, the server returns a clear error message
141
+
142
+ ## Programmatic Usage
143
+
144
+ ```typescript
145
+ import { createSnapixMcpServer } from "@metalevel/snapix-mcp-server";
146
+
147
+ const server = createSnapixMcpServer({
148
+ baseUrl: "https://www.snapix.space",
149
+ apiKey: process.env.SNAPIX_API_KEY!,
150
+ });
151
+ ```
152
+
153
+ ## Documentation
154
+
155
+ * [Full MCP docs](https://www.snapix.space/docs/mcp)
156
+ * [REST API docs](https://www.snapix.space/docs/api)
157
+ * [Get API key](https://www.snapix.space/user/api-keys)
158
+
159
+ ## License
160
+
161
+ MIT
@@ -0,0 +1,30 @@
1
+ import { type CreateGalleryParams, type GenerateImageParams, type ListImagesParams, type SnapixClientConfig, type UpdateGalleryParams, type UpdateImageParams, type UploadImageParams } from "./types.js";
2
+ export declare class SnapixClient {
3
+ private baseUrl;
4
+ private apiKey;
5
+ constructor(config: SnapixClientConfig);
6
+ private get headers();
7
+ private handleResponse;
8
+ private buildFormData;
9
+ /**
10
+ * Image endpoints
11
+ */
12
+ uploadImage(params: UploadImageParams): Promise<unknown>;
13
+ listImages(params?: ListImagesParams): Promise<unknown>;
14
+ getImage(imageId: string): Promise<unknown>;
15
+ updateImage(imageId: string, params: UpdateImageParams): Promise<unknown>;
16
+ deleteImage(imageId: string): Promise<unknown>;
17
+ /**
18
+ * Generate endpoint
19
+ */
20
+ generateImage(params: GenerateImageParams): Promise<unknown>;
21
+ /**
22
+ * Gallery endpoints
23
+ */
24
+ createGallery(params: CreateGalleryParams): Promise<unknown>;
25
+ listGalleries(): Promise<unknown>;
26
+ getGallery(galleryId: string): Promise<unknown>;
27
+ updateGallery(galleryId: string, params: UpdateGalleryParams): Promise<unknown>;
28
+ deleteGallery(galleryId: string, deleteImages?: boolean): Promise<unknown>;
29
+ }
30
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACvB,MAAM,YAAY,CAAC;AAEpB,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,kBAAkB;IAKtC,OAAO,KAAK,OAAO,GAElB;YAEa,cAAc;IA6B5B,OAAO,CAAC,aAAa;IAkBrB;;OAEG;IAEG,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IAoCxD,UAAU,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAwBvD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS3C,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBzE,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAapD;;OAEG;IAEG,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;IAyBlE;;OAEG;IAEG,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;IAU5D,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IASjC,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS/C,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;IAU/E,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;CAcjF"}
package/dist/client.js ADDED
@@ -0,0 +1,203 @@
1
+ import { API_URI_GALLERIES, API_URI_GENERATE, API_URI_IMAGES } from "./constants.js";
2
+ import { SnapixApiError } from "./errors.js";
3
+ export class SnapixClient {
4
+ baseUrl;
5
+ apiKey;
6
+ constructor(config) {
7
+ this.baseUrl = config.baseUrl.replace(/\/$/, "");
8
+ this.apiKey = config.apiKey;
9
+ }
10
+ get headers() {
11
+ return { Authorization: `Bearer ${this.apiKey}` };
12
+ }
13
+ async handleResponse(response) {
14
+ if (!response.ok) {
15
+ let body;
16
+ try {
17
+ body = await response.json();
18
+ }
19
+ catch {
20
+ body = await response.text().catch(() => undefined);
21
+ }
22
+ const message = body && typeof body === "object" && "error" in body
23
+ ? String(body.error)
24
+ : body && typeof body === "object" && "message" in body
25
+ ? String(body.message)
26
+ : `HTTP ${response.status}: ${response.statusText}`;
27
+ throw new SnapixApiError(message, response.status, body);
28
+ }
29
+ const contentType = response.headers.get("content-type") ?? "";
30
+ if (contentType.includes("application/json")) {
31
+ return response.json();
32
+ }
33
+ return response.text();
34
+ }
35
+ buildFormData(params) {
36
+ const formData = new FormData();
37
+ for (const [key, value] of Object.entries(params)) {
38
+ if (value === undefined || value === null) {
39
+ continue;
40
+ }
41
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
42
+ formData.append(key, String(value));
43
+ }
44
+ else {
45
+ formData.append(key, JSON.stringify(value));
46
+ }
47
+ }
48
+ return formData;
49
+ }
50
+ /**
51
+ * Image endpoints
52
+ */
53
+ async uploadImage(params) {
54
+ const formData = this.buildFormData({
55
+ name: params.name,
56
+ description: params.description,
57
+ contentType: params.contentType ?? params.imageContentType,
58
+ ratio: params.ratio !== undefined ? JSON.stringify(params.ratio) : undefined,
59
+ resizeOptions: params.resizeOptions !== undefined ? JSON.stringify(params.resizeOptions) : undefined,
60
+ formatOptions: params.formatOptions !== undefined ? JSON.stringify(params.formatOptions) : undefined,
61
+ galleries: params.galleries !== undefined ? JSON.stringify(params.galleries) : undefined,
62
+ bucketKey: params.bucketKey,
63
+ prefix: params.prefix,
64
+ storageKeyHandling: params.storageKeyHandling,
65
+ });
66
+ if (params.imageBase64) {
67
+ const mimeType = params.imageContentType ?? params.contentType ?? "application/octet-stream";
68
+ const buffer = Buffer.from(params.imageBase64, "base64");
69
+ const blob = new Blob([buffer], { type: mimeType });
70
+ const ext = mimeType.split("/")[1] ?? "bin";
71
+ const filename = params.name ? `${params.name}.${ext}` : `upload.${ext}`;
72
+ formData.append("image", blob, filename);
73
+ }
74
+ else if (params.imageUrl) {
75
+ formData.append("url", params.imageUrl);
76
+ }
77
+ const response = await fetch(`${this.baseUrl}/${API_URI_IMAGES}`, {
78
+ method: "POST",
79
+ headers: this.headers,
80
+ body: formData,
81
+ });
82
+ return this.handleResponse(response);
83
+ }
84
+ async listImages(params) {
85
+ const searchParams = new URLSearchParams();
86
+ if (params?.page !== undefined) {
87
+ searchParams.set("page", String(params.page));
88
+ }
89
+ if (params?.limit !== undefined) {
90
+ searchParams.set("limit", String(params.limit));
91
+ }
92
+ if (params?.sort) {
93
+ searchParams.set("sort", params.sort);
94
+ }
95
+ if (params?.bucketKey) {
96
+ searchParams.set("bucketKey", params.bucketKey);
97
+ }
98
+ const query = searchParams.toString();
99
+ const url = `${this.baseUrl}/${API_URI_IMAGES}${query ? `?${query}` : ""}`;
100
+ const response = await fetch(url, { method: "GET", headers: this.headers });
101
+ return this.handleResponse(response);
102
+ }
103
+ async getImage(imageId) {
104
+ const response = await fetch(`${this.baseUrl}/${API_URI_IMAGES}/${imageId}`, {
105
+ method: "GET",
106
+ headers: this.headers,
107
+ });
108
+ return this.handleResponse(response);
109
+ }
110
+ async updateImage(imageId, params) {
111
+ const formData = this.buildFormData({
112
+ name: params.name,
113
+ description: params.description,
114
+ galleries: params.galleries !== undefined ? JSON.stringify(params.galleries) : undefined,
115
+ formatOptions: params.formatOptions !== undefined ? JSON.stringify(params.formatOptions) : undefined,
116
+ resizeOptions: params.resizeOptions !== undefined ? JSON.stringify(params.resizeOptions) : undefined,
117
+ });
118
+ const response = await fetch(`${this.baseUrl}/${API_URI_IMAGES}/${imageId}`, {
119
+ method: "PATCH",
120
+ headers: this.headers,
121
+ body: formData,
122
+ });
123
+ return this.handleResponse(response);
124
+ }
125
+ async deleteImage(imageId) {
126
+ const response = await fetch(`${this.baseUrl}/${API_URI_IMAGES}/${imageId}`, {
127
+ method: "DELETE",
128
+ headers: this.headers,
129
+ });
130
+ if (response.status === 204) {
131
+ return { success: true };
132
+ }
133
+ return this.handleResponse(response);
134
+ }
135
+ /**
136
+ * Generate endpoint
137
+ */
138
+ async generateImage(params) {
139
+ const formData = this.buildFormData({
140
+ url: params.imageUrl,
141
+ prompt: params.promptText,
142
+ name: params.name,
143
+ description: params.description,
144
+ ratio: params.ratio !== undefined ? JSON.stringify(params.ratio) : undefined,
145
+ resizeOptions: params.resizeOptions !== undefined ? JSON.stringify(params.resizeOptions) : undefined,
146
+ formatOptions: params.formatOptions !== undefined ? JSON.stringify(params.formatOptions) : undefined,
147
+ galleries: params.galleries !== undefined ? JSON.stringify(params.galleries) : undefined,
148
+ bucketKey: params.bucketKey,
149
+ aiConfig: params.aiConfig !== undefined ? JSON.stringify(params.aiConfig) : undefined,
150
+ });
151
+ const response = await fetch(`${this.baseUrl}/${API_URI_GENERATE}`, {
152
+ method: "POST",
153
+ headers: this.headers,
154
+ body: formData,
155
+ });
156
+ return this.handleResponse(response);
157
+ }
158
+ /**
159
+ * Gallery endpoints
160
+ */
161
+ async createGallery(params) {
162
+ const response = await fetch(`${this.baseUrl}/${API_URI_GALLERIES}`, {
163
+ method: "POST",
164
+ headers: { ...this.headers, "Content-Type": "application/json" },
165
+ body: JSON.stringify(params),
166
+ });
167
+ return this.handleResponse(response);
168
+ }
169
+ async listGalleries() {
170
+ const response = await fetch(`${this.baseUrl}/${API_URI_GALLERIES}`, {
171
+ method: "GET",
172
+ headers: this.headers,
173
+ });
174
+ return this.handleResponse(response);
175
+ }
176
+ async getGallery(galleryId) {
177
+ const response = await fetch(`${this.baseUrl}/${API_URI_GALLERIES}/${galleryId}`, {
178
+ method: "GET",
179
+ headers: this.headers,
180
+ });
181
+ return this.handleResponse(response);
182
+ }
183
+ async updateGallery(galleryId, params) {
184
+ const response = await fetch(`${this.baseUrl}/${API_URI_GALLERIES}/${galleryId}`, {
185
+ method: "PATCH",
186
+ headers: { ...this.headers, "Content-Type": "application/json" },
187
+ body: JSON.stringify(params),
188
+ });
189
+ return this.handleResponse(response);
190
+ }
191
+ async deleteGallery(galleryId, deleteImages) {
192
+ const query = deleteImages ? "?deleteImages=true" : "";
193
+ const response = await fetch(`${this.baseUrl}/${API_URI_GALLERIES}/${galleryId}${query}`, {
194
+ method: "DELETE",
195
+ headers: this.headers,
196
+ });
197
+ if (response.status === 204) {
198
+ return { success: true };
199
+ }
200
+ return this.handleResponse(response);
201
+ }
202
+ }
203
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare const APP_MCP_BASE_URL: string;
2
+ export declare const APP_MCP_PACKAGE_VERSION: string;
3
+ export declare const APP_MCP_PACKAGE_NAME: string;
4
+ export declare const API_URI_IMAGES = "api/v1/images";
5
+ export declare const API_URI_GENERATE = "api/v1/generate";
6
+ export declare const API_URI_GALLERIES = "api/v1/galleries";
7
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,gBAAgB,QAA+C,CAAC;AAC7E,eAAO,MAAM,uBAAuB,QAAsB,CAAC;AAC3D,eAAO,MAAM,oBAAoB,QAAmB,CAAC;AAErD,eAAO,MAAM,cAAc,kBAAkB,CAAC;AAC9C,eAAO,MAAM,gBAAgB,oBAAoB,CAAC;AAClD,eAAO,MAAM,iBAAiB,qBAAqB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import packageJson from "../package.json" with { type: "json" };
2
+ // This is for testing purposes only - this is why it is not in the documentation.
3
+ const PROCESS_MCP_BASE_URL = process.env.MCP_BASE_URL;
4
+ const PACKAGE_MCP_BASE_URL = packageJson.mcpBaseUrl || "https://www.snapix.space";
5
+ export const APP_MCP_BASE_URL = PROCESS_MCP_BASE_URL ?? PACKAGE_MCP_BASE_URL;
6
+ export const APP_MCP_PACKAGE_VERSION = packageJson.version;
7
+ export const APP_MCP_PACKAGE_NAME = packageJson.name;
8
+ export const API_URI_IMAGES = "api/v1/images";
9
+ export const API_URI_GENERATE = "api/v1/generate";
10
+ export const API_URI_GALLERIES = "api/v1/galleries";
11
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAEhE,kFAAkF;AAClF,MAAM,oBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;AACtD,MAAM,oBAAoB,GAAI,WAAW,CAAC,UAAqB,IAAI,0BAA0B,CAAC;AAE9F,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAAoB,IAAI,oBAAoB,CAAC;AAC7E,MAAM,CAAC,MAAM,uBAAuB,GAAG,WAAW,CAAC,OAAO,CAAC;AAC3D,MAAM,CAAC,MAAM,oBAAoB,GAAG,WAAW,CAAC,IAAI,CAAC;AAErD,MAAM,CAAC,MAAM,cAAc,GAAG,eAAe,CAAC;AAC9C,MAAM,CAAC,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;AAClD,MAAM,CAAC,MAAM,iBAAiB,GAAG,kBAAkB,CAAC"}
@@ -0,0 +1,18 @@
1
+ export declare class SnapixApiError extends Error {
2
+ status: number;
3
+ responseBody?: unknown | undefined;
4
+ constructor(message: string, status: number, responseBody?: unknown | undefined);
5
+ get isRetryable(): boolean;
6
+ get message(): string;
7
+ }
8
+ export declare function handleToolError(error: unknown): {
9
+ content: {
10
+ type: "text";
11
+ text: string;
12
+ }[];
13
+ isError: true;
14
+ _meta?: {
15
+ retryable: boolean;
16
+ };
17
+ };
18
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,cAAe,SAAQ,KAAK;IAG9B,MAAM,EAAE,MAAM;IACd,YAAY,CAAC,EAAE,OAAO;gBAF7B,OAAO,EAAE,MAAM,EACR,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,OAAO,YAAA;IAM/B,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,OAAO,IAAI,MAAM,CAmBpB;CACF;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG;IAC/C,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C,OAAO,EAAE,IAAI,CAAC;IACd,KAAK,CAAC,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;CAChC,CAkBA"}
package/dist/errors.js ADDED
@@ -0,0 +1,48 @@
1
+ export class SnapixApiError extends Error {
2
+ status;
3
+ responseBody;
4
+ constructor(message, status, responseBody) {
5
+ super(message);
6
+ this.status = status;
7
+ this.responseBody = responseBody;
8
+ this.name = "SnapixApiError";
9
+ }
10
+ get isRetryable() {
11
+ return this.status === 429;
12
+ }
13
+ get message() {
14
+ let message;
15
+ switch (this.status) {
16
+ case 401:
17
+ message = "Invalid or missing API key.";
18
+ break;
19
+ case 402:
20
+ message = "Insufficient credits or quota exceeded.";
21
+ break;
22
+ case 429:
23
+ message = "Rate limit exceeded. Please wait before retrying.";
24
+ break;
25
+ default:
26
+ message = super.message || `API error (HTTP ${this.status})`;
27
+ // We use super.message because our getter overrides the default this.message property
28
+ }
29
+ return message;
30
+ }
31
+ }
32
+ export function handleToolError(error) {
33
+ if (error instanceof SnapixApiError) {
34
+ const retryable = error.isRetryable;
35
+ const message = error.message;
36
+ return {
37
+ content: [{ type: "text", text: message }],
38
+ isError: true,
39
+ ...(retryable ? { _meta: { retryable: true } } : {}),
40
+ };
41
+ }
42
+ const message = error instanceof Error ? error.message : "An unexpected error occurred.";
43
+ return {
44
+ content: [{ type: "text", text: message }],
45
+ isError: true,
46
+ };
47
+ }
48
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,cAAe,SAAQ,KAAK;IAG9B;IACA;IAHT,YACE,OAAe,EACR,MAAc,EACd,YAAsB;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,WAAM,GAAN,MAAM,CAAQ;QACd,iBAAY,GAAZ,YAAY,CAAU;QAG7B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC;IAC7B,CAAC;IAED,IAAI,OAAO;QACT,IAAI,OAAe,CAAC;QAEpB,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,KAAK,GAAG;gBACN,OAAO,GAAG,6BAA6B,CAAC;gBACxC,MAAM;YACR,KAAK,GAAG;gBACN,OAAO,GAAG,yCAAyC,CAAC;gBACpD,MAAM;YACR,KAAK,GAAG;gBACN,OAAO,GAAG,mDAAmD,CAAC;gBAC9D,MAAM;YACR;gBACE,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,mBAAmB,IAAI,CAAC,MAAM,GAAG,CAAC;YAC/D,sFAAsF;QACxF,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAK5C,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC;QACpC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAE9B,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;YACnD,OAAO,EAAE,IAAI;YACb,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrD,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,+BAA+B,CAAC;IAEzF,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QACnD,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { APP_MCP_BASE_URL } from "./constants.js";
4
+ import { createSnapixMcpServer } from "./server.js";
5
+ const apiKey = process.env.SNAPIX_API_KEY;
6
+ if (!apiKey) {
7
+ console.error("Error: SNAPIX_API_KEY environment variable is required.");
8
+ console.error(`Get your API key at ${APP_MCP_BASE_URL}/user/api-keys`);
9
+ process.exit(1);
10
+ }
11
+ const server = createSnapixMcpServer({ apiKey });
12
+ const transport = new StdioServerTransport();
13
+ await server.connect(transport);
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AAE1C,IAAI,CAAC,MAAM,EAAE,CAAC;IACZ,OAAO,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;IACzE,OAAO,CAAC,KAAK,CAAC,uBAAuB,gBAAgB,gBAAgB,CAAC,CAAC;IACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,MAAM,GAAG,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AACjD,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { type SnapixClient } from "../client.js";
3
+ export declare function registerGalleryResources(server: McpServer, client: SnapixClient): void;
4
+ //# sourceMappingURL=galleries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"galleries.d.ts","sourceRoot":"","sources":["../../src/resources/galleries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,yCAAyC,CAAC;AAE3F,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA8CtF"}
@@ -0,0 +1,35 @@
1
+ import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export function registerGalleryResources(server, client) {
3
+ server.resource("gallery-list", "snapix://galleries", {
4
+ description: "Lists all galleries for the authenticated user (name, id, visibility, image count)",
5
+ mimeType: "application/json",
6
+ }, async (uri) => {
7
+ const data = await client.listGalleries();
8
+ return {
9
+ contents: [
10
+ {
11
+ uri: uri.href,
12
+ mimeType: "application/json",
13
+ text: JSON.stringify(data, null, 2),
14
+ },
15
+ ],
16
+ };
17
+ });
18
+ server.resource("gallery-detail", new ResourceTemplate("snapix://galleries/{galleryId}", { list: undefined }), {
19
+ description: "Gallery details with all images, metadata, and CDN URLs",
20
+ mimeType: "application/json",
21
+ }, async (uri, variables) => {
22
+ const galleryId = String(variables.galleryId);
23
+ const data = await client.getGallery(galleryId);
24
+ return {
25
+ contents: [
26
+ {
27
+ uri: uri.href,
28
+ mimeType: "application/json",
29
+ text: JSON.stringify(data, null, 2),
30
+ },
31
+ ],
32
+ };
33
+ });
34
+ }
35
+ //# sourceMappingURL=galleries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"galleries.js","sourceRoot":"","sources":["../../src/resources/galleries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAI3F,MAAM,UAAU,wBAAwB,CAAC,MAAiB,EAAE,MAAoB;IAC9E,MAAM,CAAC,QAAQ,CACb,cAAc,EACd,oBAAoB,EACpB;QACE,WAAW,EACT,oFAAoF;QACtF,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;QAE1C,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;iBACpC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,QAAQ,CACb,gBAAgB,EAChB,IAAI,gBAAgB,CAAC,gCAAgC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAC3E;QACE,WAAW,EAAE,yDAAyD;QACtE,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;QACvB,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAEhD,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;iBACpC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { type SnapixClient } from "../client.js";
3
+ export declare function registerImageResources(server: McpServer, client: SnapixClient): void;
4
+ //# sourceMappingURL=images.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"images.d.ts","sourceRoot":"","sources":["../../src/resources/images.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,yCAAyC,CAAC;AAE3F,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA6CpF"}
@@ -0,0 +1,35 @@
1
+ import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export function registerImageResources(server, client) {
3
+ server.resource("image-list", "snapix://images", {
4
+ description: "Recent images (first page, default sort) with metadata and CDN URLs",
5
+ mimeType: "application/json",
6
+ }, async (uri) => {
7
+ const data = await client.listImages({ page: 1 });
8
+ return {
9
+ contents: [
10
+ {
11
+ uri: uri.href,
12
+ mimeType: "application/json",
13
+ text: JSON.stringify(data, null, 2),
14
+ },
15
+ ],
16
+ };
17
+ });
18
+ server.resource("image-detail", new ResourceTemplate("snapix://images/{imageId}", { list: undefined }), {
19
+ description: "Full image metadata, all variants, dimensions, and CDN URLs",
20
+ mimeType: "application/json",
21
+ }, async (uri, variables) => {
22
+ const imageId = String(variables.imageId);
23
+ const data = await client.getImage(imageId);
24
+ return {
25
+ contents: [
26
+ {
27
+ uri: uri.href,
28
+ mimeType: "application/json",
29
+ text: JSON.stringify(data, null, 2),
30
+ },
31
+ ],
32
+ };
33
+ });
34
+ }
35
+ //# sourceMappingURL=images.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"images.js","sourceRoot":"","sources":["../../src/resources/images.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAI3F,MAAM,UAAU,sBAAsB,CAAC,MAAiB,EAAE,MAAoB;IAC5E,MAAM,CAAC,QAAQ,CACb,YAAY,EACZ,iBAAiB,EACjB;QACE,WAAW,EAAE,qEAAqE;QAClF,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAElD,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;iBACpC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,QAAQ,CACb,cAAc,EACd,IAAI,gBAAgB,CAAC,2BAA2B,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EACtE;QACE,WAAW,EAAE,6DAA6D;QAC1E,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;QACvB,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAE5C,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;iBACpC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}