@graisol/gpt-image-mcp
Version:
A Model Context Protocol (MCP) server for OpenAI GPT-Image-1 image generation and editing
98 lines • 4.24 kB
JavaScript
;
/**
* MCP Tools implementation for GPT-Image-1 server
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.MCPTools = void 0;
exports.setupTools = setupTools;
const logger_js_1 = require("../utils/logger.js");
class MCPTools {
context;
constructor(context) {
this.context = context;
}
async generateImage(args) {
try {
await logger_js_1.logger.info('Generating image', { prompt: args.prompt, size: args.size });
const result = await this.context.openaiClient.generateImage(args);
await this.context.imageManager.storeImageMetadata(result);
// Save the actual image file if base64 data is available, or download from URL
let savedPath;
if (result.b64_json) {
savedPath = await this.context.imageManager.saveImageData(result.id, result.b64_json, 'base64');
}
else if (result.url) {
savedPath = await this.context.imageManager.saveImageData(result.id, result.url, 'url');
}
await logger_js_1.logger.info('Image generated successfully', { imageId: result.id, savedPath });
// Return a sanitized response without the large base64 data to avoid MCP token limits
return {
...result,
b64_json: undefined, // Remove base64 data from response
url: result.url || `Image saved to: ${savedPath || `./mcp-images/${result.id}.png`}`
};
}
catch (error) {
await logger_js_1.logger.error('Error generating image', args, error);
throw error;
}
}
async editImage(args) {
try {
await logger_js_1.logger.info('Editing image', { prompt: args.prompt });
const result = await this.context.openaiClient.editImage(args);
await this.context.imageManager.storeImageMetadata(result);
// Save the actual image file if base64 data is available, or download from URL
let savedPath;
if (result.b64_json) {
savedPath = await this.context.imageManager.saveImageData(result.id, result.b64_json, 'base64');
}
else if (result.url) {
savedPath = await this.context.imageManager.saveImageData(result.id, result.url, 'url');
}
await logger_js_1.logger.info('Image edited successfully', { imageId: result.id, savedPath });
// Return a sanitized response without the large base64 data to avoid MCP token limits
return {
...result,
b64_json: undefined, // Remove base64 data from response
url: result.url || `Image saved to: ${savedPath || `./mcp-images/${result.id}.png`}`
};
}
catch (error) {
await logger_js_1.logger.error('Error editing image', args, error);
throw error;
}
}
async getImageInfo(args) {
try {
await logger_js_1.logger.debug('Getting image info', { imageId: args.image_id });
const info = await this.context.imageManager.getImageInfo(args.image_id);
if (!info) {
throw new Error(`Image not found: ${args.image_id}`);
}
await logger_js_1.logger.debug('Image info retrieved', { imageId: args.image_id });
return info;
}
catch (error) {
await logger_js_1.logger.error('Error getting image info', args, error);
throw error;
}
}
async listGenerations(args) {
try {
await logger_js_1.logger.debug('Listing generations', args);
const generations = await this.context.imageManager.listGenerations(args);
await logger_js_1.logger.debug('Generations listed', { count: generations.images.length });
return generations;
}
catch (error) {
await logger_js_1.logger.error('Error listing generations', args, error);
throw error;
}
}
}
exports.MCPTools = MCPTools;
function setupTools(context) {
return new MCPTools(context);
}
//# sourceMappingURL=index.js.map