Skip to main content
Glama

inpaint

Remove unwanted elements from images using AI-powered inpainting. Select mask shapes and positions to replace specific areas with new content generated from text prompts.

Instructions

Inpaint an image using a mask

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
imageYesInput image path
promptYesText prompt for inpainting
mask_shapeNoShape of the maskcircle
positionNoPosition of the maskcenter
outputNoOutput filenameinpainted.jpg

Implementation Reference

  • MCP tool handler for 'inpaint': validates InpaintArgs, builds command line arguments for the Python CLI, executes via runPythonCommand, and returns the output.
    case 'inpaint': {
        const args = request.params.arguments as InpaintArgs;
        // Validate required fields
        const image = this.validateRequiredString(args.image, 'image');
        const prompt = this.validateRequiredString(args.prompt, 'prompt');
    
        const cmdArgs = ['inpaint'];
        cmdArgs.push('--image', image);
        cmdArgs.push('--prompt', prompt);
        if (args.mask_shape) cmdArgs.push('--mask-shape', args.mask_shape);
        if (args.position) cmdArgs.push('--position', args.position);
        if (args.output) cmdArgs.push('--output', args.output);
    
        const output = await this.runPythonCommand(cmdArgs);
        return {
            content: [{ type: 'text', text: output }],
        };
    }
  • src/index.ts:215-249 (registration)
    Registration of the 'inpaint' tool in the ListTools response, including name, description, and JSON input schema.
    {
        name: 'inpaint',
        description: 'Inpaint an image using a mask',
        inputSchema: {
            type: 'object',
            properties: {
                image: {
                    type: 'string',
                    description: 'Input image path',
                },
                prompt: {
                    type: 'string',
                    description: 'Text prompt for inpainting',
                },
                mask_shape: {
                    type: 'string',
                    description: 'Shape of the mask',
                    enum: ['circle', 'rectangle'],
                    default: 'circle',
                },
                position: {
                    type: 'string',
                    description: 'Position of the mask',
                    enum: ['center', 'ground'],
                    default: 'center',
                },
                output: {
                    type: 'string',
                    description: 'Output filename',
                    default: 'inpainted.jpg',
                },
            },
            required: ['image', 'prompt'],
        },
    },
  • TypeScript interface InpaintArgs defining the typed arguments for the inpaint tool handler.
    export interface InpaintArgs {
      image: string;
      prompt: string;
      mask_shape?: MaskShape;
      position?: MaskPosition;
      output?: string;
    }
  • Core implementation of inpainting in FluxAPI: creates procedural mask, encodes image and mask, submits to BFL API /v1/flux-pro-1.0-fill, polls and returns result URL.
    def inpaint(self, image_path: str, prompt: str, mask_shape: str = 'circle', position: str = 'center') -> Optional[str]:
        """Inpaint an image using a mask."""
        base_image = Image.open(image_path)
        mask = self.create_mask(base_image.size, shape=mask_shape, position=position)
        
        mask_path = 'temp_mask.jpg'
        mask.save(mask_path)
        
        payload = {
            "image": self.encode_image(image_path),
            "mask": self.encode_image(mask_path),
            "prompt": prompt,
            "steps": 50,
            "guidance": 60,
            "output_format": "jpeg",
            "safety_tolerance": 2
        }
        
        response = requests.post(
            f"{self.base_url}/v1/flux-pro-1.0-fill",
            json=payload,
            headers=self.headers
        )
        
        os.remove(mask_path)
        
        task_id = response.json().get('id')
        if not task_id:
            return None
            
        result = self.get_task_result(task_id)
        if result and result.get('result', {}).get('sample'):
            return result['result']['sample']
        return None
  • Supporting utility to create procedural mask image for inpainting based on shape ('circle'/'rectangle') and position ('center'/'ground').
    def create_mask(self, size: tuple, shape: str = 'rectangle', position: str = 'center') -> Image:
        """Create a mask for inpainting."""
        mask = Image.new('L', size, 0)
        draw = ImageDraw.Draw(mask)
        
        width, height = size
        
        if position == 'ground':
            horizon_y = height * 0.65
            y_start = horizon_y - (height * 0.05)
            points = [
                (0, y_start),
                (0, height),
                (width, height),
                (width, y_start)
            ]
            draw.polygon(points, fill=255)
        else:
            x1 = width * 0.25
            y1 = height * 0.25
            x2 = width * 0.75
            y2 = height * 0.75
            
            if shape == 'rectangle':
                draw.rectangle([x1, y1, x2, y2], fill=255)
            else:  # circle
                center = (width // 2, height // 2)
                radius = min(width, height) // 4
                draw.ellipse([center[0] - radius, center[1] - radius,
                             center[0] + radius, center[1] + radius], fill=255)
        
        return mask

Tool Definition Quality

Score is being calculated. Check back soon.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jmanhype/mcp-flux-studio'

If you have feedback or need assistance with the MCP directory API, please join our Discord server