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.
package/dist/index.js CHANGED
@@ -1,131 +1,58 @@
1
1
  #!/usr/bin/env node
2
2
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
3
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
- import { promises as fs } from "node:fs";
4
+ import { promises as fs, realpathSync } from "node:fs";
5
5
  import path from "node:path";
6
+ import { fileURLToPath } from "node:url";
6
7
  import { z } from "zod";
7
8
  import { loadImages } from "./imageInput.js";
8
- const DEFAULT_BASE_URL = "https://api.openai.com/v1";
9
- const DEFAULT_MODEL = "gpt-image-2";
10
- const qualitySchema = z.enum(["auto", "low", "medium", "high"]);
9
+ import { requestImage, resolveConfig, resolveProvider, } from "./providers.js";
10
+ const generateQualitySchema = z.enum(["auto", "low", "medium", "high", "standard", "hd"]);
11
+ const editQualitySchema = z.enum(["auto", "low", "medium", "high"]);
11
12
  const outputFormatSchema = z.enum(["png", "jpeg", "webp"]);
12
- function firstValue(...values) {
13
- return values.map((value) => value?.trim()).find(Boolean);
14
- }
15
- export function resolveConfig(input) {
16
- const apiKey = firstValue(input.apiKey, process.env.OPENAI_API_KEY);
17
- if (!apiKey) {
18
- throw new Error("Missing API key: pass api_key or set OPENAI_API_KEY.");
19
- }
20
- const model = firstValue(input.model, process.env.OPENAI_IMAGE_MODEL, DEFAULT_MODEL);
21
- if (model !== DEFAULT_MODEL) {
22
- throw new Error(`Unsupported model '${model}'. This MVP only supports ${DEFAULT_MODEL}.`);
23
- }
24
- const baseUrl = firstValue(input.baseUrl, process.env.OPENAI_BASE_URL, DEFAULT_BASE_URL);
25
- let parsedUrl;
26
- try {
27
- parsedUrl = new URL(baseUrl);
28
- }
29
- catch {
30
- throw new Error("base_url must be a valid absolute HTTP(S) URL.");
31
- }
32
- if (parsedUrl.protocol !== "http:" && parsedUrl.protocol !== "https:") {
33
- throw new Error("base_url must use HTTP or HTTPS.");
34
- }
35
- return {
36
- apiKey,
37
- model,
38
- baseUrl: baseUrl.replace(/\/+$/, ""),
39
- };
40
- }
41
- export async function requestImage(input) {
42
- const fetchImpl = input.fetchImpl ?? fetch;
43
- const commonFields = {
44
- model: input.config.model,
45
- prompt: input.prompt,
46
- n: 1,
47
- size: input.size,
48
- quality: input.quality,
49
- output_format: input.outputFormat,
50
- };
51
- const hasInputImages = Boolean(input.inputImages?.length);
52
- let body;
53
- let headers = { authorization: `Bearer ${input.config.apiKey}` };
54
- if (hasInputImages) {
55
- const form = new FormData();
56
- for (const [name, value] of Object.entries(commonFields))
57
- form.append(name, String(value));
58
- for (const image of input.inputImages) {
59
- form.append("image[]", new Blob([new Uint8Array(image.data)], { type: image.mimeType }), image.fileName);
60
- }
61
- body = form;
62
- }
63
- else {
64
- headers = { ...headers, "content-type": "application/json" };
65
- body = JSON.stringify(commonFields);
66
- }
67
- const endpoint = hasInputImages ? "edits" : "generations";
68
- const response = await fetchImpl(`${input.config.baseUrl}/images/${endpoint}`, {
69
- method: "POST",
70
- headers,
71
- body,
72
- });
73
- if (!response.ok) {
74
- const detail = (await response.text()).slice(0, 500);
75
- throw new Error(`OpenAI image request failed (${response.status}): ${detail || response.statusText}`);
76
- }
77
- const payload = (await response.json());
78
- const encodedImage = payload.data?.[0]?.b64_json;
79
- if (!encodedImage) {
80
- throw new Error("OpenAI image response contained no base64 image data.");
81
- }
82
- const normalizedImage = encodedImage.replace(/\s+/g, "");
83
- if (!/^[A-Za-z0-9+/]+={0,2}$/.test(normalizedImage)) {
84
- throw new Error("OpenAI image response contained invalid base64 image data.");
85
- }
86
- const image = Buffer.from(normalizedImage, "base64");
87
- if (image.length === 0 || image.toString("base64").replace(/=+$/, "") !== normalizedImage.replace(/=+$/, "")) {
88
- throw new Error("OpenAI image response contained invalid base64 image data.");
89
- }
90
- return image;
91
- }
92
13
  export async function saveImage(image, outputPath) {
93
14
  const resolvedPath = path.resolve(outputPath);
94
15
  await fs.mkdir(path.dirname(resolvedPath), { recursive: true });
95
16
  await fs.writeFile(resolvedPath, image, { flag: "wx" });
96
17
  return resolvedPath;
97
18
  }
98
- async function imageResult(image, outputFormat, outputPath) {
19
+ async function imageResult(image, outputPath) {
99
20
  const content = [
100
21
  {
101
22
  type: "image",
102
- data: image.toString("base64"),
103
- mimeType: `image/${outputFormat}`,
23
+ data: image.data.toString("base64"),
24
+ mimeType: image.mimeType,
104
25
  },
105
26
  ];
106
27
  if (outputPath) {
107
- const savedPath = await saveImage(image, outputPath);
28
+ const savedPath = await saveImage(image.data, outputPath);
108
29
  content.push({ type: "text", text: `Image saved to ${savedPath}` });
109
30
  }
110
31
  return { content };
111
32
  }
112
33
  export function createServer() {
113
- const server = new McpServer({ name: "imageforge-mcp", version: "0.3.0" });
34
+ const server = new McpServer({ name: "imageforge-mcp", version: "0.4.0" });
114
35
  server.registerTool("generate_image", {
115
- description: "Generate one image with gpt-image-2, optionally guided by reference images.",
36
+ description: "Generate one image with OpenAI gpt-image-2 or a supported Zhipu image model.",
116
37
  inputSchema: {
117
38
  prompt: z.string().trim().min(1).max(32_000).describe("Image description."),
118
- model: z.string().optional().describe("Model name; only gpt-image-2 is supported."),
119
- base_url: z.string().optional().describe("OpenAI-compatible base URL ending in /v1."),
120
- api_key: z.string().optional().describe("Per-call API key; OPENAI_API_KEY is preferred."),
39
+ model: z.string().optional().describe("Model name: OpenAI gpt-image-2, or Zhipu glm-image / cogview-4-250304 / cogview-4 / cogview-3-flash."),
40
+ base_url: z.string().optional().describe("Per-call provider API base URL override."),
41
+ api_key: z.string().optional().describe("Per-call provider API key; environment variables are preferred."),
42
+ provider: z.enum(["openai", "zhipu"]).optional().describe("Image provider. Defaults to IMAGEFORGE_PROVIDER, then openai."),
43
+ watermark_enabled: z.boolean().optional().describe("Provider watermark switch. Zhipu sends it when set; false may require watermark-removal account permission. Unsupported providers silently ignore it. ImageForge never removes watermarks locally."),
121
44
  size: z.string().default("1024x1024").describe("Output size, for example 1536x1024."),
122
- quality: qualitySchema.default("auto"),
45
+ quality: generateQualitySchema.default("auto"),
123
46
  output_format: outputFormatSchema.default("png"),
124
47
  output_path: z.string().trim().min(1).optional().describe("Optional local path to save the generated image. Relative paths resolve from the MCP working directory. Existing files are not overwritten."),
125
- reference_images: z.array(z.string()).max(16).optional().describe("Optional reference images as absolute local paths or HTTP(S) URLs."),
48
+ reference_images: z.array(z.string()).max(16).optional().describe("Optional OpenAI reference images as absolute local paths or HTTP(S) URLs. Zhipu does not support this parameter."),
126
49
  },
127
- }, async ({ prompt, model, base_url, api_key, size, quality, output_format, output_path, reference_images }) => {
128
- const config = resolveConfig({ apiKey: api_key, baseUrl: base_url, model });
50
+ }, async ({ prompt, model, base_url, api_key, provider, watermark_enabled, size, quality, output_format, output_path, reference_images }) => {
51
+ const selectedProvider = provider ?? resolveProvider(process.env.IMAGEFORGE_PROVIDER);
52
+ if (selectedProvider === "zhipu" && reference_images?.length) {
53
+ throw new Error("Zhipu image generation does not support reference_images.");
54
+ }
55
+ const config = resolveConfig({ provider: selectedProvider, apiKey: api_key, baseUrl: base_url, model });
129
56
  const inputImages = reference_images?.length ? await loadImages(reference_images) : undefined;
130
57
  const image = await requestImage({
131
58
  prompt,
@@ -134,8 +61,9 @@ export function createServer() {
134
61
  quality,
135
62
  outputFormat: output_format,
136
63
  inputImages,
64
+ watermarkEnabled: watermark_enabled,
137
65
  });
138
- return imageResult(image, output_format, output_path);
66
+ return imageResult(image, output_path);
139
67
  });
140
68
  server.registerTool("edit_image", {
141
69
  description: "Edit one or more input images with gpt-image-2.",
@@ -146,12 +74,12 @@ export function createServer() {
146
74
  base_url: z.string().optional().describe("OpenAI-compatible base URL ending in /v1."),
147
75
  api_key: z.string().optional().describe("Per-call API key; OPENAI_API_KEY is preferred."),
148
76
  size: z.string().default("1024x1024").describe("Output size, for example 1536x1024."),
149
- quality: qualitySchema.default("auto"),
77
+ quality: editQualitySchema.default("auto"),
150
78
  output_format: outputFormatSchema.default("png"),
151
79
  output_path: z.string().trim().min(1).optional().describe("Optional local path to save the edited image. Relative paths resolve from the MCP working directory. Existing files are not overwritten."),
152
80
  },
153
81
  }, async ({ prompt, input_images, model, base_url, api_key, size, quality, output_format, output_path }) => {
154
- const config = resolveConfig({ apiKey: api_key, baseUrl: base_url, model });
82
+ const config = resolveConfig({ provider: "openai", apiKey: api_key, baseUrl: base_url, model });
155
83
  const image = await requestImage({
156
84
  prompt,
157
85
  config,
@@ -160,14 +88,24 @@ export function createServer() {
160
88
  outputFormat: output_format,
161
89
  inputImages: await loadImages(input_images),
162
90
  });
163
- return imageResult(image, output_format, output_path);
91
+ return imageResult(image, output_path);
164
92
  });
165
93
  return server;
166
94
  }
95
+ export function isMainModule(entryPath = process.argv[1], moduleUrl = import.meta.url) {
96
+ if (!entryPath)
97
+ return false;
98
+ try {
99
+ return realpathSync(entryPath) === realpathSync(fileURLToPath(moduleUrl));
100
+ }
101
+ catch {
102
+ return false;
103
+ }
104
+ }
167
105
  async function main() {
168
106
  await createServer().connect(new StdioServerTransport());
169
107
  }
170
- if (import.meta.url === `file://${process.argv[1]}`) {
108
+ if (isMainModule()) {
171
109
  main().catch((error) => {
172
110
  console.error(error instanceof Error ? error.message : error);
173
111
  process.exitCode = 1;
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":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EACL,YAAY,EACZ,aAAa,EACb,eAAe,GAEhB,MAAM,gBAAgB,CAAC;AAExB,MAAM,qBAAqB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;AAC1F,MAAM,iBAAiB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AACpE,MAAM,kBAAkB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAa,EAAE,UAAkB;IAC/D,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,KAAqB,EAAE,UAAmB;IACnE,MAAM,OAAO,GAGT;QACF;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACnC,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB;KACF,CAAC;IACF,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,SAAS,EAAE,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAE3E,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,WAAW,EAAE,8EAA8E;QAC3F,WAAW,EAAE;YACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YAC3E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sGAAsG,CAAC;YAC7I,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;YACpF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iEAAiE,CAAC;YAC1G,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+DAA+D,CAAC;YAC1H,iBAAiB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oMAAoM,CAAC;YACxP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,qCAAqC,CAAC;YACrF,OAAO,EAAE,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC;YAC9C,aAAa,EAAE,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC;YAChD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACvD,6IAA6I,CAC9I;YACD,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAC/D,kHAAkH,CACnH;SACF;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,EAAE,EAAE;QACvI,MAAM,gBAAgB,GAAG,QAAQ,IAAI,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACtF,IAAI,gBAAgB,KAAK,OAAO,IAAI,gBAAgB,EAAE,MAAM,EAAE,CAAC;YAC7D,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC/E,CAAC;QACD,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACxG,MAAM,WAAW,GAAG,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9F,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC;YAC/B,MAAM;YACN,MAAM;YACN,IAAI;YACJ,OAAO;YACP,YAAY,EAAE,aAAa;YAC3B,WAAW;YACX,gBAAgB,EAAE,iBAAiB;SACpC,CAAC,CAAC;QAEH,OAAO,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACzC,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;QACE,WAAW,EAAE,iDAAiD;QAC9D,WAAW,EAAE;YACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,kCAAkC,CAAC;YACzF,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,CACvD,uDAAuD,CACxD;YACD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;YACnF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;YACrF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;YACzF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,qCAAqC,CAAC;YACrF,OAAO,EAAE,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC;YAC1C,aAAa,EAAE,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC;YAChD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACvD,0IAA0I,CAC3I;SACF;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,EAAE,EAAE;QACtG,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QAChG,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC;YAC/B,MAAM;YACN,MAAM;YACN,IAAI;YACJ,OAAO;YACP,YAAY,EAAE,aAAa;YAC3B,WAAW,EAAE,MAAM,UAAU,CAAC,YAAY,CAAC;SAC5C,CAAC,CAAC;QACH,OAAO,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACzC,CAAC,CACF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,YAAgC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAC/C,YAAoB,MAAM,CAAC,IAAI,CAAC,GAAG;IAEnC,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7B,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,SAAS,CAAC,KAAK,YAAY,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,YAAY,EAAE,CAAC,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,IAAI,YAAY,EAAE,EAAE,CAAC;IACnB,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QAC9B,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC9D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { type LoadedImage } from "./imageInput.js";
2
+ export type ProviderId = "openai" | "zhipu";
3
+ export type Quality = "auto" | "low" | "medium" | "high" | "standard" | "hd";
4
+ export type OutputFormat = "png" | "jpeg" | "webp";
5
+ export interface GeneratedImage {
6
+ data: Buffer;
7
+ mimeType: "image/png" | "image/jpeg" | "image/webp";
8
+ }
9
+ export interface ImageConfig {
10
+ provider: ProviderId;
11
+ apiKey: string;
12
+ baseUrl: string;
13
+ model: string;
14
+ }
15
+ export declare function resolveProvider(value: string | undefined): ProviderId;
16
+ export declare function resolveConfig(input: {
17
+ provider?: ProviderId;
18
+ apiKey?: string;
19
+ baseUrl?: string;
20
+ model?: string;
21
+ }): ImageConfig;
22
+ export declare function requestOpenAIImage(input: {
23
+ prompt: string;
24
+ config: ImageConfig;
25
+ size: string;
26
+ quality: Quality;
27
+ outputFormat: OutputFormat;
28
+ inputImages?: LoadedImage[];
29
+ fetchImpl?: typeof fetch;
30
+ }): Promise<GeneratedImage>;
31
+ export declare function requestZhipuImage(input: {
32
+ prompt: string;
33
+ config: ImageConfig;
34
+ size: string;
35
+ quality: Quality;
36
+ watermarkEnabled?: boolean;
37
+ fetchImpl?: typeof fetch;
38
+ downloadFetchImpl?: typeof fetch;
39
+ }): Promise<GeneratedImage>;
40
+ export declare function requestImage(input: Parameters<typeof requestOpenAIImage>[0] & {
41
+ watermarkEnabled?: boolean;
42
+ downloadFetchImpl?: typeof fetch;
43
+ }): Promise<GeneratedImage>;
@@ -0,0 +1,207 @@
1
+ import { z } from "zod";
2
+ import { loadRemoteImage } from "./imageInput.js";
3
+ const OPENAI_DEFAULT_BASE_URL = "https://api.openai.com/v1";
4
+ const OPENAI_DEFAULT_MODEL = "gpt-image-2";
5
+ const ZHIPU_DEFAULT_BASE_URL = "https://open.bigmodel.cn/api/paas/v4";
6
+ const ZHIPU_DEFAULT_MODEL = "glm-image";
7
+ const ZHIPU_MODELS = new Set(["glm-image", "cogview-4-250304", "cogview-4", "cogview-3-flash"]);
8
+ const zhipuResponseSchema = z.object({
9
+ data: z.array(z.object({ url: z.string().url() })).min(1),
10
+ content_filter: z.array(z.unknown()).optional(),
11
+ });
12
+ export function resolveProvider(value) {
13
+ const provider = value?.trim().toLowerCase();
14
+ if (!provider)
15
+ return "openai";
16
+ if (provider === "openai" || provider === "zhipu")
17
+ return provider;
18
+ throw new Error("provider must be 'openai' or 'zhipu'.");
19
+ }
20
+ function firstValue(...values) {
21
+ return values.map((value) => value?.trim()).find(Boolean);
22
+ }
23
+ function normalizeBaseUrl(value, label) {
24
+ let parsedUrl;
25
+ try {
26
+ parsedUrl = new URL(value);
27
+ }
28
+ catch {
29
+ throw new Error(`${label} must be a valid absolute HTTP(S) URL.`);
30
+ }
31
+ if (parsedUrl.protocol !== "http:" && parsedUrl.protocol !== "https:") {
32
+ throw new Error(`${label} must use HTTP or HTTPS.`);
33
+ }
34
+ return value.replace(/\/+$/, "");
35
+ }
36
+ export function resolveConfig(input) {
37
+ const provider = input.provider ?? resolveProvider(process.env.IMAGEFORGE_PROVIDER);
38
+ if (provider === "openai") {
39
+ const apiKey = firstValue(input.apiKey, process.env.OPENAI_API_KEY);
40
+ if (!apiKey)
41
+ throw new Error("Missing OpenAI API key: pass api_key or set OPENAI_API_KEY.");
42
+ const model = firstValue(input.model, process.env.OPENAI_IMAGE_MODEL, OPENAI_DEFAULT_MODEL);
43
+ if (model !== OPENAI_DEFAULT_MODEL) {
44
+ throw new Error(`Unsupported OpenAI model '${model}'. Only ${OPENAI_DEFAULT_MODEL} is supported.`);
45
+ }
46
+ return {
47
+ provider,
48
+ apiKey,
49
+ model,
50
+ baseUrl: normalizeBaseUrl(firstValue(input.baseUrl, process.env.OPENAI_BASE_URL, OPENAI_DEFAULT_BASE_URL), "base_url"),
51
+ };
52
+ }
53
+ const apiKey = firstValue(input.apiKey, process.env.ZHIPU_API_KEY);
54
+ if (!apiKey)
55
+ throw new Error("Missing Zhipu API key: pass api_key or set ZHIPU_API_KEY.");
56
+ const model = firstValue(input.model, process.env.ZHIPU_IMAGE_MODEL, ZHIPU_DEFAULT_MODEL);
57
+ if (!ZHIPU_MODELS.has(model)) {
58
+ throw new Error(`Unsupported Zhipu model '${model}'. Supported models: ${Array.from(ZHIPU_MODELS).join(", ")}.`);
59
+ }
60
+ return {
61
+ provider,
62
+ apiKey,
63
+ model,
64
+ baseUrl: normalizeBaseUrl(firstValue(input.baseUrl, process.env.ZHIPU_BASE_URL, ZHIPU_DEFAULT_BASE_URL), "base_url"),
65
+ };
66
+ }
67
+ function detectMimeType(data) {
68
+ if (data.length >= 8 && data.subarray(0, 8).equals(Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]))) {
69
+ return "image/png";
70
+ }
71
+ if (data.length >= 3 && data[0] === 0xff && data[1] === 0xd8 && data[2] === 0xff)
72
+ return "image/jpeg";
73
+ if (data.length >= 12 && data.subarray(0, 4).toString("ascii") === "RIFF" && data.subarray(8, 12).toString("ascii") === "WEBP") {
74
+ return "image/webp";
75
+ }
76
+ return undefined;
77
+ }
78
+ function actualMimeType(data) {
79
+ const mimeType = detectMimeType(data);
80
+ if (!mimeType)
81
+ throw new Error("Provider response was not a valid PNG, JPEG, or WebP image.");
82
+ return mimeType;
83
+ }
84
+ export async function requestOpenAIImage(input) {
85
+ if (!["auto", "low", "medium", "high"].includes(input.quality)) {
86
+ throw new Error("OpenAI quality must be auto, low, medium, or high.");
87
+ }
88
+ const fetchImpl = input.fetchImpl ?? fetch;
89
+ const commonFields = {
90
+ model: input.config.model,
91
+ prompt: input.prompt,
92
+ n: 1,
93
+ size: input.size,
94
+ quality: input.quality,
95
+ output_format: input.outputFormat,
96
+ };
97
+ const hasInputImages = Boolean(input.inputImages?.length);
98
+ let body;
99
+ let headers = { authorization: `Bearer ${input.config.apiKey}` };
100
+ if (hasInputImages) {
101
+ const form = new FormData();
102
+ for (const [name, value] of Object.entries(commonFields))
103
+ form.append(name, String(value));
104
+ for (const image of input.inputImages) {
105
+ form.append("image[]", new Blob([new Uint8Array(image.data)], { type: image.mimeType }), image.fileName);
106
+ }
107
+ body = form;
108
+ }
109
+ else {
110
+ headers = { ...headers, "content-type": "application/json" };
111
+ body = JSON.stringify(commonFields);
112
+ }
113
+ const endpoint = hasInputImages ? "edits" : "generations";
114
+ const response = await fetchImpl(`${input.config.baseUrl}/images/${endpoint}`, {
115
+ method: "POST",
116
+ headers,
117
+ body,
118
+ signal: AbortSignal.timeout(120_000),
119
+ });
120
+ if (!response.ok) {
121
+ const detail = (await response.text()).slice(0, 500);
122
+ throw new Error(`OpenAI image request failed (${response.status}): ${detail || response.statusText}`);
123
+ }
124
+ const payload = (await response.json());
125
+ const encodedImage = payload.data?.[0]?.b64_json;
126
+ if (!encodedImage)
127
+ throw new Error("OpenAI image response contained no base64 image data.");
128
+ const normalizedImage = encodedImage.replace(/\s+/g, "");
129
+ if (!/^[A-Za-z0-9+/]+={0,2}$/.test(normalizedImage)) {
130
+ throw new Error("OpenAI image response contained invalid base64 image data.");
131
+ }
132
+ const image = Buffer.from(normalizedImage, "base64");
133
+ if (image.length === 0 || image.toString("base64").replace(/=+$/, "") !== normalizedImage.replace(/=+$/, "")) {
134
+ throw new Error("OpenAI image response contained invalid base64 image data.");
135
+ }
136
+ return { data: image, mimeType: actualMimeType(image) };
137
+ }
138
+ export async function requestZhipuImage(input) {
139
+ if (!/^\d+x\d+$/.test(input.size))
140
+ throw new Error("size must use the WIDTHxHEIGHT format, for example 1024x1024.");
141
+ const allowedQuality = input.config.model === "glm-image"
142
+ ? new Set(["auto", "hd"])
143
+ : new Set(["auto", "standard", "hd"]);
144
+ if (!allowedQuality.has(input.quality)) {
145
+ throw new Error(`Zhipu model ${input.config.model} quality must be one of ${Array.from(allowedQuality).join(", ")}.`);
146
+ }
147
+ if (input.config.model === "glm-image" && input.prompt.length > 1000) {
148
+ throw new Error("glm-image prompt must be at most 1000 characters.");
149
+ }
150
+ const requestBody = {
151
+ model: input.config.model,
152
+ prompt: input.prompt,
153
+ size: input.size,
154
+ };
155
+ if (input.quality !== "auto")
156
+ requestBody.quality = input.quality;
157
+ if (input.watermarkEnabled !== undefined)
158
+ requestBody.watermark_enabled = input.watermarkEnabled;
159
+ const fetchImpl = input.fetchImpl ?? fetch;
160
+ const response = await fetchImpl(`${input.config.baseUrl}/images/generations`, {
161
+ method: "POST",
162
+ headers: {
163
+ authorization: `Bearer ${input.config.apiKey}`,
164
+ "content-type": "application/json",
165
+ },
166
+ body: JSON.stringify(requestBody),
167
+ signal: AbortSignal.timeout(120_000),
168
+ });
169
+ if (!response.ok) {
170
+ const detail = (await response.text()).slice(0, 500);
171
+ throw new Error(`Zhipu image request failed (${response.status}): ${detail || response.statusText}`);
172
+ }
173
+ let payload;
174
+ try {
175
+ payload = await response.json();
176
+ }
177
+ catch {
178
+ throw new Error("Zhipu image response was not valid JSON.");
179
+ }
180
+ const parsed = zhipuResponseSchema.safeParse(payload);
181
+ if (!parsed.success)
182
+ throw new Error("Zhipu image response contained no valid image URL.");
183
+ const downloaded = await loadRemoteImage(parsed.data.data[0].url, input.downloadFetchImpl ?? fetchImpl, undefined, undefined, false);
184
+ return { data: downloaded.data, mimeType: downloaded.mimeType };
185
+ }
186
+ const imageProviders = {
187
+ openai: requestOpenAIImage,
188
+ zhipu: requestZhipuImage,
189
+ };
190
+ export async function requestImage(input) {
191
+ const provider = input.config.provider;
192
+ if (provider === "zhipu") {
193
+ if (input.inputImages?.length)
194
+ throw new Error("Zhipu image generation does not support reference_images.");
195
+ return imageProviders[provider]({
196
+ prompt: input.prompt,
197
+ config: input.config,
198
+ size: input.size,
199
+ quality: input.quality,
200
+ watermarkEnabled: input.watermarkEnabled,
201
+ fetchImpl: input.fetchImpl,
202
+ downloadFetchImpl: input.downloadFetchImpl,
203
+ });
204
+ }
205
+ return imageProviders[provider](input);
206
+ }
207
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "imageforge-mcp",
3
- "version": "0.3.0",
4
- "description": "Minimal MCP server for gpt-image-2 through the OpenAI Images API",
3
+ "version": "0.4.0",
4
+ "description": "Lightweight MCP image generation server with OpenAI and Zhipu providers",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "bin": {
@@ -23,6 +23,7 @@
23
23
  "license": "MIT",
24
24
  "dependencies": {
25
25
  "@modelcontextprotocol/sdk": "^1.30.0",
26
+ "undici": "^6.28.0",
26
27
  "zod": "^3.25.76"
27
28
  },
28
29
  "devDependencies": {