{
  "id": "image.combine",
  "object": "tool",
  "name": "Combine images",
  "summary": "Join images side by side.",
  "description": "Joins 2 to 20 images into one, side by side or stacked, with ImageMagick. Choose the alignment, a gap and its colour (or transparent), and optionally scale every image to a common height (side by side) or width (stacked) first. Results are capped at 12,000 px per side.",
  "category": "images",
  "hosted_by": "Opentools",
  "runtime": "container",
  "side_effects": false,
  "status": "live",
  "credits": 2,
  "price": "$0.0020",
  "providers": [
    {
      "id": "opentools",
      "name": "Opentools",
      "price": "$0.0020"
    }
  ],
  "mcp_name": "image_combine",
  "input_schema": {
    "type": "object",
    "properties": {
      "files": {
        "minItems": 2,
        "maxItems": 20,
        "type": "array",
        "items": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "url": {
                  "type": "string",
                  "format": "uri",
                  "description": "Public http(s) URL of the file"
                }
              },
              "required": [
                "url"
              ]
            },
            {
              "type": "object",
              "properties": {
                "file_id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                  "description": "An id returned by POST /v1/files"
                }
              },
              "required": [
                "file_id"
              ]
            },
            {
              "type": "object",
              "properties": {
                "base64": {
                  "type": "string",
                  "description": "Base64-encoded file bytes (up to 10 MB)"
                },
                "name": {
                  "type": "string",
                  "description": "File name, e.g. invoice.pdf"
                },
                "content_type": {
                  "type": "string"
                }
              },
              "required": [
                "base64",
                "name"
              ]
            },
            {
              "type": "object",
              "properties": {
                "connection": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 64,
                  "description": "A storage connection id or name (see storage.connections)"
                },
                "path": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 1024,
                  "description": "Path of the file in that connection, e.g. reports/q3.pdf"
                }
              },
              "required": [
                "connection",
                "path"
              ]
            }
          ],
          "x-file": true,
          "description": "A file: { url }, { file_id }, { base64, name } or { connection, path } from connected storage"
        },
        "description": "2 to 20 images (PNG, JPEG, WebP, GIF, TIFF, HEIC, AVIF…)"
      },
      "direction": {
        "default": "horizontal",
        "description": "horizontal: side by side; vertical: stacked",
        "type": "string",
        "enum": [
          "horizontal",
          "vertical"
        ]
      },
      "align": {
        "default": "center",
        "description": "Alignment across the row: top/centre/bottom, or left/centre/right when stacked",
        "type": "string",
        "enum": [
          "start",
          "center",
          "end"
        ]
      },
      "gap": {
        "default": 0,
        "description": "Space between images in px",
        "type": "integer",
        "minimum": 0,
        "maximum": 1000
      },
      "background": {
        "default": "#FFFFFF",
        "description": "Background colour like #FFFFFF, or \"transparent\" (PNG/WebP output)",
        "anyOf": [
          {
            "type": "string",
            "pattern": "^#[0-9a-fA-F]{6}$"
          },
          {
            "type": "string",
            "const": "transparent"
          }
        ]
      },
      "resize": {
        "default": "none",
        "description": "Scale images to a common height (or width when stacked): the smallest one's, or the largest one's",
        "type": "string",
        "enum": [
          "none",
          "smallest",
          "largest"
        ]
      },
      "size": {
        "description": "Scale every image to exactly this height (or width when stacked)",
        "type": "integer",
        "minimum": 16,
        "maximum": 12000
      },
      "format": {
        "default": "auto",
        "description": "Output format. auto keeps JPEG, PNG or WebP inputs as they are, uses PNG otherwise or when transparent",
        "type": "string",
        "enum": [
          "auto",
          "png",
          "jpg",
          "webp"
        ]
      },
      "quality": {
        "default": 90,
        "description": "Quality for lossy formats, 1-100",
        "type": "integer",
        "minimum": 1,
        "maximum": 100
      }
    },
    "required": [
      "files"
    ]
  },
  "kind": "tool"
}