UNPKG

ai-image-generate

Version:

MCP Server for image generation using Replicate's flux-schnell model

67 lines (66 loc) 2.87 kB
#!/usr/bin/env node import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { z } from "zod"; import { ImageGenerationService } from '../src/imageService.js'; import dotenv from 'dotenv'; dotenv.config(); const model = process.env.REPLICATE_MODEL || 'black-forest-labs/flux-schnell'; const apiToken = process.env.REPLICATE_API_TOKEN; if (!apiToken) { console.error('REPLICATE_API_TOKEN environment variable is required'); process.exit(1); } const imageService = new ImageGenerationService(apiToken, model); const server = new McpServer({ name: "image-generator", version: "1.0.0" }); server.tool("generate-image", "Generate an image based on a prompt", { prompt: z.string(), output_dir: z.string().describe("The absolute and full path to the directory where generated images will be saved."), filename: z.string().optional().describe("Base filename to save the image(s) with"), go_fast: z.boolean().optional(), megapixels: z.enum(["1", "2", "4"]).optional().describe("Resolution quality. Accepted values are \"1\", \"2\", or \"4\"."), num_outputs: z.number().min(1).max(4).optional().describe("Number of images to generate (1-4)."), aspect_ratio: z.enum(["1:1", "4:3", "16:9"]).optional().describe("Aspect ratio. Accepted values are \"1:1\", \"4:3\", or \"16:9\"."), output_format: z.enum(["webp", "png", "jpeg"]).optional().describe("Image format. Accepted values are \"webp\", \"png\", or \"jpeg\"."), output_quality: z.number().min(1).max(100).optional().describe("Compression quality (1-100)."), num_inference_steps: z.number().min(4).max(20).optional().describe("Number of denoising steps (4-20).") }, async (params) => { try { const result = await imageService.generateImages(params); return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] }; } catch (error) { return { content: [{ type: "text", text: JSON.stringify({ error: { code: error.code || 'UNKNOWN_ERROR', message: error.message, details: error.details } }, null, 2) }] }; } }); async function main() { const transport = new StdioServerTransport(); await server.connect(transport); console.error("Image Generation MCP Server running on stdio"); } main().catch(async (error) => { const fs = require('fs').promises; await fs.appendFile('server.log', `${new Date().toISOString()} - ${error.stack || error} `); console.error(error); process.exit(1); });