imageforge-mcp 0.3.0 → 0.4.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.
@@ -1,9 +1,52 @@
1
1
  import { promises as fs } from "node:fs";
2
- import { isIP } from "node:net";
3
2
  import { lookup } from "node:dns/promises";
3
+ import { BlockList, isIP } from "node:net";
4
4
  import path from "node:path";
5
+ import { Agent } from "undici";
5
6
  export const MAX_INPUT_IMAGES = 16;
6
7
  export const MAX_IMAGE_BYTES = 50 * 1024 * 1024;
8
+ export const MAX_TOTAL_IMAGE_BYTES = 200 * 1024 * 1024;
9
+ export const DEFAULT_INPUT_CONCURRENCY = 4;
10
+ const blockedIpv4Addresses = new BlockList();
11
+ const blockedIpv6Addresses = new BlockList();
12
+ for (const [network, prefix] of [
13
+ ["0.0.0.0", 8],
14
+ ["10.0.0.0", 8],
15
+ ["100.64.0.0", 10],
16
+ ["127.0.0.0", 8],
17
+ ["169.254.0.0", 16],
18
+ ["172.16.0.0", 12],
19
+ ["192.0.0.0", 24],
20
+ ["192.0.2.0", 24],
21
+ ["192.88.99.0", 24],
22
+ ["192.168.0.0", 16],
23
+ ["198.18.0.0", 15],
24
+ ["198.51.100.0", 24],
25
+ ["203.0.113.0", 24],
26
+ ["224.0.0.0", 4],
27
+ ["240.0.0.0", 4],
28
+ ]) {
29
+ blockedIpv4Addresses.addSubnet(network, prefix, "ipv4");
30
+ }
31
+ for (const [network, prefix] of [
32
+ ["::", 128],
33
+ ["::1", 128],
34
+ ["::ffff:0:0", 96],
35
+ ["64:ff9b::", 96],
36
+ ["64:ff9b:1::", 48],
37
+ ["100::", 64],
38
+ ["100:0:0:1::", 64],
39
+ ["2001::", 23],
40
+ ["2002::", 16],
41
+ ["3fff::", 20],
42
+ ["5f00::", 16],
43
+ ["fc00::", 7],
44
+ ["fe80::", 10],
45
+ ["fec0::", 10],
46
+ ["ff00::", 8],
47
+ ]) {
48
+ blockedIpv6Addresses.addSubnet(network, prefix, "ipv6");
49
+ }
7
50
  function detectMimeType(data) {
8
51
  if (data.subarray(0, 8).equals(Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]))) {
9
52
  return "image/png";
@@ -33,102 +76,264 @@ function validateImage(data, fileName) {
33
76
  const baseName = path.basename(fileName, path.extname(fileName)) || "image";
34
77
  return { data, mimeType, fileName: `${baseName}${extensionFor(mimeType)}` };
35
78
  }
36
- function isPrivateAddress(address) {
37
- if (address === "::1" || address === "::" || address.startsWith("fe80:") || address.startsWith("fc") || address.startsWith("fd")) {
38
- return true;
39
- }
40
- if (address.startsWith("::ffff:")) {
41
- return isPrivateAddress(address.slice(7));
42
- }
43
- const parts = address.split(".").map(Number);
44
- if (parts.length !== 4 || parts.some((part) => !Number.isInteger(part)))
45
- return false;
46
- return (parts[0] === 10 ||
47
- parts[0] === 127 ||
48
- (parts[0] === 169 && parts[1] === 254) ||
49
- (parts[0] === 172 && parts[1] >= 16 && parts[1] <= 31) ||
50
- (parts[0] === 192 && parts[1] === 168) ||
51
- parts[0] === 0);
52
- }
53
- async function assertPublicUrl(url) {
79
+ export function isPublicAddress(address) {
80
+ const family = isIP(address);
81
+ if (family === 4)
82
+ return !blockedIpv4Addresses.check(address, "ipv4");
83
+ if (family === 6)
84
+ return !blockedIpv6Addresses.check(address, "ipv6");
85
+ return false;
86
+ }
87
+ function hostnameForLookup(url) {
88
+ return url.hostname.startsWith("[") && url.hostname.endsWith("]")
89
+ ? url.hostname.slice(1, -1)
90
+ : url.hostname;
91
+ }
92
+ const resolveAddresses = async (hostname) => {
93
+ const family = isIP(hostname);
94
+ return family
95
+ ? [{ address: hostname, family }]
96
+ : await lookup(hostname, { all: true, verbatim: true });
97
+ };
98
+ function assertRemoteUrl(url) {
54
99
  if (url.protocol !== "http:" && url.protocol !== "https:") {
55
100
  throw new Error("Image URLs must use HTTP or HTTPS.");
56
101
  }
57
102
  if (url.username || url.password) {
58
103
  throw new Error("Image URLs must not contain credentials.");
59
104
  }
60
- const addresses = isIP(url.hostname)
61
- ? [{ address: url.hostname }]
62
- : await lookup(url.hostname, { all: true, verbatim: true });
63
- if (addresses.length === 0 || addresses.some(({ address }) => isPrivateAddress(address))) {
64
- throw new Error(`Image URL host '${url.hostname}' resolves to a private or local address.`);
105
+ }
106
+ async function resolvePublicAddresses(url, resolveImpl) {
107
+ assertRemoteUrl(url);
108
+ const addresses = await resolveImpl(hostnameForLookup(url));
109
+ if (addresses.length === 0 ||
110
+ addresses.some(({ address, family }) => family !== isIP(address) || !isPublicAddress(address))) {
111
+ throw new Error(`Image URL host '${url.hostname}' resolves to a non-public address.`);
65
112
  }
113
+ return addresses;
114
+ }
115
+ export function createPinnedLookup(addresses) {
116
+ let nextAddress = 0;
117
+ return (_hostname, options, callback) => {
118
+ const requestedFamily = options.family === "IPv4" ? 4 : options.family === "IPv6" ? 6 : options.family;
119
+ const candidates = requestedFamily === 4 || requestedFamily === 6
120
+ ? addresses.filter(({ family }) => family === requestedFamily)
121
+ : addresses;
122
+ if (candidates.length === 0) {
123
+ callback(new Error("No validated address matches the requested IP family."), "", 0);
124
+ return;
125
+ }
126
+ if (options.all) {
127
+ callback(null, candidates);
128
+ return;
129
+ }
130
+ const selected = candidates[nextAddress % candidates.length];
131
+ nextAddress += 1;
132
+ callback(null, selected.address, selected.family);
133
+ };
134
+ }
135
+ function createPinnedDispatcher(addresses) {
136
+ return new Agent({
137
+ connect: { lookup: createPinnedLookup(addresses) },
138
+ autoSelectFamily: addresses.some(({ family }) => family === 4) && addresses.some(({ family }) => family === 6),
139
+ });
140
+ }
141
+ const defaultRemoteFetch = async (input, init) => fetch(input, init);
142
+ function createByteBudget(limit) {
143
+ let used = 0;
144
+ return {
145
+ get remaining() {
146
+ return limit - used;
147
+ },
148
+ reserve(bytes) {
149
+ if (bytes < 0 || used + bytes > limit) {
150
+ throw new Error("Combined input images exceed the 200 MB limit.");
151
+ }
152
+ used += bytes;
153
+ },
154
+ release(bytes) {
155
+ used = Math.max(0, used - bytes);
156
+ },
157
+ };
66
158
  }
67
- async function readLimitedResponse(response) {
68
- const declaredLength = Number(response.headers.get("content-length"));
69
- if (Number.isFinite(declaredLength) && declaredLength > MAX_IMAGE_BYTES) {
159
+ async function readLimitedResponse(response, budget) {
160
+ const contentLength = response.headers.get("content-length");
161
+ const declaredLength = contentLength === null ? undefined : Number(contentLength);
162
+ if (declaredLength !== undefined && Number.isFinite(declaredLength) && declaredLength > MAX_IMAGE_BYTES) {
163
+ await response.body?.cancel().catch(() => undefined);
70
164
  throw new Error("Remote input image exceeds the 50 MB limit.");
71
165
  }
166
+ if (declaredLength !== undefined && Number.isFinite(declaredLength) && budget && declaredLength > budget.remaining) {
167
+ await response.body?.cancel().catch(() => undefined);
168
+ throw new Error("Combined input images exceed the 200 MB limit.");
169
+ }
72
170
  if (!response.body)
73
171
  throw new Error("Remote input image returned an empty response body.");
74
172
  const reader = response.body.getReader();
75
173
  const chunks = [];
76
174
  let total = 0;
77
- while (true) {
78
- const { done, value } = await reader.read();
79
- if (done)
80
- break;
81
- total += value.byteLength;
82
- if (total > MAX_IMAGE_BYTES) {
83
- await reader.cancel();
84
- throw new Error("Remote input image exceeds the 50 MB limit.");
175
+ let reservedBytes = 0;
176
+ try {
177
+ while (true) {
178
+ const { done, value } = await reader.read();
179
+ if (done)
180
+ break;
181
+ total += value.byteLength;
182
+ if (total > MAX_IMAGE_BYTES) {
183
+ await reader.cancel();
184
+ throw new Error("Remote input image exceeds the 50 MB limit.");
185
+ }
186
+ budget?.reserve(value.byteLength);
187
+ reservedBytes += value.byteLength;
188
+ chunks.push(value);
85
189
  }
86
- chunks.push(value);
190
+ return { data: Buffer.concat(chunks, total), reservedBytes };
191
+ }
192
+ catch (error) {
193
+ await reader.cancel().catch(() => undefined);
194
+ budget?.release(reservedBytes);
195
+ throw error;
87
196
  }
88
- return Buffer.concat(chunks, total);
89
197
  }
90
- export async function loadRemoteImage(source, fetchImpl = fetch) {
198
+ export async function loadRemoteImage(source, fetchImpl = defaultRemoteFetch, resolveImpl = resolveAddresses, budget, skipDnsSafetyChecks = resolveSkipDnsSafetyChecks()) {
91
199
  let current = new URL(source);
92
200
  for (let redirects = 0; redirects <= 3; redirects += 1) {
93
- await assertPublicUrl(current);
94
- const response = await fetchImpl(current, { redirect: "manual", signal: AbortSignal.timeout(30_000) });
95
- if (response.status >= 300 && response.status < 400) {
96
- const location = response.headers.get("location");
97
- if (!location || redirects === 3)
98
- throw new Error("Remote input image has too many redirects.");
99
- current = new URL(location, current);
100
- continue;
201
+ const dispatcher = skipDnsSafetyChecks
202
+ ? undefined
203
+ : createPinnedDispatcher(await resolvePublicAddresses(current, resolveImpl));
204
+ if (skipDnsSafetyChecks)
205
+ assertRemoteUrl(current);
206
+ try {
207
+ const response = await fetchImpl(current, {
208
+ redirect: "manual",
209
+ signal: AbortSignal.timeout(30_000),
210
+ ...(dispatcher ? { dispatcher } : {}),
211
+ });
212
+ if (response.status >= 300 && response.status < 400) {
213
+ await response.body?.cancel().catch(() => undefined);
214
+ const location = response.headers.get("location");
215
+ if (!location || redirects === 3)
216
+ throw new Error("Remote input image has too many redirects.");
217
+ current = new URL(location, current);
218
+ continue;
219
+ }
220
+ if (!response.ok) {
221
+ await response.body?.cancel().catch(() => undefined);
222
+ throw new Error(`Failed to download input image (${response.status} ${response.statusText}).`);
223
+ }
224
+ const loaded = await readLimitedResponse(response, budget);
225
+ try {
226
+ return validateImage(loaded.data, path.basename(current.pathname) || "remote-image");
227
+ }
228
+ catch (error) {
229
+ budget?.release(loaded.reservedBytes);
230
+ throw error;
231
+ }
101
232
  }
102
- if (!response.ok) {
103
- throw new Error(`Failed to download input image (${response.status} ${response.statusText}).`);
233
+ finally {
234
+ await dispatcher?.close();
104
235
  }
105
- const data = await readLimitedResponse(response);
106
- return validateImage(data, path.basename(current.pathname) || "remote-image");
107
236
  }
108
237
  throw new Error("Remote input image has too many redirects.");
109
238
  }
110
- export async function loadLocalImage(source) {
239
+ export async function loadLocalImage(source, budget) {
111
240
  if (!path.isAbsolute(source)) {
112
241
  throw new Error(`Local image path must be absolute: '${source}'.`);
113
242
  }
114
243
  const handle = await fs.open(source, "r");
244
+ let reservedBytes = 0;
115
245
  try {
116
246
  const stats = await handle.stat();
117
247
  if (!stats.isFile())
118
248
  throw new Error(`Input image is not a regular file: '${source}'.`);
119
249
  if (stats.size > MAX_IMAGE_BYTES)
120
250
  throw new Error(`Input image '${source}' exceeds the 50 MB limit.`);
121
- return validateImage(await handle.readFile(), path.basename(source));
251
+ if (budget && stats.size > budget.remaining)
252
+ throw new Error("Combined input images exceed the 200 MB limit.");
253
+ budget?.reserve(stats.size);
254
+ reservedBytes = stats.size;
255
+ const data = await handle.readFile();
256
+ if (data.length > reservedBytes) {
257
+ budget?.reserve(data.length - reservedBytes);
258
+ }
259
+ else if (data.length < reservedBytes) {
260
+ budget?.release(reservedBytes - data.length);
261
+ }
262
+ reservedBytes = data.length;
263
+ return validateImage(data, path.basename(source));
264
+ }
265
+ catch (error) {
266
+ budget?.release(reservedBytes);
267
+ throw error;
122
268
  }
123
269
  finally {
124
270
  await handle.close();
125
271
  }
126
272
  }
127
- export async function loadImages(sources) {
273
+ export function resolveInputConcurrency(value = process.env.IMAGEFORGE_INPUT_CONCURRENCY) {
274
+ if (value === undefined || String(value).trim() === "")
275
+ return DEFAULT_INPUT_CONCURRENCY;
276
+ const normalized = String(value).trim();
277
+ if (!/^\d+$/.test(normalized) || Number(normalized) < 1) {
278
+ throw new Error("IMAGEFORGE_INPUT_CONCURRENCY must be a positive integer.");
279
+ }
280
+ return Math.min(Number(normalized), MAX_INPUT_IMAGES);
281
+ }
282
+ export function resolveSkipDnsSafetyChecks(value = process.env.IMAGEFORGE_SKIP_DNS_SAFETY_CHECKS) {
283
+ if (value === undefined || String(value).trim() === "")
284
+ return false;
285
+ if (typeof value === "boolean")
286
+ return value;
287
+ switch (value.trim().toLowerCase()) {
288
+ case "1":
289
+ case "true":
290
+ case "yes":
291
+ case "on":
292
+ return true;
293
+ case "0":
294
+ case "false":
295
+ case "no":
296
+ case "off":
297
+ return false;
298
+ default:
299
+ throw new Error("IMAGEFORGE_SKIP_DNS_SAFETY_CHECKS must be true/false, 1/0, yes/no, or on/off.");
300
+ }
301
+ }
302
+ export async function loadImages(sources, options = {}) {
128
303
  if (sources.length === 0)
129
304
  throw new Error("At least one input image is required.");
130
305
  if (sources.length > MAX_INPUT_IMAGES)
131
306
  throw new Error("A maximum of 16 input images is supported.");
132
- return Promise.all(sources.map((source) => /^https?:\/\//i.test(source) ? loadRemoteImage(source) : loadLocalImage(source)));
307
+ const concurrency = resolveInputConcurrency(options.concurrency);
308
+ const skipDnsSafetyChecks = options.skipDnsSafetyChecks ?? resolveSkipDnsSafetyChecks();
309
+ const maxTotalBytes = Math.min(options.maxTotalBytes ?? MAX_TOTAL_IMAGE_BYTES, MAX_TOTAL_IMAGE_BYTES);
310
+ if (!Number.isSafeInteger(maxTotalBytes) || maxTotalBytes < 1) {
311
+ throw new Error("The total input image byte limit must be a positive integer.");
312
+ }
313
+ const budget = createByteBudget(maxTotalBytes);
314
+ const results = new Array(sources.length);
315
+ let nextIndex = 0;
316
+ let firstError;
317
+ const worker = async () => {
318
+ while (firstError === undefined) {
319
+ const index = nextIndex;
320
+ nextIndex += 1;
321
+ if (index >= sources.length)
322
+ return;
323
+ const source = sources[index];
324
+ try {
325
+ results[index] = /^https?:\/\//i.test(source)
326
+ ? await loadRemoteImage(source, options.fetchImpl, options.resolveImpl, budget, skipDnsSafetyChecks)
327
+ : await loadLocalImage(source, budget);
328
+ }
329
+ catch (error) {
330
+ firstError ??= error;
331
+ }
332
+ }
333
+ };
334
+ await Promise.all(Array.from({ length: Math.min(concurrency, sources.length) }, worker));
335
+ if (firstError !== undefined)
336
+ throw firstError;
337
+ return results;
133
338
  }
134
339
  //# sourceMappingURL=imageInput.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"imageInput.js","sourceRoot":"","sources":["../src/imageInput.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"imageInput.js","sourceRoot":"","sources":["../src/imageInput.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,33 +1,5 @@
1
1
  #!/usr/bin/env node
2
2
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
- import { z } from "zod";
4
- import { type LoadedImage } from "./imageInput.js";
5
- declare const qualitySchema: z.ZodEnum<["auto", "low", "medium", "high"]>;
6
- declare const outputFormatSchema: z.ZodEnum<["png", "jpeg", "webp"]>;
7
- export interface ImageConfig {
8
- apiKey: string;
9
- baseUrl: string;
10
- model: string;
11
- }
12
- export interface ImageGenerationResponse {
13
- data?: Array<{
14
- b64_json?: string;
15
- }>;
16
- }
17
- export declare function resolveConfig(input: {
18
- apiKey?: string;
19
- baseUrl?: string;
20
- model?: string;
21
- }): ImageConfig;
22
- export declare function requestImage(input: {
23
- prompt: string;
24
- config: ImageConfig;
25
- size: string;
26
- quality: z.infer<typeof qualitySchema>;
27
- outputFormat: z.infer<typeof outputFormatSchema>;
28
- inputImages?: LoadedImage[];
29
- fetchImpl?: typeof fetch;
30
- }): Promise<Buffer>;
31
3
  export declare function saveImage(image: Buffer, outputPath: string): Promise<string>;
32
4
  export declare function createServer(): McpServer;
33
- export {};
5
+ export declare function isMainModule(entryPath?: string | undefined, moduleUrl?: string): boolean;