replicate-flux-mcp
Version:
MCP for Replicate Flux Model
62 lines (61 loc) • 2.27 kB
JavaScript
import { replicate } from "../services/replicate.js";
import { handleError } from "../utils/error.js";
import { mimeFor, outputToBase64 } from "../utils/image.js";
import { CONFIG } from "../config/index.js";
export const registerGenerateMultipleImagesTool = async (input, extra) => {
const { prompts, ...commonParams } = input;
const progressToken = extra._meta?.progressToken;
const total = prompts.length;
let done = 0;
try {
const notify = async (message) => {
if (progressToken === undefined)
return;
await extra.sendNotification({
method: "notifications/progress",
params: { progressToken, progress: done, total, message },
});
};
await notify(`Starting ${total} image generations`);
const generationPromises = prompts.map(async (prompt) => {
const [output] = (await replicate.run(CONFIG.imageModelId, {
input: { prompt, ...commonParams },
}));
const imageUrl = output.url();
const imageBase64 = await outputToBase64(output);
done += 1;
await notify(`Completed ${done}/${total}`);
return { prompt, imageUrl, imageBase64 };
});
const results = await Promise.all(generationPromises);
const mimeType = mimeFor(input.output_format);
const content = [
{
type: "text",
text: `Generated ${results.length} images based on your prompts:`,
},
];
for (const result of results) {
content.push({
type: "text",
text: `\n\nPrompt: "${result.prompt}"\nImage URL: ${result.imageUrl}`,
});
content.push({
type: "image",
data: result.imageBase64,
mimeType,
});
}
return {
content,
structuredContent: {
images: results.map((r) => ({ url: r.imageUrl, prompt: r.prompt })),
format: input.output_format,
aspect_ratio: input.aspect_ratio,
},
};
}
catch (error) {
return handleError(error);
}
};