ai-image-generate
Version:
MCP Server for image generation using Replicate's flux-schnell model
67 lines (66 loc) • 2.87 kB
JavaScript
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);
});