@moeloubani/libvips-mcp-server
Version:
Enhanced MCP server for libvips image processing library with 300+ operations and advanced capabilities
288 lines (283 loc) • 10.3 kB
JavaScript
/**
* Demo: Enhanced libvips MCP Server using wasm-vips
*
* This shows the additional features we'd gain by switching from Sharp to wasm-vips
*/
// NOTE: This is a conceptual demo. To actually implement:
// 1. npm install wasm-vips
// 2. Replace Sharp imports with wasm-vips
// 3. Update operations to use full libvips API
// import Vips from 'wasm-vips'; // Instead of Sharp
// Example of advanced operations we could add with wasm-vips:
const advancedToolsWithWasmVips = [
// MORPHOLOGICAL OPERATIONS (not in Sharp)
{
name: 'image_morphology_opening',
description: 'Apply morphological opening to an image',
inputSchema: {
type: 'object',
properties: {
input_path: { type: 'string' },
output_path: { type: 'string' },
kernel_size: { type: 'number', default: 3 },
iterations: { type: 'number', default: 1 }
},
required: ['input_path', 'output_path']
}
},
{
name: 'image_morphology_closing',
description: 'Apply morphological closing to an image',
inputSchema: {
type: 'object',
properties: {
input_path: { type: 'string' },
output_path: { type: 'string' },
kernel_size: { type: 'number', default: 3 }
},
required: ['input_path', 'output_path']
}
},
// FREQUENCY DOMAIN OPERATIONS (not in Sharp)
{
name: 'image_fft',
description: 'Apply Fast Fourier Transform to an image',
inputSchema: {
type: 'object',
properties: {
input_path: { type: 'string' },
output_path: { type: 'string' },
inverse: { type: 'boolean', default: false }
},
required: ['input_path', 'output_path']
}
},
{
name: 'image_frequency_filter',
description: 'Apply frequency domain filtering',
inputSchema: {
type: 'object',
properties: {
input_path: { type: 'string' },
output_path: { type: 'string' },
filter_type: { type: 'string', enum: ['lowpass', 'highpass', 'bandpass'] },
cutoff_frequency: { type: 'number' }
},
required: ['input_path', 'output_path', 'filter_type', 'cutoff_frequency']
}
},
// DRAWING OPERATIONS (limited in Sharp)
{
name: 'image_draw_line',
description: 'Draw a line on an image',
inputSchema: {
type: 'object',
properties: {
input_path: { type: 'string' },
output_path: { type: 'string' },
x1: { type: 'number' },
y1: { type: 'number' },
x2: { type: 'number' },
y2: { type: 'number' },
color: { type: 'string', default: '#000000' },
width: { type: 'number', default: 1 }
},
required: ['input_path', 'output_path', 'x1', 'y1', 'x2', 'y2']
}
},
{
name: 'image_draw_circle',
description: 'Draw a circle on an image',
inputSchema: {
type: 'object',
properties: {
input_path: { type: 'string' },
output_path: { type: 'string' },
x: { type: 'number' },
y: { type: 'number' },
radius: { type: 'number' },
fill: { type: 'boolean', default: false },
color: { type: 'string', default: '#000000' }
},
required: ['input_path', 'output_path', 'x', 'y', 'radius']
}
},
{
name: 'image_flood_fill',
description: 'Flood fill an area with color',
inputSchema: {
type: 'object',
properties: {
input_path: { type: 'string' },
output_path: { type: 'string' },
x: { type: 'number' },
y: { type: 'number' },
color: { type: 'string' },
tolerance: { type: 'number', default: 0 }
},
required: ['input_path', 'output_path', 'x', 'y', 'color']
}
},
// ADVANCED COLOR OPERATIONS
{
name: 'image_convert_colorspace',
description: 'Convert between different color spaces',
inputSchema: {
type: 'object',
properties: {
input_path: { type: 'string' },
output_path: { type: 'string' },
source_space: {
type: 'string',
enum: ['srgb', 'rgb', 'cmyk', 'lab', 'xyz', 'scrgb', 'hsv']
},
target_space: {
type: 'string',
enum: ['srgb', 'rgb', 'cmyk', 'lab', 'xyz', 'scrgb', 'hsv']
}
},
required: ['input_path', 'output_path', 'source_space', 'target_space']
}
},
// SCIENTIFIC/ANALYSIS OPERATIONS
{
name: 'image_calculate_entropy',
description: 'Calculate image entropy (information content)',
inputSchema: {
type: 'object',
properties: {
input_path: { type: 'string' }
},
required: ['input_path']
}
},
{
name: 'image_find_trim_box',
description: 'Find the bounding box of non-background pixels',
inputSchema: {
type: 'object',
properties: {
input_path: { type: 'string' },
background_color: { type: 'string', default: '#FFFFFF' },
threshold: { type: 'number', default: 10 }
},
required: ['input_path']
}
},
// CONVOLUTION AND FILTERING
{
name: 'image_custom_convolution',
description: 'Apply custom convolution kernel',
inputSchema: {
type: 'object',
properties: {
input_path: { type: 'string' },
output_path: { type: 'string' },
kernel: {
type: 'array',
items: { type: 'array', items: { type: 'number' } },
description: '2D array representing the convolution kernel'
},
scale: { type: 'number', default: 1 },
offset: { type: 'number', default: 0 }
},
required: ['input_path', 'output_path', 'kernel']
}
},
{
name: 'image_edge_detection',
description: 'Apply edge detection algorithms',
inputSchema: {
type: 'object',
properties: {
input_path: { type: 'string' },
output_path: { type: 'string' },
method: {
type: 'string',
enum: ['sobel', 'canny', 'laplacian', 'roberts']
},
threshold: { type: 'number', default: 128 }
},
required: ['input_path', 'output_path', 'method']
}
},
// IMAGE MOSAICING
{
name: 'image_mosaic_merge',
description: 'Merge images into a mosaic/panorama',
inputSchema: {
type: 'object',
properties: {
image_paths: {
type: 'array',
items: { type: 'string' },
description: 'Array of image paths to merge'
},
output_path: { type: 'string' },
direction: { type: 'string', enum: ['horizontal', 'vertical'] },
blend_width: { type: 'number', default: 100 }
},
required: ['image_paths', 'output_path']
}
},
// PYRAMID OPERATIONS
{
name: 'image_create_pyramid',
description: 'Create image pyramid (multiple resolution levels)',
inputSchema: {
type: 'object',
properties: {
input_path: { type: 'string' },
output_dir: { type: 'string' },
levels: { type: 'number', default: 6 },
format: { type: 'string', enum: ['dz', 'google', 'zoomify'], default: 'dz' }
},
required: ['input_path', 'output_dir']
}
}
];
// Example implementation with wasm-vips:
async function wasmVipsExample() {
/*
// Initialize wasm-vips
const vips = await Vips();
// Load image (more flexible than Sharp)
const image = vips.Image.newFromFile('input.jpg');
// Example: Morphological opening (not available in Sharp)
const kernel = vips.Image.newFromArray([
[1, 1, 1],
[1, 1, 1],
[1, 1, 1]
]);
const opened = image.morphology(kernel, vips.OperationMorphology.erode)
.morphology(kernel, vips.OperationMorphology.dilate);
// Example: Custom convolution (more control than Sharp)
const edgeKernel = vips.Image.newFromArray([
[-1, -1, -1],
[-1, 8, -1],
[-1, -1, -1]
]);
const edges = image.conv(edgeKernel);
// Example: Frequency domain operations (not in Sharp)
const fft = image.fwfft();
const filtered = fft.multiply(someFilter);
const result = filtered.invfft();
// Save with full libvips format support
result.writeToFile('output.jpg');
*/
}
export { advancedToolsWithWasmVips };
console.log('📊 Enhanced MCP Server Capabilities with wasm-vips:');
console.log(`🔧 Additional tools available: ${advancedToolsWithWasmVips.length}`);
console.log('🎯 Key advantages:');
console.log(' - Full libvips API access (300+ operations vs ~30 in Sharp)');
console.log(' - Morphological operations');
console.log(' - Frequency domain processing');
console.log(' - Advanced drawing and flood fill');
console.log(' - Scientific image analysis');
console.log(' - Image mosaicing and pyramids');
console.log(' - More color spaces and conversions');
console.log(' - Custom convolution kernels');
console.log(' - Professional image analysis tools');
//# sourceMappingURL=wasm-vips-demo.js.map