UNPKG

@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
"use strict"; /** * 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