@dondonudonjp/vertexai-imagen-mcp-server
Version:
[DEPRECATED] MCP Server for Vertex AI Imagen image generation. Imagen endpoints shut down 2026-06-30; migrate to the nanoBanana MCP Server (Gemini image models).
156 lines • 5.63 kB
JavaScript
/**
* サムネイル生成ユーティリティ
*/
import sharp from 'sharp';
// 環境変数からサムネイル設定を取得
const getThumbnailSize = () => {
const envSize = process.env.VERTEXAI_IMAGEN_THUMBNAIL_SIZE;
if (envSize) {
const size = parseInt(envSize, 10);
if (!isNaN(size) && size > 0 && size <= 512) {
return size;
}
}
return 128; // デフォルト
};
const getThumbnailQuality = () => {
const envQuality = process.env.VERTEXAI_IMAGEN_THUMBNAIL_QUALITY;
if (envQuality) {
const quality = parseInt(envQuality, 10);
if (!isNaN(quality) && quality > 0 && quality <= 100) {
return quality;
}
}
return 60; // デフォルト
};
export const DEFAULT_THUMBNAIL_CONFIG = {
maxWidth: getThumbnailSize(),
maxHeight: getThumbnailSize(),
quality: getThumbnailQuality(),
format: 'jpeg'
};
/**
* 画像ファイルからサムネイルを生成
*
* @param imageBuffer 元画像のバッファ
* @param config サムネイル設定(省略時はデフォルト)
* @returns サムネイルのBase64データURI
*/
export async function generateThumbnail(imageBuffer, config = DEFAULT_THUMBNAIL_CONFIG) {
try {
// Sharpでリサイズ処理
let sharpInstance = sharp(imageBuffer)
.resize(config.maxWidth, config.maxHeight, {
fit: 'inside', // アスペクト比を維持
withoutEnlargement: true // 元画像より大きくしない
});
// フォーマットに応じた圧縮処理を適用
if (config.format === 'jpeg') {
sharpInstance = sharpInstance.jpeg({
quality: config.quality,
progressive: true // プログレッシブJPEG
});
}
else if (config.format === 'png') {
sharpInstance = sharpInstance.png({
quality: config.quality
});
}
else if (config.format === 'webp') {
sharpInstance = sharpInstance.webp({
quality: config.quality
});
}
const thumbnailBuffer = await sharpInstance.toBuffer();
// Base64 Data URIとして返却
const base64 = thumbnailBuffer.toString('base64');
const mimeType = `image/${config.format}`;
return `data:${mimeType};base64,${base64}`;
}
catch (error) {
throw new Error(`Failed to generate thumbnail: ${error instanceof Error ? error.message : String(error)}`);
}
}
/**
* ファイルパスから画像を読み込みサムネイルを生成
*
* @param filePath 画像ファイルパス
* @param config サムネイル設定(省略時はデフォルト)
* @returns サムネイルのBase64データURI
* @deprecated Use generateThumbnailDataFromFile for MCP responses
*/
export async function generateThumbnailFromFile(filePath, config = DEFAULT_THUMBNAIL_CONFIG) {
try {
let sharpInstance = sharp(filePath)
.resize(config.maxWidth, config.maxHeight, {
fit: 'inside',
withoutEnlargement: true
});
// フォーマットに応じた圧縮処理を適用
if (config.format === 'jpeg') {
sharpInstance = sharpInstance.jpeg({
quality: config.quality,
progressive: true
});
}
else if (config.format === 'png') {
sharpInstance = sharpInstance.png({
quality: config.quality
});
}
else if (config.format === 'webp') {
sharpInstance = sharpInstance.webp({
quality: config.quality
});
}
const thumbnailBuffer = await sharpInstance.toBuffer();
const base64 = thumbnailBuffer.toString('base64');
const mimeType = `image/${config.format}`;
return `data:${mimeType};base64,${base64}`;
}
catch (error) {
throw new Error(`Failed to generate thumbnail from file: ${error instanceof Error ? error.message : String(error)}`);
}
}
/**
* ファイルパスから画像を読み込みMCP用のサムネイルデータを生成
*
* @param filePath 画像ファイルパス
* @param config サムネイル設定(省略時はデフォルト)
* @returns 純粋なBase64文字列とMIMEタイプ
*/
export async function generateThumbnailDataFromFile(filePath, config = DEFAULT_THUMBNAIL_CONFIG) {
try {
let sharpInstance = sharp(filePath)
.resize(config.maxWidth, config.maxHeight, {
fit: 'inside',
withoutEnlargement: true
});
// フォーマットに応じた圧縮処理を適用
if (config.format === 'jpeg') {
sharpInstance = sharpInstance.jpeg({
quality: config.quality,
progressive: true
});
}
else if (config.format === 'png') {
sharpInstance = sharpInstance.png({
quality: config.quality
});
}
else if (config.format === 'webp') {
sharpInstance = sharpInstance.webp({
quality: config.quality
});
}
const thumbnailBuffer = await sharpInstance.toBuffer();
return {
base64: thumbnailBuffer.toString('base64'),
mimeType: `image/${config.format}`
};
}
catch (error) {
throw new Error(`Failed to generate thumbnail from file: ${error instanceof Error ? error.message : String(error)}`);
}
}
//# sourceMappingURL=thumbnail.js.map