@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.
- package/LICENSE +674 -0
- package/README.md +161 -0
- package/dist/client.d.ts +30 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +203 -0
- package/dist/client.js.map +1 -0
- package/dist/constants.d.ts +7 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +11 -0
- package/dist/constants.js.map +1 -0
- package/dist/errors.d.ts +18 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +48 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/galleries.d.ts +4 -0
- package/dist/resources/galleries.d.ts.map +1 -0
- package/dist/resources/galleries.js +35 -0
- package/dist/resources/galleries.js.map +1 -0
- package/dist/resources/images.d.ts +4 -0
- package/dist/resources/images.d.ts.map +1 -0
- package/dist/resources/images.js +35 -0
- package/dist/resources/images.js.map +1 -0
- package/dist/server.d.ts +9 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +56 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/convert.d.ts +4 -0
- package/dist/tools/convert.d.ts.map +1 -0
- package/dist/tools/convert.js +28 -0
- package/dist/tools/convert.js.map +1 -0
- package/dist/tools/create-gallery.d.ts +4 -0
- package/dist/tools/create-gallery.d.ts.map +1 -0
- package/dist/tools/create-gallery.js +34 -0
- package/dist/tools/create-gallery.js.map +1 -0
- package/dist/tools/delete-gallery.d.ts +4 -0
- package/dist/tools/delete-gallery.d.ts.map +1 -0
- package/dist/tools/delete-gallery.js +26 -0
- package/dist/tools/delete-gallery.js.map +1 -0
- package/dist/tools/delete-image.d.ts +4 -0
- package/dist/tools/delete-image.d.ts.map +1 -0
- package/dist/tools/delete-image.js +22 -0
- package/dist/tools/delete-image.js.map +1 -0
- package/dist/tools/generate.d.ts +4 -0
- package/dist/tools/generate.d.ts.map +1 -0
- package/dist/tools/generate.js +61 -0
- package/dist/tools/generate.js.map +1 -0
- package/dist/tools/get-gallery.d.ts +4 -0
- package/dist/tools/get-gallery.d.ts.map +1 -0
- package/dist/tools/get-gallery.js +22 -0
- package/dist/tools/get-gallery.js.map +1 -0
- package/dist/tools/get-image.d.ts +4 -0
- package/dist/tools/get-image.d.ts.map +1 -0
- package/dist/tools/get-image.js +22 -0
- package/dist/tools/get-image.js.map +1 -0
- package/dist/tools/list-galleries.d.ts +4 -0
- package/dist/tools/list-galleries.d.ts.map +1 -0
- package/dist/tools/list-galleries.js +18 -0
- package/dist/tools/list-galleries.js.map +1 -0
- package/dist/tools/list-images.d.ts +4 -0
- package/dist/tools/list-images.d.ts.map +1 -0
- package/dist/tools/list-images.js +34 -0
- package/dist/tools/list-images.js.map +1 -0
- package/dist/tools/update-gallery.d.ts +4 -0
- package/dist/tools/update-gallery.d.ts.map +1 -0
- package/dist/tools/update-gallery.js +27 -0
- package/dist/tools/update-gallery.js.map +1 -0
- package/dist/tools/update-image.d.ts +4 -0
- package/dist/tools/update-image.d.ts.map +1 -0
- package/dist/tools/update-image.js +32 -0
- package/dist/tools/update-image.js.map +1 -0
- package/dist/tools/upload-image.d.ts +4 -0
- package/dist/tools/upload-image.d.ts.map +1 -0
- package/dist/tools/upload-image.js +68 -0
- package/dist/tools/upload-image.js.map +1 -0
- package/dist/types.d.ts +67 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- 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
|
package/dist/client.d.ts
ADDED
|
@@ -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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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"}
|