imagegen-mcp-server
Version:
MCP server for AI image generation with OpenAI DALL-E, Google Imagen, Gemini, and Flux via Replicate
72 lines (71 loc) • 2.57 kB
JavaScript
import OpenAI from "openai";
import { saveBase64Image } from "../utils/fs.js";
const DEFAULT_MODEL = "gpt-image-1"; // supports images.generate
export async function generateImageOpenAI(args) {
const apiKey = process.env.OPENAI_API_KEY;
if (!apiKey) {
throw new Error("Missing OPENAI_API_KEY environment variable");
}
const client = new OpenAI({ apiKey });
const format = (args.format ?? "png").toLowerCase();
const ext = format === "jpeg" ? "jpg" : format;
const mimeType = format === "png"
? "image/png"
: format === "jpg" || format === "jpeg"
? "image/jpeg"
: "image/webp";
// size priority: explicit size string > width/height > default
const size = args.size
? args.size
: args.width && args.height
? `${args.width}x${args.height}`
: "1024x1024";
const model = args.model || process.env.OPENAI_IMAGE_MODEL || DEFAULT_MODEL;
// Build request parameters based on model capabilities
const requestParams = {
model,
prompt: args.prompt,
size,
response_format: "b64_json",
};
// Add quality parameter (supported by all models)
if (args.quality) {
requestParams.quality = args.quality;
}
// gpt-image-1 specific parameters
if (model === "gpt-image-1") {
if (args.background) {
requestParams.background = args.background;
}
// gpt-image-1 supports additional output formats
if (args.format && args.format !== "png") {
if (args.format === "jpeg" || args.format === "jpg") {
requestParams.output_format = "jpeg";
}
else if (args.format === "webp") {
requestParams.output_format = "webp";
}
}
}
const response = await client.images.generate(requestParams);
const data = response.data?.[0];
if (!data?.b64_json) {
throw new Error("OpenAI returned no image data");
}
const base64 = data.b64_json;
const outputDir = process.env.OUTPUT_DIR || "outputs";
const name = (args.filenameHint || "openai-image")
.toLowerCase()
.replace(/[^a-z0-9-_]+/g, "-")
.replace(/-+/g, "-")
.replace(/^-|-$/g, "");
const filename = `${Date.now()}-${name || "image"}.${ext}`;
const path = saveBase64Image(base64, outputDir, filename);
return {
path,
mimeType,
base64: args.returnBase64 ? base64 : undefined,
provider: "openai",
model,
};
}